UNPKG

1.7 MBJavaScriptView Raw
1/**
2 * Framework7 6.1.0-beta.6
3 * Full featured mobile HTML framework for building iOS & Android apps
4 * https://framework7.io/
5 *
6 * Copyright 2014-2021 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: July 19, 2021
11 */
12
13(function (global, factory) {
14 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
15 typeof define === 'function' && define.amd ? define(factory) :
16 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Framework7 = factory());
17}(this, (function () { 'use strict';
18
19 /**
20 * SSR Window 3.0.0
21 * Better handling for window object in SSR environment
22 * https://github.com/nolimits4web/ssr-window
23 *
24 * Copyright 2020, Vladimir Kharlampidi
25 *
26 * Licensed under MIT
27 *
28 * Released on: November 9, 2020
29 */
30
31 /* eslint-disable no-param-reassign */
32 function isObject$2(obj) {
33 return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
34 }
35
36 function extend$2(target, src) {
37 if (target === void 0) {
38 target = {};
39 }
40
41 if (src === void 0) {
42 src = {};
43 }
44
45 Object.keys(src).forEach(function (key) {
46 if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$2(src[key]) && isObject$2(target[key]) && Object.keys(src[key]).length > 0) {
47 extend$2(target[key], src[key]);
48 }
49 });
50 }
51
52 var ssrDocument = {
53 body: {},
54 addEventListener: function addEventListener() {},
55 removeEventListener: function removeEventListener() {},
56 activeElement: {
57 blur: function blur() {},
58 nodeName: ''
59 },
60 querySelector: function querySelector() {
61 return null;
62 },
63 querySelectorAll: function querySelectorAll() {
64 return [];
65 },
66 getElementById: function getElementById() {
67 return null;
68 },
69 createEvent: function createEvent() {
70 return {
71 initEvent: function initEvent() {}
72 };
73 },
74 createElement: function createElement() {
75 return {
76 children: [],
77 childNodes: [],
78 style: {},
79 setAttribute: function setAttribute() {},
80 getElementsByTagName: function getElementsByTagName() {
81 return [];
82 }
83 };
84 },
85 createElementNS: function createElementNS() {
86 return {};
87 },
88 importNode: function importNode() {
89 return null;
90 },
91 location: {
92 hash: '',
93 host: '',
94 hostname: '',
95 href: '',
96 origin: '',
97 pathname: '',
98 protocol: '',
99 search: ''
100 }
101 };
102
103 function getDocument() {
104 var doc = typeof document !== 'undefined' ? document : {};
105 extend$2(doc, ssrDocument);
106 return doc;
107 }
108
109 var ssrWindow = {
110 document: ssrDocument,
111 navigator: {
112 userAgent: ''
113 },
114 location: {
115 hash: '',
116 host: '',
117 hostname: '',
118 href: '',
119 origin: '',
120 pathname: '',
121 protocol: '',
122 search: ''
123 },
124 history: {
125 replaceState: function replaceState() {},
126 pushState: function pushState() {},
127 go: function go() {},
128 back: function back() {}
129 },
130 CustomEvent: function CustomEvent() {
131 return this;
132 },
133 addEventListener: function addEventListener() {},
134 removeEventListener: function removeEventListener() {},
135 getComputedStyle: function getComputedStyle() {
136 return {
137 getPropertyValue: function getPropertyValue() {
138 return '';
139 }
140 };
141 },
142 Image: function Image() {},
143 Date: function Date() {},
144 screen: {},
145 setTimeout: function setTimeout() {},
146 clearTimeout: function clearTimeout() {},
147 matchMedia: function matchMedia() {
148 return {};
149 },
150 requestAnimationFrame: function requestAnimationFrame(callback) {
151 if (typeof setTimeout === 'undefined') {
152 callback();
153 return null;
154 }
155
156 return setTimeout(callback, 0);
157 },
158 cancelAnimationFrame: function cancelAnimationFrame(id) {
159 if (typeof setTimeout === 'undefined') {
160 return;
161 }
162
163 clearTimeout(id);
164 }
165 };
166
167 function getWindow() {
168 var win = typeof window !== 'undefined' ? window : {};
169 extend$2(win, ssrWindow);
170 return win;
171 }
172
173 /**
174 * Dom7 3.0.0
175 * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
176 * https://framework7.io/docs/dom7.html
177 *
178 * Copyright 2020, Vladimir Kharlampidi
179 *
180 * Licensed under MIT
181 *
182 * Released on: November 9, 2020
183 */
184
185 function _inheritsLoose$1(subClass, superClass) {
186 subClass.prototype = Object.create(superClass.prototype);
187 subClass.prototype.constructor = subClass;
188 subClass.__proto__ = superClass;
189 }
190
191 function _getPrototypeOf$1(o) {
192 _getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
193 return o.__proto__ || Object.getPrototypeOf(o);
194 };
195 return _getPrototypeOf$1(o);
196 }
197
198 function _setPrototypeOf$1(o, p) {
199 _setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
200 o.__proto__ = p;
201 return o;
202 };
203
204 return _setPrototypeOf$1(o, p);
205 }
206
207 function _isNativeReflectConstruct$1() {
208 if (typeof Reflect === "undefined" || !Reflect.construct) return false;
209 if (Reflect.construct.sham) return false;
210 if (typeof Proxy === "function") return true;
211
212 try {
213 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
214 return true;
215 } catch (e) {
216 return false;
217 }
218 }
219
220 function _construct$1(Parent, args, Class) {
221 if (_isNativeReflectConstruct$1()) {
222 _construct$1 = Reflect.construct;
223 } else {
224 _construct$1 = function _construct(Parent, args, Class) {
225 var a = [null];
226 a.push.apply(a, args);
227 var Constructor = Function.bind.apply(Parent, a);
228 var instance = new Constructor();
229 if (Class) _setPrototypeOf$1(instance, Class.prototype);
230 return instance;
231 };
232 }
233
234 return _construct$1.apply(null, arguments);
235 }
236
237 function _isNativeFunction$1(fn) {
238 return Function.toString.call(fn).indexOf("[native code]") !== -1;
239 }
240
241 function _wrapNativeSuper$1(Class) {
242 var _cache = typeof Map === "function" ? new Map() : undefined;
243
244 _wrapNativeSuper$1 = function _wrapNativeSuper(Class) {
245 if (Class === null || !_isNativeFunction$1(Class)) return Class;
246
247 if (typeof Class !== "function") {
248 throw new TypeError("Super expression must either be null or a function");
249 }
250
251 if (typeof _cache !== "undefined") {
252 if (_cache.has(Class)) return _cache.get(Class);
253
254 _cache.set(Class, Wrapper);
255 }
256
257 function Wrapper() {
258 return _construct$1(Class, arguments, _getPrototypeOf$1(this).constructor);
259 }
260
261 Wrapper.prototype = Object.create(Class.prototype, {
262 constructor: {
263 value: Wrapper,
264 enumerable: false,
265 writable: true,
266 configurable: true
267 }
268 });
269 return _setPrototypeOf$1(Wrapper, Class);
270 };
271
272 return _wrapNativeSuper$1(Class);
273 }
274
275 function _assertThisInitialized$1(self) {
276 if (self === void 0) {
277 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
278 }
279
280 return self;
281 }
282 /* eslint-disable no-proto */
283
284
285 function makeReactive(obj) {
286 var proto = obj.__proto__;
287 Object.defineProperty(obj, '__proto__', {
288 get: function get() {
289 return proto;
290 },
291 set: function set(value) {
292 proto.__proto__ = value;
293 }
294 });
295 }
296
297 var Dom7 = /*#__PURE__*/function (_Array) {
298 _inheritsLoose$1(Dom7, _Array);
299
300 function Dom7(items) {
301 var _this;
302
303 _this = _Array.call.apply(_Array, [this].concat(items)) || this;
304 makeReactive(_assertThisInitialized$1(_this));
305 return _this;
306 }
307
308 return Dom7;
309 }( /*#__PURE__*/_wrapNativeSuper$1(Array));
310
311 function arrayFlat(arr) {
312 if (arr === void 0) {
313 arr = [];
314 }
315
316 var res = [];
317 arr.forEach(function (el) {
318 if (Array.isArray(el)) {
319 res.push.apply(res, arrayFlat(el));
320 } else {
321 res.push(el);
322 }
323 });
324 return res;
325 }
326
327 function arrayFilter(arr, callback) {
328 return Array.prototype.filter.call(arr, callback);
329 }
330
331 function arrayUnique(arr) {
332 var uniqueArray = [];
333
334 for (var i = 0; i < arr.length; i += 1) {
335 if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);
336 }
337
338 return uniqueArray;
339 }
340
341 function toCamelCase$1(string) {
342 return string.toLowerCase().replace(/-(.)/g, function (match, group) {
343 return group.toUpperCase();
344 });
345 }
346
347 function qsa(selector, context) {
348 if (typeof selector !== 'string') {
349 return [selector];
350 }
351
352 var a = [];
353 var res = context.querySelectorAll(selector);
354
355 for (var i = 0; i < res.length; i += 1) {
356 a.push(res[i]);
357 }
358
359 return a;
360 }
361
362 function $$1(selector, context) {
363 var window = getWindow();
364 var document = getDocument();
365 var arr = [];
366
367 if (!context && selector instanceof Dom7) {
368 return selector;
369 }
370
371 if (!selector) {
372 return new Dom7(arr);
373 }
374
375 if (typeof selector === 'string') {
376 var html = selector.trim();
377
378 if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
379 var toCreate = 'div';
380 if (html.indexOf('<li') === 0) toCreate = 'ul';
381 if (html.indexOf('<tr') === 0) toCreate = 'tbody';
382 if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';
383 if (html.indexOf('<tbody') === 0) toCreate = 'table';
384 if (html.indexOf('<option') === 0) toCreate = 'select';
385 var tempParent = document.createElement(toCreate);
386 tempParent.innerHTML = html;
387
388 for (var i = 0; i < tempParent.childNodes.length; i += 1) {
389 arr.push(tempParent.childNodes[i]);
390 }
391 } else {
392 arr = qsa(selector.trim(), context || document);
393 } // arr = qsa(selector, document);
394
395 } else if (selector.nodeType || selector === window || selector === document) {
396 arr.push(selector);
397 } else if (Array.isArray(selector)) {
398 if (selector instanceof Dom7) return selector;
399 arr = selector;
400 }
401
402 return new Dom7(arrayUnique(arr));
403 }
404
405 $$1.fn = Dom7.prototype;
406
407 function addClass() {
408 for (var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++) {
409 classes[_key] = arguments[_key];
410 }
411
412 var classNames = arrayFlat(classes.map(function (c) {
413 return c.split(' ');
414 }));
415 this.forEach(function (el) {
416 var _el$classList;
417
418 (_el$classList = el.classList).add.apply(_el$classList, classNames);
419 });
420 return this;
421 }
422
423 function removeClass() {
424 for (var _len2 = arguments.length, classes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
425 classes[_key2] = arguments[_key2];
426 }
427
428 var classNames = arrayFlat(classes.map(function (c) {
429 return c.split(' ');
430 }));
431 this.forEach(function (el) {
432 var _el$classList2;
433
434 (_el$classList2 = el.classList).remove.apply(_el$classList2, classNames);
435 });
436 return this;
437 }
438
439 function toggleClass() {
440 for (var _len3 = arguments.length, classes = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
441 classes[_key3] = arguments[_key3];
442 }
443
444 var classNames = arrayFlat(classes.map(function (c) {
445 return c.split(' ');
446 }));
447 this.forEach(function (el) {
448 classNames.forEach(function (className) {
449 el.classList.toggle(className);
450 });
451 });
452 }
453
454 function hasClass() {
455 for (var _len4 = arguments.length, classes = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
456 classes[_key4] = arguments[_key4];
457 }
458
459 var classNames = arrayFlat(classes.map(function (c) {
460 return c.split(' ');
461 }));
462 return arrayFilter(this, function (el) {
463 return classNames.filter(function (className) {
464 return el.classList.contains(className);
465 }).length > 0;
466 }).length > 0;
467 }
468
469 function attr(attrs, value) {
470 if (arguments.length === 1 && typeof attrs === 'string') {
471 // Get attr
472 if (this[0]) return this[0].getAttribute(attrs);
473 return undefined;
474 } // Set attrs
475
476
477 for (var i = 0; i < this.length; i += 1) {
478 if (arguments.length === 2) {
479 // String
480 this[i].setAttribute(attrs, value);
481 } else {
482 // Object
483 for (var attrName in attrs) {
484 this[i][attrName] = attrs[attrName];
485 this[i].setAttribute(attrName, attrs[attrName]);
486 }
487 }
488 }
489
490 return this;
491 }
492
493 function removeAttr(attr) {
494 for (var i = 0; i < this.length; i += 1) {
495 this[i].removeAttribute(attr);
496 }
497
498 return this;
499 }
500
501 function prop(props, value) {
502 if (arguments.length === 1 && typeof props === 'string') {
503 // Get prop
504 if (this[0]) return this[0][props];
505 } else {
506 // Set props
507 for (var i = 0; i < this.length; i += 1) {
508 if (arguments.length === 2) {
509 // String
510 this[i][props] = value;
511 } else {
512 // Object
513 for (var propName in props) {
514 this[i][propName] = props[propName];
515 }
516 }
517 }
518
519 return this;
520 }
521
522 return this;
523 }
524
525 function data(key, value) {
526 var el;
527
528 if (typeof value === 'undefined') {
529 el = this[0];
530 if (!el) return undefined; // Get value
531
532 if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {
533 return el.dom7ElementDataStorage[key];
534 }
535
536 var dataKey = el.getAttribute("data-" + key);
537
538 if (dataKey) {
539 return dataKey;
540 }
541
542 return undefined;
543 } // Set value
544
545
546 for (var i = 0; i < this.length; i += 1) {
547 el = this[i];
548 if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};
549 el.dom7ElementDataStorage[key] = value;
550 }
551
552 return this;
553 }
554
555 function removeData(key) {
556 for (var i = 0; i < this.length; i += 1) {
557 var el = this[i];
558
559 if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {
560 el.dom7ElementDataStorage[key] = null;
561 delete el.dom7ElementDataStorage[key];
562 }
563 }
564 }
565
566 function dataset() {
567 var el = this[0];
568 if (!el) return undefined;
569 var dataset = {}; // eslint-disable-line
570
571 if (el.dataset) {
572 for (var dataKey in el.dataset) {
573 dataset[dataKey] = el.dataset[dataKey];
574 }
575 } else {
576 for (var i = 0; i < el.attributes.length; i += 1) {
577 var _attr = el.attributes[i];
578
579 if (_attr.name.indexOf('data-') >= 0) {
580 dataset[toCamelCase$1(_attr.name.split('data-')[1])] = _attr.value;
581 }
582 }
583 }
584
585 for (var key in dataset) {
586 if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;
587 }
588
589 return dataset;
590 }
591
592 function val(value) {
593 if (typeof value === 'undefined') {
594 // get value
595 var el = this[0];
596 if (!el) return undefined;
597
598 if (el.multiple && el.nodeName.toLowerCase() === 'select') {
599 var values = [];
600
601 for (var i = 0; i < el.selectedOptions.length; i += 1) {
602 values.push(el.selectedOptions[i].value);
603 }
604
605 return values;
606 }
607
608 return el.value;
609 } // set value
610
611
612 for (var _i = 0; _i < this.length; _i += 1) {
613 var _el = this[_i];
614
615 if (Array.isArray(value) && _el.multiple && _el.nodeName.toLowerCase() === 'select') {
616 for (var j = 0; j < _el.options.length; j += 1) {
617 _el.options[j].selected = value.indexOf(_el.options[j].value) >= 0;
618 }
619 } else {
620 _el.value = value;
621 }
622 }
623
624 return this;
625 }
626
627 function value(value) {
628 return this.val(value);
629 }
630
631 function transform(transform) {
632 for (var i = 0; i < this.length; i += 1) {
633 this[i].style.transform = transform;
634 }
635
636 return this;
637 }
638
639 function transition$1(duration) {
640 for (var i = 0; i < this.length; i += 1) {
641 this[i].style.transitionDuration = typeof duration !== 'string' ? duration + "ms" : duration;
642 }
643
644 return this;
645 }
646
647 function on() {
648 for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
649 args[_key5] = arguments[_key5];
650 }
651
652 var eventType = args[0],
653 targetSelector = args[1],
654 listener = args[2],
655 capture = args[3];
656
657 if (typeof args[1] === 'function') {
658 eventType = args[0];
659 listener = args[1];
660 capture = args[2];
661 targetSelector = undefined;
662 }
663
664 if (!capture) capture = false;
665
666 function handleLiveEvent(e) {
667 var target = e.target;
668 if (!target) return;
669 var eventData = e.target.dom7EventData || [];
670
671 if (eventData.indexOf(e) < 0) {
672 eventData.unshift(e);
673 }
674
675 if ($$1(target).is(targetSelector)) listener.apply(target, eventData);else {
676 var _parents = $$1(target).parents(); // eslint-disable-line
677
678
679 for (var k = 0; k < _parents.length; k += 1) {
680 if ($$1(_parents[k]).is(targetSelector)) listener.apply(_parents[k], eventData);
681 }
682 }
683 }
684
685 function handleEvent(e) {
686 var eventData = e && e.target ? e.target.dom7EventData || [] : [];
687
688 if (eventData.indexOf(e) < 0) {
689 eventData.unshift(e);
690 }
691
692 listener.apply(this, eventData);
693 }
694
695 var events = eventType.split(' ');
696 var j;
697
698 for (var i = 0; i < this.length; i += 1) {
699 var el = this[i];
700
701 if (!targetSelector) {
702 for (j = 0; j < events.length; j += 1) {
703 var event = events[j];
704 if (!el.dom7Listeners) el.dom7Listeners = {};
705 if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];
706 el.dom7Listeners[event].push({
707 listener: listener,
708 proxyListener: handleEvent
709 });
710 el.addEventListener(event, handleEvent, capture);
711 }
712 } else {
713 // Live events
714 for (j = 0; j < events.length; j += 1) {
715 var _event = events[j];
716 if (!el.dom7LiveListeners) el.dom7LiveListeners = {};
717 if (!el.dom7LiveListeners[_event]) el.dom7LiveListeners[_event] = [];
718
719 el.dom7LiveListeners[_event].push({
720 listener: listener,
721 proxyListener: handleLiveEvent
722 });
723
724 el.addEventListener(_event, handleLiveEvent, capture);
725 }
726 }
727 }
728
729 return this;
730 }
731
732 function off() {
733 for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
734 args[_key6] = arguments[_key6];
735 }
736
737 var eventType = args[0],
738 targetSelector = args[1],
739 listener = args[2],
740 capture = args[3];
741
742 if (typeof args[1] === 'function') {
743 eventType = args[0];
744 listener = args[1];
745 capture = args[2];
746 targetSelector = undefined;
747 }
748
749 if (!capture) capture = false;
750 var events = eventType.split(' ');
751
752 for (var i = 0; i < events.length; i += 1) {
753 var event = events[i];
754
755 for (var j = 0; j < this.length; j += 1) {
756 var el = this[j];
757 var handlers = void 0;
758
759 if (!targetSelector && el.dom7Listeners) {
760 handlers = el.dom7Listeners[event];
761 } else if (targetSelector && el.dom7LiveListeners) {
762 handlers = el.dom7LiveListeners[event];
763 }
764
765 if (handlers && handlers.length) {
766 for (var k = handlers.length - 1; k >= 0; k -= 1) {
767 var handler = handlers[k];
768
769 if (listener && handler.listener === listener) {
770 el.removeEventListener(event, handler.proxyListener, capture);
771 handlers.splice(k, 1);
772 } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
773 el.removeEventListener(event, handler.proxyListener, capture);
774 handlers.splice(k, 1);
775 } else if (!listener) {
776 el.removeEventListener(event, handler.proxyListener, capture);
777 handlers.splice(k, 1);
778 }
779 }
780 }
781 }
782 }
783
784 return this;
785 }
786
787 function once() {
788 var dom = this;
789
790 for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
791 args[_key7] = arguments[_key7];
792 }
793
794 var eventName = args[0],
795 targetSelector = args[1],
796 listener = args[2],
797 capture = args[3];
798
799 if (typeof args[1] === 'function') {
800 eventName = args[0];
801 listener = args[1];
802 capture = args[2];
803 targetSelector = undefined;
804 }
805
806 function onceHandler() {
807 for (var _len8 = arguments.length, eventArgs = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
808 eventArgs[_key8] = arguments[_key8];
809 }
810
811 listener.apply(this, eventArgs);
812 dom.off(eventName, targetSelector, onceHandler, capture);
813
814 if (onceHandler.dom7proxy) {
815 delete onceHandler.dom7proxy;
816 }
817 }
818
819 onceHandler.dom7proxy = listener;
820 return dom.on(eventName, targetSelector, onceHandler, capture);
821 }
822
823 function trigger() {
824 var window = getWindow();
825
826 for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
827 args[_key9] = arguments[_key9];
828 }
829
830 var events = args[0].split(' ');
831 var eventData = args[1];
832
833 for (var i = 0; i < events.length; i += 1) {
834 var event = events[i];
835
836 for (var j = 0; j < this.length; j += 1) {
837 var el = this[j];
838
839 if (window.CustomEvent) {
840 var evt = new window.CustomEvent(event, {
841 detail: eventData,
842 bubbles: true,
843 cancelable: true
844 });
845 el.dom7EventData = args.filter(function (data, dataIndex) {
846 return dataIndex > 0;
847 });
848 el.dispatchEvent(evt);
849 el.dom7EventData = [];
850 delete el.dom7EventData;
851 }
852 }
853 }
854
855 return this;
856 }
857
858 function transitionEnd$1(callback) {
859 var dom = this;
860
861 function fireCallBack(e) {
862 if (e.target !== this) return;
863 callback.call(this, e);
864 dom.off('transitionend', fireCallBack);
865 }
866
867 if (callback) {
868 dom.on('transitionend', fireCallBack);
869 }
870
871 return this;
872 }
873
874 function animationEnd(callback) {
875 var dom = this;
876
877 function fireCallBack(e) {
878 if (e.target !== this) return;
879 callback.call(this, e);
880 dom.off('animationend', fireCallBack);
881 }
882
883 if (callback) {
884 dom.on('animationend', fireCallBack);
885 }
886
887 return this;
888 }
889
890 function width() {
891 var window = getWindow();
892
893 if (this[0] === window) {
894 return window.innerWidth;
895 }
896
897 if (this.length > 0) {
898 return parseFloat(this.css('width'));
899 }
900
901 return null;
902 }
903
904 function outerWidth(includeMargins) {
905 if (this.length > 0) {
906 if (includeMargins) {
907 var _styles = this.styles();
908
909 return this[0].offsetWidth + parseFloat(_styles.getPropertyValue('margin-right')) + parseFloat(_styles.getPropertyValue('margin-left'));
910 }
911
912 return this[0].offsetWidth;
913 }
914
915 return null;
916 }
917
918 function height() {
919 var window = getWindow();
920
921 if (this[0] === window) {
922 return window.innerHeight;
923 }
924
925 if (this.length > 0) {
926 return parseFloat(this.css('height'));
927 }
928
929 return null;
930 }
931
932 function outerHeight(includeMargins) {
933 if (this.length > 0) {
934 if (includeMargins) {
935 var _styles2 = this.styles();
936
937 return this[0].offsetHeight + parseFloat(_styles2.getPropertyValue('margin-top')) + parseFloat(_styles2.getPropertyValue('margin-bottom'));
938 }
939
940 return this[0].offsetHeight;
941 }
942
943 return null;
944 }
945
946 function offset() {
947 if (this.length > 0) {
948 var window = getWindow();
949 var document = getDocument();
950 var el = this[0];
951 var box = el.getBoundingClientRect();
952 var body = document.body;
953 var clientTop = el.clientTop || body.clientTop || 0;
954 var clientLeft = el.clientLeft || body.clientLeft || 0;
955 var scrollTop = el === window ? window.scrollY : el.scrollTop;
956 var scrollLeft = el === window ? window.scrollX : el.scrollLeft;
957 return {
958 top: box.top + scrollTop - clientTop,
959 left: box.left + scrollLeft - clientLeft
960 };
961 }
962
963 return null;
964 }
965
966 function hide() {
967 for (var i = 0; i < this.length; i += 1) {
968 this[i].style.display = 'none';
969 }
970
971 return this;
972 }
973
974 function show() {
975 var window = getWindow();
976
977 for (var i = 0; i < this.length; i += 1) {
978 var el = this[i];
979
980 if (el.style.display === 'none') {
981 el.style.display = '';
982 }
983
984 if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {
985 // Still not visible
986 el.style.display = 'block';
987 }
988 }
989
990 return this;
991 }
992
993 function styles() {
994 var window = getWindow();
995 if (this[0]) return window.getComputedStyle(this[0], null);
996 return {};
997 }
998
999 function css(props, value) {
1000 var window = getWindow();
1001 var i;
1002
1003 if (arguments.length === 1) {
1004 if (typeof props === 'string') {
1005 // .css('width')
1006 if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);
1007 } else {
1008 // .css({ width: '100px' })
1009 for (i = 0; i < this.length; i += 1) {
1010 for (var _prop in props) {
1011 this[i].style[_prop] = props[_prop];
1012 }
1013 }
1014
1015 return this;
1016 }
1017 }
1018
1019 if (arguments.length === 2 && typeof props === 'string') {
1020 // .css('width', '100px')
1021 for (i = 0; i < this.length; i += 1) {
1022 this[i].style[props] = value;
1023 }
1024
1025 return this;
1026 }
1027
1028 return this;
1029 }
1030
1031 function each(callback) {
1032 if (!callback) return this;
1033 this.forEach(function (el, index) {
1034 callback.apply(el, [el, index]);
1035 });
1036 return this;
1037 }
1038
1039 function filter(callback) {
1040 var result = arrayFilter(this, callback);
1041 return $$1(result);
1042 }
1043
1044 function html(html) {
1045 if (typeof html === 'undefined') {
1046 return this[0] ? this[0].innerHTML : null;
1047 }
1048
1049 for (var i = 0; i < this.length; i += 1) {
1050 this[i].innerHTML = html;
1051 }
1052
1053 return this;
1054 }
1055
1056 function text(text) {
1057 if (typeof text === 'undefined') {
1058 return this[0] ? this[0].textContent.trim() : null;
1059 }
1060
1061 for (var i = 0; i < this.length; i += 1) {
1062 this[i].textContent = text;
1063 }
1064
1065 return this;
1066 }
1067
1068 function is(selector) {
1069 var window = getWindow();
1070 var document = getDocument();
1071 var el = this[0];
1072 var compareWith;
1073 var i;
1074 if (!el || typeof selector === 'undefined') return false;
1075
1076 if (typeof selector === 'string') {
1077 if (el.matches) return el.matches(selector);
1078 if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);
1079 if (el.msMatchesSelector) return el.msMatchesSelector(selector);
1080 compareWith = $$1(selector);
1081
1082 for (i = 0; i < compareWith.length; i += 1) {
1083 if (compareWith[i] === el) return true;
1084 }
1085
1086 return false;
1087 }
1088
1089 if (selector === document) {
1090 return el === document;
1091 }
1092
1093 if (selector === window) {
1094 return el === window;
1095 }
1096
1097 if (selector.nodeType || selector instanceof Dom7) {
1098 compareWith = selector.nodeType ? [selector] : selector;
1099
1100 for (i = 0; i < compareWith.length; i += 1) {
1101 if (compareWith[i] === el) return true;
1102 }
1103
1104 return false;
1105 }
1106
1107 return false;
1108 }
1109
1110 function index() {
1111 var child = this[0];
1112 var i;
1113
1114 if (child) {
1115 i = 0; // eslint-disable-next-line
1116
1117 while ((child = child.previousSibling) !== null) {
1118 if (child.nodeType === 1) i += 1;
1119 }
1120
1121 return i;
1122 }
1123
1124 return undefined;
1125 }
1126
1127 function eq(index) {
1128 if (typeof index === 'undefined') return this;
1129 var length = this.length;
1130
1131 if (index > length - 1) {
1132 return $$1([]);
1133 }
1134
1135 if (index < 0) {
1136 var returnIndex = length + index;
1137 if (returnIndex < 0) return $$1([]);
1138 return $$1([this[returnIndex]]);
1139 }
1140
1141 return $$1([this[index]]);
1142 }
1143
1144 function append() {
1145 var newChild;
1146 var document = getDocument();
1147
1148 for (var k = 0; k < arguments.length; k += 1) {
1149 newChild = k < 0 || arguments.length <= k ? undefined : arguments[k];
1150
1151 for (var i = 0; i < this.length; i += 1) {
1152 if (typeof newChild === 'string') {
1153 var tempDiv = document.createElement('div');
1154 tempDiv.innerHTML = newChild;
1155
1156 while (tempDiv.firstChild) {
1157 this[i].appendChild(tempDiv.firstChild);
1158 }
1159 } else if (newChild instanceof Dom7) {
1160 for (var j = 0; j < newChild.length; j += 1) {
1161 this[i].appendChild(newChild[j]);
1162 }
1163 } else {
1164 this[i].appendChild(newChild);
1165 }
1166 }
1167 }
1168
1169 return this;
1170 }
1171
1172 function appendTo(parent) {
1173 $$1(parent).append(this);
1174 return this;
1175 }
1176
1177 function prepend(newChild) {
1178 var document = getDocument();
1179 var i;
1180 var j;
1181
1182 for (i = 0; i < this.length; i += 1) {
1183 if (typeof newChild === 'string') {
1184 var tempDiv = document.createElement('div');
1185 tempDiv.innerHTML = newChild;
1186
1187 for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
1188 this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
1189 }
1190 } else if (newChild instanceof Dom7) {
1191 for (j = 0; j < newChild.length; j += 1) {
1192 this[i].insertBefore(newChild[j], this[i].childNodes[0]);
1193 }
1194 } else {
1195 this[i].insertBefore(newChild, this[i].childNodes[0]);
1196 }
1197 }
1198
1199 return this;
1200 }
1201
1202 function prependTo(parent) {
1203 $$1(parent).prepend(this);
1204 return this;
1205 }
1206
1207 function insertBefore$1(selector) {
1208 var before = $$1(selector);
1209
1210 for (var i = 0; i < this.length; i += 1) {
1211 if (before.length === 1) {
1212 before[0].parentNode.insertBefore(this[i], before[0]);
1213 } else if (before.length > 1) {
1214 for (var j = 0; j < before.length; j += 1) {
1215 before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);
1216 }
1217 }
1218 }
1219 }
1220
1221 function insertAfter(selector) {
1222 var after = $$1(selector);
1223
1224 for (var i = 0; i < this.length; i += 1) {
1225 if (after.length === 1) {
1226 after[0].parentNode.insertBefore(this[i], after[0].nextSibling);
1227 } else if (after.length > 1) {
1228 for (var j = 0; j < after.length; j += 1) {
1229 after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);
1230 }
1231 }
1232 }
1233 }
1234
1235 function next(selector) {
1236 if (this.length > 0) {
1237 if (selector) {
1238 if (this[0].nextElementSibling && $$1(this[0].nextElementSibling).is(selector)) {
1239 return $$1([this[0].nextElementSibling]);
1240 }
1241
1242 return $$1([]);
1243 }
1244
1245 if (this[0].nextElementSibling) return $$1([this[0].nextElementSibling]);
1246 return $$1([]);
1247 }
1248
1249 return $$1([]);
1250 }
1251
1252 function nextAll(selector) {
1253 var nextEls = [];
1254 var el = this[0];
1255 if (!el) return $$1([]);
1256
1257 while (el.nextElementSibling) {
1258 var _next = el.nextElementSibling; // eslint-disable-line
1259
1260 if (selector) {
1261 if ($$1(_next).is(selector)) nextEls.push(_next);
1262 } else nextEls.push(_next);
1263
1264 el = _next;
1265 }
1266
1267 return $$1(nextEls);
1268 }
1269
1270 function prev(selector) {
1271 if (this.length > 0) {
1272 var el = this[0];
1273
1274 if (selector) {
1275 if (el.previousElementSibling && $$1(el.previousElementSibling).is(selector)) {
1276 return $$1([el.previousElementSibling]);
1277 }
1278
1279 return $$1([]);
1280 }
1281
1282 if (el.previousElementSibling) return $$1([el.previousElementSibling]);
1283 return $$1([]);
1284 }
1285
1286 return $$1([]);
1287 }
1288
1289 function prevAll(selector) {
1290 var prevEls = [];
1291 var el = this[0];
1292 if (!el) return $$1([]);
1293
1294 while (el.previousElementSibling) {
1295 var _prev = el.previousElementSibling; // eslint-disable-line
1296
1297 if (selector) {
1298 if ($$1(_prev).is(selector)) prevEls.push(_prev);
1299 } else prevEls.push(_prev);
1300
1301 el = _prev;
1302 }
1303
1304 return $$1(prevEls);
1305 }
1306
1307 function siblings(selector) {
1308 return this.nextAll(selector).add(this.prevAll(selector));
1309 }
1310
1311 function parent(selector) {
1312 var parents = []; // eslint-disable-line
1313
1314 for (var i = 0; i < this.length; i += 1) {
1315 if (this[i].parentNode !== null) {
1316 if (selector) {
1317 if ($$1(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);
1318 } else {
1319 parents.push(this[i].parentNode);
1320 }
1321 }
1322 }
1323
1324 return $$1(parents);
1325 }
1326
1327 function parents(selector) {
1328 var parents = []; // eslint-disable-line
1329
1330 for (var i = 0; i < this.length; i += 1) {
1331 var _parent = this[i].parentNode; // eslint-disable-line
1332
1333 while (_parent) {
1334 if (selector) {
1335 if ($$1(_parent).is(selector)) parents.push(_parent);
1336 } else {
1337 parents.push(_parent);
1338 }
1339
1340 _parent = _parent.parentNode;
1341 }
1342 }
1343
1344 return $$1(parents);
1345 }
1346
1347 function closest(selector) {
1348 var closest = this; // eslint-disable-line
1349
1350 if (typeof selector === 'undefined') {
1351 return $$1([]);
1352 }
1353
1354 if (!closest.is(selector)) {
1355 closest = closest.parents(selector).eq(0);
1356 }
1357
1358 return closest;
1359 }
1360
1361 function find(selector) {
1362 var foundElements = [];
1363
1364 for (var i = 0; i < this.length; i += 1) {
1365 var found = this[i].querySelectorAll(selector);
1366
1367 for (var j = 0; j < found.length; j += 1) {
1368 foundElements.push(found[j]);
1369 }
1370 }
1371
1372 return $$1(foundElements);
1373 }
1374
1375 function children(selector) {
1376 var children = []; // eslint-disable-line
1377
1378 for (var i = 0; i < this.length; i += 1) {
1379 var childNodes = this[i].children;
1380
1381 for (var j = 0; j < childNodes.length; j += 1) {
1382 if (!selector || $$1(childNodes[j]).is(selector)) {
1383 children.push(childNodes[j]);
1384 }
1385 }
1386 }
1387
1388 return $$1(children);
1389 }
1390
1391 function remove() {
1392 for (var i = 0; i < this.length; i += 1) {
1393 if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);
1394 }
1395
1396 return this;
1397 }
1398
1399 function detach() {
1400 return this.remove();
1401 }
1402
1403 function add() {
1404 var dom = this;
1405 var i;
1406 var j;
1407
1408 for (var _len10 = arguments.length, els = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
1409 els[_key10] = arguments[_key10];
1410 }
1411
1412 for (i = 0; i < els.length; i += 1) {
1413 var toAdd = $$1(els[i]);
1414
1415 for (j = 0; j < toAdd.length; j += 1) {
1416 dom.push(toAdd[j]);
1417 }
1418 }
1419
1420 return dom;
1421 }
1422
1423 function empty() {
1424 for (var i = 0; i < this.length; i += 1) {
1425 var el = this[i];
1426
1427 if (el.nodeType === 1) {
1428 for (var j = 0; j < el.childNodes.length; j += 1) {
1429 if (el.childNodes[j].parentNode) {
1430 el.childNodes[j].parentNode.removeChild(el.childNodes[j]);
1431 }
1432 }
1433
1434 el.textContent = '';
1435 }
1436 }
1437
1438 return this;
1439 }
1440
1441 function scrollTo() {
1442 var window = getWindow();
1443
1444 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
1445 args[_key] = arguments[_key];
1446 }
1447
1448 var left = args[0],
1449 top = args[1],
1450 duration = args[2],
1451 easing = args[3],
1452 callback = args[4];
1453
1454 if (args.length === 4 && typeof easing === 'function') {
1455 callback = easing;
1456 left = args[0];
1457 top = args[1];
1458 duration = args[2];
1459 callback = args[3];
1460 easing = args[4];
1461 }
1462
1463 if (typeof easing === 'undefined') easing = 'swing';
1464 return this.each(function animate() {
1465 var el = this;
1466 var currentTop;
1467 var currentLeft;
1468 var maxTop;
1469 var maxLeft;
1470 var newTop;
1471 var newLeft;
1472 var scrollTop; // eslint-disable-line
1473
1474 var scrollLeft; // eslint-disable-line
1475
1476 var animateTop = top > 0 || top === 0;
1477 var animateLeft = left > 0 || left === 0;
1478
1479 if (typeof easing === 'undefined') {
1480 easing = 'swing';
1481 }
1482
1483 if (animateTop) {
1484 currentTop = el.scrollTop;
1485
1486 if (!duration) {
1487 el.scrollTop = top;
1488 }
1489 }
1490
1491 if (animateLeft) {
1492 currentLeft = el.scrollLeft;
1493
1494 if (!duration) {
1495 el.scrollLeft = left;
1496 }
1497 }
1498
1499 if (!duration) return;
1500
1501 if (animateTop) {
1502 maxTop = el.scrollHeight - el.offsetHeight;
1503 newTop = Math.max(Math.min(top, maxTop), 0);
1504 }
1505
1506 if (animateLeft) {
1507 maxLeft = el.scrollWidth - el.offsetWidth;
1508 newLeft = Math.max(Math.min(left, maxLeft), 0);
1509 }
1510
1511 var startTime = null;
1512 if (animateTop && newTop === currentTop) animateTop = false;
1513 if (animateLeft && newLeft === currentLeft) animateLeft = false;
1514
1515 function render(time) {
1516 if (time === void 0) {
1517 time = new Date().getTime();
1518 }
1519
1520 if (startTime === null) {
1521 startTime = time;
1522 }
1523
1524 var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
1525 var easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;
1526 var done;
1527 if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);
1528 if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);
1529
1530 if (animateTop && newTop > currentTop && scrollTop >= newTop) {
1531 el.scrollTop = newTop;
1532 done = true;
1533 }
1534
1535 if (animateTop && newTop < currentTop && scrollTop <= newTop) {
1536 el.scrollTop = newTop;
1537 done = true;
1538 }
1539
1540 if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {
1541 el.scrollLeft = newLeft;
1542 done = true;
1543 }
1544
1545 if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {
1546 el.scrollLeft = newLeft;
1547 done = true;
1548 }
1549
1550 if (done) {
1551 if (callback) callback();
1552 return;
1553 }
1554
1555 if (animateTop) el.scrollTop = scrollTop;
1556 if (animateLeft) el.scrollLeft = scrollLeft;
1557 window.requestAnimationFrame(render);
1558 }
1559
1560 window.requestAnimationFrame(render);
1561 });
1562 } // scrollTop(top, duration, easing, callback) {
1563
1564
1565 function scrollTop() {
1566 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
1567 args[_key2] = arguments[_key2];
1568 }
1569
1570 var top = args[0],
1571 duration = args[1],
1572 easing = args[2],
1573 callback = args[3];
1574
1575 if (args.length === 3 && typeof easing === 'function') {
1576 top = args[0];
1577 duration = args[1];
1578 callback = args[2];
1579 easing = args[3];
1580 }
1581
1582 var dom = this;
1583
1584 if (typeof top === 'undefined') {
1585 if (dom.length > 0) return dom[0].scrollTop;
1586 return null;
1587 }
1588
1589 return dom.scrollTo(undefined, top, duration, easing, callback);
1590 }
1591
1592 function scrollLeft() {
1593 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
1594 args[_key3] = arguments[_key3];
1595 }
1596
1597 var left = args[0],
1598 duration = args[1],
1599 easing = args[2],
1600 callback = args[3];
1601
1602 if (args.length === 3 && typeof easing === 'function') {
1603 left = args[0];
1604 duration = args[1];
1605 callback = args[2];
1606 easing = args[3];
1607 }
1608
1609 var dom = this;
1610
1611 if (typeof left === 'undefined') {
1612 if (dom.length > 0) return dom[0].scrollLeft;
1613 return null;
1614 }
1615
1616 return dom.scrollTo(left, undefined, duration, easing, callback);
1617 }
1618
1619 function animate(initialProps, initialParams) {
1620 var window = getWindow();
1621 var els = this;
1622 var a = {
1623 props: Object.assign({}, initialProps),
1624 params: Object.assign({
1625 duration: 300,
1626 easing: 'swing' // or 'linear'
1627
1628 /* Callbacks
1629 begin(elements)
1630 complete(elements)
1631 progress(elements, complete, remaining, start, tweenValue)
1632 */
1633
1634 }, initialParams),
1635 elements: els,
1636 animating: false,
1637 que: [],
1638 easingProgress: function easingProgress(easing, progress) {
1639 if (easing === 'swing') {
1640 return 0.5 - Math.cos(progress * Math.PI) / 2;
1641 }
1642
1643 if (typeof easing === 'function') {
1644 return easing(progress);
1645 }
1646
1647 return progress;
1648 },
1649 stop: function stop() {
1650 if (a.frameId) {
1651 window.cancelAnimationFrame(a.frameId);
1652 }
1653
1654 a.animating = false;
1655 a.elements.each(function (el) {
1656 var element = el;
1657 delete element.dom7AnimateInstance;
1658 });
1659 a.que = [];
1660 },
1661 done: function done(complete) {
1662 a.animating = false;
1663 a.elements.each(function (el) {
1664 var element = el;
1665 delete element.dom7AnimateInstance;
1666 });
1667 if (complete) complete(els);
1668
1669 if (a.que.length > 0) {
1670 var que = a.que.shift();
1671 a.animate(que[0], que[1]);
1672 }
1673 },
1674 animate: function animate(props, params) {
1675 if (a.animating) {
1676 a.que.push([props, params]);
1677 return a;
1678 }
1679
1680 var elements = []; // Define & Cache Initials & Units
1681
1682 a.elements.each(function (el, index) {
1683 var initialFullValue;
1684 var initialValue;
1685 var unit;
1686 var finalValue;
1687 var finalFullValue;
1688 if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;
1689 elements[index] = {
1690 container: el
1691 };
1692 Object.keys(props).forEach(function (prop) {
1693 initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');
1694 initialValue = parseFloat(initialFullValue);
1695 unit = initialFullValue.replace(initialValue, '');
1696 finalValue = parseFloat(props[prop]);
1697 finalFullValue = props[prop] + unit;
1698 elements[index][prop] = {
1699 initialFullValue: initialFullValue,
1700 initialValue: initialValue,
1701 unit: unit,
1702 finalValue: finalValue,
1703 finalFullValue: finalFullValue,
1704 currentValue: initialValue
1705 };
1706 });
1707 });
1708 var startTime = null;
1709 var time;
1710 var elementsDone = 0;
1711 var propsDone = 0;
1712 var done;
1713 var began = false;
1714 a.animating = true;
1715
1716 function render() {
1717 time = new Date().getTime();
1718 var progress;
1719 var easeProgress; // let el;
1720
1721 if (!began) {
1722 began = true;
1723 if (params.begin) params.begin(els);
1724 }
1725
1726 if (startTime === null) {
1727 startTime = time;
1728 }
1729
1730 if (params.progress) {
1731 // eslint-disable-next-line
1732 params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);
1733 }
1734
1735 elements.forEach(function (element) {
1736 var el = element;
1737 if (done || el.done) return;
1738 Object.keys(props).forEach(function (prop) {
1739 if (done || el.done) return;
1740 progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);
1741 easeProgress = a.easingProgress(params.easing, progress);
1742 var _el$prop = el[prop],
1743 initialValue = _el$prop.initialValue,
1744 finalValue = _el$prop.finalValue,
1745 unit = _el$prop.unit;
1746 el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);
1747 var currentValue = el[prop].currentValue;
1748
1749 if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {
1750 el.container.style[prop] = finalValue + unit;
1751 propsDone += 1;
1752
1753 if (propsDone === Object.keys(props).length) {
1754 el.done = true;
1755 elementsDone += 1;
1756 }
1757
1758 if (elementsDone === elements.length) {
1759 done = true;
1760 }
1761 }
1762
1763 if (done) {
1764 a.done(params.complete);
1765 return;
1766 }
1767
1768 el.container.style[prop] = currentValue + unit;
1769 });
1770 });
1771 if (done) return; // Then call
1772
1773 a.frameId = window.requestAnimationFrame(render);
1774 }
1775
1776 a.frameId = window.requestAnimationFrame(render);
1777 return a;
1778 }
1779 };
1780
1781 if (a.elements.length === 0) {
1782 return els;
1783 }
1784
1785 var animateInstance;
1786
1787 for (var i = 0; i < a.elements.length; i += 1) {
1788 if (a.elements[i].dom7AnimateInstance) {
1789 animateInstance = a.elements[i].dom7AnimateInstance;
1790 } else a.elements[i].dom7AnimateInstance = a;
1791 }
1792
1793 if (!animateInstance) {
1794 animateInstance = a;
1795 }
1796
1797 if (initialProps === 'stop') {
1798 animateInstance.stop();
1799 } else {
1800 animateInstance.animate(a.props, a.params);
1801 }
1802
1803 return els;
1804 }
1805
1806 function stop() {
1807 var els = this;
1808
1809 for (var i = 0; i < els.length; i += 1) {
1810 if (els[i].dom7AnimateInstance) {
1811 els[i].dom7AnimateInstance.stop();
1812 }
1813 }
1814 }
1815
1816 var noTrigger = 'resize scroll'.split(' ');
1817
1818 function shortcut(name) {
1819 function eventHandler() {
1820 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
1821 args[_key] = arguments[_key];
1822 }
1823
1824 if (typeof args[0] === 'undefined') {
1825 for (var i = 0; i < this.length; i += 1) {
1826 if (noTrigger.indexOf(name) < 0) {
1827 if (name in this[i]) this[i][name]();else {
1828 $$1(this[i]).trigger(name);
1829 }
1830 }
1831 }
1832
1833 return this;
1834 }
1835
1836 return this.on.apply(this, [name].concat(args));
1837 }
1838
1839 return eventHandler;
1840 }
1841
1842 var click = shortcut('click');
1843 var blur = shortcut('blur');
1844 var focus = shortcut('focus');
1845 var focusin = shortcut('focusin');
1846 var focusout = shortcut('focusout');
1847 var keyup = shortcut('keyup');
1848 var keydown = shortcut('keydown');
1849 var keypress = shortcut('keypress');
1850 var submit = shortcut('submit');
1851 var change = shortcut('change');
1852 var mousedown = shortcut('mousedown');
1853 var mousemove = shortcut('mousemove');
1854 var mouseup = shortcut('mouseup');
1855 var mouseenter = shortcut('mouseenter');
1856 var mouseleave = shortcut('mouseleave');
1857 var mouseout = shortcut('mouseout');
1858 var mouseover = shortcut('mouseover');
1859 var touchstart = shortcut('touchstart');
1860 var touchend = shortcut('touchend');
1861 var touchmove = shortcut('touchmove');
1862 var resize = shortcut('resize');
1863 var scroll = shortcut('scroll');
1864
1865 var methods = /*#__PURE__*/Object.freeze({
1866 __proto__: null,
1867 'default': $$1,
1868 $: $$1,
1869 add: add,
1870 addClass: addClass,
1871 animate: animate,
1872 animationEnd: animationEnd,
1873 append: append,
1874 appendTo: appendTo,
1875 attr: attr,
1876 blur: blur,
1877 change: change,
1878 children: children,
1879 click: click,
1880 closest: closest,
1881 css: css,
1882 data: data,
1883 dataset: dataset,
1884 detach: detach,
1885 each: each,
1886 empty: empty,
1887 eq: eq,
1888 filter: filter,
1889 find: find,
1890 focus: focus,
1891 focusin: focusin,
1892 focusout: focusout,
1893 hasClass: hasClass,
1894 height: height,
1895 hide: hide,
1896 html: html,
1897 index: index,
1898 insertAfter: insertAfter,
1899 insertBefore: insertBefore$1,
1900 is: is,
1901 keydown: keydown,
1902 keypress: keypress,
1903 keyup: keyup,
1904 mousedown: mousedown,
1905 mouseenter: mouseenter,
1906 mouseleave: mouseleave,
1907 mousemove: mousemove,
1908 mouseout: mouseout,
1909 mouseover: mouseover,
1910 mouseup: mouseup,
1911 next: next,
1912 nextAll: nextAll,
1913 off: off,
1914 offset: offset,
1915 on: on,
1916 once: once,
1917 outerHeight: outerHeight,
1918 outerWidth: outerWidth,
1919 parent: parent,
1920 parents: parents,
1921 prepend: prepend,
1922 prependTo: prependTo,
1923 prev: prev,
1924 prevAll: prevAll,
1925 prop: prop,
1926 remove: remove,
1927 removeAttr: removeAttr,
1928 removeClass: removeClass,
1929 removeData: removeData,
1930 resize: resize,
1931 scroll: scroll,
1932 scrollLeft: scrollLeft,
1933 scrollTo: scrollTo,
1934 scrollTop: scrollTop,
1935 show: show,
1936 siblings: siblings,
1937 stop: stop,
1938 styles: styles,
1939 submit: submit,
1940 text: text,
1941 toggleClass: toggleClass,
1942 touchend: touchend,
1943 touchmove: touchmove,
1944 touchstart: touchstart,
1945 transform: transform,
1946 transition: transition$1,
1947 transitionEnd: transitionEnd$1,
1948 trigger: trigger,
1949 val: val,
1950 value: value,
1951 width: width
1952 });
1953
1954 Object.keys(methods).forEach(function (methodName) {
1955 if (methodName === '$') return;
1956 $$1.fn[methodName] = methods[methodName];
1957 });
1958 var $ = $$1;
1959
1960 var REACT_ELEMENT_TYPE;
1961
1962 function _jsx(type, props, key, children) {
1963 if (!REACT_ELEMENT_TYPE) {
1964 REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") || 0xeac7;
1965 }
1966
1967 var defaultProps = type && type.defaultProps;
1968 var childrenLength = arguments.length - 3;
1969
1970 if (!props && childrenLength !== 0) {
1971 props = {
1972 children: void 0
1973 };
1974 }
1975
1976 if (childrenLength === 1) {
1977 props.children = children;
1978 } else if (childrenLength > 1) {
1979 var childArray = new Array(childrenLength);
1980
1981 for (var i = 0; i < childrenLength; i++) {
1982 childArray[i] = arguments[i + 3];
1983 }
1984
1985 props.children = childArray;
1986 }
1987
1988 if (props && defaultProps) {
1989 for (var propName in defaultProps) {
1990 if (props[propName] === void 0) {
1991 props[propName] = defaultProps[propName];
1992 }
1993 }
1994 } else if (!props) {
1995 props = defaultProps || {};
1996 }
1997
1998 return {
1999 $$typeof: REACT_ELEMENT_TYPE,
2000 type: type,
2001 key: key === undefined ? null : "" + key,
2002 ref: null,
2003 props: props,
2004 _owner: null
2005 };
2006 }
2007
2008 function ownKeys(object, enumerableOnly) {
2009 var keys = Object.keys(object);
2010
2011 if (Object.getOwnPropertySymbols) {
2012 var symbols = Object.getOwnPropertySymbols(object);
2013
2014 if (enumerableOnly) {
2015 symbols = symbols.filter(function (sym) {
2016 return Object.getOwnPropertyDescriptor(object, sym).enumerable;
2017 });
2018 }
2019
2020 keys.push.apply(keys, symbols);
2021 }
2022
2023 return keys;
2024 }
2025
2026 function _objectSpread2(target) {
2027 for (var i = 1; i < arguments.length; i++) {
2028 var source = arguments[i] != null ? arguments[i] : {};
2029
2030 if (i % 2) {
2031 ownKeys(Object(source), true).forEach(function (key) {
2032 _defineProperty(target, key, source[key]);
2033 });
2034 } else if (Object.getOwnPropertyDescriptors) {
2035 Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
2036 } else {
2037 ownKeys(Object(source)).forEach(function (key) {
2038 Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
2039 });
2040 }
2041 }
2042
2043 return target;
2044 }
2045
2046 function _typeof(obj) {
2047 "@babel/helpers - typeof";
2048
2049 if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
2050 _typeof = function (obj) {
2051 return typeof obj;
2052 };
2053 } else {
2054 _typeof = function (obj) {
2055 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
2056 };
2057 }
2058
2059 return _typeof(obj);
2060 }
2061
2062 function _wrapRegExp() {
2063 _wrapRegExp = function (re, groups) {
2064 return new BabelRegExp(re, undefined, groups);
2065 };
2066
2067 var _super = RegExp.prototype;
2068
2069 var _groups = new WeakMap();
2070
2071 function BabelRegExp(re, flags, groups) {
2072 var _this = new RegExp(re, flags);
2073
2074 _groups.set(_this, groups || _groups.get(re));
2075
2076 return _setPrototypeOf(_this, BabelRegExp.prototype);
2077 }
2078
2079 _inherits(BabelRegExp, RegExp);
2080
2081 BabelRegExp.prototype.exec = function (str) {
2082 var result = _super.exec.call(this, str);
2083
2084 if (result) result.groups = buildGroups(result, this);
2085 return result;
2086 };
2087
2088 BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
2089 if (typeof substitution === "string") {
2090 var groups = _groups.get(this);
2091
2092 return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
2093 return "$" + groups[name];
2094 }));
2095 } else if (typeof substitution === "function") {
2096 var _this = this;
2097
2098 return _super[Symbol.replace].call(this, str, function () {
2099 var args = arguments;
2100
2101 if (typeof args[args.length - 1] !== "object") {
2102 args = [].slice.call(args);
2103 args.push(buildGroups(args, _this));
2104 }
2105
2106 return substitution.apply(this, args);
2107 });
2108 } else {
2109 return _super[Symbol.replace].call(this, str, substitution);
2110 }
2111 };
2112
2113 function buildGroups(result, re) {
2114 var g = _groups.get(re);
2115
2116 return Object.keys(g).reduce(function (groups, name) {
2117 groups[name] = result[g[name]];
2118 return groups;
2119 }, Object.create(null));
2120 }
2121
2122 return _wrapRegExp.apply(this, arguments);
2123 }
2124
2125 function _asyncIterator(iterable) {
2126 var method;
2127
2128 if (typeof Symbol !== "undefined") {
2129 if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator];
2130 if (method == null && Symbol.iterator) method = iterable[Symbol.iterator];
2131 }
2132
2133 if (method == null) method = iterable["@@asyncIterator"];
2134 if (method == null) method = iterable["@@iterator"];
2135 if (method == null) throw new TypeError("Object is not async iterable");
2136 return method.call(iterable);
2137 }
2138
2139 function _AwaitValue(value) {
2140 this.wrapped = value;
2141 }
2142
2143 function _AsyncGenerator(gen) {
2144 var front, back;
2145
2146 function send(key, arg) {
2147 return new Promise(function (resolve, reject) {
2148 var request = {
2149 key: key,
2150 arg: arg,
2151 resolve: resolve,
2152 reject: reject,
2153 next: null
2154 };
2155
2156 if (back) {
2157 back = back.next = request;
2158 } else {
2159 front = back = request;
2160 resume(key, arg);
2161 }
2162 });
2163 }
2164
2165 function resume(key, arg) {
2166 try {
2167 var result = gen[key](arg);
2168 var value = result.value;
2169 var wrappedAwait = value instanceof _AwaitValue;
2170 Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
2171 if (wrappedAwait) {
2172 resume(key === "return" ? "return" : "next", arg);
2173 return;
2174 }
2175
2176 settle(result.done ? "return" : "normal", arg);
2177 }, function (err) {
2178 resume("throw", err);
2179 });
2180 } catch (err) {
2181 settle("throw", err);
2182 }
2183 }
2184
2185 function settle(type, value) {
2186 switch (type) {
2187 case "return":
2188 front.resolve({
2189 value: value,
2190 done: true
2191 });
2192 break;
2193
2194 case "throw":
2195 front.reject(value);
2196 break;
2197
2198 default:
2199 front.resolve({
2200 value: value,
2201 done: false
2202 });
2203 break;
2204 }
2205
2206 front = front.next;
2207
2208 if (front) {
2209 resume(front.key, front.arg);
2210 } else {
2211 back = null;
2212 }
2213 }
2214
2215 this._invoke = send;
2216
2217 if (typeof gen.return !== "function") {
2218 this.return = undefined;
2219 }
2220 }
2221
2222 _AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
2223 return this;
2224 };
2225
2226 _AsyncGenerator.prototype.next = function (arg) {
2227 return this._invoke("next", arg);
2228 };
2229
2230 _AsyncGenerator.prototype.throw = function (arg) {
2231 return this._invoke("throw", arg);
2232 };
2233
2234 _AsyncGenerator.prototype.return = function (arg) {
2235 return this._invoke("return", arg);
2236 };
2237
2238 function _wrapAsyncGenerator(fn) {
2239 return function () {
2240 return new _AsyncGenerator(fn.apply(this, arguments));
2241 };
2242 }
2243
2244 function _awaitAsyncGenerator(value) {
2245 return new _AwaitValue(value);
2246 }
2247
2248 function _asyncGeneratorDelegate(inner, awaitWrap) {
2249 var iter = {},
2250 waiting = false;
2251
2252 function pump(key, value) {
2253 waiting = true;
2254 value = new Promise(function (resolve) {
2255 resolve(inner[key](value));
2256 });
2257 return {
2258 done: false,
2259 value: awaitWrap(value)
2260 };
2261 }
2262
2263 ;
2264
2265 iter[typeof Symbol !== "undefined" && Symbol.iterator || "@@iterator"] = function () {
2266 return this;
2267 };
2268
2269 iter.next = function (value) {
2270 if (waiting) {
2271 waiting = false;
2272 return value;
2273 }
2274
2275 return pump("next", value);
2276 };
2277
2278 if (typeof inner.throw === "function") {
2279 iter.throw = function (value) {
2280 if (waiting) {
2281 waiting = false;
2282 throw value;
2283 }
2284
2285 return pump("throw", value);
2286 };
2287 }
2288
2289 if (typeof inner.return === "function") {
2290 iter.return = function (value) {
2291 if (waiting) {
2292 waiting = false;
2293 return value;
2294 }
2295
2296 return pump("return", value);
2297 };
2298 }
2299
2300 return iter;
2301 }
2302
2303 function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2304 try {
2305 var info = gen[key](arg);
2306 var value = info.value;
2307 } catch (error) {
2308 reject(error);
2309 return;
2310 }
2311
2312 if (info.done) {
2313 resolve(value);
2314 } else {
2315 Promise.resolve(value).then(_next, _throw);
2316 }
2317 }
2318
2319 function _asyncToGenerator(fn) {
2320 return function () {
2321 var self = this,
2322 args = arguments;
2323 return new Promise(function (resolve, reject) {
2324 var gen = fn.apply(self, args);
2325
2326 function _next(value) {
2327 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
2328 }
2329
2330 function _throw(err) {
2331 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
2332 }
2333
2334 _next(undefined);
2335 });
2336 };
2337 }
2338
2339 function _classCallCheck(instance, Constructor) {
2340 if (!(instance instanceof Constructor)) {
2341 throw new TypeError("Cannot call a class as a function");
2342 }
2343 }
2344
2345 function _defineProperties$1(target, props) {
2346 for (var i = 0; i < props.length; i++) {
2347 var descriptor = props[i];
2348 descriptor.enumerable = descriptor.enumerable || false;
2349 descriptor.configurable = true;
2350 if ("value" in descriptor) descriptor.writable = true;
2351 Object.defineProperty(target, descriptor.key, descriptor);
2352 }
2353 }
2354
2355 function _createClass$1(Constructor, protoProps, staticProps) {
2356 if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);
2357 if (staticProps) _defineProperties$1(Constructor, staticProps);
2358 return Constructor;
2359 }
2360
2361 function _defineEnumerableProperties(obj, descs) {
2362 for (var key in descs) {
2363 var desc = descs[key];
2364 desc.configurable = desc.enumerable = true;
2365 if ("value" in desc) desc.writable = true;
2366 Object.defineProperty(obj, key, desc);
2367 }
2368
2369 if (Object.getOwnPropertySymbols) {
2370 var objectSymbols = Object.getOwnPropertySymbols(descs);
2371
2372 for (var i = 0; i < objectSymbols.length; i++) {
2373 var sym = objectSymbols[i];
2374 var desc = descs[sym];
2375 desc.configurable = desc.enumerable = true;
2376 if ("value" in desc) desc.writable = true;
2377 Object.defineProperty(obj, sym, desc);
2378 }
2379 }
2380
2381 return obj;
2382 }
2383
2384 function _defaults(obj, defaults) {
2385 var keys = Object.getOwnPropertyNames(defaults);
2386
2387 for (var i = 0; i < keys.length; i++) {
2388 var key = keys[i];
2389 var value = Object.getOwnPropertyDescriptor(defaults, key);
2390
2391 if (value && value.configurable && obj[key] === undefined) {
2392 Object.defineProperty(obj, key, value);
2393 }
2394 }
2395
2396 return obj;
2397 }
2398
2399 function _defineProperty(obj, key, value) {
2400 if (key in obj) {
2401 Object.defineProperty(obj, key, {
2402 value: value,
2403 enumerable: true,
2404 configurable: true,
2405 writable: true
2406 });
2407 } else {
2408 obj[key] = value;
2409 }
2410
2411 return obj;
2412 }
2413
2414 function _extends$j() {
2415 _extends$j = Object.assign || function (target) {
2416 for (var i = 1; i < arguments.length; i++) {
2417 var source = arguments[i];
2418
2419 for (var key in source) {
2420 if (Object.prototype.hasOwnProperty.call(source, key)) {
2421 target[key] = source[key];
2422 }
2423 }
2424 }
2425
2426 return target;
2427 };
2428
2429 return _extends$j.apply(this, arguments);
2430 }
2431
2432 function _objectSpread(target) {
2433 for (var i = 1; i < arguments.length; i++) {
2434 var source = arguments[i] != null ? Object(arguments[i]) : {};
2435 var ownKeys = Object.keys(source);
2436
2437 if (typeof Object.getOwnPropertySymbols === 'function') {
2438 ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
2439 return Object.getOwnPropertyDescriptor(source, sym).enumerable;
2440 }));
2441 }
2442
2443 ownKeys.forEach(function (key) {
2444 _defineProperty(target, key, source[key]);
2445 });
2446 }
2447
2448 return target;
2449 }
2450
2451 function _inherits(subClass, superClass) {
2452 if (typeof superClass !== "function" && superClass !== null) {
2453 throw new TypeError("Super expression must either be null or a function");
2454 }
2455
2456 subClass.prototype = Object.create(superClass && superClass.prototype, {
2457 constructor: {
2458 value: subClass,
2459 writable: true,
2460 configurable: true
2461 }
2462 });
2463 if (superClass) _setPrototypeOf(subClass, superClass);
2464 }
2465
2466 function _inheritsLoose(subClass, superClass) {
2467 subClass.prototype = Object.create(superClass.prototype);
2468 subClass.prototype.constructor = subClass;
2469
2470 _setPrototypeOf(subClass, superClass);
2471 }
2472
2473 function _getPrototypeOf(o) {
2474 _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
2475 return o.__proto__ || Object.getPrototypeOf(o);
2476 };
2477 return _getPrototypeOf(o);
2478 }
2479
2480 function _setPrototypeOf(o, p) {
2481 _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
2482 o.__proto__ = p;
2483 return o;
2484 };
2485
2486 return _setPrototypeOf(o, p);
2487 }
2488
2489 function _isNativeReflectConstruct() {
2490 if (typeof Reflect === "undefined" || !Reflect.construct) return false;
2491 if (Reflect.construct.sham) return false;
2492 if (typeof Proxy === "function") return true;
2493
2494 try {
2495 Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
2496 return true;
2497 } catch (e) {
2498 return false;
2499 }
2500 }
2501
2502 function _construct(Parent, args, Class) {
2503 if (_isNativeReflectConstruct()) {
2504 _construct = Reflect.construct;
2505 } else {
2506 _construct = function _construct(Parent, args, Class) {
2507 var a = [null];
2508 a.push.apply(a, args);
2509 var Constructor = Function.bind.apply(Parent, a);
2510 var instance = new Constructor();
2511 if (Class) _setPrototypeOf(instance, Class.prototype);
2512 return instance;
2513 };
2514 }
2515
2516 return _construct.apply(null, arguments);
2517 }
2518
2519 function _isNativeFunction(fn) {
2520 return Function.toString.call(fn).indexOf("[native code]") !== -1;
2521 }
2522
2523 function _wrapNativeSuper(Class) {
2524 var _cache = typeof Map === "function" ? new Map() : undefined;
2525
2526 _wrapNativeSuper = function _wrapNativeSuper(Class) {
2527 if (Class === null || !_isNativeFunction(Class)) return Class;
2528
2529 if (typeof Class !== "function") {
2530 throw new TypeError("Super expression must either be null or a function");
2531 }
2532
2533 if (typeof _cache !== "undefined") {
2534 if (_cache.has(Class)) return _cache.get(Class);
2535
2536 _cache.set(Class, Wrapper);
2537 }
2538
2539 function Wrapper() {
2540 return _construct(Class, arguments, _getPrototypeOf(this).constructor);
2541 }
2542
2543 Wrapper.prototype = Object.create(Class.prototype, {
2544 constructor: {
2545 value: Wrapper,
2546 enumerable: false,
2547 writable: true,
2548 configurable: true
2549 }
2550 });
2551 return _setPrototypeOf(Wrapper, Class);
2552 };
2553
2554 return _wrapNativeSuper(Class);
2555 }
2556
2557 function _instanceof(left, right) {
2558 if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
2559 return !!right[Symbol.hasInstance](left);
2560 } else {
2561 return left instanceof right;
2562 }
2563 }
2564
2565 function _interopRequireDefault(obj) {
2566 return obj && obj.__esModule ? obj : {
2567 default: obj
2568 };
2569 }
2570
2571 function _getRequireWildcardCache(nodeInterop) {
2572 if (typeof WeakMap !== "function") return null;
2573 var cacheBabelInterop = new WeakMap();
2574 var cacheNodeInterop = new WeakMap();
2575 return (_getRequireWildcardCache = function (nodeInterop) {
2576 return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
2577 })(nodeInterop);
2578 }
2579
2580 function _interopRequireWildcard(obj, nodeInterop) {
2581 if (!nodeInterop && obj && obj.__esModule) {
2582 return obj;
2583 }
2584
2585 if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
2586 return {
2587 default: obj
2588 };
2589 }
2590
2591 var cache = _getRequireWildcardCache(nodeInterop);
2592
2593 if (cache && cache.has(obj)) {
2594 return cache.get(obj);
2595 }
2596
2597 var newObj = {};
2598 var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
2599
2600 for (var key in obj) {
2601 if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
2602 var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
2603
2604 if (desc && (desc.get || desc.set)) {
2605 Object.defineProperty(newObj, key, desc);
2606 } else {
2607 newObj[key] = obj[key];
2608 }
2609 }
2610 }
2611
2612 newObj.default = obj;
2613
2614 if (cache) {
2615 cache.set(obj, newObj);
2616 }
2617
2618 return newObj;
2619 }
2620
2621 function _newArrowCheck(innerThis, boundThis) {
2622 if (innerThis !== boundThis) {
2623 throw new TypeError("Cannot instantiate an arrow function");
2624 }
2625 }
2626
2627 function _objectDestructuringEmpty(obj) {
2628 if (obj == null) throw new TypeError("Cannot destructure undefined");
2629 }
2630
2631 function _objectWithoutPropertiesLoose(source, excluded) {
2632 if (source == null) return {};
2633 var target = {};
2634 var sourceKeys = Object.keys(source);
2635 var key, i;
2636
2637 for (i = 0; i < sourceKeys.length; i++) {
2638 key = sourceKeys[i];
2639 if (excluded.indexOf(key) >= 0) continue;
2640 target[key] = source[key];
2641 }
2642
2643 return target;
2644 }
2645
2646 function _objectWithoutProperties(source, excluded) {
2647 if (source == null) return {};
2648
2649 var target = _objectWithoutPropertiesLoose(source, excluded);
2650
2651 var key, i;
2652
2653 if (Object.getOwnPropertySymbols) {
2654 var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
2655
2656 for (i = 0; i < sourceSymbolKeys.length; i++) {
2657 key = sourceSymbolKeys[i];
2658 if (excluded.indexOf(key) >= 0) continue;
2659 if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
2660 target[key] = source[key];
2661 }
2662 }
2663
2664 return target;
2665 }
2666
2667 function _assertThisInitialized(self) {
2668 if (self === void 0) {
2669 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
2670 }
2671
2672 return self;
2673 }
2674
2675 function _possibleConstructorReturn(self, call) {
2676 if (call && (typeof call === "object" || typeof call === "function")) {
2677 return call;
2678 }
2679
2680 return _assertThisInitialized(self);
2681 }
2682
2683 function _createSuper(Derived) {
2684 var hasNativeReflectConstruct = _isNativeReflectConstruct();
2685
2686 return function _createSuperInternal() {
2687 var Super = _getPrototypeOf(Derived),
2688 result;
2689
2690 if (hasNativeReflectConstruct) {
2691 var NewTarget = _getPrototypeOf(this).constructor;
2692
2693 result = Reflect.construct(Super, arguments, NewTarget);
2694 } else {
2695 result = Super.apply(this, arguments);
2696 }
2697
2698 return _possibleConstructorReturn(this, result);
2699 };
2700 }
2701
2702 function _superPropBase(object, property) {
2703 while (!Object.prototype.hasOwnProperty.call(object, property)) {
2704 object = _getPrototypeOf(object);
2705 if (object === null) break;
2706 }
2707
2708 return object;
2709 }
2710
2711 function _get(target, property, receiver) {
2712 if (typeof Reflect !== "undefined" && Reflect.get) {
2713 _get = Reflect.get;
2714 } else {
2715 _get = function _get(target, property, receiver) {
2716 var base = _superPropBase(target, property);
2717
2718 if (!base) return;
2719 var desc = Object.getOwnPropertyDescriptor(base, property);
2720
2721 if (desc.get) {
2722 return desc.get.call(receiver);
2723 }
2724
2725 return desc.value;
2726 };
2727 }
2728
2729 return _get(target, property, receiver || target);
2730 }
2731
2732 function set(target, property, value, receiver) {
2733 if (typeof Reflect !== "undefined" && Reflect.set) {
2734 set = Reflect.set;
2735 } else {
2736 set = function set(target, property, value, receiver) {
2737 var base = _superPropBase(target, property);
2738
2739 var desc;
2740
2741 if (base) {
2742 desc = Object.getOwnPropertyDescriptor(base, property);
2743
2744 if (desc.set) {
2745 desc.set.call(receiver, value);
2746 return true;
2747 } else if (!desc.writable) {
2748 return false;
2749 }
2750 }
2751
2752 desc = Object.getOwnPropertyDescriptor(receiver, property);
2753
2754 if (desc) {
2755 if (!desc.writable) {
2756 return false;
2757 }
2758
2759 desc.value = value;
2760 Object.defineProperty(receiver, property, desc);
2761 } else {
2762 _defineProperty(receiver, property, value);
2763 }
2764
2765 return true;
2766 };
2767 }
2768
2769 return set(target, property, value, receiver);
2770 }
2771
2772 function _set(target, property, value, receiver, isStrict) {
2773 var s = set(target, property, value, receiver || target);
2774
2775 if (!s && isStrict) {
2776 throw new Error('failed to set property');
2777 }
2778
2779 return value;
2780 }
2781
2782 function _taggedTemplateLiteral(strings, raw) {
2783 if (!raw) {
2784 raw = strings.slice(0);
2785 }
2786
2787 return Object.freeze(Object.defineProperties(strings, {
2788 raw: {
2789 value: Object.freeze(raw)
2790 }
2791 }));
2792 }
2793
2794 function _taggedTemplateLiteralLoose(strings, raw) {
2795 if (!raw) {
2796 raw = strings.slice(0);
2797 }
2798
2799 strings.raw = raw;
2800 return strings;
2801 }
2802
2803 function _readOnlyError(name) {
2804 throw new TypeError("\"" + name + "\" is read-only");
2805 }
2806
2807 function _writeOnlyError(name) {
2808 throw new TypeError("\"" + name + "\" is write-only");
2809 }
2810
2811 function _classNameTDZError(name) {
2812 throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys.");
2813 }
2814
2815 function _temporalUndefined() {}
2816
2817 function _tdz(name) {
2818 throw new ReferenceError(name + " is not defined - temporal dead zone");
2819 }
2820
2821 function _temporalRef(val, name) {
2822 return val === _temporalUndefined ? _tdz(name) : val;
2823 }
2824
2825 function _slicedToArray(arr, i) {
2826 return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
2827 }
2828
2829 function _slicedToArrayLoose(arr, i) {
2830 return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
2831 }
2832
2833 function _toArray(arr) {
2834 return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
2835 }
2836
2837 function _toConsumableArray(arr) {
2838 return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
2839 }
2840
2841 function _arrayWithoutHoles(arr) {
2842 if (Array.isArray(arr)) return _arrayLikeToArray(arr);
2843 }
2844
2845 function _arrayWithHoles(arr) {
2846 if (Array.isArray(arr)) return arr;
2847 }
2848
2849 function _maybeArrayLike(next, arr, i) {
2850 if (arr && !Array.isArray(arr) && typeof arr.length === "number") {
2851 var len = arr.length;
2852 return _arrayLikeToArray(arr, i !== void 0 && i < len ? i : len);
2853 }
2854
2855 return next(arr, i);
2856 }
2857
2858 function _iterableToArray(iter) {
2859 if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
2860 }
2861
2862 function _iterableToArrayLimit(arr, i) {
2863 var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
2864
2865 if (_i == null) return;
2866 var _arr = [];
2867 var _n = true;
2868 var _d = false;
2869
2870 var _s, _e;
2871
2872 try {
2873 for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
2874 _arr.push(_s.value);
2875
2876 if (i && _arr.length === i) break;
2877 }
2878 } catch (err) {
2879 _d = true;
2880 _e = err;
2881 } finally {
2882 try {
2883 if (!_n && _i["return"] != null) _i["return"]();
2884 } finally {
2885 if (_d) throw _e;
2886 }
2887 }
2888
2889 return _arr;
2890 }
2891
2892 function _iterableToArrayLimitLoose(arr, i) {
2893 var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
2894
2895 if (_i == null) return;
2896 var _arr = [];
2897
2898 for (_i = _i.call(arr), _step; !(_step = _i.next()).done;) {
2899 _arr.push(_step.value);
2900
2901 if (i && _arr.length === i) break;
2902 }
2903
2904 return _arr;
2905 }
2906
2907 function _unsupportedIterableToArray(o, minLen) {
2908 if (!o) return;
2909 if (typeof o === "string") return _arrayLikeToArray(o, minLen);
2910 var n = Object.prototype.toString.call(o).slice(8, -1);
2911 if (n === "Object" && o.constructor) n = o.constructor.name;
2912 if (n === "Map" || n === "Set") return Array.from(o);
2913 if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
2914 }
2915
2916 function _arrayLikeToArray(arr, len) {
2917 if (len == null || len > arr.length) len = arr.length;
2918
2919 for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
2920
2921 return arr2;
2922 }
2923
2924 function _nonIterableSpread() {
2925 throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
2926 }
2927
2928 function _nonIterableRest() {
2929 throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
2930 }
2931
2932 function _createForOfIteratorHelper(o, allowArrayLike) {
2933 var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
2934
2935 if (!it) {
2936 if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
2937 if (it) o = it;
2938 var i = 0;
2939
2940 var F = function () {};
2941
2942 return {
2943 s: F,
2944 n: function () {
2945 if (i >= o.length) return {
2946 done: true
2947 };
2948 return {
2949 done: false,
2950 value: o[i++]
2951 };
2952 },
2953 e: function (e) {
2954 throw e;
2955 },
2956 f: F
2957 };
2958 }
2959
2960 throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
2961 }
2962
2963 var normalCompletion = true,
2964 didErr = false,
2965 err;
2966 return {
2967 s: function () {
2968 it = it.call(o);
2969 },
2970 n: function () {
2971 var step = it.next();
2972 normalCompletion = step.done;
2973 return step;
2974 },
2975 e: function (e) {
2976 didErr = true;
2977 err = e;
2978 },
2979 f: function () {
2980 try {
2981 if (!normalCompletion && it.return != null) it.return();
2982 } finally {
2983 if (didErr) throw err;
2984 }
2985 }
2986 };
2987 }
2988
2989 function _createForOfIteratorHelperLoose(o, allowArrayLike) {
2990 var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
2991 if (it) return (it = it.call(o)).next.bind(it);
2992
2993 if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
2994 if (it) o = it;
2995 var i = 0;
2996 return function () {
2997 if (i >= o.length) return {
2998 done: true
2999 };
3000 return {
3001 done: false,
3002 value: o[i++]
3003 };
3004 };
3005 }
3006
3007 throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
3008 }
3009
3010 function _skipFirstGeneratorNext(fn) {
3011 return function () {
3012 var it = fn.apply(this, arguments);
3013 it.next();
3014 return it;
3015 };
3016 }
3017
3018 function _toPrimitive(input, hint) {
3019 if (typeof input !== "object" || input === null) return input;
3020 var prim = input[Symbol.toPrimitive];
3021
3022 if (prim !== undefined) {
3023 var res = prim.call(input, hint || "default");
3024 if (typeof res !== "object") return res;
3025 throw new TypeError("@@toPrimitive must return a primitive value.");
3026 }
3027
3028 return (hint === "string" ? String : Number)(input);
3029 }
3030
3031 function _toPropertyKey(arg) {
3032 var key = _toPrimitive(arg, "string");
3033
3034 return typeof key === "symbol" ? key : String(key);
3035 }
3036
3037 function _initializerWarningHelper(descriptor, context) {
3038 throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.');
3039 }
3040
3041 function _initializerDefineProperty(target, property, descriptor, context) {
3042 if (!descriptor) return;
3043 Object.defineProperty(target, property, {
3044 enumerable: descriptor.enumerable,
3045 configurable: descriptor.configurable,
3046 writable: descriptor.writable,
3047 value: descriptor.initializer ? descriptor.initializer.call(context) : void 0
3048 });
3049 }
3050
3051 function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
3052 var desc = {};
3053 Object.keys(descriptor).forEach(function (key) {
3054 desc[key] = descriptor[key];
3055 });
3056 desc.enumerable = !!desc.enumerable;
3057 desc.configurable = !!desc.configurable;
3058
3059 if ('value' in desc || desc.initializer) {
3060 desc.writable = true;
3061 }
3062
3063 desc = decorators.slice().reverse().reduce(function (desc, decorator) {
3064 return decorator(target, property, desc) || desc;
3065 }, desc);
3066
3067 if (context && desc.initializer !== void 0) {
3068 desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
3069 desc.initializer = undefined;
3070 }
3071
3072 if (desc.initializer === void 0) {
3073 Object.defineProperty(target, property, desc);
3074 desc = null;
3075 }
3076
3077 return desc;
3078 }
3079
3080 var id$1 = 0;
3081
3082 function _classPrivateFieldLooseKey(name) {
3083 return "__private_" + id$1++ + "_" + name;
3084 }
3085
3086 function _classPrivateFieldLooseBase(receiver, privateKey) {
3087 if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
3088 throw new TypeError("attempted to use private field on non-instance");
3089 }
3090
3091 return receiver;
3092 }
3093
3094 function _classPrivateFieldGet(receiver, privateMap) {
3095 var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get");
3096
3097 return _classApplyDescriptorGet(receiver, descriptor);
3098 }
3099
3100 function _classPrivateFieldSet(receiver, privateMap, value) {
3101 var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
3102
3103 _classApplyDescriptorSet(receiver, descriptor, value);
3104
3105 return value;
3106 }
3107
3108 function _classPrivateFieldDestructureSet(receiver, privateMap) {
3109 var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set");
3110
3111 return _classApplyDescriptorDestructureSet(receiver, descriptor);
3112 }
3113
3114 function _classExtractFieldDescriptor(receiver, privateMap, action) {
3115 if (!privateMap.has(receiver)) {
3116 throw new TypeError("attempted to " + action + " private field on non-instance");
3117 }
3118
3119 return privateMap.get(receiver);
3120 }
3121
3122 function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) {
3123 _classCheckPrivateStaticAccess(receiver, classConstructor);
3124
3125 _classCheckPrivateStaticFieldDescriptor(descriptor, "get");
3126
3127 return _classApplyDescriptorGet(receiver, descriptor);
3128 }
3129
3130 function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) {
3131 _classCheckPrivateStaticAccess(receiver, classConstructor);
3132
3133 _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
3134
3135 _classApplyDescriptorSet(receiver, descriptor, value);
3136
3137 return value;
3138 }
3139
3140 function _classStaticPrivateMethodGet(receiver, classConstructor, method) {
3141 _classCheckPrivateStaticAccess(receiver, classConstructor);
3142
3143 return method;
3144 }
3145
3146 function _classStaticPrivateMethodSet() {
3147 throw new TypeError("attempted to set read only static private field");
3148 }
3149
3150 function _classApplyDescriptorGet(receiver, descriptor) {
3151 if (descriptor.get) {
3152 return descriptor.get.call(receiver);
3153 }
3154
3155 return descriptor.value;
3156 }
3157
3158 function _classApplyDescriptorSet(receiver, descriptor, value) {
3159 if (descriptor.set) {
3160 descriptor.set.call(receiver, value);
3161 } else {
3162 if (!descriptor.writable) {
3163 throw new TypeError("attempted to set read only private field");
3164 }
3165
3166 descriptor.value = value;
3167 }
3168 }
3169
3170 function _classApplyDescriptorDestructureSet(receiver, descriptor) {
3171 if (descriptor.set) {
3172 if (!("__destrObj" in descriptor)) {
3173 descriptor.__destrObj = {
3174 set value(v) {
3175 descriptor.set.call(receiver, v);
3176 }
3177
3178 };
3179 }
3180
3181 return descriptor.__destrObj;
3182 } else {
3183 if (!descriptor.writable) {
3184 throw new TypeError("attempted to set read only private field");
3185 }
3186
3187 return descriptor;
3188 }
3189 }
3190
3191 function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) {
3192 _classCheckPrivateStaticAccess(receiver, classConstructor);
3193
3194 _classCheckPrivateStaticFieldDescriptor(descriptor, "set");
3195
3196 return _classApplyDescriptorDestructureSet(receiver, descriptor);
3197 }
3198
3199 function _classCheckPrivateStaticAccess(receiver, classConstructor) {
3200 if (receiver !== classConstructor) {
3201 throw new TypeError("Private static access of wrong provenance");
3202 }
3203 }
3204
3205 function _classCheckPrivateStaticFieldDescriptor(descriptor, action) {
3206 if (descriptor === undefined) {
3207 throw new TypeError("attempted to " + action + " private static field before its declaration");
3208 }
3209 }
3210
3211 function _decorate(decorators, factory, superClass, mixins) {
3212 var api = _getDecoratorsApi();
3213
3214 if (mixins) {
3215 for (var i = 0; i < mixins.length; i++) {
3216 api = mixins[i](api);
3217 }
3218 }
3219
3220 var r = factory(function initialize(O) {
3221 api.initializeInstanceElements(O, decorated.elements);
3222 }, superClass);
3223 var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators);
3224 api.initializeClassElements(r.F, decorated.elements);
3225 return api.runClassFinishers(r.F, decorated.finishers);
3226 }
3227
3228 function _getDecoratorsApi() {
3229 _getDecoratorsApi = function () {
3230 return api;
3231 };
3232
3233 var api = {
3234 elementsDefinitionOrder: [["method"], ["field"]],
3235 initializeInstanceElements: function (O, elements) {
3236 ["method", "field"].forEach(function (kind) {
3237 elements.forEach(function (element) {
3238 if (element.kind === kind && element.placement === "own") {
3239 this.defineClassElement(O, element);
3240 }
3241 }, this);
3242 }, this);
3243 },
3244 initializeClassElements: function (F, elements) {
3245 var proto = F.prototype;
3246 ["method", "field"].forEach(function (kind) {
3247 elements.forEach(function (element) {
3248 var placement = element.placement;
3249
3250 if (element.kind === kind && (placement === "static" || placement === "prototype")) {
3251 var receiver = placement === "static" ? F : proto;
3252 this.defineClassElement(receiver, element);
3253 }
3254 }, this);
3255 }, this);
3256 },
3257 defineClassElement: function (receiver, element) {
3258 var descriptor = element.descriptor;
3259
3260 if (element.kind === "field") {
3261 var initializer = element.initializer;
3262 descriptor = {
3263 enumerable: descriptor.enumerable,
3264 writable: descriptor.writable,
3265 configurable: descriptor.configurable,
3266 value: initializer === void 0 ? void 0 : initializer.call(receiver)
3267 };
3268 }
3269
3270 Object.defineProperty(receiver, element.key, descriptor);
3271 },
3272 decorateClass: function (elements, decorators) {
3273 var newElements = [];
3274 var finishers = [];
3275 var placements = {
3276 static: [],
3277 prototype: [],
3278 own: []
3279 };
3280 elements.forEach(function (element) {
3281 this.addElementPlacement(element, placements);
3282 }, this);
3283 elements.forEach(function (element) {
3284 if (!_hasDecorators(element)) return newElements.push(element);
3285 var elementFinishersExtras = this.decorateElement(element, placements);
3286 newElements.push(elementFinishersExtras.element);
3287 newElements.push.apply(newElements, elementFinishersExtras.extras);
3288 finishers.push.apply(finishers, elementFinishersExtras.finishers);
3289 }, this);
3290
3291 if (!decorators) {
3292 return {
3293 elements: newElements,
3294 finishers: finishers
3295 };
3296 }
3297
3298 var result = this.decorateConstructor(newElements, decorators);
3299 finishers.push.apply(finishers, result.finishers);
3300 result.finishers = finishers;
3301 return result;
3302 },
3303 addElementPlacement: function (element, placements, silent) {
3304 var keys = placements[element.placement];
3305
3306 if (!silent && keys.indexOf(element.key) !== -1) {
3307 throw new TypeError("Duplicated element (" + element.key + ")");
3308 }
3309
3310 keys.push(element.key);
3311 },
3312 decorateElement: function (element, placements) {
3313 var extras = [];
3314 var finishers = [];
3315
3316 for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) {
3317 var keys = placements[element.placement];
3318 keys.splice(keys.indexOf(element.key), 1);
3319 var elementObject = this.fromElementDescriptor(element);
3320 var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject);
3321 element = elementFinisherExtras.element;
3322 this.addElementPlacement(element, placements);
3323
3324 if (elementFinisherExtras.finisher) {
3325 finishers.push(elementFinisherExtras.finisher);
3326 }
3327
3328 var newExtras = elementFinisherExtras.extras;
3329
3330 if (newExtras) {
3331 for (var j = 0; j < newExtras.length; j++) {
3332 this.addElementPlacement(newExtras[j], placements);
3333 }
3334
3335 extras.push.apply(extras, newExtras);
3336 }
3337 }
3338
3339 return {
3340 element: element,
3341 finishers: finishers,
3342 extras: extras
3343 };
3344 },
3345 decorateConstructor: function (elements, decorators) {
3346 var finishers = [];
3347
3348 for (var i = decorators.length - 1; i >= 0; i--) {
3349 var obj = this.fromClassDescriptor(elements);
3350 var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj);
3351
3352 if (elementsAndFinisher.finisher !== undefined) {
3353 finishers.push(elementsAndFinisher.finisher);
3354 }
3355
3356 if (elementsAndFinisher.elements !== undefined) {
3357 elements = elementsAndFinisher.elements;
3358
3359 for (var j = 0; j < elements.length - 1; j++) {
3360 for (var k = j + 1; k < elements.length; k++) {
3361 if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) {
3362 throw new TypeError("Duplicated element (" + elements[j].key + ")");
3363 }
3364 }
3365 }
3366 }
3367 }
3368
3369 return {
3370 elements: elements,
3371 finishers: finishers
3372 };
3373 },
3374 fromElementDescriptor: function (element) {
3375 var obj = {
3376 kind: element.kind,
3377 key: element.key,
3378 placement: element.placement,
3379 descriptor: element.descriptor
3380 };
3381 var desc = {
3382 value: "Descriptor",
3383 configurable: true
3384 };
3385 Object.defineProperty(obj, Symbol.toStringTag, desc);
3386 if (element.kind === "field") obj.initializer = element.initializer;
3387 return obj;
3388 },
3389 toElementDescriptors: function (elementObjects) {
3390 if (elementObjects === undefined) return;
3391 return _toArray(elementObjects).map(function (elementObject) {
3392 var element = this.toElementDescriptor(elementObject);
3393 this.disallowProperty(elementObject, "finisher", "An element descriptor");
3394 this.disallowProperty(elementObject, "extras", "An element descriptor");
3395 return element;
3396 }, this);
3397 },
3398 toElementDescriptor: function (elementObject) {
3399 var kind = String(elementObject.kind);
3400
3401 if (kind !== "method" && kind !== "field") {
3402 throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"');
3403 }
3404
3405 var key = _toPropertyKey(elementObject.key);
3406
3407 var placement = String(elementObject.placement);
3408
3409 if (placement !== "static" && placement !== "prototype" && placement !== "own") {
3410 throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"');
3411 }
3412
3413 var descriptor = elementObject.descriptor;
3414 this.disallowProperty(elementObject, "elements", "An element descriptor");
3415 var element = {
3416 kind: kind,
3417 key: key,
3418 placement: placement,
3419 descriptor: Object.assign({}, descriptor)
3420 };
3421
3422 if (kind !== "field") {
3423 this.disallowProperty(elementObject, "initializer", "A method descriptor");
3424 } else {
3425 this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
3426 this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
3427 this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
3428 element.initializer = elementObject.initializer;
3429 }
3430
3431 return element;
3432 },
3433 toElementFinisherExtras: function (elementObject) {
3434 var element = this.toElementDescriptor(elementObject);
3435
3436 var finisher = _optionalCallableProperty(elementObject, "finisher");
3437
3438 var extras = this.toElementDescriptors(elementObject.extras);
3439 return {
3440 element: element,
3441 finisher: finisher,
3442 extras: extras
3443 };
3444 },
3445 fromClassDescriptor: function (elements) {
3446 var obj = {
3447 kind: "class",
3448 elements: elements.map(this.fromElementDescriptor, this)
3449 };
3450 var desc = {
3451 value: "Descriptor",
3452 configurable: true
3453 };
3454 Object.defineProperty(obj, Symbol.toStringTag, desc);
3455 return obj;
3456 },
3457 toClassDescriptor: function (obj) {
3458 var kind = String(obj.kind);
3459
3460 if (kind !== "class") {
3461 throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"');
3462 }
3463
3464 this.disallowProperty(obj, "key", "A class descriptor");
3465 this.disallowProperty(obj, "placement", "A class descriptor");
3466 this.disallowProperty(obj, "descriptor", "A class descriptor");
3467 this.disallowProperty(obj, "initializer", "A class descriptor");
3468 this.disallowProperty(obj, "extras", "A class descriptor");
3469
3470 var finisher = _optionalCallableProperty(obj, "finisher");
3471
3472 var elements = this.toElementDescriptors(obj.elements);
3473 return {
3474 elements: elements,
3475 finisher: finisher
3476 };
3477 },
3478 runClassFinishers: function (constructor, finishers) {
3479 for (var i = 0; i < finishers.length; i++) {
3480 var newConstructor = (0, finishers[i])(constructor);
3481
3482 if (newConstructor !== undefined) {
3483 if (typeof newConstructor !== "function") {
3484 throw new TypeError("Finishers must return a constructor.");
3485 }
3486
3487 constructor = newConstructor;
3488 }
3489 }
3490
3491 return constructor;
3492 },
3493 disallowProperty: function (obj, name, objectType) {
3494 if (obj[name] !== undefined) {
3495 throw new TypeError(objectType + " can't have a ." + name + " property.");
3496 }
3497 }
3498 };
3499 return api;
3500 }
3501
3502 function _createElementDescriptor(def) {
3503 var key = _toPropertyKey(def.key);
3504
3505 var descriptor;
3506
3507 if (def.kind === "method") {
3508 descriptor = {
3509 value: def.value,
3510 writable: true,
3511 configurable: true,
3512 enumerable: false
3513 };
3514 } else if (def.kind === "get") {
3515 descriptor = {
3516 get: def.value,
3517 configurable: true,
3518 enumerable: false
3519 };
3520 } else if (def.kind === "set") {
3521 descriptor = {
3522 set: def.value,
3523 configurable: true,
3524 enumerable: false
3525 };
3526 } else if (def.kind === "field") {
3527 descriptor = {
3528 configurable: true,
3529 writable: true,
3530 enumerable: true
3531 };
3532 }
3533
3534 var element = {
3535 kind: def.kind === "field" ? "field" : "method",
3536 key: key,
3537 placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype",
3538 descriptor: descriptor
3539 };
3540 if (def.decorators) element.decorators = def.decorators;
3541 if (def.kind === "field") element.initializer = def.value;
3542 return element;
3543 }
3544
3545 function _coalesceGetterSetter(element, other) {
3546 if (element.descriptor.get !== undefined) {
3547 other.descriptor.get = element.descriptor.get;
3548 } else {
3549 other.descriptor.set = element.descriptor.set;
3550 }
3551 }
3552
3553 function _coalesceClassElements(elements) {
3554 var newElements = [];
3555
3556 var isSameElement = function (other) {
3557 return other.kind === "method" && other.key === element.key && other.placement === element.placement;
3558 };
3559
3560 for (var i = 0; i < elements.length; i++) {
3561 var element = elements[i];
3562 var other;
3563
3564 if (element.kind === "method" && (other = newElements.find(isSameElement))) {
3565 if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) {
3566 if (_hasDecorators(element) || _hasDecorators(other)) {
3567 throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated.");
3568 }
3569
3570 other.descriptor = element.descriptor;
3571 } else {
3572 if (_hasDecorators(element)) {
3573 if (_hasDecorators(other)) {
3574 throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ").");
3575 }
3576
3577 other.decorators = element.decorators;
3578 }
3579
3580 _coalesceGetterSetter(element, other);
3581 }
3582 } else {
3583 newElements.push(element);
3584 }
3585 }
3586
3587 return newElements;
3588 }
3589
3590 function _hasDecorators(element) {
3591 return element.decorators && element.decorators.length;
3592 }
3593
3594 function _isDataDescriptor(desc) {
3595 return desc !== undefined && !(desc.value === undefined && desc.writable === undefined);
3596 }
3597
3598 function _optionalCallableProperty(obj, name) {
3599 var value = obj[name];
3600
3601 if (value !== undefined && typeof value !== "function") {
3602 throw new TypeError("Expected '" + name + "' to be a function");
3603 }
3604
3605 return value;
3606 }
3607
3608 function _classPrivateMethodGet(receiver, privateSet, fn) {
3609 if (!privateSet.has(receiver)) {
3610 throw new TypeError("attempted to get private field on non-instance");
3611 }
3612
3613 return fn;
3614 }
3615
3616 function _classPrivateMethodSet() {
3617 throw new TypeError("attempted to reassign private method");
3618 }
3619
3620 var uniqueNum = 0;
3621 function uniqueNumber() {
3622 uniqueNum += 1;
3623 return uniqueNum;
3624 }
3625 function id(mask, map) {
3626 if (mask === void 0) {
3627 mask = 'xxxxxxxxxx';
3628 }
3629
3630 if (map === void 0) {
3631 map = '0123456789abcdef';
3632 }
3633
3634 var length = map.length;
3635 return mask.replace(/x/g, function () {
3636 return map[Math.floor(Math.random() * length)];
3637 });
3638 }
3639 var mdPreloaderContent = "\n <span class=\"preloader-inner\">\n <svg viewBox=\"0 0 36 36\">\n <circle cx=\"18\" cy=\"18\" r=\"16\"></circle>\n </svg>\n </span>\n".trim();
3640 var iosPreloaderContent = ("\n <span class=\"preloader-inner\">\n " + [0, 1, 2, 3, 4, 5, 6, 7].map(function () {
3641 return '<span class="preloader-inner-line"></span>';
3642 }).join('') + "\n </span>\n").trim();
3643 var auroraPreloaderContent = "\n <span class=\"preloader-inner\">\n <span class=\"preloader-inner-circle\"></span>\n </span>\n";
3644 function eventNameToColonCase(eventName) {
3645 var hasColon;
3646 return eventName.split('').map(function (char, index) {
3647 if (char.match(/[A-Z]/) && index !== 0 && !hasColon) {
3648 hasColon = true;
3649 return ":" + char.toLowerCase();
3650 }
3651
3652 return char.toLowerCase();
3653 }).join('');
3654 }
3655 function deleteProps$1(obj) {
3656 var object = obj;
3657 Object.keys(object).forEach(function (key) {
3658 try {
3659 object[key] = null;
3660 } catch (e) {// no setter for object
3661 }
3662
3663 try {
3664 delete object[key];
3665 } catch (e) {// something got wrong
3666 }
3667 });
3668 }
3669 function requestAnimationFrame(callback) {
3670 var window = getWindow();
3671 return window.requestAnimationFrame(callback);
3672 }
3673 function cancelAnimationFrame$1(frameId) {
3674 var window = getWindow();
3675 return window.cancelAnimationFrame(frameId);
3676 }
3677 function nextTick$1(callback, delay) {
3678 if (delay === void 0) {
3679 delay = 0;
3680 }
3681
3682 return setTimeout(callback, delay);
3683 }
3684 function nextFrame$1(callback) {
3685 return requestAnimationFrame(function () {
3686 requestAnimationFrame(callback);
3687 });
3688 }
3689 function now$1() {
3690 return Date.now();
3691 }
3692 function parseUrlQuery(url) {
3693 var window = getWindow();
3694 var query = {};
3695 var urlToParse = url || window.location.href;
3696 var i;
3697 var params;
3698 var param;
3699 var length;
3700
3701 if (typeof urlToParse === 'string' && urlToParse.length) {
3702 urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
3703 params = urlToParse.split('&').filter(function (paramsPart) {
3704 return paramsPart !== '';
3705 });
3706 length = params.length;
3707
3708 for (i = 0; i < length; i += 1) {
3709 param = params[i].replace(/#\S+/g, '').split('=');
3710 query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param.slice(1).join('=')) || '';
3711 }
3712 }
3713
3714 return query;
3715 }
3716 function getTranslate$1(el, axis) {
3717 if (axis === void 0) {
3718 axis = 'x';
3719 }
3720
3721 var window = getWindow();
3722 var matrix;
3723 var curTransform;
3724 var transformMatrix;
3725 var curStyle = window.getComputedStyle(el, null);
3726
3727 if (window.WebKitCSSMatrix) {
3728 curTransform = curStyle.transform || curStyle.webkitTransform;
3729
3730 if (curTransform.split(',').length > 6) {
3731 curTransform = curTransform.split(', ').map(function (a) {
3732 return a.replace(',', '.');
3733 }).join(', ');
3734 } // Some old versions of Webkit choke when 'none' is passed; pass
3735 // empty string instead in this case
3736
3737
3738 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
3739 } else {
3740 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
3741 matrix = transformMatrix.toString().split(',');
3742 }
3743
3744 if (axis === 'x') {
3745 // Latest Chrome and webkits Fix
3746 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix
3747 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers
3748 else curTransform = parseFloat(matrix[4]);
3749 }
3750
3751 if (axis === 'y') {
3752 // Latest Chrome and webkits Fix
3753 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix
3754 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers
3755 else curTransform = parseFloat(matrix[5]);
3756 }
3757
3758 return curTransform || 0;
3759 }
3760 function serializeObject(obj, parents) {
3761 if (parents === void 0) {
3762 parents = [];
3763 }
3764
3765 if (typeof obj === 'string') return obj;
3766 var resultArray = [];
3767 var separator = '&';
3768 var newParents;
3769
3770 function varName(name) {
3771 if (parents.length > 0) {
3772 var parentParts = '';
3773
3774 for (var j = 0; j < parents.length; j += 1) {
3775 if (j === 0) parentParts += parents[j];else parentParts += "[" + encodeURIComponent(parents[j]) + "]";
3776 }
3777
3778 return parentParts + "[" + encodeURIComponent(name) + "]";
3779 }
3780
3781 return encodeURIComponent(name);
3782 }
3783
3784 function varValue(value) {
3785 return encodeURIComponent(value);
3786 }
3787
3788 Object.keys(obj).forEach(function (prop) {
3789 var toPush;
3790
3791 if (Array.isArray(obj[prop])) {
3792 toPush = [];
3793
3794 for (var i = 0; i < obj[prop].length; i += 1) {
3795 if (!Array.isArray(obj[prop][i]) && typeof obj[prop][i] === 'object') {
3796 newParents = parents.slice();
3797 newParents.push(prop);
3798 newParents.push(String(i));
3799 toPush.push(serializeObject(obj[prop][i], newParents));
3800 } else {
3801 toPush.push(varName(prop) + "[]=" + varValue(obj[prop][i]));
3802 }
3803 }
3804
3805 if (toPush.length > 0) resultArray.push(toPush.join(separator));
3806 } else if (obj[prop] === null || obj[prop] === '') {
3807 resultArray.push(varName(prop) + "=");
3808 } else if (typeof obj[prop] === 'object') {
3809 // Object, convert to named array
3810 newParents = parents.slice();
3811 newParents.push(prop);
3812 toPush = serializeObject(obj[prop], newParents);
3813 if (toPush !== '') resultArray.push(toPush);
3814 } else if (typeof obj[prop] !== 'undefined' && obj[prop] !== '') {
3815 // Should be string or plain value
3816 resultArray.push(varName(prop) + "=" + varValue(obj[prop]));
3817 } else if (obj[prop] === '') resultArray.push(varName(prop));
3818 });
3819 return resultArray.join(separator);
3820 }
3821 function isObject$1(o) {
3822 return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
3823 }
3824 function merge() {
3825 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3826 args[_key] = arguments[_key];
3827 }
3828
3829 var to = args[0];
3830 args.splice(0, 1);
3831 var from = args;
3832
3833 for (var i = 0; i < from.length; i += 1) {
3834 var nextSource = args[i];
3835
3836 if (nextSource !== undefined && nextSource !== null) {
3837 var keysArray = Object.keys(Object(nextSource));
3838
3839 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
3840 var nextKey = keysArray[nextIndex];
3841 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
3842
3843 if (desc !== undefined && desc.enumerable) {
3844 to[nextKey] = nextSource[nextKey];
3845 }
3846 }
3847 }
3848 }
3849
3850 return to;
3851 }
3852 function extend$1() {
3853 var deep = true;
3854 var to;
3855 var from;
3856
3857 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
3858 args[_key2] = arguments[_key2];
3859 }
3860
3861 if (typeof args[0] === 'boolean') {
3862 deep = args[0];
3863 to = args[1];
3864 args.splice(0, 2);
3865 from = args;
3866 } else {
3867 to = args[0];
3868 args.splice(0, 1);
3869 from = args;
3870 }
3871
3872 for (var i = 0; i < from.length; i += 1) {
3873 var nextSource = args[i];
3874
3875 if (nextSource !== undefined && nextSource !== null) {
3876 var keysArray = Object.keys(Object(nextSource));
3877
3878 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
3879 var nextKey = keysArray[nextIndex];
3880 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
3881
3882 if (desc !== undefined && desc.enumerable) {
3883 if (!deep) {
3884 to[nextKey] = nextSource[nextKey];
3885 } else if (isObject$1(to[nextKey]) && isObject$1(nextSource[nextKey])) {
3886 extend$1(to[nextKey], nextSource[nextKey]);
3887 } else if (!isObject$1(to[nextKey]) && isObject$1(nextSource[nextKey])) {
3888 to[nextKey] = {};
3889 extend$1(to[nextKey], nextSource[nextKey]);
3890 } else {
3891 to[nextKey] = nextSource[nextKey];
3892 }
3893 }
3894 }
3895 }
3896 }
3897
3898 return to;
3899 }
3900 function colorHexToRgb(hex) {
3901 var h = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (m, r, g, b) {
3902 return r + r + g + g + b + b;
3903 });
3904 var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h);
3905 return result ? result.slice(1).map(function (n) {
3906 return parseInt(n, 16);
3907 }) : null;
3908 }
3909 function colorRgbToHex(r, g, b) {
3910 var result = [r, g, b].map(function (n) {
3911 var hex = n.toString(16);
3912 return hex.length === 1 ? "0" + hex : hex;
3913 }).join('');
3914 return "#" + result;
3915 }
3916 function colorRgbToHsl(r, g, b) {
3917 r /= 255; // eslint-disable-line
3918
3919 g /= 255; // eslint-disable-line
3920
3921 b /= 255; // eslint-disable-line
3922
3923 var max = Math.max(r, g, b);
3924 var min = Math.min(r, g, b);
3925 var d = max - min;
3926 var h;
3927 if (d === 0) h = 0;else if (max === r) h = (g - b) / d % 6;else if (max === g) h = (b - r) / d + 2;else if (max === b) h = (r - g) / d + 4;
3928 var l = (min + max) / 2;
3929 var s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
3930 if (h < 0) h = 360 / 60 + h;
3931 return [h * 60, s, l];
3932 }
3933 function colorHslToRgb(h, s, l) {
3934 var c = (1 - Math.abs(2 * l - 1)) * s;
3935 var hp = h / 60;
3936 var x = c * (1 - Math.abs(hp % 2 - 1));
3937 var rgb1;
3938
3939 if (Number.isNaN(h) || typeof h === 'undefined') {
3940 rgb1 = [0, 0, 0];
3941 } else if (hp <= 1) rgb1 = [c, x, 0];else if (hp <= 2) rgb1 = [x, c, 0];else if (hp <= 3) rgb1 = [0, c, x];else if (hp <= 4) rgb1 = [0, x, c];else if (hp <= 5) rgb1 = [x, 0, c];else if (hp <= 6) rgb1 = [c, 0, x];
3942
3943 var m = l - c / 2;
3944 return rgb1.map(function (n) {
3945 return Math.max(0, Math.min(255, Math.round(255 * (n + m))));
3946 });
3947 }
3948 function colorHsbToHsl(h, s, b) {
3949 var HSL = {
3950 h: h,
3951 s: 0,
3952 l: 0
3953 };
3954 var HSB = {
3955 h: h,
3956 s: s,
3957 b: b
3958 };
3959 HSL.l = (2 - HSB.s) * HSB.b / 2;
3960 HSL.s = HSL.l && HSL.l < 1 ? HSB.s * HSB.b / (HSL.l < 0.5 ? HSL.l * 2 : 2 - HSL.l * 2) : HSL.s;
3961 return [HSL.h, HSL.s, HSL.l];
3962 }
3963 function colorHslToHsb(h, s, l) {
3964 var HSB = {
3965 h: h,
3966 s: 0,
3967 b: 0
3968 };
3969 var HSL = {
3970 h: h,
3971 s: s,
3972 l: l
3973 };
3974 var t = HSL.s * (HSL.l < 0.5 ? HSL.l : 1 - HSL.l);
3975 HSB.b = HSL.l + t;
3976 HSB.s = HSL.l > 0 ? 2 * t / HSB.b : HSB.s;
3977 return [HSB.h, HSB.s, HSB.b];
3978 }
3979 function colorThemeCSSProperties() {
3980 var hex;
3981 var rgb;
3982
3983 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
3984 args[_key3] = arguments[_key3];
3985 }
3986
3987 if (args.length === 1) {
3988 hex = args[0];
3989 rgb = colorHexToRgb(hex);
3990 } else if (args.length === 3) {
3991 rgb = args;
3992 hex = colorRgbToHex.apply(void 0, rgb);
3993 }
3994
3995 if (!rgb) return {};
3996 var hsl = colorRgbToHsl.apply(void 0, rgb);
3997 var hslShade = [hsl[0], hsl[1], Math.max(0, hsl[2] - 0.08)];
3998 var hslTint = [hsl[0], hsl[1], Math.max(0, hsl[2] + 0.08)];
3999 var shade = colorRgbToHex.apply(void 0, colorHslToRgb.apply(void 0, hslShade));
4000 var tint = colorRgbToHex.apply(void 0, colorHslToRgb.apply(void 0, hslTint));
4001 return {
4002 '--f7-theme-color': hex,
4003 '--f7-theme-color-rgb': rgb.join(', '),
4004 '--f7-theme-color-shade': shade,
4005 '--f7-theme-color-tint': tint
4006 };
4007 }
4008 function bindMethods(instance, obj) {
4009 Object.keys(obj).forEach(function (key) {
4010 if (isObject$1(obj[key])) {
4011 Object.keys(obj[key]).forEach(function (subKey) {
4012 if (typeof obj[key][subKey] === 'function') {
4013 obj[key][subKey] = obj[key][subKey].bind(instance);
4014 }
4015 });
4016 }
4017
4018 instance[key] = obj[key];
4019 });
4020 }
4021 function flattenArray() {
4022 var arr = [];
4023
4024 for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
4025 args[_key4] = arguments[_key4];
4026 }
4027
4028 args.forEach(function (arg) {
4029 if (Array.isArray(arg)) arr.push.apply(arr, flattenArray.apply(void 0, arg));else arr.push(arg);
4030 });
4031 return arr;
4032 }
4033
4034 var utils = /*#__PURE__*/Object.freeze({
4035 __proto__: null,
4036 uniqueNumber: uniqueNumber,
4037 id: id,
4038 mdPreloaderContent: mdPreloaderContent,
4039 iosPreloaderContent: iosPreloaderContent,
4040 auroraPreloaderContent: auroraPreloaderContent,
4041 eventNameToColonCase: eventNameToColonCase,
4042 deleteProps: deleteProps$1,
4043 requestAnimationFrame: requestAnimationFrame,
4044 cancelAnimationFrame: cancelAnimationFrame$1,
4045 nextTick: nextTick$1,
4046 nextFrame: nextFrame$1,
4047 now: now$1,
4048 parseUrlQuery: parseUrlQuery,
4049 getTranslate: getTranslate$1,
4050 serializeObject: serializeObject,
4051 isObject: isObject$1,
4052 merge: merge,
4053 extend: extend$1,
4054 colorHexToRgb: colorHexToRgb,
4055 colorRgbToHex: colorRgbToHex,
4056 colorRgbToHsl: colorRgbToHsl,
4057 colorHslToRgb: colorHslToRgb,
4058 colorHsbToHsl: colorHsbToHsl,
4059 colorHslToHsb: colorHslToHsb,
4060 colorThemeCSSProperties: colorThemeCSSProperties,
4061 bindMethods: bindMethods,
4062 flattenArray: flattenArray
4063 });
4064
4065 var support$1;
4066
4067 function calcSupport$1() {
4068 var window = getWindow();
4069 var document = getDocument();
4070 return {
4071 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),
4072 pointerEvents: !!window.PointerEvent && 'maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints >= 0,
4073 passiveListener: function checkPassiveListener() {
4074 var supportsPassive = false;
4075
4076 try {
4077 var opts = Object.defineProperty({}, 'passive', {
4078 // eslint-disable-next-line
4079 get: function get() {
4080 supportsPassive = true;
4081 }
4082 });
4083 window.addEventListener('testPassiveListener', null, opts);
4084 } catch (e) {// No support
4085 }
4086
4087 return supportsPassive;
4088 }(),
4089 intersectionObserver: function checkObserver() {
4090 return 'IntersectionObserver' in window;
4091 }()
4092 };
4093 }
4094
4095 function getSupport$1() {
4096 if (!support$1) {
4097 support$1 = calcSupport$1();
4098 }
4099
4100 return support$1;
4101 }
4102
4103 var deviceCalculated;
4104
4105 function calcDevice$1(_temp) {
4106 var _ref = _temp === void 0 ? {} : _temp,
4107 userAgent = _ref.userAgent;
4108
4109 var support = getSupport$1();
4110 var window = getWindow();
4111 var platform = window.navigator.platform;
4112 var ua = userAgent || window.navigator.userAgent;
4113 var device = {
4114 ios: false,
4115 android: false,
4116 androidChrome: false,
4117 desktop: false,
4118 iphone: false,
4119 ipod: false,
4120 ipad: false,
4121 edge: false,
4122 ie: false,
4123 firefox: false,
4124 macos: false,
4125 windows: false,
4126 cordova: !!(window.cordova || window.phonegap),
4127 phonegap: !!(window.cordova || window.phonegap),
4128 electron: false,
4129 capacitor: !!window.Capacitor,
4130 nwjs: false
4131 };
4132 var screenWidth = window.screen.width;
4133 var screenHeight = window.screen.height;
4134 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
4135
4136 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
4137 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
4138 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS|iPhone;\sCPU\sOS)\s([\d_]+)/);
4139 var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
4140 var edge = ua.indexOf('Edge/') >= 0;
4141 var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
4142 var windows = platform === 'Win32';
4143 var electron = ua.toLowerCase().indexOf('electron') >= 0;
4144 var nwjs = typeof nw !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.nw !== 'undefined';
4145 var macos = platform === 'MacIntel'; // iPadOs 13 fix
4146
4147 var iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
4148
4149 if (!ipad && macos && support.touch && iPadScreens.indexOf(screenWidth + "x" + screenHeight) >= 0) {
4150 ipad = ua.match(/(Version)\/([\d.]+)/);
4151 if (!ipad) ipad = [0, 1, '13_0_0'];
4152 macos = false;
4153 }
4154
4155 device.ie = ie;
4156 device.edge = edge;
4157 device.firefox = firefox; // Android
4158
4159 if (android) {
4160 device.os = 'android';
4161 device.osVersion = android[2];
4162 device.android = true;
4163 device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
4164 }
4165
4166 if (ipad || iphone || ipod) {
4167 device.os = 'ios';
4168 device.ios = true;
4169 } // iOS
4170
4171
4172 if (iphone && !ipod) {
4173 device.osVersion = iphone[2].replace(/_/g, '.');
4174 device.iphone = true;
4175 }
4176
4177 if (ipad) {
4178 device.osVersion = ipad[2].replace(/_/g, '.');
4179 device.ipad = true;
4180 }
4181
4182 if (ipod) {
4183 device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
4184 device.ipod = true;
4185 } // iOS 8+ changed UA
4186
4187
4188 if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
4189 if (device.osVersion.split('.')[0] === '10') {
4190 device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
4191 }
4192 } // Webview
4193
4194
4195 device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || window.navigator.standalone)) || window.matchMedia && window.matchMedia('(display-mode: standalone)').matches;
4196 device.webview = device.webView;
4197 device.standalone = device.webView; // Desktop
4198
4199 device.desktop = !(device.ios || device.android) || electron || nwjs;
4200
4201 if (device.desktop) {
4202 device.electron = electron;
4203 device.nwjs = nwjs;
4204 device.macos = macos;
4205 device.windows = windows;
4206
4207 if (device.macos) {
4208 device.os = 'macos';
4209 }
4210
4211 if (device.windows) {
4212 device.os = 'windows';
4213 }
4214 } // Pixel Ratio
4215
4216
4217 device.pixelRatio = window.devicePixelRatio || 1; // Color Scheme
4218
4219 var DARK = '(prefers-color-scheme: dark)';
4220 var LIGHT = '(prefers-color-scheme: light)';
4221
4222 device.prefersColorScheme = function prefersColorTheme() {
4223 var theme;
4224
4225 if (window.matchMedia && window.matchMedia(LIGHT).matches) {
4226 theme = 'light';
4227 }
4228
4229 if (window.matchMedia && window.matchMedia(DARK).matches) {
4230 theme = 'dark';
4231 }
4232
4233 return theme;
4234 }; // Export object
4235
4236
4237 return device;
4238 }
4239
4240 function getDevice$1(overrides, reset) {
4241 if (overrides === void 0) {
4242 overrides = {};
4243 }
4244
4245 if (!deviceCalculated || reset) {
4246 deviceCalculated = calcDevice$1(overrides);
4247 }
4248
4249 return deviceCalculated;
4250 }
4251
4252 var EventsClass = /*#__PURE__*/function () {
4253 function EventsClass(parents) {
4254 if (parents === void 0) {
4255 parents = [];
4256 }
4257
4258 var self = this;
4259 self.eventsParents = parents;
4260 self.eventsListeners = {};
4261 }
4262
4263 var _proto = EventsClass.prototype;
4264
4265 _proto.on = function on(events, handler, priority) {
4266 var self = this;
4267 if (typeof handler !== 'function') return self;
4268 var method = priority ? 'unshift' : 'push';
4269 events.split(' ').forEach(function (event) {
4270 if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
4271 self.eventsListeners[event][method](handler);
4272 });
4273 return self;
4274 };
4275
4276 _proto.once = function once(events, handler, priority) {
4277 var self = this;
4278 if (typeof handler !== 'function') return self;
4279
4280 function onceHandler() {
4281 self.off(events, onceHandler);
4282
4283 if (onceHandler.f7proxy) {
4284 delete onceHandler.f7proxy;
4285 }
4286
4287 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
4288 args[_key] = arguments[_key];
4289 }
4290
4291 handler.apply(self, args);
4292 }
4293
4294 onceHandler.f7proxy = handler;
4295 return self.on(events, onceHandler, priority);
4296 };
4297
4298 _proto.off = function off(events, handler) {
4299 var self = this;
4300 if (!self.eventsListeners) return self;
4301 events.split(' ').forEach(function (event) {
4302 if (typeof handler === 'undefined') {
4303 self.eventsListeners[event] = [];
4304 } else if (self.eventsListeners[event]) {
4305 self.eventsListeners[event].forEach(function (eventHandler, index) {
4306 if (eventHandler === handler || eventHandler.f7proxy && eventHandler.f7proxy === handler) {
4307 self.eventsListeners[event].splice(index, 1);
4308 }
4309 });
4310 }
4311 });
4312 return self;
4313 };
4314
4315 _proto.emit = function emit() {
4316 var self = this;
4317 if (!self.eventsListeners) return self;
4318 var events;
4319 var data;
4320 var context;
4321 var eventsParents;
4322
4323 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
4324 args[_key2] = arguments[_key2];
4325 }
4326
4327 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
4328 events = args[0];
4329 data = args.slice(1, args.length);
4330 context = self;
4331 eventsParents = self.eventsParents;
4332 } else {
4333 events = args[0].events;
4334 data = args[0].data;
4335 context = args[0].context || self;
4336 eventsParents = args[0].local ? [] : args[0].parents || self.eventsParents;
4337 }
4338
4339 var eventsArray = Array.isArray(events) ? events : events.split(' ');
4340 var localEvents = eventsArray.map(function (eventName) {
4341 return eventName.replace('local::', '');
4342 });
4343 var parentEvents = eventsArray.filter(function (eventName) {
4344 return eventName.indexOf('local::') < 0;
4345 });
4346 localEvents.forEach(function (event) {
4347 if (self.eventsListeners && self.eventsListeners[event]) {
4348 var handlers = [];
4349 self.eventsListeners[event].forEach(function (eventHandler) {
4350 handlers.push(eventHandler);
4351 });
4352 handlers.forEach(function (eventHandler) {
4353 eventHandler.apply(context, data);
4354 });
4355 }
4356 });
4357
4358 if (eventsParents && eventsParents.length > 0) {
4359 eventsParents.forEach(function (eventsParent) {
4360 eventsParent.emit.apply(eventsParent, [parentEvents].concat(data));
4361 });
4362 }
4363
4364 return self;
4365 };
4366
4367 return EventsClass;
4368 }();
4369
4370 var Framework7Class = /*#__PURE__*/function (_EventsClass) {
4371 _inheritsLoose(Framework7Class, _EventsClass);
4372
4373 function Framework7Class(params, parents) {
4374 var _this;
4375
4376 if (params === void 0) {
4377 params = {};
4378 }
4379
4380 if (parents === void 0) {
4381 parents = [];
4382 }
4383
4384 _this = _EventsClass.call(this, parents) || this;
4385
4386 var self = _assertThisInitialized(_this);
4387
4388 self.params = params;
4389
4390 if (self.params && self.params.on) {
4391 Object.keys(self.params.on).forEach(function (eventName) {
4392 self.on(eventName, self.params.on[eventName]);
4393 });
4394 }
4395
4396 return _this;
4397 } // eslint-disable-next-line
4398
4399
4400 var _proto = Framework7Class.prototype;
4401
4402 _proto.useModuleParams = function useModuleParams(module, instanceParams) {
4403 if (module.params) {
4404 var originalParams = {};
4405 Object.keys(module.params).forEach(function (paramKey) {
4406 if (typeof instanceParams[paramKey] === 'undefined') return;
4407 originalParams[paramKey] = extend$1({}, instanceParams[paramKey]);
4408 });
4409 extend$1(instanceParams, module.params);
4410 Object.keys(originalParams).forEach(function (paramKey) {
4411 extend$1(instanceParams[paramKey], originalParams[paramKey]);
4412 });
4413 }
4414 };
4415
4416 _proto.useModulesParams = function useModulesParams(instanceParams) {
4417 var instance = this;
4418 if (!instance.modules) return;
4419 Object.keys(instance.modules).forEach(function (moduleName) {
4420 var module = instance.modules[moduleName]; // Extend params
4421
4422 if (module.params) {
4423 extend$1(instanceParams, module.params);
4424 }
4425 });
4426 };
4427
4428 _proto.useModule = function useModule(moduleName, moduleParams) {
4429 if (moduleName === void 0) {
4430 moduleName = '';
4431 }
4432
4433 if (moduleParams === void 0) {
4434 moduleParams = {};
4435 }
4436
4437 var instance = this;
4438 if (!instance.modules) return;
4439 var module = typeof moduleName === 'string' ? instance.modules[moduleName] : moduleName;
4440 if (!module) return; // Extend instance methods and props
4441
4442 if (module.instance) {
4443 Object.keys(module.instance).forEach(function (modulePropName) {
4444 var moduleProp = module.instance[modulePropName];
4445
4446 if (typeof moduleProp === 'function') {
4447 instance[modulePropName] = moduleProp.bind(instance);
4448 } else {
4449 instance[modulePropName] = moduleProp;
4450 }
4451 });
4452 } // Add event listeners
4453
4454
4455 if (module.on && instance.on) {
4456 Object.keys(module.on).forEach(function (moduleEventName) {
4457 instance.on(moduleEventName, module.on[moduleEventName]);
4458 });
4459 } // Add vnode hooks
4460
4461
4462 if (module.vnode) {
4463 if (!instance.vnodeHooks) instance.vnodeHooks = {};
4464 Object.keys(module.vnode).forEach(function (vnodeId) {
4465 Object.keys(module.vnode[vnodeId]).forEach(function (hookName) {
4466 var handler = module.vnode[vnodeId][hookName];
4467 if (!instance.vnodeHooks[hookName]) instance.vnodeHooks[hookName] = {};
4468 if (!instance.vnodeHooks[hookName][vnodeId]) instance.vnodeHooks[hookName][vnodeId] = [];
4469 instance.vnodeHooks[hookName][vnodeId].push(handler.bind(instance));
4470 });
4471 });
4472 } // Module create callback
4473
4474
4475 if (module.create) {
4476 module.create.bind(instance)(moduleParams);
4477 }
4478 };
4479
4480 _proto.useModules = function useModules(modulesParams) {
4481 if (modulesParams === void 0) {
4482 modulesParams = {};
4483 }
4484
4485 var instance = this;
4486 if (!instance.modules) return;
4487 Object.keys(instance.modules).forEach(function (moduleName) {
4488 var moduleParams = modulesParams[moduleName] || {};
4489 instance.useModule(moduleName, moduleParams);
4490 });
4491 };
4492
4493 Framework7Class.installModule = function installModule(module) {
4494 var Class = this;
4495 if (!Class.prototype.modules) Class.prototype.modules = {};
4496 var name = module.name || Object.keys(Class.prototype.modules).length + "_" + now$1();
4497 Class.prototype.modules[name] = module; // Prototype
4498
4499 if (module.proto) {
4500 Object.keys(module.proto).forEach(function (key) {
4501 Class.prototype[key] = module.proto[key];
4502 });
4503 } // Class
4504
4505
4506 if (module.static) {
4507 Object.keys(module.static).forEach(function (key) {
4508 Class[key] = module.static[key];
4509 });
4510 } // Callback
4511
4512
4513 if (module.install) {
4514 for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
4515 params[_key - 1] = arguments[_key];
4516 }
4517
4518 module.install.apply(Class, params);
4519 }
4520
4521 return Class;
4522 };
4523
4524 Framework7Class.use = function use(module) {
4525 var Class = this;
4526
4527 if (Array.isArray(module)) {
4528 module.forEach(function (m) {
4529 return Class.installModule(m);
4530 });
4531 return Class;
4532 }
4533
4534 for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
4535 params[_key2 - 1] = arguments[_key2];
4536 }
4537
4538 return Class.installModule.apply(Class, [module].concat(params));
4539 };
4540
4541 _createClass$1(Framework7Class, null, [{
4542 key: "components",
4543 set: function set(components) {
4544 var Class = this;
4545 if (!Class.use) return;
4546 Class.use(components);
4547 }
4548 }]);
4549
4550 return Framework7Class;
4551 }(EventsClass);
4552
4553 function ConstructorMethods(parameters) {
4554 if (parameters === void 0) {
4555 parameters = {};
4556 }
4557
4558 var _parameters = parameters,
4559 defaultSelector = _parameters.defaultSelector,
4560 Constructor = _parameters.constructor,
4561 domProp = _parameters.domProp,
4562 app = _parameters.app,
4563 addMethods = _parameters.addMethods;
4564 var methods = {
4565 create: function create() {
4566 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
4567 args[_key] = arguments[_key];
4568 }
4569
4570 if (app) return _construct(Constructor, [app].concat(args));
4571 return _construct(Constructor, args);
4572 },
4573 get: function get(el) {
4574 if (el === void 0) {
4575 el = defaultSelector;
4576 }
4577
4578 if (el instanceof Constructor) return el;
4579 var $el = $(el);
4580 if ($el.length === 0) return undefined;
4581 return $el[0][domProp];
4582 },
4583 destroy: function destroy(el) {
4584 var instance = methods.get(el);
4585 if (instance && instance.destroy) return instance.destroy();
4586 return undefined;
4587 }
4588 };
4589
4590 if (addMethods && Array.isArray(addMethods)) {
4591 addMethods.forEach(function (methodName) {
4592 methods[methodName] = function (el) {
4593 if (el === void 0) {
4594 el = defaultSelector;
4595 }
4596
4597 var instance = methods.get(el);
4598
4599 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
4600 args[_key2 - 1] = arguments[_key2];
4601 }
4602
4603 if (instance && instance[methodName]) return instance[methodName].apply(instance, args);
4604 return undefined;
4605 };
4606 });
4607 }
4608
4609 return methods;
4610 }
4611
4612 function ModalMethods(parameters) {
4613 if (parameters === void 0) {
4614 parameters = {};
4615 }
4616
4617 var _parameters = parameters,
4618 defaultSelector = _parameters.defaultSelector,
4619 Constructor = _parameters.constructor,
4620 app = _parameters.app;
4621 var methods = extend$1(ConstructorMethods({
4622 defaultSelector: defaultSelector,
4623 constructor: Constructor,
4624 app: app,
4625 domProp: 'f7Modal'
4626 }), {
4627 open: function open(el, animate, targetEl) {
4628 var $el = $(el);
4629
4630 if ($el.length > 1 && targetEl) {
4631 // check if same modal in other page
4632 var $targetPage = $(targetEl).parents('.page');
4633
4634 if ($targetPage.length) {
4635 $el.each(function (modalEl) {
4636 var $modalEl = $(modalEl);
4637
4638 if ($modalEl.parents($targetPage)[0] === $targetPage[0]) {
4639 $el = $modalEl;
4640 }
4641 });
4642 }
4643 }
4644
4645 if ($el.length > 1) {
4646 $el = $el.eq($el.length - 1);
4647 }
4648
4649 if (!$el.length) return undefined;
4650 var instance = $el[0].f7Modal;
4651
4652 if (!instance) {
4653 var params = $el.dataset();
4654 instance = new Constructor(app, _extends$j({
4655 el: $el
4656 }, params));
4657 }
4658
4659 return instance.open(animate);
4660 },
4661 close: function close(el, animate, targetEl) {
4662 if (el === void 0) {
4663 el = defaultSelector;
4664 }
4665
4666 var $el = $(el);
4667 if (!$el.length) return undefined;
4668
4669 if ($el.length > 1) {
4670 // check if close link (targetEl) in this modal
4671 var $parentEl;
4672
4673 if (targetEl) {
4674 var $targetEl = $(targetEl);
4675
4676 if ($targetEl.length) {
4677 $parentEl = $targetEl.parents($el);
4678 }
4679 }
4680
4681 if ($parentEl && $parentEl.length > 0) {
4682 $el = $parentEl;
4683 } else {
4684 $el = $el.eq($el.length - 1);
4685 }
4686 }
4687
4688 var instance = $el[0].f7Modal;
4689
4690 if (!instance) {
4691 var params = $el.dataset();
4692 instance = new Constructor(app, _extends$j({
4693 el: $el
4694 }, params));
4695 }
4696
4697 return instance.close(animate);
4698 }
4699 });
4700 return methods;
4701 }
4702
4703 var fetchedModules = [];
4704
4705 function loadModule(moduleToLoad) {
4706 var Framework7 = this;
4707 var window = getWindow();
4708 var document = getDocument();
4709 return new Promise(function (resolve, reject) {
4710 var app = Framework7.instance;
4711 var modulePath;
4712 var moduleObj;
4713 var moduleFunc;
4714
4715 if (!moduleToLoad) {
4716 reject(new Error('Framework7: Lazy module must be specified'));
4717 return;
4718 }
4719
4720 function install(module) {
4721 Framework7.use(module);
4722
4723 if (app) {
4724 app.useModuleParams(module, app.params);
4725 app.useModule(module);
4726 }
4727 }
4728
4729 if (typeof moduleToLoad === 'string') {
4730 var matchNamePattern = moduleToLoad.match(/([a-z0-9-]*)/i);
4731
4732 if (moduleToLoad.indexOf('.') < 0 && matchNamePattern && matchNamePattern[0].length === moduleToLoad.length) {
4733 if (!app || app && !app.params.lazyModulesPath) {
4734 reject(new Error('Framework7: "lazyModulesPath" app parameter must be specified to fetch module by name'));
4735 return;
4736 }
4737
4738 modulePath = app.params.lazyModulesPath + "/" + moduleToLoad + "/" + moduleToLoad + ".js";
4739 } else {
4740 modulePath = moduleToLoad;
4741 }
4742 } else if (typeof moduleToLoad === 'function') {
4743 moduleFunc = moduleToLoad;
4744 } else {
4745 // considering F7-Plugin object
4746 moduleObj = moduleToLoad;
4747 }
4748
4749 if (moduleFunc) {
4750 var module = moduleFunc(Framework7, false);
4751
4752 if (!module) {
4753 reject(new Error("Framework7: Can't find Framework7 component in specified component function"));
4754 return;
4755 } // Check if it was added
4756
4757
4758 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
4759 resolve();
4760 return;
4761 } // Install It
4762
4763
4764 install(module);
4765 resolve();
4766 }
4767
4768 if (moduleObj) {
4769 var _module = moduleObj;
4770
4771 if (!_module) {
4772 reject(new Error("Framework7: Can't find Framework7 component in specified component"));
4773 return;
4774 } // Check if it was added
4775
4776
4777 if (Framework7.prototype.modules && Framework7.prototype.modules[_module.name]) {
4778 resolve();
4779 return;
4780 } // Install It
4781
4782
4783 install(_module);
4784 resolve();
4785 }
4786
4787 if (modulePath) {
4788 if (fetchedModules.indexOf(modulePath) >= 0) {
4789 resolve();
4790 return;
4791 }
4792
4793 fetchedModules.push(modulePath);
4794 var scriptLoad = new Promise(function (resolveScript, rejectScript) {
4795 Framework7.request.get(modulePath, function (scriptContent) {
4796 var callbackId = id();
4797 var callbackLoadName = "f7_component_loader_callback_" + callbackId;
4798 var scriptEl = document.createElement('script');
4799 scriptEl.innerHTML = "window." + callbackLoadName + " = function (Framework7, Framework7AutoInstallComponent) {return " + scriptContent.trim() + "}";
4800 $('head').append(scriptEl);
4801 var componentLoader = window[callbackLoadName];
4802 delete window[callbackLoadName];
4803 $(scriptEl).remove();
4804 var module = componentLoader(Framework7, false);
4805
4806 if (!module) {
4807 rejectScript(new Error("Framework7: Can't find Framework7 component in " + modulePath + " file"));
4808 return;
4809 } // Check if it was added
4810
4811
4812 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
4813 resolveScript();
4814 return;
4815 } // Install It
4816
4817
4818 install(module);
4819 resolveScript();
4820 }, function (xhr, status) {
4821 rejectScript(xhr, status);
4822 });
4823 });
4824 var styleLoad = new Promise(function (resolveStyle) {
4825 Framework7.request.get(modulePath.replace('.js', app.rtl ? '.rtl.css' : '.css'), function (styleContent) {
4826 var styleEl = document.createElement('style');
4827 styleEl.innerHTML = styleContent;
4828 $('head').append(styleEl);
4829 resolveStyle();
4830 }, function () {
4831 resolveStyle();
4832 });
4833 });
4834 Promise.all([scriptLoad, styleLoad]).then(function () {
4835 resolve();
4836 }).catch(function (err) {
4837 reject(err);
4838 });
4839 }
4840 });
4841 }
4842
4843 var Framework7 = /*#__PURE__*/function (_Framework7Class) {
4844 _inheritsLoose(Framework7, _Framework7Class);
4845
4846 function Framework7(params) {
4847 var _this;
4848
4849 if (params === void 0) {
4850 params = {};
4851 }
4852
4853 _this = _Framework7Class.call(this, params) || this; // eslint-disable-next-line
4854
4855 if (Framework7.instance && typeof window !== 'undefined') {
4856 throw new Error("Framework7 is already initialized and can't be initialized more than once");
4857 }
4858
4859 var device = getDevice$1({
4860 userAgent: params.userAgent || undefined
4861 });
4862 var support = getSupport$1();
4863 var passedParams = extend$1({}, params); // App Instance
4864
4865 var app = _assertThisInitialized(_this);
4866
4867 app.device = device;
4868 app.support = support;
4869 var w = getWindow();
4870 var d = getDocument();
4871 Framework7.instance = app; // Default
4872
4873 var defaults = {
4874 version: '1.0.0',
4875 id: 'io.framework7.myapp',
4876 el: 'body',
4877 theme: 'auto',
4878 language: w.navigator.language,
4879 routes: [],
4880 name: 'Framework7',
4881 lazyModulesPath: null,
4882 initOnDeviceReady: true,
4883 init: true,
4884 autoDarkTheme: false,
4885 iosTranslucentBars: true,
4886 iosTranslucentModals: true,
4887 component: undefined,
4888 componentUrl: undefined,
4889 userAgent: null,
4890 url: null
4891 }; // Extend defaults with modules params
4892
4893 app.useModulesParams(defaults); // Extend defaults with passed params
4894
4895 app.params = extend$1(defaults, params);
4896 extend$1(app, {
4897 // App Id
4898 id: app.params.id,
4899 // App Name
4900 name: app.params.name,
4901 // App version
4902 version: app.params.version,
4903 // Routes
4904 routes: app.params.routes,
4905 // Lang
4906 language: app.params.language,
4907 // Theme
4908 theme: function getTheme() {
4909 if (app.params.theme === 'auto') {
4910 if (device.ios) return 'ios';
4911 if (device.desktop && device.electron) return 'aurora';
4912 return 'md';
4913 }
4914
4915 return app.params.theme;
4916 }(),
4917 // Initially passed parameters
4918 passedParams: passedParams,
4919 online: w.navigator.onLine
4920 });
4921 if (params.store) app.params.store = params.store; // Save Root
4922
4923 if (app.$el && app.$el[0]) {
4924 app.$el[0].f7 = app;
4925 } // Install Modules
4926
4927
4928 app.useModules(); // Init Store
4929
4930 app.initStore(); // Init
4931
4932 if (app.params.init) {
4933 if (device.cordova && app.params.initOnDeviceReady) {
4934 $(d).on('deviceready', function () {
4935 app.init();
4936 });
4937 } else {
4938 app.init();
4939 }
4940 } // Return app instance
4941
4942
4943 return app || _assertThisInitialized(_this);
4944 }
4945
4946 var _proto = Framework7.prototype;
4947
4948 _proto.mount = function mount(rootEl) {
4949 var app = this;
4950 var window = getWindow();
4951 var document = getDocument();
4952 var $rootEl = $(rootEl || app.params.el).eq(0);
4953 app.$el = $rootEl;
4954
4955 if (app.$el && app.$el[0]) {
4956 app.el = app.$el[0];
4957 app.el.f7 = app;
4958 app.rtl = $rootEl.css('direction') === 'rtl';
4959 } // Auto Dark Theme
4960
4961
4962 var DARK = '(prefers-color-scheme: dark)';
4963 var LIGHT = '(prefers-color-scheme: light)';
4964 app.mq = {};
4965
4966 if (window.matchMedia) {
4967 app.mq.dark = window.matchMedia(DARK);
4968 app.mq.light = window.matchMedia(LIGHT);
4969 }
4970
4971 app.colorSchemeListener = function colorSchemeListener(_ref) {
4972 var matches = _ref.matches,
4973 media = _ref.media;
4974
4975 if (!matches) {
4976 return;
4977 }
4978
4979 var html = document.querySelector('html');
4980
4981 if (media === DARK) {
4982 html.classList.add('theme-dark');
4983 app.darkTheme = true;
4984 app.emit('darkThemeChange', true);
4985 } else if (media === LIGHT) {
4986 html.classList.remove('theme-dark');
4987 app.darkTheme = false;
4988 app.emit('darkThemeChange', false);
4989 }
4990 };
4991
4992 app.emit('mount');
4993 };
4994
4995 _proto.initStore = function initStore() {
4996 var app = this;
4997
4998 if (typeof app.params.store !== 'undefined' && app.params.store.__store) {
4999 app.store = app.params.store;
5000 } else {
5001 app.store = app.createStore(app.params.store);
5002 }
5003 };
5004
5005 _proto.enableAutoDarkTheme = function enableAutoDarkTheme() {
5006 var window = getWindow();
5007 var document = getDocument();
5008 if (!window.matchMedia) return;
5009 var app = this;
5010 var html = document.querySelector('html');
5011
5012 if (app.mq.dark && app.mq.light) {
5013 app.mq.dark.addListener(app.colorSchemeListener);
5014 app.mq.light.addListener(app.colorSchemeListener);
5015 }
5016
5017 if (app.mq.dark && app.mq.dark.matches) {
5018 html.classList.add('theme-dark');
5019 app.darkTheme = true;
5020 app.emit('darkThemeChange', true);
5021 } else if (app.mq.light && app.mq.light.matches) {
5022 html.classList.remove('theme-dark');
5023 app.darkTheme = false;
5024 app.emit('darkThemeChange', false);
5025 }
5026 };
5027
5028 _proto.disableAutoDarkTheme = function disableAutoDarkTheme() {
5029 var window = getWindow();
5030 if (!window.matchMedia) return;
5031 var app = this;
5032 if (app.mq.dark) app.mq.dark.removeListener(app.colorSchemeListener);
5033 if (app.mq.light) app.mq.light.removeListener(app.colorSchemeListener);
5034 };
5035
5036 _proto.initAppComponent = function initAppComponent(callback) {
5037 var app = this;
5038 app.router.componentLoader(app.params.component, app.params.componentUrl, {
5039 componentOptions: {
5040 el: app.$el[0]
5041 }
5042 }, function (el) {
5043 app.$el = $(el);
5044 app.$el[0].f7 = app;
5045 app.$elComponent = el.f7Component;
5046 app.el = app.$el[0];
5047 if (callback) callback();
5048 }, function () {});
5049 };
5050
5051 _proto.init = function init(rootEl) {
5052 var app = this;
5053 app.mount(rootEl);
5054
5055 var init = function init() {
5056 if (app.initialized) return;
5057 app.$el.addClass('framework7-initializing'); // RTL attr
5058
5059 if (app.rtl) {
5060 $('html').attr('dir', 'rtl');
5061 } // Auto Dark Theme
5062
5063
5064 if (app.params.autoDarkTheme) {
5065 app.enableAutoDarkTheme();
5066 } // Watch for online/offline state
5067
5068
5069 var window = getWindow();
5070 window.addEventListener('offline', function () {
5071 app.online = false;
5072 app.emit('offline');
5073 app.emit('connection', false);
5074 });
5075 window.addEventListener('online', function () {
5076 app.online = true;
5077 app.emit('online');
5078 app.emit('connection', true);
5079 }); // Root class
5080
5081 app.$el.addClass('framework7-root'); // Theme class
5082
5083 $('html').removeClass('ios md aurora').addClass(app.theme); // iOS Translucent
5084
5085 var device = app.device;
5086
5087 if (app.params.iosTranslucentBars && app.theme === 'ios' && device.ios) {
5088 $('html').addClass('ios-translucent-bars');
5089 }
5090
5091 if (app.params.iosTranslucentModals && app.theme === 'ios' && device.ios) {
5092 $('html').addClass('ios-translucent-modals');
5093 } // Init class
5094
5095
5096 nextFrame$1(function () {
5097 app.$el.removeClass('framework7-initializing');
5098 }); // Emit, init other modules
5099
5100 app.initialized = true;
5101 app.emit('init');
5102 };
5103
5104 if (app.params.component || app.params.componentUrl) {
5105 app.initAppComponent(function () {
5106 init();
5107 });
5108 } else {
5109 init();
5110 }
5111
5112 return app;
5113 } // eslint-disable-next-line
5114 ;
5115
5116 _proto.loadModule = function loadModule() {
5117 return Framework7.loadModule.apply(Framework7, arguments);
5118 } // eslint-disable-next-line
5119 ;
5120
5121 _proto.loadModules = function loadModules() {
5122 return Framework7.loadModules.apply(Framework7, arguments);
5123 };
5124
5125 _proto.getVnodeHooks = function getVnodeHooks(hook, id) {
5126 var app = this;
5127 if (!app.vnodeHooks || !app.vnodeHooks[hook]) return [];
5128 return app.vnodeHooks[hook][id] || [];
5129 } // eslint-disable-next-line
5130 ;
5131
5132 _createClass$1(Framework7, [{
5133 key: "$",
5134 get: function get() {
5135 return $;
5136 }
5137 }], [{
5138 key: "Dom7",
5139 get: function get() {
5140 return $;
5141 }
5142 }, {
5143 key: "$",
5144 get: function get() {
5145 return $;
5146 }
5147 }, {
5148 key: "device",
5149 get: function get() {
5150 return getDevice$1();
5151 }
5152 }, {
5153 key: "support",
5154 get: function get() {
5155 return getSupport$1();
5156 }
5157 }, {
5158 key: "Class",
5159 get: function get() {
5160 return Framework7Class;
5161 }
5162 }, {
5163 key: "Events",
5164 get: function get() {
5165 return EventsClass;
5166 }
5167 }]);
5168
5169 return Framework7;
5170 }(Framework7Class);
5171
5172 Framework7.ModalMethods = ModalMethods;
5173 Framework7.ConstructorMethods = ConstructorMethods;
5174 Framework7.loadModule = loadModule;
5175
5176 Framework7.loadModules = function loadModules(modules) {
5177 return Promise.all(modules.map(function (module) {
5178 return Framework7.loadModule(module);
5179 }));
5180 };
5181
5182 var DeviceModule = {
5183 name: 'device',
5184 static: {
5185 getDevice: getDevice$1
5186 },
5187 on: {
5188 init: function init() {
5189 var document = getDocument();
5190 var device = getDevice$1();
5191 var classNames = [];
5192 var html = document.querySelector('html');
5193 var metaStatusbar = document.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
5194 if (!html) return;
5195
5196 if (device.standalone && device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
5197 classNames.push('device-full-viewport');
5198 } // Pixel Ratio
5199
5200
5201 classNames.push("device-pixel-ratio-" + Math.floor(device.pixelRatio)); // OS classes
5202
5203 if (device.os && !device.desktop) {
5204 classNames.push("device-" + device.os);
5205 } else if (device.desktop) {
5206 classNames.push('device-desktop');
5207
5208 if (device.os) {
5209 classNames.push("device-" + device.os);
5210 }
5211 }
5212
5213 if (device.cordova || device.phonegap) {
5214 classNames.push('device-cordova');
5215 }
5216
5217 if (device.capacitor) {
5218 classNames.push('device-capacitor');
5219 } // Add html classes
5220
5221
5222 classNames.forEach(function (className) {
5223 html.classList.add(className);
5224 });
5225 }
5226 }
5227 };
5228
5229 var SupportModule = {
5230 name: 'support',
5231 static: {
5232 getSupport: getSupport$1
5233 }
5234 };
5235
5236 var UtilsModule = {
5237 name: 'utils',
5238 proto: {
5239 utils: utils
5240 },
5241 static: {
5242 utils: utils
5243 }
5244 };
5245
5246 var ResizeModule = {
5247 name: 'resize',
5248 create: function create() {
5249 var app = this;
5250
5251 app.getSize = function () {
5252 if (!app.el) return {
5253 width: 0,
5254 height: 0,
5255 left: 0,
5256 top: 0
5257 };
5258 var offset = app.$el.offset();
5259 var _ref = [app.el.offsetWidth, app.el.offsetHeight, offset.left, offset.top],
5260 width = _ref[0],
5261 height = _ref[1],
5262 left = _ref[2],
5263 top = _ref[3];
5264 app.width = width;
5265 app.height = height;
5266 app.left = left;
5267 app.top = top;
5268 return {
5269 width: width,
5270 height: height,
5271 left: left,
5272 top: top
5273 };
5274 };
5275 },
5276 on: {
5277 init: function init() {
5278 var app = this;
5279 var window = getWindow(); // Get Size
5280
5281 app.getSize(); // Emit resize
5282
5283 window.addEventListener('resize', function () {
5284 app.emit('resize');
5285 }, false); // Emit orientationchange
5286
5287 window.addEventListener('orientationchange', function () {
5288 app.emit('orientationchange');
5289 });
5290 },
5291 orientationchange: function orientationchange() {
5292 var document = getDocument();
5293 var device = getDevice$1(); // Fix iPad weird body scroll
5294
5295 if (device.ipad) {
5296 document.body.scrollLeft = 0;
5297 setTimeout(function () {
5298 document.body.scrollLeft = 0;
5299 }, 0);
5300 }
5301 },
5302 resize: function resize() {
5303 var app = this;
5304 app.getSize();
5305 }
5306 }
5307 };
5308
5309 var globals = {};
5310 var jsonpRequests = 0;
5311
5312 var RequestResponse = function RequestResponse(obj) {
5313 Object.assign(this, obj);
5314 };
5315
5316 var RequestError = /*#__PURE__*/function (_Error) {
5317 _inheritsLoose(RequestError, _Error);
5318
5319 function RequestError(obj) {
5320 var _this;
5321
5322 _this = _Error.call(this) || this;
5323 Object.assign(_assertThisInitialized(_this), obj);
5324 return _this;
5325 }
5326
5327 return RequestError;
5328 }( /*#__PURE__*/_wrapNativeSuper(Error));
5329
5330 var request = function request(requestOptions) {
5331 return new Promise(function (resolve, reject) {
5332 var window = getWindow();
5333 var document = getDocument();
5334 var globalsNoCallbacks = extend$1({}, globals);
5335 'beforeCreate beforeOpen beforeSend error complete success statusCode'.split(' ').forEach(function (callbackName) {
5336 delete globalsNoCallbacks[callbackName];
5337 });
5338 var defaults = extend$1({
5339 url: window.location.toString(),
5340 method: 'GET',
5341 data: false,
5342 async: true,
5343 cache: true,
5344 user: '',
5345 password: '',
5346 headers: {},
5347 xhrFields: {},
5348 statusCode: {},
5349 processData: true,
5350 dataType: 'text',
5351 contentType: 'application/x-www-form-urlencoded',
5352 timeout: 0
5353 }, globalsNoCallbacks);
5354 var proceedRequest;
5355 var options = extend$1({}, defaults, requestOptions);
5356
5357 if (requestOptions.abortController) {
5358 options.abortController = requestOptions.abortController;
5359 }
5360
5361 if (options.abortController && options.abortController.canceled) {
5362 reject(new RequestError({
5363 options: options,
5364 status: 'canceled',
5365 message: 'canceled'
5366 }));
5367 return;
5368 } // Function to run XHR callbacks and events
5369
5370
5371 function fireCallback(callbackName) {
5372 /*
5373 Callbacks:
5374 beforeCreate (options),
5375 beforeOpen (xhr, options),
5376 beforeSend (xhr, options),
5377 error (xhr, status, message),
5378 complete (xhr, status),
5379 success (response, status, xhr),
5380 statusCode ()
5381 */
5382 var globalCallbackValue;
5383 var optionCallbackValue;
5384
5385 for (var _len = arguments.length, data = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
5386 data[_key - 1] = arguments[_key];
5387 }
5388
5389 if (globals[callbackName]) {
5390 globalCallbackValue = globals[callbackName].apply(globals, data);
5391 }
5392
5393 if (options[callbackName]) {
5394 optionCallbackValue = options[callbackName].apply(options, data);
5395 }
5396
5397 if (typeof globalCallbackValue !== 'boolean') globalCallbackValue = true;
5398 if (typeof optionCallbackValue !== 'boolean') optionCallbackValue = true;
5399
5400 if (options.abortController && options.abortController.canceled && (callbackName === 'beforeCreate' || callbackName === 'beforeOpen' || callbackName === 'beforeSend')) {
5401 return false;
5402 }
5403
5404 return globalCallbackValue && optionCallbackValue;
5405 } // Before create callback
5406
5407
5408 proceedRequest = fireCallback('beforeCreate', options);
5409
5410 if (proceedRequest === false) {
5411 reject(new RequestError({
5412 options: options,
5413 status: 'canceled',
5414 message: 'canceled'
5415 }));
5416 return;
5417 } // For jQuery guys
5418
5419
5420 if (options.type) options.method = options.type; // Parameters Prefix
5421
5422 var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?'; // UC method
5423
5424 var method = options.method.toUpperCase(); // Data to modify GET URL
5425
5426 if ((method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') && options.data) {
5427 var stringData;
5428
5429 if (typeof options.data === 'string') {
5430 // Should be key=value string
5431 if (options.data.indexOf('?') >= 0) stringData = options.data.split('?')[1];else stringData = options.data;
5432 } else {
5433 // Should be key=value object
5434 stringData = serializeObject(options.data);
5435 }
5436
5437 if (stringData.length) {
5438 options.url += paramsPrefix + stringData;
5439 if (paramsPrefix === '?') paramsPrefix = '&';
5440 }
5441 } // JSONP
5442
5443
5444 if (options.dataType === 'json' && options.url.indexOf('callback=') >= 0) {
5445 var callbackName = "f7jsonp_" + (Date.now() + (jsonpRequests += 1));
5446 var abortTimeout;
5447 var callbackSplit = options.url.split('callback=');
5448 var requestUrl = callbackSplit[0] + "callback=" + callbackName;
5449
5450 if (callbackSplit[1].indexOf('&') >= 0) {
5451 var addVars = callbackSplit[1].split('&').filter(function (el) {
5452 return el.indexOf('=') > 0;
5453 }).join('&');
5454 if (addVars.length > 0) requestUrl += "&" + addVars;
5455 } // Create script
5456
5457
5458 var script = document.createElement('script');
5459 script.type = 'text/javascript';
5460
5461 script.onerror = function onerror() {
5462 clearTimeout(abortTimeout);
5463 fireCallback('error', null, 'scripterror', 'scripterror');
5464 reject(new RequestError({
5465 options: options,
5466 status: 'scripterror',
5467 message: 'scripterror'
5468 }));
5469 fireCallback('complete', null, 'scripterror');
5470 };
5471
5472 script.src = requestUrl; // Handler
5473
5474 window[callbackName] = function jsonpCallback(data) {
5475 clearTimeout(abortTimeout);
5476 fireCallback('success', data);
5477 script.parentNode.removeChild(script);
5478 script = null;
5479 delete window[callbackName];
5480 resolve(new RequestResponse({
5481 options: options,
5482 data: data
5483 }));
5484 };
5485
5486 document.querySelector('head').appendChild(script);
5487
5488 if (options.timeout > 0) {
5489 abortTimeout = setTimeout(function () {
5490 script.parentNode.removeChild(script);
5491 script = null;
5492 fireCallback('error', null, 'timeout', 'timeout');
5493 reject(new RequestError({
5494 options: options,
5495 status: 'timeout',
5496 message: 'timeout'
5497 }));
5498 }, options.timeout);
5499 }
5500
5501 return;
5502 } // Cache for GET/HEAD requests
5503
5504
5505 if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') {
5506 if (options.cache === false) {
5507 options.url += paramsPrefix + "_nocache" + Date.now();
5508 }
5509 } // Create XHR
5510
5511
5512 var xhr = new XMLHttpRequest();
5513
5514 if (options.abortController) {
5515 var aborted = false;
5516
5517 options.abortController.onAbort = function () {
5518 if (aborted) return;
5519 aborted = true;
5520 xhr.abort();
5521 reject(new RequestError({
5522 options: options,
5523 xhr: xhr,
5524 status: 'canceled',
5525 message: 'canceled'
5526 }));
5527 };
5528 } // Save Request URL
5529
5530
5531 xhr.requestUrl = options.url;
5532 xhr.requestParameters = options; // Before open callback
5533
5534 proceedRequest = fireCallback('beforeOpen', xhr, options);
5535
5536 if (proceedRequest === false) {
5537 reject(new RequestError({
5538 options: options,
5539 xhr: xhr,
5540 status: 'canceled',
5541 message: 'canceled'
5542 }));
5543 return;
5544 } // Open XHR
5545
5546
5547 xhr.open(method, options.url, options.async, options.user, options.password); // Create POST Data
5548
5549 var postData = null;
5550
5551 if ((method === 'POST' || method === 'PUT' || method === 'PATCH') && options.data) {
5552 if (options.processData) {
5553 var postDataInstances = [ArrayBuffer, Blob, Document, FormData]; // Post Data
5554
5555 if (postDataInstances.indexOf(options.data.constructor) >= 0) {
5556 postData = options.data;
5557 } else {
5558 // POST Headers
5559 var boundary = "---------------------------" + Date.now().toString(16);
5560
5561 if (options.contentType === 'multipart/form-data') {
5562 xhr.setRequestHeader('Content-Type', "multipart/form-data; boundary=" + boundary);
5563 } else {
5564 xhr.setRequestHeader('Content-Type', options.contentType);
5565 }
5566
5567 postData = '';
5568 var data = serializeObject(options.data);
5569
5570 if (options.contentType === 'multipart/form-data') {
5571 data = data.split('&');
5572 var newData = [];
5573
5574 for (var i = 0; i < data.length; i += 1) {
5575 newData.push("Content-Disposition: form-data; name=\"" + data[i].split('=')[0] + "\"\r\n\r\n" + data[i].split('=')[1] + "\r\n");
5576 }
5577
5578 postData = "--" + boundary + "\r\n" + newData.join("--" + boundary + "\r\n") + "--" + boundary + "--\r\n";
5579 } else if (options.contentType === 'application/json') {
5580 postData = JSON.stringify(options.data);
5581 } else {
5582 postData = data;
5583 }
5584 }
5585 } else {
5586 postData = options.data;
5587 xhr.setRequestHeader('Content-Type', options.contentType);
5588 }
5589 }
5590
5591 if (options.dataType === 'json' && (!options.headers || !options.headers.Accept)) {
5592 xhr.setRequestHeader('Accept', 'application/json');
5593 } // Additional headers
5594
5595
5596 if (options.headers) {
5597 Object.keys(options.headers).forEach(function (headerName) {
5598 if (typeof options.headers[headerName] === 'undefined') return;
5599 xhr.setRequestHeader(headerName, options.headers[headerName]);
5600 });
5601 } // Check for crossDomain
5602
5603
5604 if (typeof options.crossDomain === 'undefined') {
5605 options.crossDomain = // eslint-disable-next-line
5606 /^([\w-]+:)?\/\/([^\/]+)/.test(options.url) && RegExp.$2 !== window.location.host;
5607 }
5608
5609 if (!options.crossDomain) {
5610 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
5611 }
5612
5613 if (options.xhrFields) {
5614 extend$1(xhr, options.xhrFields);
5615 } // Handle XHR
5616
5617
5618 xhr.onload = function onload() {
5619 if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 0) {
5620 var responseData;
5621
5622 if (options.dataType === 'json') {
5623 var parseError;
5624
5625 try {
5626 responseData = JSON.parse(xhr.responseText);
5627 } catch (err) {
5628 parseError = true;
5629 }
5630
5631 if (!parseError) {
5632 fireCallback('success', responseData, xhr.status, xhr);
5633 resolve(new RequestResponse({
5634 options: options,
5635 data: responseData,
5636 status: xhr.status,
5637 xhr: xhr
5638 }));
5639 } else {
5640 fireCallback('error', xhr, 'parseerror', 'parseerror');
5641 reject(new RequestError({
5642 options: options,
5643 xhr: xhr,
5644 status: 'parseerror',
5645 message: 'parseerror'
5646 }));
5647 }
5648 } else {
5649 responseData = xhr.responseType === 'text' || xhr.responseType === '' ? xhr.responseText : xhr.response;
5650 fireCallback('success', responseData, xhr.status, xhr);
5651 resolve(new RequestResponse({
5652 options: options,
5653 data: responseData,
5654 status: xhr.status,
5655 xhr: xhr
5656 }));
5657 }
5658 } else {
5659 fireCallback('error', xhr, xhr.status, xhr.statusText);
5660 reject(new RequestError({
5661 options: options,
5662 xhr: xhr,
5663 status: xhr.status,
5664 message: xhr.statusText
5665 }));
5666 }
5667
5668 if (options.statusCode) {
5669 if (globals.statusCode && globals.statusCode[xhr.status]) globals.statusCode[xhr.status](xhr);
5670 if (options.statusCode[xhr.status]) options.statusCode[xhr.status](xhr);
5671 }
5672
5673 fireCallback('complete', xhr, xhr.status);
5674 };
5675
5676 xhr.onerror = function onerror() {
5677 fireCallback('error', xhr, xhr.status, xhr.status);
5678 reject(new RequestError({
5679 options: options,
5680 xhr: xhr,
5681 status: xhr.status,
5682 message: xhr.statusText
5683 }));
5684 fireCallback('complete', xhr, 'error');
5685 }; // Timeout
5686
5687
5688 if (options.timeout > 0) {
5689 xhr.timeout = options.timeout;
5690
5691 xhr.ontimeout = function () {
5692 fireCallback('error', xhr, 'timeout', 'timeout');
5693 reject(new RequestError({
5694 options: options,
5695 xhr: xhr,
5696 status: 'timeout',
5697 message: 'timeout'
5698 }));
5699 fireCallback('complete', xhr, 'timeout');
5700 };
5701 } // Ajax start callback
5702
5703
5704 proceedRequest = fireCallback('beforeSend', xhr, options);
5705
5706 if (proceedRequest === false) {
5707 reject(new RequestError({
5708 options: options,
5709 xhr: xhr,
5710 status: 'canceled',
5711 message: 'canceled'
5712 }));
5713 return;
5714 } // Send XHR
5715
5716
5717 xhr.send(postData);
5718 });
5719 };
5720
5721 function requestShortcut(method) {
5722 var _ref = [],
5723 url = _ref[0],
5724 data = _ref[1],
5725 success = _ref[2],
5726 error = _ref[3],
5727 dataType = _ref[4];
5728
5729 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
5730 args[_key2 - 1] = arguments[_key2];
5731 }
5732
5733 if (typeof args[1] === 'function') {
5734 url = args[0];
5735 success = args[1];
5736 error = args[2];
5737 dataType = args[3];
5738 } else {
5739 url = args[0];
5740 data = args[1];
5741 success = args[2];
5742 error = args[3];
5743 dataType = args[4];
5744 }
5745
5746 [success, error].forEach(function (callback) {
5747 if (typeof callback === 'string') {
5748 dataType = callback;
5749 if (callback === success) success = undefined;else error = undefined;
5750 }
5751 });
5752 dataType = dataType || (method === 'json' || method === 'postJSON' ? 'json' : undefined);
5753 var requestOptions = {
5754 url: url,
5755 method: method === 'post' || method === 'postJSON' ? 'POST' : 'GET',
5756 data: data,
5757 success: success,
5758 error: error,
5759 dataType: dataType
5760 };
5761
5762 if (method === 'postJSON') {
5763 extend$1(requestOptions, {
5764 contentType: 'application/json',
5765 processData: false,
5766 crossDomain: true,
5767 data: typeof data === 'string' ? data : JSON.stringify(data)
5768 });
5769 }
5770
5771 return request(requestOptions);
5772 }
5773
5774 Object.assign(request, {
5775 get: function get() {
5776 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
5777 args[_key3] = arguments[_key3];
5778 }
5779
5780 return requestShortcut.apply(void 0, ['get'].concat(args));
5781 },
5782 post: function post() {
5783 for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
5784 args[_key4] = arguments[_key4];
5785 }
5786
5787 return requestShortcut.apply(void 0, ['post'].concat(args));
5788 },
5789 json: function json() {
5790 for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
5791 args[_key5] = arguments[_key5];
5792 }
5793
5794 return requestShortcut.apply(void 0, ['json'].concat(args));
5795 },
5796 getJSON: function getJSON() {
5797 for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
5798 args[_key6] = arguments[_key6];
5799 }
5800
5801 return requestShortcut.apply(void 0, ['json'].concat(args));
5802 },
5803 postJSON: function postJSON() {
5804 for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
5805 args[_key7] = arguments[_key7];
5806 }
5807
5808 return requestShortcut.apply(void 0, ['postJSON'].concat(args));
5809 }
5810 });
5811
5812 request.abortController = function () {
5813 var contoller = {
5814 canceled: false,
5815 onAbort: null,
5816 abort: function abort() {
5817 contoller.canceled = true;
5818 if (contoller.onAbort) contoller.onAbort();
5819 }
5820 };
5821 return contoller;
5822 };
5823
5824 request.setup = function setup(options) {
5825 if (options.type && !options.method) {
5826 extend$1(options, {
5827 method: options.type
5828 });
5829 }
5830
5831 extend$1(globals, options);
5832 };
5833
5834 /* eslint no-param-reassign: "off" */
5835 var RequestModule = {
5836 name: 'request',
5837 proto: {
5838 request: request
5839 },
5840 static: {
5841 request: request
5842 }
5843 };
5844
5845 /* eslint-disable no-nested-ternary */
5846
5847 function initTouch() {
5848 var app = this;
5849 var device = getDevice$1();
5850 var support = getSupport$1();
5851 var window = getWindow();
5852 var document = getDocument();
5853 var params = app.params.touch;
5854 var useRipple = params[app.theme + "TouchRipple"];
5855
5856 if (device.ios && device.webView) {
5857 // Strange hack required for iOS 8 webview to work on inputs
5858 window.addEventListener('touchstart', function () {});
5859 }
5860
5861 var touchStartX;
5862 var touchStartY;
5863 var targetElement;
5864 var isMoved;
5865 var tapHoldFired;
5866 var tapHoldTimeout;
5867 var preventClick;
5868 var activableElement;
5869 var activeTimeout;
5870 var rippleWave;
5871 var rippleTarget;
5872 var rippleTimeout;
5873
5874 function findActivableElement(el) {
5875 var target = $(el);
5876 var parents = target.parents(params.activeStateElements);
5877
5878 if (target.closest('.no-active-state').length) {
5879 return null;
5880 }
5881
5882 var activable;
5883
5884 if (target.is(params.activeStateElements)) {
5885 activable = target;
5886 }
5887
5888 if (parents.length > 0) {
5889 activable = activable ? activable.add(parents) : parents;
5890 }
5891
5892 if (activable && activable.length > 1) {
5893 var newActivable = [];
5894 var preventPropagation;
5895
5896 for (var i = 0; i < activable.length; i += 1) {
5897 if (!preventPropagation) {
5898 newActivable.push(activable[i]);
5899
5900 if (activable.eq(i).hasClass('prevent-active-state-propagation') || activable.eq(i).hasClass('no-active-state-propagation')) {
5901 preventPropagation = true;
5902 }
5903 }
5904 }
5905
5906 activable = $(newActivable);
5907 }
5908
5909 return activable || target;
5910 }
5911
5912 function isInsideScrollableView(el) {
5913 var pageContent = el.parents('.page-content');
5914 return pageContent.length > 0;
5915 }
5916
5917 function addActive() {
5918 if (!activableElement) return;
5919 activableElement.addClass('active-state');
5920 }
5921
5922 function removeActive() {
5923 if (!activableElement) return;
5924 activableElement.removeClass('active-state');
5925 activableElement = null;
5926 } // Ripple handlers
5927
5928
5929 function findRippleElement(el) {
5930 var rippleElements = params.touchRippleElements;
5931 var $el = $(el);
5932
5933 if ($el.is(rippleElements)) {
5934 if ($el.hasClass('no-ripple')) {
5935 return false;
5936 }
5937
5938 return $el;
5939 }
5940
5941 if ($el.parents(rippleElements).length > 0) {
5942 var rippleParent = $el.parents(rippleElements).eq(0);
5943
5944 if (rippleParent.hasClass('no-ripple')) {
5945 return false;
5946 }
5947
5948 return rippleParent;
5949 }
5950
5951 return false;
5952 }
5953
5954 function createRipple($el, x, y) {
5955 if (!$el) return;
5956 rippleWave = app.touchRipple.create(app, $el, x, y);
5957 }
5958
5959 function removeRipple() {
5960 if (!rippleWave) return;
5961 rippleWave.remove();
5962 rippleWave = undefined;
5963 rippleTarget = undefined;
5964 }
5965
5966 function rippleTouchStart(el) {
5967 rippleTarget = findRippleElement(el);
5968
5969 if (!rippleTarget || rippleTarget.length === 0) {
5970 rippleTarget = undefined;
5971 return;
5972 }
5973
5974 var inScrollable = isInsideScrollableView(rippleTarget);
5975
5976 if (!inScrollable) {
5977 removeRipple();
5978 createRipple(rippleTarget, touchStartX, touchStartY);
5979 } else {
5980 clearTimeout(rippleTimeout);
5981 rippleTimeout = setTimeout(function () {
5982 removeRipple();
5983 createRipple(rippleTarget, touchStartX, touchStartY);
5984 }, 80);
5985 }
5986 }
5987
5988 function rippleTouchMove() {
5989 clearTimeout(rippleTimeout);
5990 removeRipple();
5991 }
5992
5993 function rippleTouchEnd() {
5994 if (!rippleWave && rippleTarget && !isMoved) {
5995 clearTimeout(rippleTimeout);
5996 createRipple(rippleTarget, touchStartX, touchStartY);
5997 setTimeout(removeRipple, 0);
5998 } else {
5999 removeRipple();
6000 }
6001 } // Mouse Handlers
6002
6003
6004 function handleMouseDown(e) {
6005 var $activableEl = findActivableElement(e.target);
6006
6007 if ($activableEl) {
6008 $activableEl.addClass('active-state');
6009
6010 if ('which' in e && e.which === 3) {
6011 setTimeout(function () {
6012 $('.active-state').removeClass('active-state');
6013 }, 0);
6014 }
6015 }
6016
6017 if (useRipple) {
6018 touchStartX = e.pageX;
6019 touchStartY = e.pageY;
6020 rippleTouchStart(e.target, e.pageX, e.pageY);
6021 }
6022 }
6023
6024 function handleMouseMove() {
6025 if (!params.activeStateOnMouseMove) {
6026 $('.active-state').removeClass('active-state');
6027 }
6028
6029 if (useRipple) {
6030 rippleTouchMove();
6031 }
6032 }
6033
6034 function handleMouseUp() {
6035 $('.active-state').removeClass('active-state');
6036
6037 if (useRipple) {
6038 rippleTouchEnd();
6039 }
6040 }
6041
6042 function handleTouchCancel() {
6043 targetElement = null; // Remove Active State
6044
6045 clearTimeout(activeTimeout);
6046 clearTimeout(tapHoldTimeout);
6047
6048 if (params.activeState) {
6049 removeActive();
6050 } // Remove Ripple
6051
6052
6053 if (useRipple) {
6054 rippleTouchEnd();
6055 }
6056 }
6057
6058 function handleTouchStart(e) {
6059 isMoved = false;
6060 tapHoldFired = false;
6061 preventClick = false;
6062
6063 if (e.targetTouches.length > 1) {
6064 if (activableElement) removeActive();
6065 return true;
6066 }
6067
6068 if (e.touches.length > 1 && activableElement) {
6069 removeActive();
6070 }
6071
6072 if (params.tapHold) {
6073 if (tapHoldTimeout) clearTimeout(tapHoldTimeout);
6074 tapHoldTimeout = setTimeout(function () {
6075 if (e && e.touches && e.touches.length > 1) return;
6076 tapHoldFired = true;
6077 e.preventDefault();
6078 preventClick = true;
6079 $(e.target).trigger('taphold', e);
6080 app.emit('taphold', e);
6081 }, params.tapHoldDelay);
6082 }
6083
6084 targetElement = e.target;
6085 touchStartX = e.targetTouches[0].pageX;
6086 touchStartY = e.targetTouches[0].pageY;
6087
6088 if (params.activeState) {
6089 activableElement = findActivableElement(targetElement);
6090
6091 if (activableElement && !isInsideScrollableView(activableElement)) {
6092 addActive();
6093 } else if (activableElement) {
6094 activeTimeout = setTimeout(addActive, 80);
6095 }
6096 }
6097
6098 if (useRipple) {
6099 rippleTouchStart(targetElement, touchStartX, touchStartY);
6100 }
6101
6102 return true;
6103 }
6104
6105 function handleTouchMove(e) {
6106 var touch;
6107 var distance;
6108
6109 if (e.type === 'touchmove') {
6110 touch = e.targetTouches[0];
6111 distance = params.touchClicksDistanceThreshold;
6112 }
6113
6114 if (distance && touch) {
6115 var pageX = touch.pageX;
6116 var pageY = touch.pageY;
6117
6118 if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
6119 isMoved = true;
6120 }
6121 } else {
6122 isMoved = true;
6123 }
6124
6125 if (isMoved) {
6126 preventClick = true;
6127
6128 if (params.tapHold) {
6129 clearTimeout(tapHoldTimeout);
6130 }
6131
6132 if (params.activeState) {
6133 clearTimeout(activeTimeout);
6134 removeActive();
6135 }
6136
6137 if (useRipple) {
6138 rippleTouchMove();
6139 }
6140 }
6141 }
6142
6143 function handleTouchEnd(e) {
6144 clearTimeout(activeTimeout);
6145 clearTimeout(tapHoldTimeout);
6146
6147 if (document.activeElement === e.target) {
6148 if (params.activeState) removeActive();
6149
6150 if (useRipple) {
6151 rippleTouchEnd();
6152 }
6153
6154 return true;
6155 }
6156
6157 if (params.activeState) {
6158 addActive();
6159 setTimeout(removeActive, 0);
6160 }
6161
6162 if (useRipple) {
6163 rippleTouchEnd();
6164 }
6165
6166 if (params.tapHoldPreventClicks && tapHoldFired || preventClick) {
6167 if (e.cancelable) e.preventDefault();
6168 preventClick = true;
6169 return false;
6170 }
6171
6172 return true;
6173 }
6174
6175 function handleClick(e) {
6176 var isOverswipe = e && e.detail && e.detail === 'f7Overswipe';
6177 var localPreventClick = preventClick;
6178
6179 if (targetElement && e.target !== targetElement) {
6180 if (isOverswipe) {
6181 localPreventClick = false;
6182 } else {
6183 localPreventClick = true;
6184 }
6185 }
6186
6187 if (params.tapHold && params.tapHoldPreventClicks && tapHoldFired) {
6188 localPreventClick = true;
6189 }
6190
6191 if (localPreventClick) {
6192 e.stopImmediatePropagation();
6193 e.stopPropagation();
6194 e.preventDefault();
6195 }
6196
6197 if (params.tapHold) {
6198 tapHoldTimeout = setTimeout(function () {
6199 tapHoldFired = false;
6200 }, device.ios || device.androidChrome ? 100 : 400);
6201 }
6202
6203 preventClick = false;
6204 targetElement = null;
6205 return !localPreventClick;
6206 }
6207
6208 function emitAppTouchEvent(name, e) {
6209 app.emit({
6210 events: name,
6211 data: [e]
6212 });
6213 }
6214
6215 function appClick(e) {
6216 emitAppTouchEvent('click', e);
6217 }
6218
6219 function appTouchStartActive(e) {
6220 emitAppTouchEvent('touchstart touchstart:active', e);
6221 }
6222
6223 function appTouchMoveActive(e) {
6224 emitAppTouchEvent('touchmove touchmove:active', e);
6225 }
6226
6227 function appTouchEndActive(e) {
6228 emitAppTouchEvent('touchend touchend:active', e);
6229 }
6230
6231 function appTouchStartPassive(e) {
6232 emitAppTouchEvent('touchstart:passive', e);
6233 }
6234
6235 function appTouchMovePassive(e) {
6236 emitAppTouchEvent('touchmove:passive', e);
6237 }
6238
6239 function appTouchEndPassive(e) {
6240 emitAppTouchEvent('touchend:passive', e);
6241 }
6242
6243 var passiveListener = support.passiveListener ? {
6244 passive: true
6245 } : false;
6246 var passiveListenerCapture = support.passiveListener ? {
6247 passive: true,
6248 capture: true
6249 } : true;
6250 var activeListener = support.passiveListener ? {
6251 passive: false
6252 } : false;
6253 var activeListenerCapture = support.passiveListener ? {
6254 passive: false,
6255 capture: true
6256 } : true;
6257 document.addEventListener('click', appClick, true);
6258
6259 if (support.passiveListener) {
6260 document.addEventListener(app.touchEvents.start, appTouchStartActive, activeListenerCapture);
6261 document.addEventListener(app.touchEvents.move, appTouchMoveActive, activeListener);
6262 document.addEventListener(app.touchEvents.end, appTouchEndActive, activeListener);
6263 document.addEventListener(app.touchEvents.start, appTouchStartPassive, passiveListenerCapture);
6264 document.addEventListener(app.touchEvents.move, appTouchMovePassive, passiveListener);
6265 document.addEventListener(app.touchEvents.end, appTouchEndPassive, passiveListener);
6266 } else {
6267 document.addEventListener(app.touchEvents.start, function (e) {
6268 appTouchStartActive(e);
6269 appTouchStartPassive(e);
6270 }, true);
6271 document.addEventListener(app.touchEvents.move, function (e) {
6272 appTouchMoveActive(e);
6273 appTouchMovePassive(e);
6274 }, false);
6275 document.addEventListener(app.touchEvents.end, function (e) {
6276 appTouchEndActive(e);
6277 appTouchEndPassive(e);
6278 }, false);
6279 }
6280
6281 if (support.touch) {
6282 app.on('click', handleClick);
6283 app.on('touchstart', handleTouchStart);
6284 app.on('touchmove', handleTouchMove);
6285 app.on('touchend', handleTouchEnd);
6286 document.addEventListener('touchcancel', handleTouchCancel, {
6287 passive: true
6288 });
6289 } else if (params.activeState) {
6290 app.on('touchstart', handleMouseDown);
6291 app.on('touchmove', handleMouseMove);
6292 app.on('touchend', handleMouseUp);
6293 document.addEventListener('pointercancel', handleMouseUp, {
6294 passive: true
6295 });
6296 }
6297
6298 document.addEventListener('contextmenu', function (e) {
6299 if (params.disableContextMenu && (device.ios || device.android || device.cordova || window.Capacitor && window.Capacitor.isNative)) {
6300 e.preventDefault();
6301 }
6302
6303 if (useRipple) {
6304 if (activableElement) removeActive();
6305 rippleTouchEnd();
6306 }
6307 });
6308 }
6309
6310 var TouchModule = {
6311 name: 'touch',
6312 params: {
6313 touch: {
6314 // Clicks
6315 touchClicksDistanceThreshold: 5,
6316 // ContextMenu
6317 disableContextMenu: false,
6318 // Tap Hold
6319 tapHold: false,
6320 tapHoldDelay: 750,
6321 tapHoldPreventClicks: true,
6322 // Active State
6323 activeState: true,
6324 activeStateElements: 'a, button, label, span, .actions-button, .stepper-button, .stepper-button-plus, .stepper-button-minus, .card-expandable, .menu-item, .link, .item-link, .accordion-item-toggle',
6325 activeStateOnMouseMove: false,
6326 mdTouchRipple: true,
6327 iosTouchRipple: false,
6328 auroraTouchRipple: false,
6329 touchRippleElements: '.ripple, .link, .item-link, .list-button, .links-list a, .button, button, .input-clear-button, .dialog-button, .tab-link, .item-radio, .item-checkbox, .actions-button, .searchbar-disable-button, .fab a, .checkbox, .radio, .data-table .sortable-cell:not(.input-cell), .notification-close-button, .stepper-button, .stepper-button-minus, .stepper-button-plus, .menu-item-content, .list.accordion-list .accordion-item-toggle',
6330 touchRippleInsetElements: '.ripple-inset, .icon-only, .searchbar-disable-button, .input-clear-button, .notification-close-button, .md .navbar .link.back'
6331 }
6332 },
6333 create: function create() {
6334 var app = this;
6335 var support = getSupport$1();
6336 extend$1(app, {
6337 touchEvents: {
6338 start: support.touch ? 'touchstart' : support.pointerEvents ? 'pointerdown' : 'mousedown',
6339 move: support.touch ? 'touchmove' : support.pointerEvents ? 'pointermove' : 'mousemove',
6340 end: support.touch ? 'touchend' : support.pointerEvents ? 'pointerup' : 'mouseup'
6341 }
6342 });
6343 },
6344 on: {
6345 init: initTouch
6346 }
6347 };
6348
6349 /**
6350 * Tokenize input string.
6351 */
6352 function lexer(str) {
6353 var tokens = [];
6354 var i = 0;
6355
6356 while (i < str.length) {
6357 var char = str[i];
6358
6359 if (char === "*" || char === "+" || char === "?") {
6360 tokens.push({
6361 type: "MODIFIER",
6362 index: i,
6363 value: str[i++]
6364 });
6365 continue;
6366 }
6367
6368 if (char === "\\") {
6369 tokens.push({
6370 type: "ESCAPED_CHAR",
6371 index: i++,
6372 value: str[i++]
6373 });
6374 continue;
6375 }
6376
6377 if (char === "{") {
6378 tokens.push({
6379 type: "OPEN",
6380 index: i,
6381 value: str[i++]
6382 });
6383 continue;
6384 }
6385
6386 if (char === "}") {
6387 tokens.push({
6388 type: "CLOSE",
6389 index: i,
6390 value: str[i++]
6391 });
6392 continue;
6393 }
6394
6395 if (char === ":") {
6396 var name = "";
6397 var j = i + 1;
6398
6399 while (j < str.length) {
6400 var code = str.charCodeAt(j);
6401
6402 if ( // `0-9`
6403 code >= 48 && code <= 57 || // `A-Z`
6404 code >= 65 && code <= 90 || // `a-z`
6405 code >= 97 && code <= 122 || // `_`
6406 code === 95) {
6407 name += str[j++];
6408 continue;
6409 }
6410
6411 break;
6412 }
6413
6414 if (!name) throw new TypeError("Missing parameter name at " + i);
6415 tokens.push({
6416 type: "NAME",
6417 index: i,
6418 value: name
6419 });
6420 i = j;
6421 continue;
6422 }
6423
6424 if (char === "(") {
6425 var count = 1;
6426 var pattern = "";
6427 var j = i + 1;
6428
6429 if (str[j] === "?") {
6430 throw new TypeError("Pattern cannot start with \"?\" at " + j);
6431 }
6432
6433 while (j < str.length) {
6434 if (str[j] === "\\") {
6435 pattern += str[j++] + str[j++];
6436 continue;
6437 }
6438
6439 if (str[j] === ")") {
6440 count--;
6441
6442 if (count === 0) {
6443 j++;
6444 break;
6445 }
6446 } else if (str[j] === "(") {
6447 count++;
6448
6449 if (str[j + 1] !== "?") {
6450 throw new TypeError("Capturing groups are not allowed at " + j);
6451 }
6452 }
6453
6454 pattern += str[j++];
6455 }
6456
6457 if (count) throw new TypeError("Unbalanced pattern at " + i);
6458 if (!pattern) throw new TypeError("Missing pattern at " + i);
6459 tokens.push({
6460 type: "PATTERN",
6461 index: i,
6462 value: pattern
6463 });
6464 i = j;
6465 continue;
6466 }
6467
6468 tokens.push({
6469 type: "CHAR",
6470 index: i,
6471 value: str[i++]
6472 });
6473 }
6474
6475 tokens.push({
6476 type: "END",
6477 index: i,
6478 value: ""
6479 });
6480 return tokens;
6481 }
6482 /**
6483 * Parse a string for the raw tokens.
6484 */
6485
6486
6487 function parse(str, options) {
6488 if (options === void 0) {
6489 options = {};
6490 }
6491
6492 var tokens = lexer(str);
6493 var _a = options.prefixes,
6494 prefixes = _a === void 0 ? "./" : _a;
6495 var defaultPattern = "[^" + escapeString(options.delimiter || "/#?") + "]+?";
6496 var result = [];
6497 var key = 0;
6498 var i = 0;
6499 var path = "";
6500
6501 var tryConsume = function tryConsume(type) {
6502 if (i < tokens.length && tokens[i].type === type) return tokens[i++].value;
6503 };
6504
6505 var mustConsume = function mustConsume(type) {
6506 var value = tryConsume(type);
6507 if (value !== undefined) return value;
6508 var _a = tokens[i],
6509 nextType = _a.type,
6510 index = _a.index;
6511 throw new TypeError("Unexpected " + nextType + " at " + index + ", expected " + type);
6512 };
6513
6514 var consumeText = function consumeText() {
6515 var result = "";
6516 var value; // tslint:disable-next-line
6517
6518 while (value = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR")) {
6519 result += value;
6520 }
6521
6522 return result;
6523 };
6524
6525 while (i < tokens.length) {
6526 var char = tryConsume("CHAR");
6527 var name = tryConsume("NAME");
6528 var pattern = tryConsume("PATTERN");
6529
6530 if (name || pattern) {
6531 var prefix = char || "";
6532
6533 if (prefixes.indexOf(prefix) === -1) {
6534 path += prefix;
6535 prefix = "";
6536 }
6537
6538 if (path) {
6539 result.push(path);
6540 path = "";
6541 }
6542
6543 result.push({
6544 name: name || key++,
6545 prefix: prefix,
6546 suffix: "",
6547 pattern: pattern || defaultPattern,
6548 modifier: tryConsume("MODIFIER") || ""
6549 });
6550 continue;
6551 }
6552
6553 var value = char || tryConsume("ESCAPED_CHAR");
6554
6555 if (value) {
6556 path += value;
6557 continue;
6558 }
6559
6560 if (path) {
6561 result.push(path);
6562 path = "";
6563 }
6564
6565 var open = tryConsume("OPEN");
6566
6567 if (open) {
6568 var prefix = consumeText();
6569 var name_1 = tryConsume("NAME") || "";
6570 var pattern_1 = tryConsume("PATTERN") || "";
6571 var suffix = consumeText();
6572 mustConsume("CLOSE");
6573 result.push({
6574 name: name_1 || (pattern_1 ? key++ : ""),
6575 pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1,
6576 prefix: prefix,
6577 suffix: suffix,
6578 modifier: tryConsume("MODIFIER") || ""
6579 });
6580 continue;
6581 }
6582
6583 mustConsume("END");
6584 }
6585
6586 return result;
6587 }
6588 /**
6589 * Compile a string to a template function for the path.
6590 */
6591
6592 function compile(str, options) {
6593 return tokensToFunction(parse(str, options), options);
6594 }
6595 /**
6596 * Expose a method for transforming tokens into the path function.
6597 */
6598
6599 function tokensToFunction(tokens, options) {
6600 if (options === void 0) {
6601 options = {};
6602 }
6603
6604 var reFlags = flags(options);
6605 var _a = options.encode,
6606 encode = _a === void 0 ? function (x) {
6607 return x;
6608 } : _a,
6609 _b = options.validate,
6610 validate = _b === void 0 ? true : _b; // Compile all the tokens into regexps.
6611
6612 var matches = tokens.map(function (token) {
6613 if (typeof token === "object") {
6614 return new RegExp("^(?:" + token.pattern + ")$", reFlags);
6615 }
6616 });
6617 return function (data) {
6618 var path = "";
6619
6620 for (var i = 0; i < tokens.length; i++) {
6621 var token = tokens[i];
6622
6623 if (typeof token === "string") {
6624 path += token;
6625 continue;
6626 }
6627
6628 var value = data ? data[token.name] : undefined;
6629 var optional = token.modifier === "?" || token.modifier === "*";
6630 var repeat = token.modifier === "*" || token.modifier === "+";
6631
6632 if (Array.isArray(value)) {
6633 if (!repeat) {
6634 throw new TypeError("Expected \"" + token.name + "\" to not repeat, but got an array");
6635 }
6636
6637 if (value.length === 0) {
6638 if (optional) continue;
6639 throw new TypeError("Expected \"" + token.name + "\" to not be empty");
6640 }
6641
6642 for (var j = 0; j < value.length; j++) {
6643 var segment = encode(value[j], token);
6644
6645 if (validate && !matches[i].test(segment)) {
6646 throw new TypeError("Expected all \"" + token.name + "\" to match \"" + token.pattern + "\", but got \"" + segment + "\"");
6647 }
6648
6649 path += token.prefix + segment + token.suffix;
6650 }
6651
6652 continue;
6653 }
6654
6655 if (typeof value === "string" || typeof value === "number") {
6656 var segment = encode(String(value), token);
6657
6658 if (validate && !matches[i].test(segment)) {
6659 throw new TypeError("Expected \"" + token.name + "\" to match \"" + token.pattern + "\", but got \"" + segment + "\"");
6660 }
6661
6662 path += token.prefix + segment + token.suffix;
6663 continue;
6664 }
6665
6666 if (optional) continue;
6667 var typeOfMessage = repeat ? "an array" : "a string";
6668 throw new TypeError("Expected \"" + token.name + "\" to be " + typeOfMessage);
6669 }
6670
6671 return path;
6672 };
6673 }
6674 /**
6675 * Create path match function from `path-to-regexp` spec.
6676 */
6677
6678 function match(str, options) {
6679 var keys = [];
6680 var re = pathToRegexp(str, keys, options);
6681 return regexpToFunction(re, keys, options);
6682 }
6683 /**
6684 * Create a path match function from `path-to-regexp` output.
6685 */
6686
6687 function regexpToFunction(re, keys, options) {
6688 if (options === void 0) {
6689 options = {};
6690 }
6691
6692 var _a = options.decode,
6693 decode = _a === void 0 ? function (x) {
6694 return x;
6695 } : _a;
6696 return function (pathname) {
6697 var m = re.exec(pathname);
6698 if (!m) return false;
6699 var path = m[0],
6700 index = m.index;
6701 var params = Object.create(null);
6702
6703 var _loop_1 = function _loop_1(i) {
6704 // tslint:disable-next-line
6705 if (m[i] === undefined) return "continue";
6706 var key = keys[i - 1];
6707
6708 if (key.modifier === "*" || key.modifier === "+") {
6709 params[key.name] = m[i].split(key.prefix + key.suffix).map(function (value) {
6710 return decode(value, key);
6711 });
6712 } else {
6713 params[key.name] = decode(m[i], key);
6714 }
6715 };
6716
6717 for (var i = 1; i < m.length; i++) {
6718 _loop_1(i);
6719 }
6720
6721 return {
6722 path: path,
6723 index: index,
6724 params: params
6725 };
6726 };
6727 }
6728 /**
6729 * Escape a regular expression string.
6730 */
6731
6732 function escapeString(str) {
6733 return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
6734 }
6735 /**
6736 * Get the flags for a regexp from the options.
6737 */
6738
6739
6740 function flags(options) {
6741 return options && options.sensitive ? "" : "i";
6742 }
6743 /**
6744 * Pull out keys from a regexp.
6745 */
6746
6747
6748 function regexpToRegexp(path, keys) {
6749 if (!keys) return path;
6750 var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g;
6751 var index = 0;
6752 var execResult = groupsRegex.exec(path.source);
6753
6754 while (execResult) {
6755 keys.push({
6756 // Use parenthesized substring match if available, index otherwise
6757 name: execResult[1] || index++,
6758 prefix: "",
6759 suffix: "",
6760 modifier: "",
6761 pattern: ""
6762 });
6763 execResult = groupsRegex.exec(path.source);
6764 }
6765
6766 return path;
6767 }
6768 /**
6769 * Transform an array into a regexp.
6770 */
6771
6772
6773 function arrayToRegexp(paths, keys, options) {
6774 var parts = paths.map(function (path) {
6775 return pathToRegexp(path, keys, options).source;
6776 });
6777 return new RegExp("(?:" + parts.join("|") + ")", flags(options));
6778 }
6779 /**
6780 * Create a path regexp from string input.
6781 */
6782
6783
6784 function stringToRegexp(path, keys, options) {
6785 return tokensToRegexp(parse(path, options), keys, options);
6786 }
6787 /**
6788 * Expose a function for taking tokens and returning a RegExp.
6789 */
6790
6791
6792 function tokensToRegexp(tokens, keys, options) {
6793 if (options === void 0) {
6794 options = {};
6795 }
6796
6797 var _a = options.strict,
6798 strict = _a === void 0 ? false : _a,
6799 _b = options.start,
6800 start = _b === void 0 ? true : _b,
6801 _c = options.end,
6802 end = _c === void 0 ? true : _c,
6803 _d = options.encode,
6804 encode = _d === void 0 ? function (x) {
6805 return x;
6806 } : _d;
6807 var endsWith = "[" + escapeString(options.endsWith || "") + "]|$";
6808 var delimiter = "[" + escapeString(options.delimiter || "/#?") + "]";
6809 var route = start ? "^" : ""; // Iterate over the tokens and create our regexp string.
6810
6811 for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
6812 var token = tokens_1[_i];
6813
6814 if (typeof token === "string") {
6815 route += escapeString(encode(token));
6816 } else {
6817 var prefix = escapeString(encode(token.prefix));
6818 var suffix = escapeString(encode(token.suffix));
6819
6820 if (token.pattern) {
6821 if (keys) keys.push(token);
6822
6823 if (prefix || suffix) {
6824 if (token.modifier === "+" || token.modifier === "*") {
6825 var mod = token.modifier === "*" ? "?" : "";
6826 route += "(?:" + prefix + "((?:" + token.pattern + ")(?:" + suffix + prefix + "(?:" + token.pattern + "))*)" + suffix + ")" + mod;
6827 } else {
6828 route += "(?:" + prefix + "(" + token.pattern + ")" + suffix + ")" + token.modifier;
6829 }
6830 } else {
6831 route += "(" + token.pattern + ")" + token.modifier;
6832 }
6833 } else {
6834 route += "(?:" + prefix + suffix + ")" + token.modifier;
6835 }
6836 }
6837 }
6838
6839 if (end) {
6840 if (!strict) route += delimiter + "?";
6841 route += !options.endsWith ? "$" : "(?=" + endsWith + ")";
6842 } else {
6843 var endToken = tokens[tokens.length - 1];
6844 var isEndDelimited = typeof endToken === "string" ? delimiter.indexOf(endToken[endToken.length - 1]) > -1 : // tslint:disable-next-line
6845 endToken === undefined;
6846
6847 if (!strict) {
6848 route += "(?:" + delimiter + "(?=" + endsWith + "))?";
6849 }
6850
6851 if (!isEndDelimited) {
6852 route += "(?=" + delimiter + "|" + endsWith + ")";
6853 }
6854 }
6855
6856 return new RegExp(route, flags(options));
6857 }
6858 /**
6859 * Normalize the given path string, returning a regular expression.
6860 *
6861 * An empty array can be passed in for the keys, which will hold the
6862 * placeholder key descriptions. For example, using `/user/:id`, `keys` will
6863 * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
6864 */
6865
6866 function pathToRegexp(path, keys, options) {
6867 if (path instanceof RegExp) return regexpToRegexp(path, keys);
6868 if (Array.isArray(path)) return arrayToRegexp(path, keys, options);
6869 return stringToRegexp(path, keys, options);
6870 }
6871
6872 var History$2 = {
6873 queue: [],
6874 clearQueue: function clearQueue() {
6875 if (History$2.queue.length === 0) return;
6876 var currentQueue = History$2.queue.shift();
6877 currentQueue();
6878 },
6879 routerQueue: [],
6880 clearRouterQueue: function clearRouterQueue() {
6881 if (History$2.routerQueue.length === 0) return;
6882 var currentQueue = History$2.routerQueue.pop();
6883 var router = currentQueue.router,
6884 stateUrl = currentQueue.stateUrl,
6885 action = currentQueue.action;
6886 var animate = router.params.animate;
6887 if (router.params.browserHistoryAnimate === false) animate = false;
6888
6889 if (action === 'back') {
6890 router.back({
6891 animate: animate,
6892 browserHistory: false
6893 });
6894 }
6895
6896 if (action === 'load') {
6897 router.navigate(stateUrl, {
6898 animate: animate,
6899 browserHistory: false
6900 });
6901 }
6902 },
6903 handle: function handle(e) {
6904 if (History$2.blockPopstate) return;
6905 var app = this; // const mainView = app.views.main;
6906
6907 var state = e.state;
6908 History$2.previousState = History$2.state;
6909 History$2.state = state;
6910 History$2.allowChange = true;
6911 History$2.clearQueue();
6912 state = History$2.state;
6913 if (!state) state = {};
6914 app.views.forEach(function (view) {
6915 var router = view.router;
6916 var viewState = state[view.id];
6917
6918 if (!viewState && view.params.browserHistory) {
6919 viewState = {
6920 url: view.router.history[0]
6921 };
6922 }
6923
6924 if (!viewState) return;
6925 var stateUrl = viewState.url || undefined;
6926 var animate = router.params.animate;
6927 if (router.params.browserHistoryAnimate === false) animate = false;
6928
6929 if (stateUrl !== router.url) {
6930 if (router.history.indexOf(stateUrl) >= 0) {
6931 // Go Back
6932 if (router.allowPageChange) {
6933 router.back({
6934 animate: animate,
6935 browserHistory: false
6936 });
6937 } else {
6938 History$2.routerQueue.push({
6939 action: 'back',
6940 router: router
6941 });
6942 }
6943 } else if (router.allowPageChange) {
6944 // Load page
6945 router.navigate(stateUrl, {
6946 animate: animate,
6947 browserHistory: false
6948 });
6949 } else {
6950 History$2.routerQueue.unshift({
6951 action: 'load',
6952 stateUrl: stateUrl,
6953 router: router
6954 });
6955 }
6956 }
6957 });
6958 },
6959 initViewState: function initViewState(viewId, viewState) {
6960 var _extend;
6961
6962 var window = getWindow();
6963 var newState = extend$1({}, History$2.state || {}, (_extend = {}, _extend[viewId] = viewState, _extend));
6964 History$2.state = newState;
6965 window.history.replaceState(newState, '');
6966 },
6967 push: function push(viewId, viewState, url) {
6968 var _extend2;
6969
6970 var window = getWindow();
6971
6972 if (url.substr(-3) === '#!/') {
6973 // eslint-disable-next-line
6974 url = url.replace('#!/', '');
6975 }
6976
6977 if (!History$2.allowChange) {
6978 History$2.queue.push(function () {
6979 History$2.push(viewId, viewState, url);
6980 });
6981 return;
6982 }
6983
6984 History$2.previousState = History$2.state;
6985 var newState = extend$1({}, History$2.previousState || {}, (_extend2 = {}, _extend2[viewId] = viewState, _extend2));
6986 History$2.state = newState;
6987 window.history.pushState(newState, '', url);
6988 },
6989 replace: function replace(viewId, viewState, url) {
6990 var _extend3;
6991
6992 var window = getWindow();
6993
6994 if (url.substr(-3) === '#!/') {
6995 // eslint-disable-next-line
6996 url = url.replace('#!/', '');
6997 }
6998
6999 if (!History$2.allowChange) {
7000 History$2.queue.push(function () {
7001 History$2.replace(viewId, viewState, url);
7002 });
7003 return;
7004 }
7005
7006 History$2.previousState = History$2.state;
7007 var newState = extend$1({}, History$2.previousState || {}, (_extend3 = {}, _extend3[viewId] = viewState, _extend3));
7008 History$2.state = newState;
7009 window.history.replaceState(newState, '', url);
7010 },
7011 go: function go(index) {
7012 var window = getWindow();
7013 History$2.allowChange = false;
7014 window.history.go(index);
7015 },
7016 back: function back() {
7017 var window = getWindow();
7018 History$2.allowChange = false;
7019 window.history.back();
7020 },
7021 allowChange: true,
7022 previousState: {},
7023 state: {},
7024 blockPopstate: true,
7025 init: function init(app) {
7026 var window = getWindow();
7027 var document = getDocument();
7028 History$2.state = window.history.state;
7029 $(window).on('load', function () {
7030 setTimeout(function () {
7031 History$2.blockPopstate = false;
7032 }, 0);
7033 });
7034
7035 if (document.readyState && document.readyState === 'complete') {
7036 History$2.blockPopstate = false;
7037 }
7038
7039 $(window).on('popstate', History$2.handle.bind(app));
7040 }
7041 };
7042
7043 function SwipeBack(r) {
7044 var router = r;
7045 var $el = router.$el,
7046 $navbarsEl = router.$navbarsEl,
7047 app = router.app,
7048 params = router.params;
7049 var support = getSupport$1();
7050 var device = getDevice$1();
7051 var isTouched = false;
7052 var isMoved = false;
7053 var touchesStart = {};
7054 var isScrolling;
7055 var $currentPageEl = [];
7056 var $previousPageEl = [];
7057 var viewContainerWidth;
7058 var touchesDiff;
7059 var allowViewTouchMove = true;
7060 var touchStartTime;
7061 var $currentNavbarEl = [];
7062 var $previousNavbarEl = [];
7063 var dynamicNavbar;
7064 var $pageShadowEl;
7065 var $pageOpacityEl;
7066 var animatableNavEls;
7067 var paramsSwipeBackAnimateShadow = params[app.theme + "SwipeBackAnimateShadow"];
7068 var paramsSwipeBackAnimateOpacity = params[app.theme + "SwipeBackAnimateOpacity"];
7069 var paramsSwipeBackActiveArea = params[app.theme + "SwipeBackActiveArea"];
7070 var paramsSwipeBackThreshold = params[app.theme + "SwipeBackThreshold"];
7071 var transformOrigin = app.rtl ? 'right center' : 'left center';
7072 var transformOriginTitleLarge = app.rtl ? 'calc(100% - var(--f7-navbar-large-title-padding-left) - var(--f7-safe-area-left)) center' : 'calc(var(--f7-navbar-large-title-padding-left) + var(--f7-safe-area-left)) center';
7073
7074 function animatableNavElements() {
7075 var els = [];
7076 var inverter = app.rtl ? -1 : 1;
7077 var currentNavIsTransparent = $currentNavbarEl.hasClass('navbar-transparent') && !$currentNavbarEl.hasClass('navbar-large') && !$currentNavbarEl.hasClass('navbar-transparent-visible');
7078 var currentNavIsLarge = $currentNavbarEl.hasClass('navbar-large');
7079 var currentNavIsCollapsed = $currentNavbarEl.hasClass('navbar-large-collapsed');
7080 var currentNavIsLargeTransparent = $currentNavbarEl.hasClass('navbar-large-transparent') || $currentNavbarEl.hasClass('navbar-large') && $currentNavbarEl.hasClass('navbar-transparent');
7081 var previousNavIsTransparent = $previousNavbarEl.hasClass('navbar-transparent') && !$previousNavbarEl.hasClass('navbar-large') && !$previousNavbarEl.hasClass('navbar-transparent-visible');
7082 var previousNavIsLarge = $previousNavbarEl.hasClass('navbar-large');
7083 var previousNavIsCollapsed = $previousNavbarEl.hasClass('navbar-large-collapsed');
7084 var previousNavIsLargeTransparent = $previousNavbarEl.hasClass('navbar-large-transparent') || $previousNavbarEl.hasClass('navbar-large') && $previousNavbarEl.hasClass('navbar-transparent');
7085 var fromLarge = currentNavIsLarge && !currentNavIsCollapsed;
7086 var toLarge = previousNavIsLarge && !previousNavIsCollapsed;
7087 var $currentNavElements = $currentNavbarEl.find('.left, .title, .right, .subnavbar, .fading, .title-large, .navbar-bg');
7088 var $previousNavElements = $previousNavbarEl.find('.left, .title, .right, .subnavbar, .fading, .title-large, .navbar-bg');
7089 var activeNavBackIconText;
7090 var previousNavBackIconText;
7091
7092 if (params.iosAnimateNavbarBackIcon) {
7093 if ($currentNavbarEl.hasClass('sliding') || $currentNavbarEl.find('.navbar-inner.sliding').length) {
7094 activeNavBackIconText = $currentNavbarEl.find('.left').find('.back .icon + span').eq(0);
7095 } else {
7096 activeNavBackIconText = $currentNavbarEl.find('.left.sliding').find('.back .icon + span').eq(0);
7097 }
7098
7099 if ($previousNavbarEl.hasClass('sliding') || $previousNavbarEl.find('.navbar-inner.sliding').length) {
7100 previousNavBackIconText = $previousNavbarEl.find('.left').find('.back .icon + span').eq(0);
7101 } else {
7102 previousNavBackIconText = $previousNavbarEl.find('.left.sliding').find('.back .icon + span').eq(0);
7103 }
7104
7105 if (activeNavBackIconText.length) {
7106 $previousNavElements.each(function (el) {
7107 if (!$(el).hasClass('title')) return;
7108 el.f7NavbarLeftOffset += activeNavBackIconText.prev('.icon')[0].offsetWidth;
7109 });
7110 }
7111 }
7112
7113 $currentNavElements.each(function (navEl) {
7114 var $navEl = $(navEl);
7115 var isSubnavbar = $navEl.hasClass('subnavbar');
7116 var isLeft = $navEl.hasClass('left');
7117 var isTitle = $navEl.hasClass('title');
7118 var isBg = $navEl.hasClass('navbar-bg');
7119 if ((isTitle || isBg) && currentNavIsTransparent) return;
7120 if (!fromLarge && $navEl.hasClass('.title-large')) return;
7121 var el = {
7122 el: navEl
7123 };
7124
7125 if (fromLarge) {
7126 if (isTitle) return;
7127
7128 if ($navEl.hasClass('title-large')) {
7129 if (els.indexOf(el) < 0) els.push(el);
7130 el.overflow = 'visible';
7131 $navEl.find('.title-large-text').each(function (subNavEl) {
7132 els.push({
7133 el: subNavEl,
7134 transform: function transform(progress) {
7135 return "translateX(" + progress * 100 * inverter + "%)";
7136 }
7137 });
7138 });
7139 return;
7140 }
7141 }
7142
7143 if (toLarge) {
7144 if (!fromLarge) {
7145 if ($navEl.hasClass('title-large')) {
7146 if (els.indexOf(el) < 0) els.push(el);
7147 el.opacity = 0;
7148 }
7149 }
7150
7151 if (isLeft) {
7152 if (els.indexOf(el) < 0) els.push(el);
7153
7154 el.opacity = function (progress) {
7155 return 1 - Math.pow(progress, 0.33);
7156 };
7157
7158 $navEl.find('.back span').each(function (subNavEl) {
7159 els.push({
7160 el: subNavEl,
7161 'transform-origin': transformOrigin,
7162 transform: function transform(progress) {
7163 return "translateX(calc(" + progress + " * (var(--f7-navbarTitleLargeOffset) - var(--f7-navbarLeftTextOffset)))) translateY(calc(" + progress + " * (var(--f7-navbar-large-title-height) - var(--f7-navbar-large-title-padding-vertical) / 2))) scale(" + (1 + 1 * progress) + ")";
7164 }
7165 });
7166 });
7167 return;
7168 }
7169 }
7170
7171 if (isBg) {
7172 if (els.indexOf(el) < 0) els.push(el);
7173
7174 if (!fromLarge && !toLarge) {
7175 if (currentNavIsCollapsed) {
7176 if (currentNavIsLargeTransparent) {
7177 el.className = 'ios-swipeback-navbar-bg-large';
7178 }
7179
7180 el.transform = function (progress) {
7181 return "translateX(" + 100 * progress * inverter + "%) translateY(calc(-1 * var(--f7-navbar-large-title-height)))";
7182 };
7183 } else {
7184 el.transform = function (progress) {
7185 return "translateX(" + 100 * progress * inverter + "%)";
7186 };
7187 }
7188 }
7189
7190 if (!fromLarge && toLarge) {
7191 el.className = 'ios-swipeback-navbar-bg-large';
7192
7193 el.transform = function (progress) {
7194 return "translateX(" + 100 * progress * inverter + "%) translateY(calc(-1 * " + (1 - progress) + " * var(--f7-navbar-large-title-height)))";
7195 };
7196 }
7197
7198 if (fromLarge && toLarge) {
7199 el.transform = function (progress) {
7200 return "translateX(" + 100 * progress * inverter + "%)";
7201 };
7202 }
7203
7204 if (fromLarge && !toLarge) {
7205 el.transform = function (progress) {
7206 return "translateX(" + 100 * progress * inverter + "%) translateY(calc(-" + progress + " * var(--f7-navbar-large-title-height)))";
7207 };
7208 }
7209
7210 return;
7211 }
7212
7213 if ($navEl.hasClass('title-large')) return;
7214 var isSliding = $navEl.hasClass('sliding') || $navEl.parents('.navbar-inner.sliding').length;
7215 if (els.indexOf(el) < 0) els.push(el);
7216
7217 if (!isSubnavbar || isSubnavbar && !isSliding) {
7218 el.opacity = function (progress) {
7219 return 1 - Math.pow(progress, 0.33);
7220 };
7221 }
7222
7223 if (isSliding) {
7224 var transformTarget = el;
7225
7226 if (isLeft && activeNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
7227 var textEl = {
7228 el: activeNavBackIconText[0]
7229 };
7230 transformTarget = textEl;
7231 els.push(textEl);
7232 }
7233
7234 transformTarget.transform = function (progress) {
7235 var activeNavTranslate = progress * transformTarget.el.f7NavbarRightOffset;
7236 if (device.pixelRatio === 1) activeNavTranslate = Math.round(activeNavTranslate);
7237
7238 if (isSubnavbar && currentNavIsLarge) {
7239 return "translate3d(" + activeNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)";
7240 }
7241
7242 return "translate3d(" + activeNavTranslate + "px,0,0)";
7243 };
7244 }
7245 });
7246 $previousNavElements.each(function (navEl) {
7247 var $navEl = $(navEl);
7248 var isSubnavbar = $navEl.hasClass('subnavbar');
7249 var isLeft = $navEl.hasClass('left');
7250 var isTitle = $navEl.hasClass('title');
7251 var isBg = $navEl.hasClass('navbar-bg');
7252 if ((isTitle || isBg) && previousNavIsTransparent) return;
7253 var el = {
7254 el: navEl
7255 };
7256
7257 if (toLarge) {
7258 if (isTitle) return;
7259 if (els.indexOf(el) < 0) els.push(el);
7260
7261 if ($navEl.hasClass('title-large')) {
7262 el.opacity = 1;
7263 el.overflow = 'visible';
7264 $navEl.find('.title-large-text').each(function (subNavEl) {
7265 els.push({
7266 el: subNavEl,
7267 'transform-origin': transformOriginTitleLarge,
7268 opacity: function opacity(progress) {
7269 return Math.pow(progress, 3);
7270 },
7271 transform: function transform(progress) {
7272 return "translateX(calc(" + (1 - progress) + " * (var(--f7-navbarLeftTextOffset) - var(--f7-navbarTitleLargeOffset)))) translateY(calc(" + (progress - 1) + " * var(--f7-navbar-large-title-height) + " + (1 - progress) + " * var(--f7-navbar-large-title-padding-vertical))) scale(" + (0.5 + progress * 0.5) + ")";
7273 }
7274 });
7275 });
7276 return;
7277 }
7278 }
7279
7280 if (isBg) {
7281 if (els.indexOf(el) < 0) els.push(el);
7282
7283 if (!fromLarge && !toLarge) {
7284 if (previousNavIsCollapsed) {
7285 if (previousNavIsLargeTransparent) {
7286 el.className = 'ios-swipeback-navbar-bg-large';
7287 }
7288
7289 el.transform = function (progress) {
7290 return "translateX(" + (-100 + 100 * progress) * inverter + "%) translateY(calc(-1 * var(--f7-navbar-large-title-height)))";
7291 };
7292 } else {
7293 el.transform = function (progress) {
7294 return "translateX(" + (-100 + 100 * progress) * inverter + "%)";
7295 };
7296 }
7297 }
7298
7299 if (!fromLarge && toLarge) {
7300 el.transform = function (progress) {
7301 return "translateX(" + (-100 + 100 * progress) * inverter + "%) translateY(calc(-1 * " + (1 - progress) + " * var(--f7-navbar-large-title-height)))";
7302 };
7303 }
7304
7305 if (fromLarge && !toLarge) {
7306 el.className = 'ios-swipeback-navbar-bg-large';
7307
7308 el.transform = function (progress) {
7309 return "translateX(" + (-100 + 100 * progress) * inverter + "%) translateY(calc(-" + progress + " * var(--f7-navbar-large-title-height)))";
7310 };
7311 }
7312
7313 if (fromLarge && toLarge) {
7314 el.transform = function (progress) {
7315 return "translateX(" + (-100 + 100 * progress) * inverter + "%)";
7316 };
7317 }
7318
7319 return;
7320 }
7321
7322 if ($navEl.hasClass('title-large')) return;
7323 var isSliding = $navEl.hasClass('sliding') || $previousNavbarEl.children('.navbar-inner.sliding').length;
7324 if (els.indexOf(el) < 0) els.push(el);
7325
7326 if (!isSubnavbar || isSubnavbar && !isSliding) {
7327 el.opacity = function (progress) {
7328 return Math.pow(progress, 3);
7329 };
7330 }
7331
7332 if (isSliding) {
7333 var transformTarget = el;
7334
7335 if (isLeft && previousNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
7336 var textEl = {
7337 el: previousNavBackIconText[0]
7338 };
7339 transformTarget = textEl;
7340 els.push(textEl);
7341 }
7342
7343 transformTarget.transform = function (progress) {
7344 var previousNavTranslate = transformTarget.el.f7NavbarLeftOffset * (1 - progress);
7345 if (device.pixelRatio === 1) previousNavTranslate = Math.round(previousNavTranslate);
7346
7347 if (isSubnavbar && previousNavIsLarge) {
7348 return "translate3d(" + previousNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)";
7349 }
7350
7351 return "translate3d(" + previousNavTranslate + "px,0,0)";
7352 };
7353 }
7354 });
7355 return els;
7356 }
7357
7358 function setAnimatableNavElements(_temp) {
7359 var _ref = _temp === void 0 ? {} : _temp,
7360 progress = _ref.progress,
7361 reset = _ref.reset,
7362 transition = _ref.transition,
7363 reflow = _ref.reflow;
7364
7365 var styles = ['overflow', 'transform', 'transform-origin', 'opacity'];
7366
7367 if (transition === true || transition === false) {
7368 for (var i = 0; i < animatableNavEls.length; i += 1) {
7369 var el = animatableNavEls[i];
7370
7371 if (el && el.el) {
7372 if (transition === true) el.el.classList.add('navbar-page-transitioning');
7373 if (transition === false) el.el.classList.remove('navbar-page-transitioning');
7374 }
7375 }
7376 }
7377
7378 if (reflow && animatableNavEls.length && animatableNavEls[0] && animatableNavEls[0].el) {
7379 // eslint-disable-next-line
7380 animatableNavEls[0].el._clientLeft = animatableNavEls[0].el.clientLeft;
7381 }
7382
7383 for (var _i = 0; _i < animatableNavEls.length; _i += 1) {
7384 var _el = animatableNavEls[_i];
7385
7386 if (_el && _el.el) {
7387 if (_el.className && !_el.classNameSet && !reset) {
7388 _el.el.classList.add(_el.className);
7389
7390 _el.classNameSet = true;
7391 }
7392
7393 if (_el.className && reset) {
7394 _el.el.classList.remove(_el.className);
7395 }
7396
7397 for (var j = 0; j < styles.length; j += 1) {
7398 var styleProp = styles[j];
7399
7400 if (_el[styleProp]) {
7401 if (reset) {
7402 _el.el.style[styleProp] = '';
7403 } else if (typeof _el[styleProp] === 'function') {
7404 _el.el.style[styleProp] = _el[styleProp](progress);
7405 } else {
7406 _el.el.style[styleProp] = _el[styleProp];
7407 }
7408 }
7409 }
7410 }
7411 }
7412 }
7413
7414 function handleTouchStart(e) {
7415 var swipeBackEnabled = params[app.theme + "SwipeBack"];
7416 if (!allowViewTouchMove || !swipeBackEnabled || isTouched || app.swipeout && app.swipeout.el || !router.allowPageChange) return;
7417 if ($(e.target).closest('.range-slider, .calendar-months').length > 0) return;
7418 if ($(e.target).closest('.page-master, .page-master-detail').length > 0 && params.masterDetailBreakpoint > 0 && app.width >= params.masterDetailBreakpoint) return;
7419 isMoved = false;
7420 isTouched = true;
7421 isScrolling = undefined;
7422 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
7423 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
7424 touchStartTime = now$1();
7425 dynamicNavbar = router.dynamicNavbar;
7426 }
7427
7428 function handleTouchMove(e) {
7429 if (!isTouched) return;
7430 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
7431 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
7432
7433 if (typeof isScrolling === 'undefined') {
7434 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x)) || pageX < touchesStart.x && !app.rtl || pageX > touchesStart.x && app.rtl;
7435 }
7436
7437 if (isScrolling || e.f7PreventSwipeBack || app.preventSwipeBack) {
7438 isTouched = false;
7439 return;
7440 }
7441
7442 if (!isMoved) {
7443 // Calc values during first move fired
7444 var cancel = false;
7445 var target = $(e.target);
7446 var swipeout = target.closest('.swipeout');
7447
7448 if (swipeout.length > 0) {
7449 if (!app.rtl && swipeout.find('.swipeout-actions-left').length > 0) cancel = true;
7450 if (app.rtl && swipeout.find('.swipeout-actions-right').length > 0) cancel = true;
7451 }
7452
7453 $currentPageEl = target.closest('.page');
7454 if ($currentPageEl.hasClass('no-swipeback') || target.closest('.no-swipeback, .card-opened').length > 0) cancel = true;
7455 $previousPageEl = $el.find('.page-previous:not(.stacked)');
7456
7457 if ($previousPageEl.length > 1) {
7458 $previousPageEl = $previousPageEl.eq($previousPageEl.length - 1);
7459 }
7460
7461 var notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
7462 viewContainerWidth = $el.width();
7463
7464 if (app.rtl) {
7465 notFromBorder = touchesStart.x < $el.offset().left - $el[0].scrollLeft + (viewContainerWidth - paramsSwipeBackActiveArea);
7466 } else {
7467 notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
7468 }
7469
7470 if (notFromBorder) cancel = true;
7471 if ($previousPageEl.length === 0 || $currentPageEl.length === 0) cancel = true;
7472
7473 if (cancel) {
7474 isTouched = false;
7475 return;
7476 }
7477
7478 if (paramsSwipeBackAnimateShadow) {
7479 $pageShadowEl = $currentPageEl.find('.page-shadow-effect');
7480
7481 if ($pageShadowEl.length === 0) {
7482 $pageShadowEl = $('<div class="page-shadow-effect"></div>');
7483 $currentPageEl.append($pageShadowEl);
7484 }
7485 }
7486
7487 if (paramsSwipeBackAnimateOpacity) {
7488 $pageOpacityEl = $previousPageEl.find('.page-opacity-effect');
7489
7490 if ($pageOpacityEl.length === 0) {
7491 $pageOpacityEl = $('<div class="page-opacity-effect"></div>');
7492 $previousPageEl.append($pageOpacityEl);
7493 }
7494 }
7495
7496 if (dynamicNavbar) {
7497 $currentNavbarEl = $navbarsEl.find('.navbar-current:not(.stacked)');
7498 $previousNavbarEl = $navbarsEl.find('.navbar-previous:not(.stacked)');
7499
7500 if ($previousNavbarEl.length > 1) {
7501 $previousNavbarEl = $previousNavbarEl.eq($previousNavbarEl.length - 1);
7502 }
7503
7504 animatableNavEls = animatableNavElements($previousNavbarEl, $currentNavbarEl);
7505 } // Close/Hide Any Picker
7506
7507
7508 if ($('.sheet.modal-in').length > 0 && app.sheet) {
7509 app.sheet.close($('.sheet.modal-in'));
7510 }
7511 }
7512
7513 e.f7PreventSwipePanel = true;
7514 isMoved = true;
7515 app.preventSwipePanelBySwipeBack = true;
7516 e.preventDefault(); // RTL inverter
7517
7518 var inverter = app.rtl ? -1 : 1; // Touches diff
7519
7520 touchesDiff = (pageX - touchesStart.x - paramsSwipeBackThreshold) * inverter;
7521 if (touchesDiff < 0) touchesDiff = 0;
7522 var percentage = Math.min(Math.max(touchesDiff / viewContainerWidth, 0), 1); // Swipe Back Callback
7523
7524 var callbackData = {
7525 percentage: percentage,
7526 progress: percentage,
7527 currentPageEl: $currentPageEl[0],
7528 previousPageEl: $previousPageEl[0],
7529 currentNavbarEl: $currentNavbarEl[0],
7530 previousNavbarEl: $previousNavbarEl[0]
7531 };
7532 $el.trigger('swipeback:move', callbackData);
7533 router.emit('swipebackMove', callbackData); // Transform pages
7534
7535 var currentPageTranslate = touchesDiff * inverter;
7536 var previousPageTranslate = (touchesDiff / 5 - viewContainerWidth / 5) * inverter;
7537
7538 if (!app.rtl) {
7539 currentPageTranslate = Math.min(currentPageTranslate, viewContainerWidth);
7540 previousPageTranslate = Math.min(previousPageTranslate, 0);
7541 } else {
7542 currentPageTranslate = Math.max(currentPageTranslate, -viewContainerWidth);
7543 previousPageTranslate = Math.max(previousPageTranslate, 0);
7544 }
7545
7546 if (device.pixelRatio === 1) {
7547 currentPageTranslate = Math.round(currentPageTranslate);
7548 previousPageTranslate = Math.round(previousPageTranslate);
7549 }
7550
7551 router.swipeBackActive = true;
7552 $([$currentPageEl[0], $previousPageEl[0]]).addClass('page-swipeback-active');
7553 $currentPageEl.transform("translate3d(" + currentPageTranslate + "px,0,0)");
7554 if (paramsSwipeBackAnimateShadow) $pageShadowEl[0].style.opacity = 1 - 1 * percentage;
7555
7556 if (app.theme === 'ios') {
7557 $previousPageEl.transform("translate3d(" + previousPageTranslate + "px,0,0)");
7558 }
7559
7560 if (paramsSwipeBackAnimateOpacity) $pageOpacityEl[0].style.opacity = 1 - 1 * percentage; // Dynamic Navbars Animation
7561
7562 if (!dynamicNavbar) return;
7563 setAnimatableNavElements({
7564 progress: percentage
7565 });
7566 }
7567
7568 function handleTouchEnd() {
7569 app.preventSwipePanelBySwipeBack = false;
7570
7571 if (!isTouched || !isMoved) {
7572 isTouched = false;
7573 isMoved = false;
7574 return;
7575 }
7576
7577 isTouched = false;
7578 isMoved = false;
7579 router.swipeBackActive = false;
7580 var $pages = $([$currentPageEl[0], $previousPageEl[0]]);
7581 $pages.removeClass('page-swipeback-active');
7582
7583 if (touchesDiff === 0) {
7584 $pages.transform('');
7585 if ($pageShadowEl && $pageShadowEl.length > 0) $pageShadowEl.remove();
7586 if ($pageOpacityEl && $pageOpacityEl.length > 0) $pageOpacityEl.remove();
7587
7588 if (dynamicNavbar) {
7589 setAnimatableNavElements({
7590 reset: true
7591 });
7592 }
7593
7594 return;
7595 }
7596
7597 var timeDiff = now$1() - touchStartTime;
7598 var pageChanged = false; // Swipe back to previous page
7599
7600 if (timeDiff < 300 && touchesDiff > 10 || timeDiff >= 300 && touchesDiff > viewContainerWidth / 2) {
7601 $currentPageEl.removeClass('page-current').addClass("page-next" + (app.theme !== 'ios' ? ' page-next-on-right' : ''));
7602 $previousPageEl.removeClass('page-previous').addClass('page-current').removeAttr('aria-hidden');
7603 if ($pageShadowEl) $pageShadowEl[0].style.opacity = '';
7604 if ($pageOpacityEl) $pageOpacityEl[0].style.opacity = '';
7605
7606 if (dynamicNavbar) {
7607 router.setNavbarPosition($currentNavbarEl, 'next');
7608 router.setNavbarPosition($previousNavbarEl, 'current', false);
7609 }
7610
7611 pageChanged = true;
7612 } // Reset custom styles
7613 // Add transitioning class for transition-duration
7614
7615
7616 $pages.addClass('page-transitioning page-transitioning-swipeback');
7617
7618 if (device.ios) {
7619 // eslint-disable-next-line
7620 $currentPageEl[0]._clientLeft = $currentPageEl[0].clientLeft;
7621 }
7622
7623 $pages.transform('');
7624
7625 if (dynamicNavbar) {
7626 setAnimatableNavElements({
7627 progress: pageChanged ? 1 : 0,
7628 transition: true,
7629 reflow: !!device.ios
7630 });
7631 }
7632
7633 allowViewTouchMove = false;
7634 router.allowPageChange = false; // Swipe Back Callback
7635
7636 var callbackData = {
7637 currentPageEl: $currentPageEl[0],
7638 previousPageEl: $previousPageEl[0],
7639 currentNavbarEl: $currentNavbarEl[0],
7640 previousNavbarEl: $previousNavbarEl[0]
7641 };
7642
7643 if (pageChanged) {
7644 // Update Route
7645 router.currentRoute = $previousPageEl[0].f7Page.route;
7646 router.currentPage = $previousPageEl[0]; // Page before animation callback
7647
7648 router.pageCallback('beforeOut', $currentPageEl, $currentNavbarEl, 'current', 'next', {
7649 route: $currentPageEl[0].f7Page.route,
7650 swipeBack: true
7651 });
7652 router.pageCallback('beforeIn', $previousPageEl, $previousNavbarEl, 'previous', 'current', {
7653 route: $previousPageEl[0].f7Page.route,
7654 swipeBack: true
7655 }, $currentPageEl[0]);
7656 $el.trigger('swipeback:beforechange', callbackData);
7657 router.emit('swipebackBeforeChange', callbackData);
7658 } else {
7659 $el.trigger('swipeback:beforereset', callbackData);
7660 router.emit('swipebackBeforeReset', callbackData);
7661 }
7662
7663 $currentPageEl.transitionEnd(function () {
7664 $pages.removeClass('page-transitioning page-transitioning-swipeback');
7665
7666 if (dynamicNavbar) {
7667 setAnimatableNavElements({
7668 reset: true,
7669 transition: false
7670 });
7671 }
7672
7673 allowViewTouchMove = true;
7674 router.allowPageChange = true;
7675
7676 if (pageChanged) {
7677 // Update History
7678 if (router.history.length === 1) {
7679 router.history.unshift(router.url);
7680 }
7681
7682 router.history.pop();
7683 router.saveHistory(); // Update push state
7684
7685 if (params.browserHistory) {
7686 History$2.back();
7687 } // Page after animation callback
7688
7689
7690 router.pageCallback('afterOut', $currentPageEl, $currentNavbarEl, 'current', 'next', {
7691 route: $currentPageEl[0].f7Page.route,
7692 swipeBack: true
7693 });
7694 router.pageCallback('afterIn', $previousPageEl, $previousNavbarEl, 'previous', 'current', {
7695 route: $previousPageEl[0].f7Page.route,
7696 swipeBack: true
7697 }); // Remove Old Page
7698
7699 if (params.stackPages && router.initialPages.indexOf($currentPageEl[0]) >= 0) {
7700 $currentPageEl.addClass('stacked');
7701
7702 if (dynamicNavbar) {
7703 $currentNavbarEl.addClass('stacked');
7704 }
7705 } else {
7706 router.pageCallback('beforeRemove', $currentPageEl, $currentNavbarEl, 'next', {
7707 swipeBack: true
7708 });
7709 router.removePage($currentPageEl);
7710
7711 if (dynamicNavbar) {
7712 router.removeNavbar($currentNavbarEl);
7713 }
7714 }
7715
7716 $el.trigger('swipeback:afterchange', callbackData);
7717 router.emit('swipebackAfterChange', callbackData);
7718 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7719
7720 if (params.preloadPreviousPage) {
7721 router.back(router.history[router.history.length - 2], {
7722 preload: true
7723 });
7724 }
7725 } else {
7726 $el.trigger('swipeback:afterreset', callbackData);
7727 router.emit('swipebackAfterReset', callbackData);
7728 }
7729
7730 if ($pageShadowEl && $pageShadowEl.length > 0) $pageShadowEl.remove();
7731 if ($pageOpacityEl && $pageOpacityEl.length > 0) $pageOpacityEl.remove();
7732 });
7733 }
7734
7735 function attachEvents() {
7736 var passiveListener = app.touchEvents.start === 'touchstart' && support.passiveListener ? {
7737 passive: true,
7738 capture: false
7739 } : false;
7740 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
7741 app.on('touchmove:active', handleTouchMove);
7742 app.on('touchend:passive', handleTouchEnd);
7743 }
7744
7745 function detachEvents() {
7746 var passiveListener = app.touchEvents.start === 'touchstart' && support.passiveListener ? {
7747 passive: true,
7748 capture: false
7749 } : false;
7750 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
7751 app.off('touchmove:active', handleTouchMove);
7752 app.off('touchend:passive', handleTouchEnd);
7753 }
7754
7755 attachEvents();
7756 router.on('routerDestroy', detachEvents);
7757 }
7758
7759 function redirect(direction, route, options) {
7760 var router = this;
7761 var r = route.route.redirect;
7762 var method = direction === 'forward' ? 'navigate' : 'back';
7763
7764 if (options.initial && router.params.browserHistory) {
7765 options.replaceState = true; // eslint-disable-line
7766
7767 options.history = true; // eslint-disable-line
7768 }
7769
7770 function redirectResolve(redirectUrl, redirectOptions) {
7771 if (redirectOptions === void 0) {
7772 redirectOptions = {};
7773 }
7774
7775 router.allowPageChange = true;
7776 router[method](redirectUrl, extend$1({}, options, redirectOptions));
7777 }
7778
7779 function redirectReject() {
7780 router.allowPageChange = true;
7781 }
7782
7783 if (typeof r === 'function') {
7784 router.allowPageChange = false;
7785 var redirectUrl = r.call(router, {
7786 router: router,
7787 to: route,
7788 resolve: redirectResolve,
7789 reject: redirectReject,
7790 direction: direction,
7791 app: router.app
7792 });
7793
7794 if (redirectUrl && typeof redirectUrl === 'string') {
7795 router.allowPageChange = true;
7796 return router[method](redirectUrl, options);
7797 }
7798
7799 return router;
7800 }
7801
7802 return router[method](r, options);
7803 }
7804
7805 function processQueue(router, routerQueue, routeQueue, to, from, resolve, _reject, direction) {
7806 var queue = [];
7807
7808 if (Array.isArray(routeQueue)) {
7809 queue.push.apply(queue, routeQueue);
7810 } else if (routeQueue && typeof routeQueue === 'function') {
7811 queue.push(routeQueue);
7812 }
7813
7814 if (routerQueue) {
7815 if (Array.isArray(routerQueue)) {
7816 queue.push.apply(queue, routerQueue);
7817 } else {
7818 queue.push(routerQueue);
7819 }
7820 }
7821
7822 function next() {
7823 if (queue.length === 0) {
7824 resolve();
7825 return;
7826 }
7827
7828 var queueItem = queue.shift();
7829 queueItem.call(router, {
7830 router: router,
7831 to: to,
7832 from: from,
7833 resolve: function resolve() {
7834 next();
7835 },
7836 reject: function reject() {
7837 _reject();
7838 },
7839 direction: direction,
7840 app: router.app
7841 });
7842 }
7843
7844 next();
7845 }
7846
7847 function processRouteQueue(to, from, resolve, reject, direction) {
7848 var router = this;
7849
7850 function enterNextRoute() {
7851 if (to && to.route && (router.params.routesBeforeEnter || to.route.beforeEnter)) {
7852 router.allowPageChange = false;
7853 processQueue(router, router.params.routesBeforeEnter, to.route.beforeEnter, to, from, function () {
7854 router.allowPageChange = true;
7855 resolve();
7856 }, function () {
7857 reject();
7858 }, direction);
7859 } else {
7860 resolve();
7861 }
7862 }
7863
7864 function leaveCurrentRoute() {
7865 if (from && from.route && (router.params.routesBeforeLeave || from.route.beforeLeave)) {
7866 router.allowPageChange = false;
7867 processQueue(router, router.params.routesBeforeLeave, from.route.beforeLeave, to, from, function () {
7868 router.allowPageChange = true;
7869 enterNextRoute();
7870 }, function () {
7871 reject();
7872 }, direction);
7873 } else {
7874 enterNextRoute();
7875 }
7876 }
7877
7878 leaveCurrentRoute();
7879 }
7880
7881 function appRouterCheck(router, method) {
7882 if (!router.view) {
7883 throw new Error("Framework7: it is not allowed to use router methods on global app router. Use router methods only on related View, e.g. app.views.main.router." + method + "(...)");
7884 }
7885 }
7886
7887 function asyncComponent(router, component, resolve, reject) {
7888 function resolvePromise(componentPromise) {
7889 componentPromise.then(function (c) {
7890 // eslint-disable-next-line
7891 resolve({
7892 component: c.default || c._default || c
7893 });
7894 }).catch(function (err) {
7895 reject();
7896 throw new Error(err);
7897 });
7898 }
7899
7900 if (component instanceof Promise) {
7901 resolvePromise(component);
7902 return;
7903 }
7904
7905 var asyncComponentResult = component.call(router);
7906
7907 if (asyncComponentResult instanceof Promise) {
7908 resolvePromise(asyncComponentResult);
7909 } else {
7910 resolve({
7911 component: asyncComponentResult
7912 });
7913 }
7914 }
7915
7916 function refreshPage() {
7917 var router = this;
7918 appRouterCheck(router, 'refreshPage');
7919 return router.navigate(router.currentRoute.url, {
7920 ignoreCache: true,
7921 reloadCurrent: true
7922 });
7923 }
7924
7925 function forward(router, el, forwardOptions) {
7926 if (forwardOptions === void 0) {
7927 forwardOptions = {};
7928 }
7929
7930 var document = getDocument();
7931 var $el = $(el);
7932 var app = router.app;
7933 var view = router.view;
7934 var options = extend$1(false, {
7935 animate: router.params.animate,
7936 browserHistory: true,
7937 replaceState: false,
7938 history: true,
7939 reloadCurrent: router.params.reloadPages,
7940 reloadPrevious: false,
7941 reloadAll: false,
7942 clearPreviousHistory: false,
7943 reloadDetail: router.params.reloadDetail,
7944 on: {}
7945 }, forwardOptions);
7946 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
7947 var isMaster = masterDetailEnabled && options.route && options.route.route && (options.route.route.master === true || typeof options.route.route.master === 'function' && options.route.route.master(app, router));
7948 var masterPageEl;
7949 var otherDetailPageEl;
7950 var detailsInBetweenRemoved = 0;
7951 var currentRouteIsModal = router.currentRoute.modal;
7952 var modalType;
7953
7954 if (!currentRouteIsModal) {
7955 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
7956 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route[modalLoadProp]) {
7957 currentRouteIsModal = true;
7958 modalType = modalLoadProp;
7959 }
7960 });
7961 }
7962
7963 if (currentRouteIsModal) {
7964 var modalToClose = router.currentRoute.modal || router.currentRoute.route.modalInstance || app[modalType].get();
7965 var previousUrl = router.history[router.history.length - 2];
7966 var previousRoute = router.findMatchingRoute(previousUrl);
7967
7968 if (!previousRoute && previousUrl) {
7969 previousRoute = {
7970 url: previousUrl,
7971 path: previousUrl.split('?')[0],
7972 query: parseUrlQuery(previousUrl),
7973 route: {
7974 path: previousUrl.split('?')[0],
7975 url: previousUrl
7976 }
7977 };
7978 }
7979
7980 router.modalRemove(modalToClose);
7981 }
7982
7983 var dynamicNavbar = router.dynamicNavbar;
7984 var $viewEl = router.$el;
7985 var $newPage = $el;
7986 var reload = options.reloadPrevious || options.reloadCurrent || options.reloadAll;
7987 var $oldPage;
7988 var $navbarsEl;
7989 var $newNavbarEl;
7990 var $oldNavbarEl;
7991 router.allowPageChange = false;
7992
7993 if ($newPage.length === 0) {
7994 router.allowPageChange = true;
7995 return router;
7996 }
7997
7998 if ($newPage.length) {
7999 // Remove theme elements
8000 router.removeThemeElements($newPage);
8001 }
8002
8003 if (dynamicNavbar) {
8004 $newNavbarEl = $newPage.children('.navbar');
8005 $navbarsEl = router.$navbarsEl;
8006
8007 if ($newNavbarEl.length === 0 && $newPage[0] && $newPage[0].f7Page) {
8008 // Try from pageData
8009 $newNavbarEl = $newPage[0].f7Page.$navbarEl;
8010 }
8011 } // Save Keep Alive Cache
8012
8013
8014 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
8015 options.route.route.keepAliveData = {
8016 pageEl: $el[0]
8017 };
8018 } // Pages In View
8019
8020
8021 var $pagesInView = $viewEl.children('.page:not(.stacked)').filter(function (pageInView) {
8022 return pageInView !== $newPage[0];
8023 }); // Navbars In View
8024
8025 var $navbarsInView;
8026
8027 if (dynamicNavbar) {
8028 $navbarsInView = $navbarsEl.children('.navbar:not(.stacked)').filter(function (navbarInView) {
8029 return navbarInView !== $newNavbarEl[0];
8030 });
8031 } // Exit when reload previous and only 1 page in view so nothing ro reload
8032
8033
8034 if (options.reloadPrevious && $pagesInView.length < 2) {
8035 router.allowPageChange = true;
8036 return router;
8037 } // Find Detail' master page
8038
8039
8040 var isDetail;
8041 var reloadDetail;
8042 var isDetailRoot;
8043
8044 if (masterDetailEnabled && !options.reloadAll) {
8045 for (var i = 0; i < $pagesInView.length; i += 1) {
8046 if (!masterPageEl && $pagesInView[i].classList.contains('page-master')) {
8047 masterPageEl = $pagesInView[i];
8048 continue; // eslint-disable-line
8049 }
8050 }
8051
8052 isDetail = !isMaster && masterPageEl;
8053
8054 if (isDetail) {
8055 // Find Other Detail
8056 if (masterPageEl) {
8057 for (var _i = 0; _i < $pagesInView.length; _i += 1) {
8058 if ($pagesInView[_i].classList.contains('page-master-detail')) {
8059 otherDetailPageEl = $pagesInView[_i];
8060 continue; // eslint-disable-line
8061 }
8062 }
8063 }
8064 }
8065
8066 reloadDetail = isDetail && options.reloadDetail && app.width >= router.params.masterDetailBreakpoint && masterPageEl;
8067 }
8068
8069 if (isDetail) {
8070 isDetailRoot = !otherDetailPageEl || reloadDetail || options.reloadAll || options.reloadCurrent;
8071 } // New Page
8072
8073
8074 var newPagePosition = 'next';
8075
8076 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
8077 newPagePosition = 'current';
8078 } else if (options.reloadPrevious) {
8079 newPagePosition = 'previous';
8080 }
8081
8082 $newPage.removeClass('page-previous page-current page-next').addClass("page-" + newPagePosition + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '') + (isDetailRoot ? ' page-master-detail-root' : '')).removeClass('stacked').trigger('page:unstack').trigger('page:position', {
8083 position: newPagePosition
8084 });
8085 router.emit('pageUnstack', $newPage[0]);
8086 router.emit('pagePosition', $newPage[0], newPagePosition);
8087
8088 if (isMaster || isDetail) {
8089 $newPage.trigger('page:role', {
8090 role: isMaster ? 'master' : 'detail',
8091 root: !!isDetailRoot
8092 });
8093 router.emit('pageRole', $newPage[0], {
8094 role: isMaster ? 'master' : 'detail',
8095 detailRoot: !!isDetailRoot
8096 });
8097 }
8098
8099 if (dynamicNavbar && $newNavbarEl.length) {
8100 $newNavbarEl.removeClass('navbar-previous navbar-current navbar-next').addClass("navbar-" + newPagePosition + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '') + (isDetailRoot ? ' navbar-master-detail-root' : '')).removeClass('stacked');
8101 $newNavbarEl.trigger('navbar:position', {
8102 position: newPagePosition
8103 });
8104 router.emit('navbarPosition', $newNavbarEl[0], newPagePosition);
8105
8106 if (isMaster || isDetail) {
8107 router.emit('navbarRole', $newNavbarEl[0], {
8108 role: isMaster ? 'master' : 'detail',
8109 detailRoot: !!isDetailRoot
8110 });
8111 }
8112 } // Find Old Page
8113
8114
8115 if (options.reloadCurrent || reloadDetail) {
8116 if (reloadDetail) {
8117 $oldPage = $pagesInView.filter(function (pageEl) {
8118 return !pageEl.classList.contains('page-master');
8119 });
8120
8121 if (dynamicNavbar) {
8122 $oldNavbarEl = $($oldPage.map(function (pageEl) {
8123 return app.navbar.getElByPage(pageEl);
8124 }));
8125 }
8126
8127 if ($oldPage.length > 1 && masterPageEl) {
8128 detailsInBetweenRemoved = $oldPage.length - 1;
8129 $(masterPageEl).removeClass('page-master-stacked').trigger('page:masterunstack');
8130 router.emit('pageMasterUnstack', masterPageEl);
8131
8132 if (dynamicNavbar) {
8133 $(app.navbar.getElByPage(masterPageEl)).removeClass('navbar-master-stacked');
8134 router.emit('navbarMasterUnstack', app.navbar.getElByPage(masterPageEl));
8135 }
8136 }
8137 } else {
8138 $oldPage = $pagesInView.eq($pagesInView.length - 1);
8139
8140 if (dynamicNavbar) {
8141 $oldNavbarEl = $(app.navbar.getElByPage($oldPage));
8142 }
8143 }
8144 } else if (options.reloadPrevious) {
8145 $oldPage = $pagesInView.eq($pagesInView.length - 2);
8146
8147 if (dynamicNavbar) {
8148 // $oldNavbarEl = $navbarsInView.eq($pagesInView.length - 2);
8149 $oldNavbarEl = $(app.navbar.getElByPage($oldPage));
8150 }
8151 } else if (options.reloadAll) {
8152 $oldPage = $pagesInView.filter(function (pageEl) {
8153 return pageEl !== $newPage[0];
8154 });
8155
8156 if (dynamicNavbar) {
8157 $oldNavbarEl = $navbarsInView.filter(function (navbarEl) {
8158 return navbarEl !== $newNavbarEl[0];
8159 });
8160 }
8161 } else {
8162 var removedPageEls = [];
8163 var removedNavbarEls = [];
8164
8165 if ($pagesInView.length > 1) {
8166 var _i2 = 0;
8167
8168 for (_i2 = 0; _i2 < $pagesInView.length - 1; _i2 += 1) {
8169 if (masterPageEl && $pagesInView[_i2] === masterPageEl) {
8170 $pagesInView.eq(_i2).addClass('page-master-stacked');
8171 $pagesInView.eq(_i2).trigger('page:masterstack');
8172 router.emit('pageMasterStack', $pagesInView[_i2]);
8173
8174 if (dynamicNavbar) {
8175 $(app.navbar.getElByPage(masterPageEl)).addClass('navbar-master-stacked');
8176 router.emit('navbarMasterStack', app.navbar.getElByPage(masterPageEl));
8177 }
8178
8179 continue; // eslint-disable-line
8180 }
8181
8182 var oldNavbarEl = app.navbar.getElByPage($pagesInView.eq(_i2));
8183
8184 if (router.params.stackPages) {
8185 $pagesInView.eq(_i2).addClass('stacked');
8186 $pagesInView.eq(_i2).trigger('page:stack');
8187 router.emit('pageStack', $pagesInView[_i2]);
8188
8189 if (dynamicNavbar) {
8190 $(oldNavbarEl).addClass('stacked');
8191 }
8192 } else {
8193 // Page remove event
8194 removedPageEls.push($pagesInView[_i2]);
8195 router.pageCallback('beforeRemove', $pagesInView[_i2], $navbarsInView && $navbarsInView[_i2], 'previous', undefined, options);
8196 router.removePage($pagesInView[_i2]);
8197
8198 if (dynamicNavbar && oldNavbarEl) {
8199 removedNavbarEls.push(oldNavbarEl);
8200 router.removeNavbar(oldNavbarEl);
8201 }
8202 }
8203 }
8204 }
8205
8206 $oldPage = $viewEl.children('.page:not(.stacked)').filter(function (pageEl) {
8207 return pageEl !== $newPage[0] && removedPageEls.indexOf(pageEl) < 0;
8208 });
8209
8210 if (dynamicNavbar) {
8211 $oldNavbarEl = $navbarsEl.children('.navbar:not(.stacked)').filter(function (navbarEl) {
8212 return navbarEl !== $newNavbarEl[0] && removedNavbarEls.indexOf(removedNavbarEls) < 0;
8213 });
8214 }
8215
8216 removedPageEls = [];
8217 removedNavbarEls = [];
8218 }
8219
8220 if (isDetail && !options.reloadAll) {
8221 if ($oldPage.length > 1 || reloadDetail) {
8222 $oldPage = $oldPage.filter(function (pageEl) {
8223 return !pageEl.classList.contains('page-master');
8224 });
8225 }
8226
8227 if ($oldNavbarEl && ($oldNavbarEl.length > 1 || reloadDetail)) {
8228 $oldNavbarEl = $oldNavbarEl.filter(function (navbarEl) {
8229 return !navbarEl.classList.contains('navbar-master');
8230 });
8231 }
8232 } // Push State
8233
8234
8235 if (router.params.browserHistory && (options.browserHistory || options.replaceState) && !options.reloadPrevious) {
8236 var browserHistoryRoot = router.params.browserHistoryRoot || '';
8237 History$2[options.reloadCurrent || reloadDetail && otherDetailPageEl || options.reloadAll || options.replaceState ? 'replace' : 'push'](view.id, {
8238 url: options.route.url
8239 }, browserHistoryRoot + router.params.browserHistorySeparator + options.route.url);
8240 }
8241
8242 if (!options.reloadPrevious) {
8243 // Current Page & Navbar
8244 router.currentPageEl = $newPage[0];
8245
8246 if (dynamicNavbar && $newNavbarEl.length) {
8247 router.currentNavbarEl = $newNavbarEl[0];
8248 } else {
8249 delete router.currentNavbarEl;
8250 } // Current Route
8251
8252
8253 router.currentRoute = options.route;
8254 } // Update router history
8255
8256
8257 var url = options.route.url;
8258
8259 if (options.history) {
8260 if (((options.reloadCurrent || reloadDetail && otherDetailPageEl) && router.history.length) > 0 || options.replaceState) {
8261 if (reloadDetail && detailsInBetweenRemoved > 0) {
8262 router.history = router.history.slice(0, router.history.length - detailsInBetweenRemoved);
8263 }
8264
8265 router.history[router.history.length - (options.reloadPrevious ? 2 : 1)] = url;
8266 } else if (options.reloadPrevious) {
8267 router.history[router.history.length - 2] = url;
8268 } else if (options.reloadAll) {
8269 router.history = [url];
8270 } else {
8271 router.history.push(url);
8272 }
8273 }
8274
8275 router.saveHistory(); // Insert new page and navbar
8276
8277 var newPageInDom = $newPage.parents(document).length > 0;
8278 var f7Component = $newPage[0].f7Component;
8279
8280 if (options.reloadPrevious) {
8281 if (f7Component && !newPageInDom) {
8282 f7Component.mount(function (componentEl) {
8283 $(componentEl).insertBefore($oldPage);
8284 });
8285 } else {
8286 $newPage.insertBefore($oldPage);
8287 }
8288
8289 if (dynamicNavbar && $newNavbarEl.length) {
8290 if ($newNavbarEl.find('.title-large').length) {
8291 $newNavbarEl.addClass('navbar-large');
8292 }
8293
8294 if ($oldNavbarEl.length) {
8295 $newNavbarEl.insertBefore($oldNavbarEl);
8296 } else {
8297 if (!router.$navbarsEl.parents(document).length) {
8298 router.$el.prepend(router.$navbarsEl);
8299 }
8300
8301 $navbarsEl.append($newNavbarEl);
8302 }
8303 }
8304 } else {
8305 if ($oldPage.next('.page')[0] !== $newPage[0]) {
8306 if (f7Component && !newPageInDom) {
8307 f7Component.mount(function (componentEl) {
8308 $viewEl.append(componentEl);
8309 });
8310 } else {
8311 $viewEl.append($newPage[0]);
8312 }
8313 }
8314
8315 if (dynamicNavbar && $newNavbarEl.length) {
8316 if ($newNavbarEl.find('.title-large').length) {
8317 $newNavbarEl.addClass('navbar-large');
8318 }
8319
8320 if (!router.$navbarsEl.parents(document).length) {
8321 router.$el.prepend(router.$navbarsEl);
8322 }
8323
8324 $navbarsEl.append($newNavbarEl[0]);
8325 }
8326 }
8327
8328 if (!newPageInDom) {
8329 router.pageCallback('mounted', $newPage, $newNavbarEl, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
8330 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
8331 $newPage[0].f7PageMounted = true;
8332 router.pageCallback('mounted', $newPage, $newNavbarEl, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
8333 } // Remove old page
8334
8335
8336 if ((options.reloadCurrent || reloadDetail) && $oldPage.length > 0) {
8337 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
8338 $oldPage.addClass('stacked');
8339 $oldPage.trigger('page:stack');
8340 router.emit('pageStack', $oldPage[0]);
8341
8342 if (dynamicNavbar) {
8343 $oldNavbarEl.addClass('stacked');
8344 }
8345 } else {
8346 // Page remove event
8347 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
8348 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
8349 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'current', undefined, options);
8350 router.removePage($oldPage);
8351
8352 if (dynamicNavbar && $oldNavbarEl && $oldNavbarEl.length) {
8353 router.removeNavbar($oldNavbarEl);
8354 }
8355 }
8356 } else if (options.reloadAll) {
8357 $oldPage.each(function (pageEl, index) {
8358 var $oldPageEl = $(pageEl);
8359 var $oldNavbarElEl = $(app.navbar.getElByPage($oldPageEl));
8360
8361 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
8362 $oldPageEl.addClass('stacked');
8363 $oldPageEl.trigger('page:stack');
8364 router.emit('pageStack', $oldPageEl[0]);
8365
8366 if (dynamicNavbar) {
8367 $oldNavbarElEl.addClass('stacked');
8368 }
8369 } else {
8370 // Page remove event
8371 if ($oldPageEl.hasClass('page-current')) {
8372 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
8373 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
8374 }
8375
8376 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarEl && $oldNavbarEl.eq(index), 'previous', undefined, options);
8377 router.removePage($oldPageEl);
8378
8379 if (dynamicNavbar && $oldNavbarElEl.length) {
8380 router.removeNavbar($oldNavbarElEl);
8381 }
8382 }
8383 });
8384 } else if (options.reloadPrevious) {
8385 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
8386 $oldPage.addClass('stacked');
8387 $oldPage.trigger('page:stack');
8388 router.emit('pageStack', $oldPage[0]);
8389
8390 if (dynamicNavbar) {
8391 $oldNavbarEl.addClass('stacked');
8392 }
8393 } else {
8394 // Page remove event
8395 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'previous', undefined, options);
8396 router.removePage($oldPage);
8397
8398 if (dynamicNavbar && $oldNavbarEl && $oldNavbarEl.length) {
8399 router.removeNavbar($oldNavbarEl);
8400 }
8401 }
8402 } // Load Tab
8403
8404
8405 if (options.route.route.tab) {
8406 router.tabLoad(options.route.route.tab, extend$1({}, options, {
8407 history: false,
8408 browserHistory: false
8409 }));
8410 } // Check master detail
8411
8412
8413 if (masterDetailEnabled) {
8414 view.checkMasterDetailBreakpoint();
8415 } // Page init and before init events
8416
8417
8418 router.pageCallback('init', $newPage, $newNavbarEl, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
8419
8420 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
8421 router.allowPageChange = true;
8422 router.pageCallback('beforeIn', $newPage, $newNavbarEl, newPagePosition, 'current', options);
8423 $newPage.removeAttr('aria-hidden');
8424
8425 if (dynamicNavbar && $newNavbarEl) {
8426 $newNavbarEl.removeAttr('aria-hidden');
8427 }
8428
8429 router.pageCallback('afterIn', $newPage, $newNavbarEl, newPagePosition, 'current', options);
8430 if (options.reloadCurrent && options.clearPreviousHistory) router.clearPreviousHistory();
8431
8432 if (reloadDetail) {
8433 router.setPagePosition($(masterPageEl), 'previous');
8434
8435 if (masterPageEl.f7Page && masterPageEl.f7Page.navbarEl) {
8436 router.setNavbarPosition($(masterPageEl.f7Page.navbarEl), 'previous');
8437 }
8438 }
8439
8440 return router;
8441 }
8442
8443 if (options.reloadPrevious) {
8444 router.allowPageChange = true;
8445 return router;
8446 } // Before animation event
8447
8448
8449 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', 'previous', options);
8450 router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'next', 'current', options); // Animation
8451
8452 function afterAnimation() {
8453 router.setPagePosition($newPage, 'current', false);
8454 router.setPagePosition($oldPage, 'previous', !$oldPage.hasClass('page-master'));
8455
8456 if (dynamicNavbar) {
8457 router.setNavbarPosition($newNavbarEl, 'current', false);
8458 router.setNavbarPosition($oldNavbarEl, 'previous', !$oldNavbarEl.hasClass('navbar-master'));
8459 } // After animation event
8460
8461
8462 router.allowPageChange = true;
8463 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', 'previous', options);
8464 router.pageCallback('afterIn', $newPage, $newNavbarEl, 'next', 'current', options);
8465 var keepOldPage = (router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"]) && !isMaster;
8466
8467 if (!keepOldPage) {
8468 if ($newPage.hasClass('smart-select-page') || $newPage.hasClass('photo-browser-page') || $newPage.hasClass('autocomplete-page') || $newPage.hasClass('color-picker-page')) {
8469 keepOldPage = true;
8470 }
8471 }
8472
8473 if (!keepOldPage) {
8474 if (router.params.stackPages) {
8475 $oldPage.addClass('stacked');
8476 $oldPage.trigger('page:stack');
8477 router.emit('pageStack', $oldPage[0]);
8478
8479 if (dynamicNavbar) {
8480 $oldNavbarEl.addClass('stacked');
8481 }
8482 } else if (!($newPage.attr('data-name') && $newPage.attr('data-name') === 'smart-select-page')) {
8483 // Remove event
8484 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'previous', undefined, options);
8485 router.removePage($oldPage);
8486
8487 if (dynamicNavbar && $oldNavbarEl.length) {
8488 router.removeNavbar($oldNavbarEl);
8489 }
8490 }
8491 }
8492
8493 if (options.clearPreviousHistory) router.clearPreviousHistory();
8494 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
8495
8496 if (router.params.browserHistory) {
8497 History$2.clearRouterQueue();
8498 }
8499 }
8500
8501 function setPositionClasses() {
8502 router.setPagePosition($oldPage, 'current', false);
8503 router.setPagePosition($newPage, 'next', false);
8504
8505 if (dynamicNavbar) {
8506 router.setNavbarPosition($oldNavbarEl, 'current', false);
8507 router.setNavbarPosition($newNavbarEl, 'next', false);
8508 }
8509 }
8510
8511 if (options.animate && !(isMaster && app.width >= router.params.masterDetailBreakpoint)) {
8512 var delay = router.params[router.app.theme + "PageLoadDelay"];
8513 var transition = router.params.transition;
8514 if (options.transition) transition = options.transition;
8515
8516 if (!transition && router.currentRoute && router.currentRoute.route) {
8517 transition = router.currentRoute.route.transition;
8518 }
8519
8520 if (!transition && router.currentRoute && router.currentRoute.route.options) {
8521 transition = router.currentRoute.route.options.transition;
8522 }
8523
8524 if (transition) {
8525 $newPage[0].f7PageTransition = transition;
8526 }
8527
8528 if (delay) {
8529 setTimeout(function () {
8530 setPositionClasses();
8531 router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'forward', transition, function () {
8532 afterAnimation();
8533 });
8534 }, delay);
8535 } else {
8536 setPositionClasses();
8537 router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'forward', transition, function () {
8538 afterAnimation();
8539 });
8540 }
8541 } else {
8542 afterAnimation();
8543 }
8544
8545 return router;
8546 }
8547
8548 function load(router, loadParams, loadOptions, ignorePageChange) {
8549 if (loadParams === void 0) {
8550 loadParams = {};
8551 }
8552
8553 if (loadOptions === void 0) {
8554 loadOptions = {};
8555 }
8556
8557 if (!router.allowPageChange && !ignorePageChange) return router;
8558 var params = loadParams;
8559 var options = loadOptions;
8560 var url = params.url,
8561 content = params.content,
8562 el = params.el,
8563 pageName = params.pageName,
8564 component = params.component,
8565 componentUrl = params.componentUrl;
8566
8567 if (!options.reloadCurrent && options.route && options.route.route && options.route.route.parentPath && router.currentRoute.route && router.currentRoute.route.parentPath === options.route.route.parentPath) {
8568 // Do something nested
8569 if (options.route.url === router.url) {
8570 router.allowPageChange = true;
8571 return false;
8572 } // Check for same params
8573
8574
8575 var sameParams = Object.keys(options.route.params).length === Object.keys(router.currentRoute.params).length;
8576
8577 if (sameParams) {
8578 // Check for equal params name
8579 Object.keys(options.route.params).forEach(function (paramName) {
8580 if (!(paramName in router.currentRoute.params) || router.currentRoute.params[paramName] !== options.route.params[paramName]) {
8581 sameParams = false;
8582 }
8583 });
8584 }
8585
8586 if (sameParams) {
8587 if (options.route.route.tab) {
8588 return router.tabLoad(options.route.route.tab, options);
8589 }
8590
8591 return false;
8592 }
8593
8594 if (!sameParams && options.route.route.tab && router.currentRoute.route.tab && router.currentRoute.parentPath === options.route.parentPath) {
8595 return router.tabLoad(options.route.route.tab, options);
8596 }
8597 }
8598
8599 if (options.route && options.route.url && router.url === options.route.url && !(options.reloadCurrent || options.reloadPrevious) && !router.params.allowDuplicateUrls) {
8600 router.allowPageChange = true;
8601 return false;
8602 }
8603
8604 if (!options.route && url) {
8605 options.route = router.parseRouteUrl(url);
8606 extend$1(options.route, {
8607 route: {
8608 url: url,
8609 path: url
8610 }
8611 });
8612 } // Component Callbacks
8613
8614
8615 function resolve(pageEl, newOptions) {
8616 return forward(router, pageEl, extend$1(options, newOptions));
8617 }
8618
8619 function reject() {
8620 router.allowPageChange = true;
8621 return router;
8622 }
8623
8624 if (url || componentUrl || component) {
8625 router.allowPageChange = false;
8626 } // Proceed
8627
8628
8629 if (content) {
8630 forward(router, router.getPageEl(content), options);
8631 } else if (el) {
8632 // Load page from specified HTMLElement or by page name in pages container
8633 forward(router, router.getPageEl(el), options);
8634 } else if (pageName) {
8635 // Load page by page name in pages container
8636 forward(router, router.$el.children(".page[data-name=\"" + pageName + "\"]").eq(0), options);
8637 } else if (component || componentUrl) {
8638 // Load from component (F7/Vue/React/...)
8639 try {
8640 router.pageComponentLoader({
8641 routerEl: router.el,
8642 component: component,
8643 componentUrl: componentUrl,
8644 options: options,
8645 resolve: resolve,
8646 reject: reject
8647 });
8648 } catch (err) {
8649 router.allowPageChange = true;
8650 throw err;
8651 }
8652 } else if (url) {
8653 // Load using XHR
8654 if (router.xhrAbortController) {
8655 router.xhrAbortController.abort();
8656 router.xhrAbortController = false;
8657 }
8658
8659 router.xhrRequest(url, options).then(function (pageContent) {
8660 forward(router, router.getPageEl(pageContent), options);
8661 }).catch(function () {
8662 router.allowPageChange = true;
8663 });
8664 }
8665
8666 return router;
8667 }
8668
8669 function openIn(router, url, options) {
8670 var navigateOptions = {
8671 url: url,
8672 route: {
8673 path: url,
8674 options: _extends$j({}, options, {
8675 openIn: undefined
8676 })
8677 }
8678 };
8679
8680 var params = _extends$j({}, options);
8681
8682 if (options.openIn === 'popup') {
8683 params.content = "<div class=\"popup popup-router-open-in\" data-url=\"" + url + "\"><div class=\"view view-init\" data-links-view=\"" + router.view.selector + "\" data-url=\"" + url + "\" data-ignore-open-in=\"true\"></div></div>";
8684 navigateOptions.route.popup = params;
8685 }
8686
8687 if (options.openIn === 'loginScreen') {
8688 params.content = "<div class=\"login-screen login-screen-router-open-in\" data-url=\"" + url + "\"><div class=\"view view-init\" data-links-view=\"" + router.view.selector + "\" data-url=\"" + url + "\" data-ignore-open-in=\"true\"></div></div>";
8689 navigateOptions.route.loginScreen = params;
8690 }
8691
8692 if (options.openIn === 'sheet') {
8693 params.content = "<div class=\"sheet-modal sheet-modal-router-open-in\" data-url=\"" + url + "\"><div class=\"sheet-modal-inner\"><div class=\"view view-init\" data-links-view=\"" + router.view.selector + "\" data-url=\"" + url + "\" data-ignore-open-in=\"true\"></div></div></div>";
8694 navigateOptions.route.sheet = params;
8695 }
8696
8697 if (options.openIn === 'popover') {
8698 params.targetEl = options.clickedEl || options.targetEl;
8699 params.content = "<div class=\"popover popover-router-open-in\" data-url=\"" + url + "\"><div class=\"popover-inner\"><div class=\"view view-init\" data-links-view=\"" + router.view.selector + "\" data-url=\"" + url + "\" data-ignore-open-in=\"true\"></div></div></div>";
8700 navigateOptions.route.popover = params;
8701 }
8702
8703 if (options.openIn.indexOf('panel') >= 0) {
8704 var parts = options.openIn.split(':');
8705 var side = parts[1] || 'left';
8706 var effect = parts[2] || 'cover';
8707 params.targetEl = options.clickedEl || options.targetEl;
8708 params.content = "<div class=\"panel panel-router-open-in panel-" + side + " panel-" + effect + "\" data-url=\"" + url + "\"><div class=\"view view-init\" data-links-view=\"" + router.view.selector + "\" data-url=\"" + url + "\" data-ignore-open-in=\"true\"></div></div>";
8709 navigateOptions.route.panel = params;
8710 }
8711
8712 return router.navigate(navigateOptions);
8713 }
8714
8715 function navigate(navigateParams, navigateOptions) {
8716 if (navigateOptions === void 0) {
8717 navigateOptions = {};
8718 }
8719
8720 var router = this;
8721 if (router.swipeBackActive) return router;
8722 var url;
8723 var createRoute;
8724 var name;
8725 var path;
8726 var query;
8727 var params;
8728 var route;
8729
8730 if (typeof navigateParams === 'string') {
8731 url = navigateParams;
8732 } else {
8733 url = navigateParams.url;
8734 createRoute = navigateParams.route;
8735 name = navigateParams.name;
8736 path = navigateParams.path;
8737 query = navigateParams.query;
8738 params = navigateParams.params;
8739 }
8740
8741 if (name || path) {
8742 url = router.generateUrl({
8743 path: path,
8744 name: name,
8745 params: params,
8746 query: query
8747 });
8748
8749 if (url) {
8750 return router.navigate(url, navigateOptions);
8751 }
8752
8753 return router;
8754 }
8755
8756 var app = router.app;
8757 appRouterCheck(router, 'navigate');
8758
8759 if (url === '#' || url === '') {
8760 return router;
8761 }
8762
8763 var navigateUrl = url.replace('./', '');
8764
8765 if (navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
8766 var currentPath = router.currentRoute.parentPath || router.currentRoute.path;
8767 navigateUrl = ((currentPath ? currentPath + "/" : '/') + navigateUrl).replace('///', '/').replace('//', '/');
8768 }
8769
8770 if (createRoute) {
8771 route = extend$1(router.parseRouteUrl(navigateUrl), {
8772 route: extend$1({}, createRoute)
8773 });
8774 } else {
8775 route = router.findMatchingRoute(navigateUrl);
8776 }
8777
8778 if (!route) {
8779 return router;
8780 }
8781
8782 if (route.route && route.route.viewName) {
8783 var anotherViewName = route.route.viewName;
8784 var anotherView = app.views[anotherViewName];
8785
8786 if (!anotherView) {
8787 throw new Error("Framework7: There is no View with \"" + anotherViewName + "\" name that was specified in this route");
8788 }
8789
8790 if (anotherView !== router.view) {
8791 return anotherView.router.navigate(navigateParams, navigateOptions);
8792 }
8793 }
8794
8795 if (route.route.redirect) {
8796 return redirect.call(router, 'forward', route, navigateOptions);
8797 }
8798
8799 var options = {};
8800
8801 if (route.route.options) {
8802 extend$1(options, route.route.options, navigateOptions);
8803 } else {
8804 extend$1(options, navigateOptions);
8805 }
8806
8807 if (options.openIn && (!router.params.ignoreOpenIn || router.params.ignoreOpenIn && router.history.length > 0)) {
8808 return openIn(router, navigateUrl, options);
8809 }
8810
8811 options.route = route;
8812
8813 function resolve() {
8814 var routerLoaded = false;
8815 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
8816 if (route.route[modalLoadProp] && !routerLoaded) {
8817 routerLoaded = true;
8818 router.modalLoad(modalLoadProp, route, options, 'forward');
8819 }
8820 });
8821
8822 if (route.route.keepAlive && route.route.keepAliveData) {
8823 load(router, {
8824 el: route.route.keepAliveData.pageEl
8825 }, options, false);
8826 routerLoaded = true;
8827 }
8828
8829 'url content component pageName el componentUrl'.split(' ').forEach(function (pageLoadProp) {
8830 if (route.route[pageLoadProp] && !routerLoaded) {
8831 var _load;
8832
8833 routerLoaded = true;
8834 load(router, (_load = {}, _load[pageLoadProp] = route.route[pageLoadProp], _load), options, false);
8835 }
8836 });
8837 if (routerLoaded) return; // Async
8838
8839 function asyncResolve(resolveParams, resolveOptions) {
8840 router.allowPageChange = false;
8841 var resolvedAsModal = false;
8842 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
8843 if (resolveParams[modalLoadProp]) {
8844 resolvedAsModal = true;
8845 var modalRoute = extend$1({}, route, {
8846 route: resolveParams
8847 });
8848 router.allowPageChange = true;
8849 router.modalLoad(modalLoadProp, modalRoute, extend$1(options, resolveOptions), 'forward');
8850 }
8851 });
8852 if (resolvedAsModal) return;
8853 load(router, resolveParams, extend$1(options, resolveOptions), true);
8854 }
8855
8856 function asyncReject() {
8857 router.allowPageChange = true;
8858 }
8859
8860 if (route.route.async) {
8861 router.allowPageChange = false;
8862 route.route.async.call(router, {
8863 router: router,
8864 to: options.route,
8865 from: router.currentRoute,
8866 resolve: asyncResolve,
8867 reject: asyncReject,
8868 direction: 'forward',
8869 app: app
8870 });
8871 }
8872
8873 if (route.route.asyncComponent) {
8874 asyncComponent(router, route.route.asyncComponent, asyncResolve, asyncReject);
8875 }
8876 }
8877
8878 function reject() {
8879 router.allowPageChange = true;
8880 }
8881
8882 if (router.params.masterDetailBreakpoint > 0 && route.route.masterRoute) {
8883 // load detail route
8884 var preloadMaster = true;
8885 var masterLoaded = false;
8886
8887 if (router.currentRoute && router.currentRoute.route) {
8888 if ((router.currentRoute.route.master === true || typeof router.currentRoute.route.master === 'function' && router.currentRoute.route.master(app, router)) && (router.currentRoute.route === route.route.masterRoute || router.currentRoute.route.path === route.route.masterRoute.path)) {
8889 preloadMaster = false;
8890 }
8891
8892 if (router.currentRoute.route.masterRoute && (router.currentRoute.route.masterRoute === route.route.masterRoute || router.currentRoute.route.masterRoute.path === route.route.masterRoute.path)) {
8893 preloadMaster = false;
8894 masterLoaded = true;
8895 }
8896 }
8897
8898 if (preloadMaster || masterLoaded && navigateOptions.reloadAll) {
8899 router.navigate({
8900 path: route.route.masterRoute.path,
8901 params: route.params || {}
8902 }, {
8903 animate: false,
8904 reloadAll: navigateOptions.reloadAll,
8905 reloadCurrent: navigateOptions.reloadCurrent,
8906 reloadPrevious: navigateOptions.reloadPrevious,
8907 browserHistory: !navigateOptions.initial,
8908 history: !navigateOptions.initial,
8909 once: {
8910 pageAfterIn: function pageAfterIn() {
8911 router.navigate(navigateParams, extend$1({}, navigateOptions, {
8912 animate: false,
8913 reloadAll: false,
8914 reloadCurrent: false,
8915 reloadPrevious: false,
8916 history: !navigateOptions.initial,
8917 browserHistory: !navigateOptions.initial
8918 }));
8919 }
8920 }
8921 });
8922 return router;
8923 }
8924 }
8925
8926 processRouteQueue.call(router, route, router.currentRoute, function () {
8927 if (route.route.modules) {
8928 app.loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules]).then(function () {
8929 resolve();
8930 }).catch(function () {
8931 reject();
8932 });
8933 } else {
8934 resolve();
8935 }
8936 }, function () {
8937 reject();
8938 }, 'forward'); // Return Router
8939
8940 return router;
8941 }
8942
8943 function tabLoad(tabRoute, loadOptions) {
8944 if (loadOptions === void 0) {
8945 loadOptions = {};
8946 }
8947
8948 var router = this;
8949 var options = extend$1({
8950 animate: router.params.animate,
8951 browserHistory: true,
8952 history: true,
8953 parentPageEl: null,
8954 preload: false,
8955 on: {}
8956 }, loadOptions);
8957 var currentRoute;
8958 var previousRoute;
8959
8960 if (options.route) {
8961 // Set Route
8962 if (!options.preload && options.route !== router.currentRoute) {
8963 previousRoute = router.previousRoute;
8964 router.currentRoute = options.route;
8965 }
8966
8967 if (options.preload) {
8968 currentRoute = options.route;
8969 previousRoute = router.currentRoute;
8970 } else {
8971 currentRoute = router.currentRoute;
8972 if (!previousRoute) previousRoute = router.previousRoute;
8973 } // Update Browser History
8974
8975
8976 if (router.params.browserHistory && options.browserHistory && !options.reloadPrevious) {
8977 History$2.replace(router.view.id, {
8978 url: options.route.url
8979 }, (router.params.browserHistoryRoot || '') + router.params.browserHistorySeparator + options.route.url);
8980 } // Update Router History
8981
8982
8983 if (options.history) {
8984 router.history[Math.max(router.history.length - 1, 0)] = options.route.url;
8985 router.saveHistory();
8986 }
8987 } // Show Tab
8988
8989
8990 var $parentPageEl = $(options.parentPageEl || router.currentPageEl);
8991 var tabEl;
8992
8993 if ($parentPageEl.length && $parentPageEl.find("#" + tabRoute.id).length) {
8994 tabEl = $parentPageEl.find("#" + tabRoute.id).eq(0);
8995 } else if (router.view.selector) {
8996 tabEl = router.view.selector + " #" + tabRoute.id;
8997 } else {
8998 tabEl = "#" + tabRoute.id;
8999 }
9000
9001 var tabShowResult = router.app.tab.show({
9002 tabEl: tabEl,
9003 animate: options.animate,
9004 tabRoute: options.route
9005 });
9006 var $newTabEl = tabShowResult.$newTabEl,
9007 $oldTabEl = tabShowResult.$oldTabEl,
9008 animated = tabShowResult.animated,
9009 onTabsChanged = tabShowResult.onTabsChanged;
9010
9011 if ($newTabEl && $newTabEl.parents('.page').length > 0 && options.route) {
9012 var tabParentPageData = $newTabEl.parents('.page')[0].f7Page;
9013
9014 if (tabParentPageData && options.route) {
9015 tabParentPageData.route = options.route;
9016 }
9017 } // Tab Content Loaded
9018
9019
9020 function onTabLoaded(contentEl) {
9021 // Remove theme elements
9022 router.removeThemeElements($newTabEl);
9023 var tabEventTarget = $newTabEl;
9024 if (typeof contentEl !== 'string') tabEventTarget = $(contentEl);
9025 tabEventTarget.trigger('tab:init tab:mounted', tabRoute);
9026 router.emit('tabInit tabMounted', $newTabEl[0], tabRoute);
9027
9028 if ($oldTabEl && $oldTabEl.length) {
9029 if (animated) {
9030 onTabsChanged(function () {
9031 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
9032
9033 if (router.params.unloadTabContent) {
9034 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
9035 }
9036 });
9037 } else {
9038 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
9039
9040 if (router.params.unloadTabContent) {
9041 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
9042 }
9043 }
9044 }
9045 }
9046
9047 if ($newTabEl[0].f7RouterTabLoaded) {
9048 if (!$oldTabEl || !$oldTabEl.length) return router;
9049
9050 if (animated) {
9051 onTabsChanged(function () {
9052 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
9053 });
9054 } else {
9055 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
9056 }
9057
9058 return router;
9059 } // Load Tab Content
9060
9061
9062 function loadTab(loadTabParams, loadTabOptions) {
9063 // Load Tab Props
9064 var url = loadTabParams.url,
9065 content = loadTabParams.content,
9066 el = loadTabParams.el,
9067 component = loadTabParams.component,
9068 componentUrl = loadTabParams.componentUrl; // Component/Template Callbacks
9069
9070 function resolve(contentEl) {
9071 router.allowPageChange = true;
9072 if (!contentEl) return;
9073
9074 if (typeof contentEl === 'string') {
9075 $newTabEl.html(contentEl);
9076 } else {
9077 $newTabEl.html('');
9078
9079 if (contentEl.f7Component) {
9080 contentEl.f7Component.mount(function (componentEl) {
9081 $newTabEl.append(componentEl);
9082 });
9083 } else {
9084 $newTabEl.append(contentEl);
9085 }
9086 }
9087
9088 $newTabEl[0].f7RouterTabLoaded = true;
9089 onTabLoaded(contentEl);
9090 }
9091
9092 function reject() {
9093 router.allowPageChange = true;
9094 return router;
9095 }
9096
9097 if (content) {
9098 resolve(content);
9099 } else if (el) {
9100 resolve(el);
9101 } else if (component || componentUrl) {
9102 // Load from component (F7/Vue/React/...)
9103 try {
9104 router.tabComponentLoader({
9105 tabEl: $newTabEl[0],
9106 component: component,
9107 componentUrl: componentUrl,
9108 options: loadTabOptions,
9109 resolve: resolve,
9110 reject: reject
9111 });
9112 } catch (err) {
9113 router.allowPageChange = true;
9114 throw err;
9115 }
9116 } else if (url) {
9117 // Load using XHR
9118 if (router.xhrAbortController) {
9119 router.xhrAbortController.abort();
9120 router.xhrAbortController = false;
9121 }
9122
9123 router.xhrRequest(url, loadTabOptions).then(function (tabContent) {
9124 resolve(tabContent);
9125 }).catch(function () {
9126 router.allowPageChange = true;
9127 });
9128 }
9129 }
9130
9131 var hasContentLoadProp;
9132 'url content component el componentUrl'.split(' ').forEach(function (tabLoadProp) {
9133 if (tabRoute[tabLoadProp]) {
9134 var _loadTab;
9135
9136 hasContentLoadProp = true;
9137 loadTab((_loadTab = {}, _loadTab[tabLoadProp] = tabRoute[tabLoadProp], _loadTab), options);
9138 }
9139 }); // Async
9140
9141 function asyncResolve(resolveParams, resolveOptions) {
9142 loadTab(resolveParams, extend$1(options, resolveOptions));
9143 }
9144
9145 function asyncReject() {
9146 router.allowPageChange = true;
9147 }
9148
9149 if (tabRoute.async) {
9150 tabRoute.async.call(router, {
9151 router: router,
9152 to: currentRoute,
9153 from: previousRoute,
9154 resolve: asyncResolve,
9155 reject: asyncReject,
9156 app: router.app
9157 });
9158 } else if (tabRoute.asyncComponent) {
9159 asyncComponent(router, tabRoute.asyncComponent, asyncResolve, asyncReject);
9160 } else if (!hasContentLoadProp) {
9161 router.allowPageChange = true;
9162 }
9163
9164 return router;
9165 }
9166
9167 function tabRemove($oldTabEl, $newTabEl, tabRoute) {
9168 var router = this;
9169 var hasTabComponentChild;
9170
9171 if ($oldTabEl[0]) {
9172 $oldTabEl[0].f7RouterTabLoaded = false;
9173 delete $oldTabEl[0].f7RouterTabLoaded;
9174 }
9175
9176 $oldTabEl.children().each(function (tabChild) {
9177 if (tabChild.f7Component) {
9178 hasTabComponentChild = true;
9179 $(tabChild).trigger('tab:beforeremove', tabRoute);
9180 tabChild.f7Component.destroy();
9181 }
9182 });
9183
9184 if (!hasTabComponentChild) {
9185 $oldTabEl.trigger('tab:beforeremove', tabRoute);
9186 }
9187
9188 router.emit('tabBeforeRemove', $oldTabEl[0], $newTabEl[0], tabRoute);
9189 router.removeTabContent($oldTabEl[0], tabRoute);
9190 }
9191
9192 function modalLoad(modalType, route, loadOptions, direction) {
9193 if (loadOptions === void 0) {
9194 loadOptions = {};
9195 }
9196
9197 var router = this;
9198 var app = router.app;
9199 var isPanel = modalType === 'panel';
9200 var modalOrPanel = isPanel ? 'panel' : 'modal';
9201 var options = extend$1({
9202 animate: router.params.animate,
9203 browserHistory: true,
9204 history: true,
9205 on: {},
9206 once: {}
9207 }, loadOptions);
9208 var modalParams = extend$1({}, route.route[modalType]);
9209 var modalRoute = route.route;
9210
9211 var routeCallback = function routeCallback(modal, name) {
9212 var on = options.on,
9213 once = options.once;
9214 var callback;
9215
9216 if (name === 'open') {
9217 callback = on.modalOpen || once.modalOpen || on.panelOpen || once.panelOpen;
9218 }
9219
9220 if (name === 'close') {
9221 callback = on.modalClose || once.modalClose || on.panelClose || once.panelClose;
9222 }
9223
9224 if (name === 'closed') {
9225 callback = on.modalClosed || once.modalClosed || on.panelClosed || once.panelClosed;
9226 }
9227
9228 if (callback) callback(modal);
9229 };
9230
9231 function onModalLoaded() {
9232 // Create Modal
9233 var modal = app[modalType].create(modalParams);
9234 modalRoute.modalInstance = modal;
9235 var hasEl = modal.el;
9236
9237 function closeOnSwipeBack() {
9238 modal.close();
9239 }
9240
9241 modal.on(modalOrPanel + "Open", function () {
9242 if (!hasEl) {
9243 // Remove theme elements
9244 router.removeThemeElements(modal.el); // Emit events
9245
9246 modal.$el.trigger(modalType.toLowerCase() + ":init " + modalType.toLowerCase() + ":mounted", route, modal);
9247 router.emit((!isPanel ? 'modalInit' : '') + " " + modalType + "Init " + modalType + "Mounted", modal.el, route, modal);
9248 }
9249
9250 router.once('swipeBackMove', closeOnSwipeBack);
9251 routeCallback(modal, 'open');
9252 });
9253 modal.on(modalOrPanel + "Close", function () {
9254 router.off('swipeBackMove', closeOnSwipeBack);
9255
9256 if (!modal.closeByRouter) {
9257 router.back();
9258 }
9259
9260 routeCallback(modal, 'close');
9261 });
9262 modal.on(modalOrPanel + "Closed", function () {
9263 modal.$el.trigger(modalType.toLowerCase() + ":beforeremove", route, modal);
9264 modal.emit("" + (!isPanel ? 'modalBeforeRemove ' : '') + modalType + "BeforeRemove", modal.el, route, modal);
9265 var modalComponent = modal.el.f7Component;
9266 routeCallback(modal, 'closed');
9267
9268 if (modalComponent) {
9269 modalComponent.destroy();
9270 }
9271
9272 nextTick$1(function () {
9273 if (modalComponent || modalParams.component) {
9274 router.removeModal(modal.el);
9275 }
9276
9277 modal.destroy();
9278 delete modal.route;
9279 delete modalRoute.modalInstance;
9280 });
9281 });
9282
9283 if (options.route) {
9284 // Update Browser History
9285 if (router.params.browserHistory && options.browserHistory) {
9286 History$2.push(router.view.id, {
9287 url: options.route.url,
9288 modal: modalType
9289 }, (router.params.browserHistoryRoot || '') + router.params.browserHistorySeparator + options.route.url);
9290 } // Set Route
9291
9292
9293 if (options.route !== router.currentRoute) {
9294 modal.route = extend$1(options.route, {
9295 modal: modal
9296 });
9297 router.currentRoute = modal.route;
9298 } // Update Router History
9299
9300
9301 if (options.history && !options.reloadCurrent) {
9302 router.history.push(options.route.url);
9303 router.saveHistory();
9304 }
9305 }
9306
9307 if (hasEl) {
9308 // Remove theme elements
9309 router.removeThemeElements(modal.el); // Emit events
9310
9311 modal.$el.trigger(modalType.toLowerCase() + ":init " + modalType.toLowerCase() + ":mounted", route, modal);
9312 router.emit(modalOrPanel + "Init " + modalType + "Init " + modalType + "Mounted", modal.el, route, modal);
9313 } // Open
9314
9315
9316 modal.open(options.animate === false || options.animate === true ? options.animate : undefined);
9317 } // Load Modal Content
9318
9319
9320 function loadModal(loadModalParams, loadModalOptions) {
9321 // Load Modal Props
9322 var url = loadModalParams.url,
9323 content = loadModalParams.content,
9324 component = loadModalParams.component,
9325 componentUrl = loadModalParams.componentUrl; // Component/Template Callbacks
9326
9327 function resolve(contentEl) {
9328 if (contentEl) {
9329 if (typeof contentEl === 'string') {
9330 modalParams.content = contentEl;
9331 } else if (contentEl.f7Component) {
9332 contentEl.f7Component.mount(function (componentEl) {
9333 modalParams.el = componentEl;
9334 app.$el.append(componentEl);
9335 });
9336 } else {
9337 modalParams.el = contentEl;
9338 }
9339
9340 onModalLoaded();
9341 }
9342 }
9343
9344 function reject() {
9345 router.allowPageChange = true;
9346 return router;
9347 }
9348
9349 if (content) {
9350 resolve(content);
9351 } else if (component || componentUrl) {
9352 // Load from component (F7/Vue/React/...)
9353 try {
9354 router.modalComponentLoader({
9355 rootEl: app.el,
9356 component: component,
9357 componentUrl: componentUrl,
9358 options: loadModalOptions,
9359 resolve: resolve,
9360 reject: reject
9361 });
9362 } catch (err) {
9363 router.allowPageChange = true;
9364 throw err;
9365 }
9366 } else if (url) {
9367 // Load using XHR
9368 if (router.xhrAbortController) {
9369 router.xhrAbortController.abort();
9370 router.xhrAbortController = false;
9371 }
9372
9373 router.xhrRequest(url, loadModalOptions).then(function (modalContent) {
9374 modalParams.content = modalContent;
9375 onModalLoaded();
9376 }).catch(function () {
9377 router.allowPageChange = true;
9378 });
9379 } else {
9380 onModalLoaded();
9381 }
9382 }
9383
9384 var foundLoadProp;
9385 'url content component el componentUrl template'.split(' ').forEach(function (modalLoadProp) {
9386 if (modalParams[modalLoadProp] && !foundLoadProp) {
9387 var _loadModal;
9388
9389 foundLoadProp = true;
9390 loadModal((_loadModal = {}, _loadModal[modalLoadProp] = modalParams[modalLoadProp], _loadModal), options);
9391 }
9392 });
9393
9394 if (!foundLoadProp && modalType === 'actions') {
9395 onModalLoaded();
9396 } // Async
9397
9398
9399 function asyncResolve(resolveParams, resolveOptions) {
9400 loadModal(resolveParams, extend$1(options, resolveOptions));
9401 }
9402
9403 function asyncReject() {
9404 router.allowPageChange = true;
9405 }
9406
9407 if (modalParams.async) {
9408 modalParams.async.call(router, {
9409 router: router,
9410 to: options.route,
9411 from: router.currentRoute,
9412 resolve: asyncResolve,
9413 reject: asyncReject,
9414 direction: direction,
9415 app: app
9416 });
9417 }
9418
9419 if (modalParams.asyncComponent) {
9420 asyncComponent(router, modalParams.asyncComponent, asyncResolve, asyncReject);
9421 }
9422
9423 return router;
9424 }
9425
9426 function modalRemove(modal) {
9427 extend$1(modal, {
9428 closeByRouter: true
9429 });
9430 modal.close();
9431 }
9432
9433 function backward(router, el, backwardOptions) {
9434 var device = getDevice$1();
9435 var document = getDocument();
9436 var $el = $(el);
9437 var app = router.app;
9438 var view = router.view;
9439 var options = extend$1({
9440 animate: router.params.animate,
9441 browserHistory: true,
9442 replaceState: false
9443 }, backwardOptions);
9444 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
9445 var isMaster = masterDetailEnabled && options.route && options.route.route && (options.route.route.master === true || typeof options.route.route.master === 'function' && options.route.route.master(app, router));
9446 var masterPageEl;
9447 var masterPageRemoved;
9448 var dynamicNavbar = router.dynamicNavbar;
9449 var $newPage = $el;
9450 var $oldPage = router.$el.children('.page-current');
9451 var initialPreload = $oldPage.length === 0 && options.preload;
9452 var currentIsMaster = masterDetailEnabled && $oldPage.hasClass('page-master');
9453
9454 if ($newPage.length) {
9455 // Remove theme elements
9456 router.removeThemeElements($newPage);
9457 }
9458
9459 var $navbarsEl;
9460 var $newNavbarEl;
9461 var $oldNavbarEl;
9462
9463 if (dynamicNavbar) {
9464 $newNavbarEl = $newPage.children('.navbar');
9465 $navbarsEl = router.$navbarsEl;
9466
9467 if ($newNavbarEl.length === 0 && $newPage[0] && $newPage[0].f7Page) {
9468 // Try from pageData
9469 $newNavbarEl = $newPage[0].f7Page.$navbarEl;
9470 }
9471
9472 $oldNavbarEl = $navbarsEl.find('.navbar-current');
9473 }
9474
9475 router.allowPageChange = false;
9476
9477 if ($newPage.length === 0 || $oldPage.length === 0 && !options.preload) {
9478 router.allowPageChange = true;
9479 return router;
9480 } // Remove theme elements
9481
9482
9483 router.removeThemeElements($newPage); // Save Keep Alive Cache
9484
9485 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
9486 options.route.route.keepAliveData = {
9487 pageEl: $el[0]
9488 };
9489 } // Pages In View
9490
9491
9492 var isDetail;
9493 var isDetailRoot;
9494
9495 if (masterDetailEnabled) {
9496 var $pagesInView = router.$el.children('.page:not(.stacked)').filter(function (pageInView) {
9497 return pageInView !== $newPage[0];
9498 }); // Find Detail' master page
9499
9500 for (var i = 0; i < $pagesInView.length; i += 1) {
9501 if (!masterPageEl && $pagesInView[i].classList.contains('page-master')) {
9502 masterPageEl = $pagesInView[i];
9503 continue; // eslint-disable-line
9504 }
9505 }
9506
9507 isDetail = !isMaster && masterPageEl && router.history.indexOf(options.route.url) > router.history.indexOf(masterPageEl.f7Page.route.url);
9508
9509 if (!isDetail && !isMaster && masterPageEl && masterPageEl.f7Page && options.route.route.masterRoute) {
9510 isDetail = options.route.route.masterRoute.path === masterPageEl.f7Page.route.route.path;
9511 }
9512 }
9513
9514 if (isDetail && masterPageEl && masterPageEl.f7Page) {
9515 isDetailRoot = router.history.indexOf(options.route.url) - router.history.indexOf(masterPageEl.f7Page.route.url) === 1;
9516 } // New Page
9517
9518
9519 $newPage.addClass("page-" + (initialPreload ? 'current' : 'previous') + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '') + (isDetailRoot ? ' page-master-detail-root' : '')).removeClass('stacked').removeAttr('aria-hidden').trigger('page:unstack').trigger('page:position', {
9520 position: initialPreload ? 'current' : 'previous'
9521 });
9522 router.emit('pageUnstack', $newPage[0]);
9523 router.emit('pagePosition', $newPage[0], initialPreload ? 'current' : 'previous');
9524
9525 if (isMaster || isDetail) {
9526 $newPage.trigger('page:role', {
9527 role: isMaster ? 'master' : 'detail',
9528 root: !!isDetailRoot
9529 });
9530 router.emit('pageRole', $newPage[0], {
9531 role: isMaster ? 'master' : 'detail',
9532 detailRoot: !!isDetailRoot
9533 });
9534 }
9535
9536 if (dynamicNavbar && $newNavbarEl.length > 0) {
9537 $newNavbarEl.addClass("navbar-" + (initialPreload ? 'current' : 'previous') + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '') + (isDetailRoot ? ' navbar-master-detail-root' : '')).removeClass('stacked').removeAttr('aria-hidden');
9538 $newNavbarEl.trigger('navbar:position', {
9539 position: initialPreload ? 'current' : 'previous'
9540 });
9541 router.emit('navbarPosition', $newNavbarEl[0], initialPreload ? 'current' : 'previous');
9542
9543 if (isMaster || isDetailRoot) {
9544 router.emit('navbarRole', $newNavbarEl[0], {
9545 role: isMaster ? 'master' : 'detail',
9546 detailRoot: !!isDetailRoot
9547 });
9548 }
9549 } // Remove previous page in case of "forced"
9550
9551
9552 var backIndex;
9553
9554 if (options.force) {
9555 if ($oldPage.prev('.page-previous:not(.stacked)').length > 0 || $oldPage.prev('.page-previous').length === 0) {
9556 if (router.history.indexOf(options.route.url) >= 0) {
9557 backIndex = router.history.length - router.history.indexOf(options.route.url) - 1;
9558 router.history = router.history.slice(0, router.history.indexOf(options.route.url) + 2);
9559 view.history = router.history;
9560 } else if (router.history[[router.history.length - 2]]) {
9561 router.history[router.history.length - 2] = options.route.url;
9562 } else {
9563 router.history.unshift(router.url);
9564 }
9565
9566 if (backIndex && router.params.stackPages) {
9567 $oldPage.prevAll('.page-previous').each(function (pageToRemove) {
9568 var $pageToRemove = $(pageToRemove);
9569 var $navbarToRemove;
9570
9571 if (dynamicNavbar) {
9572 // $navbarToRemove = $oldNavbarEl.prevAll('.navbar-previous').eq(index);
9573 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
9574 }
9575
9576 if ($pageToRemove[0] !== $newPage[0] && $pageToRemove.index() > $newPage.index()) {
9577 if (router.initialPages.indexOf($pageToRemove[0]) >= 0) {
9578 $pageToRemove.addClass('stacked');
9579 $pageToRemove.trigger('page:stack');
9580 router.emit('pageStack', $pageToRemove[0]);
9581
9582 if (dynamicNavbar) {
9583 $navbarToRemove.addClass('stacked');
9584 }
9585 } else {
9586 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
9587
9588 if ($pageToRemove[0] === masterPageEl) {
9589 masterPageRemoved = true;
9590 }
9591
9592 router.removePage($pageToRemove);
9593
9594 if (dynamicNavbar && $navbarToRemove.length > 0) {
9595 router.removeNavbar($navbarToRemove);
9596 }
9597 }
9598 }
9599 });
9600 } else {
9601 var $pageToRemove = $oldPage.prev('.page-previous:not(.stacked)');
9602 var $navbarToRemove;
9603
9604 if (dynamicNavbar) {
9605 // $navbarToRemove = $oldNavbarEl.prev('.navbar-inner:not(.stacked)');
9606 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
9607 }
9608
9609 if (router.params.stackPages && router.initialPages.indexOf($pageToRemove[0]) >= 0) {
9610 $pageToRemove.addClass('stacked');
9611 $pageToRemove.trigger('page:stack');
9612 router.emit('pageStack', $pageToRemove[0]);
9613 $navbarToRemove.addClass('stacked');
9614 } else if ($pageToRemove.length > 0) {
9615 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
9616
9617 if ($pageToRemove[0] === masterPageEl) {
9618 masterPageRemoved = true;
9619 }
9620
9621 router.removePage($pageToRemove);
9622
9623 if (dynamicNavbar && $navbarToRemove.length) {
9624 router.removeNavbar($navbarToRemove);
9625 }
9626 }
9627 }
9628 }
9629 } // Insert new page
9630
9631
9632 var newPageInDom = $newPage.parents(document).length > 0;
9633 var f7Component = $newPage[0].f7Component;
9634
9635 function insertPage() {
9636 if (initialPreload) {
9637 if (!newPageInDom && f7Component) {
9638 f7Component.mount(function (componentEl) {
9639 router.$el.append(componentEl);
9640 });
9641 } else {
9642 router.$el.append($newPage);
9643 }
9644 }
9645
9646 if ($newPage.next($oldPage).length === 0) {
9647 if (!newPageInDom && f7Component) {
9648 f7Component.mount(function (componentEl) {
9649 $(componentEl).insertBefore($oldPage);
9650 });
9651 } else {
9652 $newPage.insertBefore($oldPage);
9653 }
9654 }
9655
9656 if (dynamicNavbar && $newNavbarEl.length) {
9657 if ($newNavbarEl.find('.title-large').length) {
9658 $newNavbarEl.addClass('navbar-large');
9659 }
9660
9661 $newNavbarEl.insertBefore($oldNavbarEl);
9662
9663 if ($oldNavbarEl.length > 0) {
9664 $newNavbarEl.insertBefore($oldNavbarEl);
9665 } else {
9666 if (!router.$navbarsEl.parents(document).length) {
9667 router.$el.prepend(router.$navbarsEl);
9668 }
9669
9670 $navbarsEl.append($newNavbarEl);
9671 }
9672 }
9673
9674 if (!newPageInDom) {
9675 router.pageCallback('mounted', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
9676 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
9677 $newPage[0].f7PageMounted = true;
9678 router.pageCallback('mounted', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
9679 }
9680 }
9681
9682 if (options.preload) {
9683 // Insert Page
9684 insertPage(); // Tab route
9685
9686 if (options.route.route.tab) {
9687 router.tabLoad(options.route.route.tab, extend$1({}, options, {
9688 history: false,
9689 browserHistory: false,
9690 preload: true
9691 }));
9692 }
9693
9694 if (isMaster) {
9695 $newPage.removeClass('page-master-stacked').trigger('page:masterunstack');
9696 router.emit('pageMasterUnstack', $newPage[0]);
9697
9698 if (dynamicNavbar) {
9699 $(app.navbar.getElByPage($newPage)).removeClass('navbar-master-stacked');
9700 router.emit('navbarMasterUnstack', app.navbar.getElByPage($newPage));
9701 }
9702 } // Page init and before init events
9703
9704
9705 router.pageCallback('init', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
9706
9707 if (initialPreload) {
9708 router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'current', undefined, options);
9709 router.pageCallback('afterIn', $newPage, $newNavbarEl, 'current', undefined, options);
9710 }
9711
9712 var $previousPages = $newPage.prevAll('.page-previous:not(.stacked):not(.page-master)');
9713
9714 if ($previousPages.length > 0) {
9715 $previousPages.each(function (pageToRemove) {
9716 var $pageToRemove = $(pageToRemove);
9717 var $navbarToRemove;
9718
9719 if (dynamicNavbar) {
9720 // $navbarToRemove = $newNavbarEl.prevAll('.navbar-previous:not(.stacked)').eq(index);
9721 $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
9722 }
9723
9724 if (router.params.stackPages && router.initialPages.indexOf(pageToRemove) >= 0) {
9725 $pageToRemove.addClass('stacked');
9726 $pageToRemove.trigger('page:stack');
9727 router.emit('pageStack', $pageToRemove[0]);
9728
9729 if (dynamicNavbar) {
9730 $navbarToRemove.addClass('stacked');
9731 }
9732 } else {
9733 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined);
9734 router.removePage($pageToRemove);
9735
9736 if (dynamicNavbar && $navbarToRemove.length) {
9737 router.removeNavbar($navbarToRemove);
9738 }
9739 }
9740 });
9741 }
9742
9743 router.allowPageChange = true;
9744 return router;
9745 } // History State
9746
9747
9748 if (!(device.ie || device.edge || device.firefox && !device.ios)) {
9749 if (router.params.browserHistory && options.browserHistory) {
9750 if (options.replaceState) {
9751 var browserHistoryRoot = router.params.browserHistoryRoot || '';
9752 History$2.replace(view.id, {
9753 url: options.route.url
9754 }, browserHistoryRoot + router.params.browserHistorySeparator + options.route.url);
9755 } else if (backIndex) {
9756 History$2.go(-backIndex);
9757 } else {
9758 History$2.back();
9759 }
9760 }
9761 } // Update History
9762
9763
9764 if (options.replaceState) {
9765 router.history[router.history.length - 1] = options.route.url;
9766 } else {
9767 if (router.history.length === 1) {
9768 router.history.unshift(router.url);
9769 }
9770
9771 router.history.pop();
9772 }
9773
9774 router.saveHistory(); // Current Page & Navbar
9775
9776 router.currentPageEl = $newPage[0];
9777
9778 if (dynamicNavbar && $newNavbarEl.length) {
9779 router.currentNavbarEl = $newNavbarEl[0];
9780 } else {
9781 delete router.currentNavbarEl;
9782 } // Current Route
9783
9784
9785 router.currentRoute = options.route; // History State
9786
9787 if (device.ie || device.edge || device.firefox && !device.ios) {
9788 if (router.params.browserHistory && options.browserHistory) {
9789 if (options.replaceState) {
9790 var _browserHistoryRoot = router.params.browserHistoryRoot || '';
9791
9792 History$2.replace(view.id, {
9793 url: options.route.url
9794 }, _browserHistoryRoot + router.params.browserHistorySeparator + options.route.url);
9795 } else if (backIndex) {
9796 History$2.go(-backIndex);
9797 } else {
9798 History$2.back();
9799 }
9800 }
9801 } // Insert Page
9802
9803
9804 insertPage(); // Load Tab
9805
9806 if (options.route.route.tab) {
9807 router.tabLoad(options.route.route.tab, extend$1({}, options, {
9808 history: false,
9809 browserHistory: false
9810 }));
9811 } // Check master detail
9812
9813
9814 if (masterDetailEnabled && (currentIsMaster || masterPageRemoved)) {
9815 view.checkMasterDetailBreakpoint(false);
9816 } // Page init and before init events
9817
9818
9819 router.pageCallback('init', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage); // Before animation callback
9820
9821 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', 'next', options);
9822 router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'previous', 'current', options); // Animation
9823
9824 function afterAnimation() {
9825 // Set classes
9826 router.setPagePosition($newPage, 'current', false);
9827 router.setPagePosition($oldPage, 'next', true);
9828
9829 if (dynamicNavbar) {
9830 router.setNavbarPosition($newNavbarEl, 'current', false);
9831 router.setNavbarPosition($oldNavbarEl, 'next', true);
9832 } // After animation event
9833
9834
9835 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', 'next', options);
9836 router.pageCallback('afterIn', $newPage, $newNavbarEl, 'previous', 'current', options); // Remove Old Page
9837
9838 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
9839 $oldPage.addClass('stacked');
9840 $oldPage.trigger('page:stack');
9841 router.emit('pageStack', $oldPage[0]);
9842
9843 if (dynamicNavbar) {
9844 $oldNavbarEl.addClass('stacked');
9845 }
9846 } else {
9847 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'next', undefined, options);
9848 router.removePage($oldPage);
9849
9850 if (dynamicNavbar && $oldNavbarEl.length) {
9851 router.removeNavbar($oldNavbarEl);
9852 }
9853 }
9854
9855 router.allowPageChange = true;
9856 router.emit('routeChanged', router.currentRoute, router.previousRoute, router); // Preload previous page
9857
9858 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
9859
9860 if (preloadPreviousPage && router.history[router.history.length - 2] && !isMaster) {
9861 router.back(router.history[router.history.length - 2], {
9862 preload: true
9863 });
9864 }
9865
9866 if (router.params.browserHistory) {
9867 History$2.clearRouterQueue();
9868 }
9869 }
9870
9871 function setPositionClasses() {
9872 router.setPagePosition($oldPage, 'current');
9873 router.setPagePosition($newPage, 'previous', false);
9874
9875 if (dynamicNavbar) {
9876 router.setNavbarPosition($oldNavbarEl, 'current');
9877 router.setNavbarPosition($newNavbarEl, 'previous', false);
9878 }
9879 }
9880
9881 if (options.animate && !(currentIsMaster && app.width >= router.params.masterDetailBreakpoint)) {
9882 var transition = router.params.transition;
9883
9884 if ($oldPage[0] && $oldPage[0].f7PageTransition) {
9885 transition = $oldPage[0].f7PageTransition;
9886 delete $oldPage[0].f7PageTransition;
9887 }
9888
9889 if (options.transition) transition = options.transition;
9890
9891 if (!transition && router.previousRoute && router.previousRoute.route) {
9892 transition = router.previousRoute.route.transition;
9893 }
9894
9895 if (!transition && router.previousRoute && router.previousRoute.route && router.previousRoute.route.options) {
9896 transition = router.previousRoute.route.options.transition;
9897 }
9898
9899 setPositionClasses();
9900 router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'backward', transition, function () {
9901 afterAnimation();
9902 });
9903 } else {
9904 afterAnimation();
9905 }
9906
9907 return router;
9908 }
9909
9910 function loadBack(router, backParams, backOptions, ignorePageChange) {
9911 if (!router.allowPageChange && !ignorePageChange) return router;
9912 var params = backParams;
9913 var options = backOptions;
9914 var url = params.url,
9915 content = params.content,
9916 el = params.el,
9917 pageName = params.pageName,
9918 component = params.component,
9919 componentUrl = params.componentUrl;
9920
9921 if (options.route.url && router.url === options.route.url && !(options.reloadCurrent || options.reloadPrevious) && !router.params.allowDuplicateUrls) {
9922 return false;
9923 }
9924
9925 if (!options.route && url) {
9926 options.route = router.parseRouteUrl(url);
9927 } // Component Callbacks
9928
9929
9930 function resolve(pageEl, newOptions) {
9931 return backward(router, pageEl, extend$1(options, newOptions));
9932 }
9933
9934 function reject() {
9935 router.allowPageChange = true;
9936 return router;
9937 }
9938
9939 if (url || componentUrl || component) {
9940 router.allowPageChange = false;
9941 } // Proceed
9942
9943
9944 if (content) {
9945 backward(router, router.getPageEl(content), options);
9946 } else if (el) {
9947 // Load page from specified HTMLElement or by page name in pages container
9948 backward(router, router.getPageEl(el), options);
9949 } else if (pageName) {
9950 // Load page by page name in pages container
9951 backward(router, router.$el.children(".page[data-name=\"" + pageName + "\"]").eq(0), options);
9952 } else if (component || componentUrl) {
9953 // Load from component (F7/Vue/React/...)
9954 try {
9955 router.pageComponentLoader({
9956 routerEl: router.el,
9957 component: component,
9958 componentUrl: componentUrl,
9959 options: options,
9960 resolve: resolve,
9961 reject: reject
9962 });
9963 } catch (err) {
9964 router.allowPageChange = true;
9965 throw err;
9966 }
9967 } else if (url) {
9968 // Load using XHR
9969 if (router.xhrAbortController) {
9970 router.xhrAbortController.abort();
9971 router.xhrAbortController = false;
9972 }
9973
9974 router.xhrRequest(url, options).then(function (pageContent) {
9975 backward(router, router.getPageEl(pageContent), options);
9976 }).catch(function () {
9977 router.allowPageChange = true;
9978 });
9979 }
9980
9981 return router;
9982 }
9983
9984 function back() {
9985 var router = this;
9986 var device = getDevice$1();
9987 if (router.swipeBackActive) return router;
9988 var navigateUrl;
9989 var navigateOptions;
9990 var route;
9991
9992 if (typeof (arguments.length <= 0 ? undefined : arguments[0]) === 'object') {
9993 navigateOptions = (arguments.length <= 0 ? undefined : arguments[0]) || {};
9994 } else {
9995 navigateUrl = arguments.length <= 0 ? undefined : arguments[0];
9996 navigateOptions = (arguments.length <= 1 ? undefined : arguments[1]) || {};
9997 }
9998
9999 var _navigateOptions = navigateOptions,
10000 name = _navigateOptions.name,
10001 params = _navigateOptions.params,
10002 query = _navigateOptions.query;
10003
10004 if (name) {
10005 navigateUrl = router.generateUrl({
10006 name: name,
10007 params: params,
10008 query: query
10009 });
10010
10011 if (navigateUrl) {
10012 return router.back(navigateUrl, extend$1({}, navigateOptions, {
10013 name: null,
10014 params: null,
10015 query: null
10016 }));
10017 }
10018
10019 return router;
10020 }
10021
10022 var app = router.app;
10023 appRouterCheck(router, 'back');
10024 var currentRouteIsModal = router.currentRoute.modal;
10025 var modalType;
10026
10027 if (!currentRouteIsModal) {
10028 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
10029 if (router.currentRoute.route[modalLoadProp]) {
10030 currentRouteIsModal = true;
10031 modalType = modalLoadProp;
10032 }
10033 });
10034 }
10035
10036 if (currentRouteIsModal && !navigateOptions.preload) {
10037 var modalToClose = router.currentRoute.modal || router.currentRoute.route.modalInstance || app[modalType].get();
10038 var previousUrl = router.history[router.history.length - 2];
10039 var previousRoute; // check if previous route is modal too
10040
10041 if (modalToClose && modalToClose.$el) {
10042 var prevOpenedModals = modalToClose.$el.prevAll('.modal-in');
10043
10044 if (prevOpenedModals.length && prevOpenedModals[0].f7Modal) {
10045 var modalEl = prevOpenedModals[0]; // check if current router not inside of the modalEl
10046
10047 if (!router.$el.parents(modalEl).length) {
10048 previousRoute = modalEl.f7Modal.route;
10049 }
10050 }
10051 }
10052
10053 if (!previousRoute) {
10054 previousRoute = router.findMatchingRoute(previousUrl);
10055 }
10056
10057 if (!previousRoute && previousUrl) {
10058 previousRoute = {
10059 url: previousUrl,
10060 path: previousUrl.split('?')[0],
10061 query: parseUrlQuery(previousUrl),
10062 route: {
10063 path: previousUrl.split('?')[0],
10064 url: previousUrl
10065 }
10066 };
10067 }
10068
10069 if (!navigateUrl || navigateUrl.replace(/[# ]/g, '').trim().length === 0) {
10070 if (!previousRoute || !modalToClose) {
10071 return router;
10072 }
10073 }
10074
10075 var forceOtherUrl = navigateOptions.force && previousRoute && navigateUrl;
10076
10077 if (previousRoute && modalToClose) {
10078 var isBrokenBrowserHistory = device.ie || device.edge || device.firefox && !device.ios;
10079 var needHistoryBack = router.params.browserHistory && navigateOptions.browserHistory !== false;
10080 var currentRouteWithoutBrowserHistory = router.currentRoute && router.currentRoute.route && router.currentRoute.route.options && router.currentRoute.route.options.browserHistory === false;
10081
10082 if (needHistoryBack && !isBrokenBrowserHistory && !currentRouteWithoutBrowserHistory) {
10083 History$2.back();
10084 }
10085
10086 router.currentRoute = previousRoute;
10087 router.history.pop();
10088 router.saveHistory();
10089
10090 if (needHistoryBack && isBrokenBrowserHistory && !currentRouteWithoutBrowserHistory) {
10091 History$2.back();
10092 }
10093
10094 router.modalRemove(modalToClose);
10095
10096 if (forceOtherUrl) {
10097 router.navigate(navigateUrl, {
10098 reloadCurrent: true
10099 });
10100 }
10101 } else if (modalToClose) {
10102 router.modalRemove(modalToClose);
10103
10104 if (navigateUrl) {
10105 router.navigate(navigateUrl, {
10106 reloadCurrent: true
10107 });
10108 }
10109 }
10110
10111 return router;
10112 }
10113
10114 var $previousPage = router.$el.children('.page-current').prevAll('.page-previous:not(.page-master)').eq(0);
10115 var skipMaster;
10116
10117 if (router.params.masterDetailBreakpoint > 0) {
10118 var classes = [];
10119 router.$el.children('.page').each(function (pageEl) {
10120 classes.push(pageEl.className);
10121 });
10122 var $previousMaster = router.$el.children('.page-current').prevAll('.page-master').eq(0);
10123
10124 if ($previousMaster.length) {
10125 var expectedPreviousPageUrl = router.history[router.history.length - 2];
10126 var expectedPreviousPageRoute = router.findMatchingRoute(expectedPreviousPageUrl);
10127
10128 if (expectedPreviousPageRoute && $previousMaster[0].f7Page && expectedPreviousPageRoute.route === $previousMaster[0].f7Page.route.route) {
10129 $previousPage = $previousMaster;
10130
10131 if (!navigateOptions.preload) {
10132 skipMaster = app.width >= router.params.masterDetailBreakpoint;
10133 }
10134 }
10135 }
10136 }
10137
10138 if (!navigateOptions.force && $previousPage.length && !skipMaster) {
10139 if (router.params.browserHistory && $previousPage[0].f7Page && router.history[router.history.length - 2] !== $previousPage[0].f7Page.route.url) {
10140 router.back(router.history[router.history.length - 2], extend$1(navigateOptions, {
10141 force: true
10142 }));
10143 return router;
10144 }
10145
10146 var previousPageRoute = $previousPage[0].f7Page.route;
10147 processRouteQueue.call(router, previousPageRoute, router.currentRoute, function () {
10148 loadBack(router, {
10149 el: $previousPage
10150 }, extend$1(navigateOptions, {
10151 route: previousPageRoute
10152 }));
10153 }, function () {}, 'backward');
10154 return router;
10155 } // Navigate URL
10156
10157
10158 if (navigateUrl === '#') {
10159 navigateUrl = undefined;
10160 }
10161
10162 if (navigateUrl && navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
10163 navigateUrl = ((router.path || '/') + navigateUrl).replace('//', '/');
10164 }
10165
10166 if (!navigateUrl && router.history.length > 1) {
10167 navigateUrl = router.history[router.history.length - 2];
10168 }
10169
10170 if (skipMaster && !navigateOptions.force && router.history[router.history.length - 3]) {
10171 return router.back(router.history[router.history.length - 3], extend$1({}, navigateOptions || {}, {
10172 force: true,
10173 animate: false
10174 }));
10175 }
10176
10177 if (skipMaster && !navigateOptions.force) {
10178 return router;
10179 } // Find route to load
10180
10181
10182 route = router.findMatchingRoute(navigateUrl);
10183
10184 if (!route) {
10185 if (navigateUrl) {
10186 route = {
10187 url: navigateUrl,
10188 path: navigateUrl.split('?')[0],
10189 query: parseUrlQuery(navigateUrl),
10190 route: {
10191 path: navigateUrl.split('?')[0],
10192 url: navigateUrl
10193 }
10194 };
10195 }
10196 }
10197
10198 if (!route) {
10199 return router;
10200 }
10201
10202 if (route.route.redirect) {
10203 return redirect.call(router, 'backward', route, navigateOptions);
10204 }
10205
10206 var options = {};
10207
10208 if (route.route.options) {
10209 extend$1(options, route.route.options, navigateOptions);
10210 } else {
10211 extend$1(options, navigateOptions);
10212 }
10213
10214 options.route = route;
10215 var backForceLoaded;
10216
10217 if (options.force && router.params.stackPages) {
10218 router.$el.children('.page-previous.stacked').each(function (pageEl) {
10219 if (pageEl.f7Page && pageEl.f7Page.route && pageEl.f7Page.route.url === route.url) {
10220 backForceLoaded = true;
10221 loadBack(router, {
10222 el: pageEl
10223 }, options);
10224 }
10225 });
10226
10227 if (backForceLoaded) {
10228 return router;
10229 }
10230 }
10231
10232 function resolve() {
10233 var routerLoaded = false;
10234
10235 if (route.route.keepAlive && route.route.keepAliveData) {
10236 loadBack(router, {
10237 el: route.route.keepAliveData.pageEl
10238 }, options);
10239 routerLoaded = true;
10240 }
10241
10242 'url content component pageName el componentUrl'.split(' ').forEach(function (pageLoadProp) {
10243 if (route.route[pageLoadProp] && !routerLoaded) {
10244 var _loadBack;
10245
10246 routerLoaded = true;
10247 loadBack(router, (_loadBack = {}, _loadBack[pageLoadProp] = route.route[pageLoadProp], _loadBack), options);
10248 }
10249 });
10250 if (routerLoaded) return; // Async
10251
10252 function asyncResolve(resolveParams, resolveOptions) {
10253 router.allowPageChange = false;
10254 loadBack(router, resolveParams, extend$1(options, resolveOptions), true);
10255 }
10256
10257 function asyncReject() {
10258 router.allowPageChange = true;
10259 }
10260
10261 if (route.route.async) {
10262 router.allowPageChange = false;
10263 route.route.async.call(router, {
10264 router: router,
10265 to: route,
10266 from: router.currentRoute,
10267 resolve: asyncResolve,
10268 reject: asyncReject,
10269 direction: 'backward',
10270 app: app
10271 });
10272 }
10273
10274 if (route.route.asyncComponent) {
10275 asyncComponent(router, route.route.asyncComponent, asyncResolve, asyncReject);
10276 }
10277 }
10278
10279 function reject() {
10280 router.allowPageChange = true;
10281 }
10282
10283 if (options.preload) {
10284 resolve();
10285 } else {
10286 processRouteQueue.call(router, route, router.currentRoute, function () {
10287 if (route.route.modules) {
10288 app.loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules]).then(function () {
10289 resolve();
10290 }).catch(function () {
10291 reject();
10292 });
10293 } else {
10294 resolve();
10295 }
10296 }, function () {
10297 reject();
10298 }, 'backward');
10299 } // Return Router
10300
10301
10302 return router;
10303 }
10304
10305 function clearPreviousPages(router) {
10306 appRouterCheck(router, 'clearPreviousPages');
10307 var app = router.app;
10308 var dynamicNavbar = router.dynamicNavbar;
10309 var $pagesToRemove = router.$el.children('.page').filter(function (pageInView) {
10310 if (router.currentRoute && (router.currentRoute.modal || router.currentRoute.panel)) return true;
10311 return pageInView !== router.currentPageEl;
10312 });
10313 $pagesToRemove.each(function (pageEl) {
10314 var $oldPageEl = $(pageEl);
10315 var $oldNavbarEl = $(app.navbar.getElByPage($oldPageEl));
10316
10317 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
10318 $oldPageEl.addClass('stacked');
10319
10320 if (dynamicNavbar) {
10321 $oldNavbarEl.addClass('stacked');
10322 }
10323 } else {
10324 // Page remove event
10325 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarEl, 'previous', undefined, {});
10326 router.removePage($oldPageEl);
10327
10328 if (dynamicNavbar && $oldNavbarEl.length) {
10329 router.removeNavbar($oldNavbarEl);
10330 }
10331 }
10332 });
10333 }
10334
10335 function clearPreviousHistory() {
10336 var router = this;
10337 appRouterCheck(router, 'clearPreviousHistory');
10338 var url = router.history[router.history.length - 1];
10339 clearPreviousPages(router);
10340 router.history = [url];
10341 router.view.history = [url];
10342 router.saveHistory();
10343 }
10344 // eslint-disable-line
10345
10346 var Router = /*#__PURE__*/function (_Framework7Class) {
10347 _inheritsLoose(Router, _Framework7Class);
10348
10349 function Router(app, view) {
10350 var _this;
10351
10352 _this = _Framework7Class.call(this, {}, [typeof view === 'undefined' ? app : view]) || this;
10353
10354 var router = _assertThisInitialized(_this); // Is App Router
10355
10356
10357 router.isAppRouter = typeof view === 'undefined';
10358
10359 if (router.isAppRouter) {
10360 // App Router
10361 extend$1(false, router, {
10362 app: app,
10363 params: app.params.view,
10364 routes: app.routes || [],
10365 cache: app.cache
10366 });
10367 } else {
10368 // View Router
10369 extend$1(false, router, {
10370 app: app,
10371 view: view,
10372 viewId: view.id,
10373 id: view.params.routerId,
10374 params: view.params,
10375 routes: view.routes,
10376 history: view.history,
10377 scrollHistory: view.scrollHistory,
10378 cache: app.cache,
10379 dynamicNavbar: app.theme === 'ios' && view.params.iosDynamicNavbar,
10380 initialPages: [],
10381 initialNavbars: []
10382 });
10383 } // Install Modules
10384
10385
10386 router.useModules(); // AllowPageChage
10387
10388 router.allowPageChange = true; // Current Route
10389
10390 var currentRoute = {};
10391 var previousRoute = {};
10392 Object.defineProperty(router, 'currentRoute', {
10393 enumerable: true,
10394 configurable: true,
10395 set: function set(newRoute) {
10396 if (newRoute === void 0) {
10397 newRoute = {};
10398 }
10399
10400 previousRoute = extend$1({}, currentRoute);
10401 currentRoute = newRoute;
10402 if (!currentRoute) return;
10403 router.url = currentRoute.url;
10404 router.emit('routeChange', newRoute, previousRoute, router);
10405 },
10406 get: function get() {
10407 return currentRoute;
10408 }
10409 });
10410 Object.defineProperty(router, 'previousRoute', {
10411 enumerable: true,
10412 configurable: true,
10413 get: function get() {
10414 return previousRoute;
10415 },
10416 set: function set(newRoute) {
10417 previousRoute = newRoute;
10418 }
10419 });
10420 return router || _assertThisInitialized(_this);
10421 }
10422
10423 var _proto = Router.prototype;
10424
10425 _proto.mount = function mount() {
10426 var router = this;
10427 var view = router.view;
10428 var document = getDocument();
10429 extend$1(false, router, {
10430 tempDom: document.createElement('div'),
10431 $el: view.$el,
10432 el: view.el,
10433 $navbarsEl: view.$navbarsEl,
10434 navbarsEl: view.navbarsEl
10435 });
10436 router.emit('local::mount routerMount', router);
10437 };
10438
10439 _proto.animatableNavElements = function animatableNavElements($newNavbarEl, $oldNavbarEl, toLarge, fromLarge, direction) {
10440 var router = this;
10441 var dynamicNavbar = router.dynamicNavbar;
10442 var animateIcon = router.params.iosAnimateNavbarBackIcon;
10443 var newNavEls;
10444 var oldNavEls;
10445
10446 function animatableNavEl($el, $navbarInner) {
10447 var isSliding = $el.hasClass('sliding') || $navbarInner.hasClass('sliding');
10448 var isSubnavbar = $el.hasClass('subnavbar');
10449 var needsOpacityTransition = isSliding ? !isSubnavbar : true;
10450 var $iconEl = $el.find('.back .icon');
10451 var isIconLabel;
10452
10453 if (isSliding && animateIcon && $el.hasClass('left') && $iconEl.length > 0 && $iconEl.next('span').length) {
10454 $el = $iconEl.next('span'); // eslint-disable-line
10455
10456 isIconLabel = true;
10457 }
10458
10459 return {
10460 $el: $el,
10461 isIconLabel: isIconLabel,
10462 leftOffset: $el[0].f7NavbarLeftOffset,
10463 rightOffset: $el[0].f7NavbarRightOffset,
10464 isSliding: isSliding,
10465 isSubnavbar: isSubnavbar,
10466 needsOpacityTransition: needsOpacityTransition
10467 };
10468 }
10469
10470 if (dynamicNavbar) {
10471 newNavEls = [];
10472 oldNavEls = [];
10473 $newNavbarEl.children('.navbar-inner').children('.left, .right, .title, .subnavbar').each(function (navEl) {
10474 var $navEl = $(navEl);
10475 if ($navEl.hasClass('left') && fromLarge && direction === 'forward') return;
10476 if ($navEl.hasClass('title') && toLarge) return;
10477 newNavEls.push(animatableNavEl($navEl, $newNavbarEl.children('.navbar-inner')));
10478 });
10479
10480 if (!($oldNavbarEl.hasClass('navbar-master') && router.params.masterDetailBreakpoint > 0 && router.app.width >= router.params.masterDetailBreakpoint)) {
10481 $oldNavbarEl.children('.navbar-inner').children('.left, .right, .title, .subnavbar').each(function (navEl) {
10482 var $navEl = $(navEl);
10483 if ($navEl.hasClass('left') && toLarge && !fromLarge && direction === 'forward') return;
10484 if ($navEl.hasClass('left') && toLarge && direction === 'backward') return;
10485
10486 if ($navEl.hasClass('title') && fromLarge) {
10487 return;
10488 }
10489
10490 oldNavEls.push(animatableNavEl($navEl, $oldNavbarEl.children('.navbar-inner')));
10491 });
10492 }
10493
10494 [oldNavEls, newNavEls].forEach(function (navEls) {
10495 navEls.forEach(function (navEl) {
10496 var n = navEl;
10497 var isSliding = navEl.isSliding,
10498 $el = navEl.$el;
10499 var otherEls = navEls === oldNavEls ? newNavEls : oldNavEls;
10500 if (!(isSliding && $el.hasClass('title') && otherEls)) return;
10501 otherEls.forEach(function (otherNavEl) {
10502 if (otherNavEl.isIconLabel) {
10503 var iconTextEl = otherNavEl.$el[0];
10504 n.leftOffset += iconTextEl ? iconTextEl.offsetLeft || 0 : 0;
10505 }
10506 });
10507 });
10508 });
10509 }
10510
10511 return {
10512 newNavEls: newNavEls,
10513 oldNavEls: oldNavEls
10514 };
10515 };
10516
10517 _proto.animate = function animate($oldPageEl, $newPageEl, $oldNavbarEl, $newNavbarEl, direction, transition, callback) {
10518 var router = this;
10519
10520 if (router.params.animateCustom) {
10521 router.params.animateCustom.apply(router, [$oldPageEl, $newPageEl, $oldNavbarEl, $newNavbarEl, direction, callback]);
10522 return;
10523 }
10524
10525 var dynamicNavbar = router.dynamicNavbar;
10526 var ios = router.app.theme === 'ios';
10527
10528 if (transition) {
10529 var routerCustomTransitionClass = "router-transition-custom router-transition-" + transition + "-" + direction; // Animate
10530
10531 var onCustomTransitionDone = function onCustomTransitionDone() {
10532 router.$el.removeClass(routerCustomTransitionClass);
10533
10534 if (dynamicNavbar && router.$navbarsEl.length) {
10535 if ($newNavbarEl) {
10536 router.$navbarsEl.prepend($newNavbarEl);
10537 }
10538
10539 if ($oldNavbarEl) {
10540 router.$navbarsEl.prepend($oldNavbarEl);
10541 }
10542 }
10543
10544 if (callback) callback();
10545 };
10546
10547 (direction === 'forward' ? $newPageEl : $oldPageEl).animationEnd(onCustomTransitionDone);
10548
10549 if (dynamicNavbar) {
10550 if ($newNavbarEl && $newPageEl) {
10551 router.setNavbarPosition($newNavbarEl, '');
10552 $newNavbarEl.removeClass('navbar-next navbar-previous navbar-current');
10553 $newPageEl.prepend($newNavbarEl);
10554 }
10555
10556 if ($oldNavbarEl && $oldPageEl) {
10557 router.setNavbarPosition($oldNavbarEl, '');
10558 $oldNavbarEl.removeClass('navbar-next navbar-previous navbar-current');
10559 $oldPageEl.prepend($oldNavbarEl);
10560 }
10561 }
10562
10563 router.$el.addClass(routerCustomTransitionClass);
10564 return;
10565 } // Router Animation class
10566
10567
10568 var routerTransitionClass = "router-transition-" + direction + " router-transition";
10569 var newNavEls;
10570 var oldNavEls;
10571 var fromLarge;
10572 var toLarge;
10573 var toDifferent;
10574 var oldIsLarge;
10575 var newIsLarge;
10576
10577 if (ios && dynamicNavbar) {
10578 var betweenMasterAndDetail = router.params.masterDetailBreakpoint > 0 && router.app.width >= router.params.masterDetailBreakpoint && ($oldNavbarEl.hasClass('navbar-master') && $newNavbarEl.hasClass('navbar-master-detail') || $oldNavbarEl.hasClass('navbar-master-detail') && $newNavbarEl.hasClass('navbar-master'));
10579
10580 if (!betweenMasterAndDetail) {
10581 oldIsLarge = $oldNavbarEl && $oldNavbarEl.hasClass('navbar-large');
10582 newIsLarge = $newNavbarEl && $newNavbarEl.hasClass('navbar-large');
10583 fromLarge = oldIsLarge && !$oldNavbarEl.hasClass('navbar-large-collapsed');
10584 toLarge = newIsLarge && !$newNavbarEl.hasClass('navbar-large-collapsed');
10585 toDifferent = fromLarge && !toLarge || toLarge && !fromLarge;
10586 }
10587
10588 var navEls = router.animatableNavElements($newNavbarEl, $oldNavbarEl, toLarge, fromLarge, direction);
10589 newNavEls = navEls.newNavEls;
10590 oldNavEls = navEls.oldNavEls;
10591 }
10592
10593 function animateNavbars(progress) {
10594 if (!(ios && dynamicNavbar)) return;
10595
10596 if (progress === 1) {
10597 if (toLarge) {
10598 $newNavbarEl.addClass('router-navbar-transition-to-large');
10599 $oldNavbarEl.addClass('router-navbar-transition-to-large');
10600 }
10601
10602 if (fromLarge) {
10603 $newNavbarEl.addClass('router-navbar-transition-from-large');
10604 $oldNavbarEl.addClass('router-navbar-transition-from-large');
10605 }
10606 }
10607
10608 newNavEls.forEach(function (navEl) {
10609 var $el = navEl.$el;
10610 var offset = direction === 'forward' ? navEl.rightOffset : navEl.leftOffset;
10611
10612 if (navEl.isSliding) {
10613 if (navEl.isSubnavbar && newIsLarge) {
10614 // prettier-ignore
10615 $el[0].style.setProperty('transform', "translate3d(" + offset * (1 - progress) + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)", 'important');
10616 } else {
10617 $el.transform("translate3d(" + offset * (1 - progress) + "px,0,0)");
10618 }
10619 }
10620 });
10621 oldNavEls.forEach(function (navEl) {
10622 var $el = navEl.$el;
10623 var offset = direction === 'forward' ? navEl.leftOffset : navEl.rightOffset;
10624
10625 if (navEl.isSliding) {
10626 if (navEl.isSubnavbar && oldIsLarge) {
10627 $el.transform("translate3d(" + offset * progress + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
10628 } else {
10629 $el.transform("translate3d(" + offset * progress + "px,0,0)");
10630 }
10631 }
10632 });
10633 } // AnimationEnd Callback
10634
10635
10636 function onDone() {
10637 if (router.dynamicNavbar) {
10638 if ($newNavbarEl) {
10639 $newNavbarEl.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
10640 $newNavbarEl.addClass('navbar-no-title-large-transition');
10641 nextFrame$1(function () {
10642 $newNavbarEl.removeClass('navbar-no-title-large-transition');
10643 });
10644 }
10645
10646 if ($oldNavbarEl) {
10647 $oldNavbarEl.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
10648 }
10649
10650 if ($newNavbarEl.hasClass('sliding') || $newNavbarEl.children('.navbar-inner.sliding').length) {
10651 $newNavbarEl.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
10652 } else {
10653 $newNavbarEl.find('.sliding').transform('');
10654 }
10655
10656 if ($oldNavbarEl.hasClass('sliding') || $oldNavbarEl.children('.navbar-inner.sliding').length) {
10657 $oldNavbarEl.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
10658 } else {
10659 $oldNavbarEl.find('.sliding').transform('');
10660 }
10661 }
10662
10663 router.$el.removeClass(routerTransitionClass);
10664 if (callback) callback();
10665 }
10666
10667 (direction === 'forward' ? $newPageEl : $oldPageEl).animationEnd(function () {
10668 onDone();
10669 }); // Animate
10670
10671 if (dynamicNavbar) {
10672 // Prepare Navbars
10673 animateNavbars(0);
10674 nextFrame$1(function () {
10675 // Add class, start animation
10676 router.$el.addClass(routerTransitionClass);
10677
10678 if (toDifferent) {
10679 // eslint-disable-next-line
10680 router.el._clientLeft = router.el.clientLeft;
10681 }
10682
10683 animateNavbars(1);
10684 });
10685 } else {
10686 // Add class, start animation
10687 router.$el.addClass(routerTransitionClass);
10688 }
10689 };
10690
10691 _proto.removeModal = function removeModal(modalEl) {
10692 var router = this;
10693 router.removeEl(modalEl);
10694 } // eslint-disable-next-line
10695 ;
10696
10697 _proto.removeTabContent = function removeTabContent(tabEl) {
10698 var $tabEl = $(tabEl);
10699 $tabEl.html('');
10700 };
10701
10702 _proto.removeNavbar = function removeNavbar(el) {
10703 var router = this;
10704 router.removeEl(el);
10705 };
10706
10707 _proto.removePage = function removePage(el) {
10708 var $el = $(el);
10709 var f7Page = $el && $el[0] && $el[0].f7Page;
10710 var router = this;
10711
10712 if (f7Page && f7Page.route && f7Page.route.route && f7Page.route.route.keepAlive) {
10713 $el.remove();
10714 return;
10715 }
10716
10717 router.removeEl(el);
10718 };
10719
10720 _proto.removeEl = function removeEl(el) {
10721 if (!el) return;
10722 var router = this;
10723 var $el = $(el);
10724 if ($el.length === 0) return;
10725 $el.find('.tab').each(function (tabEl) {
10726 $(tabEl).children().each(function (tabChild) {
10727 if (tabChild.f7Component) {
10728 $(tabChild).trigger('tab:beforeremove');
10729 tabChild.f7Component.destroy();
10730 }
10731 });
10732 });
10733
10734 if ($el[0].f7Component && $el[0].f7Component.destroy) {
10735 $el[0].f7Component.destroy();
10736 }
10737
10738 if (!router.params.removeElements) {
10739 return;
10740 }
10741
10742 if (router.params.removeElementsWithTimeout) {
10743 setTimeout(function () {
10744 $el.remove();
10745 }, router.params.removeElementsTimeout);
10746 } else {
10747 $el.remove();
10748 }
10749 };
10750
10751 _proto.getPageEl = function getPageEl(content) {
10752 var router = this;
10753
10754 if (typeof content === 'string') {
10755 router.tempDom.innerHTML = content;
10756 } else {
10757 if ($(content).hasClass('page')) {
10758 return content;
10759 }
10760
10761 router.tempDom.innerHTML = '';
10762 $(router.tempDom).append(content);
10763 }
10764
10765 return router.findElement('.page', router.tempDom);
10766 };
10767
10768 _proto.findElement = function findElement(stringSelector, container, notStacked) {
10769 var router = this;
10770 var view = router.view;
10771 var app = router.app; // Modals Selector
10772
10773 var modalsSelector = '.popup, .dialog, .popover, .actions-modal, .sheet-modal, .login-screen, .page';
10774 var $container = $(container);
10775 var selector = stringSelector;
10776 if (notStacked) selector += ':not(.stacked)';
10777 var found = $container.find(selector).filter(function (el) {
10778 return $(el).parents(modalsSelector).length === 0;
10779 });
10780
10781 if (found.length > 1) {
10782 if (typeof view.selector === 'string') {
10783 // Search in related view
10784 found = $container.find(view.selector + " " + selector);
10785 }
10786
10787 if (found.length > 1) {
10788 // Search in main view
10789 found = $container.find("." + app.params.viewMainClass + " " + selector);
10790 }
10791 }
10792
10793 if (found.length === 1) return found; // Try to find not stacked
10794
10795 if (!notStacked) found = router.findElement(selector, $container, true);
10796 if (found && found.length === 1) return found;
10797 if (found && found.length > 1) return $(found[0]);
10798 return undefined;
10799 };
10800
10801 _proto.flattenRoutes = function flattenRoutes(routes) {
10802 if (routes === void 0) {
10803 routes = this.routes;
10804 }
10805
10806 var router = this;
10807 var flattenedRoutes = [];
10808 routes.forEach(function (route) {
10809 var hasTabRoutes = false;
10810
10811 if ('tabs' in route && route.tabs) {
10812 var mergedPathsRoutes = route.tabs.map(function (tabRoute) {
10813 var tRoute = extend$1({}, route, {
10814 path: (route.path + "/" + tabRoute.path).replace('///', '/').replace('//', '/'),
10815 parentPath: route.path,
10816 tab: tabRoute
10817 });
10818 delete tRoute.tabs;
10819 delete tRoute.routes;
10820 return tRoute;
10821 });
10822 hasTabRoutes = true;
10823 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes));
10824 }
10825
10826 if ('detailRoutes' in route) {
10827 var _mergedPathsRoutes = route.detailRoutes.map(function (detailRoute) {
10828 var dRoute = extend$1({}, detailRoute);
10829 dRoute.masterRoute = route;
10830 dRoute.masterRoutePath = route.path;
10831 return dRoute;
10832 });
10833
10834 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(_mergedPathsRoutes));
10835 }
10836
10837 if ('routes' in route) {
10838 var _mergedPathsRoutes2 = route.routes.map(function (childRoute) {
10839 var cRoute = extend$1({}, childRoute);
10840 cRoute.path = (route.path + "/" + cRoute.path).replace('///', '/').replace('//', '/');
10841 return cRoute;
10842 });
10843
10844 if (hasTabRoutes) {
10845 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(_mergedPathsRoutes2));
10846 } else {
10847 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(_mergedPathsRoutes2));
10848 }
10849 }
10850
10851 if (!('routes' in route) && !('tabs' in route && route.tabs) && !('detailRoutes' in route)) {
10852 flattenedRoutes.push(route);
10853 }
10854 });
10855 return flattenedRoutes;
10856 } // eslint-disable-next-line
10857 ;
10858
10859 _proto.parseRouteUrl = function parseRouteUrl(url) {
10860 if (!url) return {};
10861 var query = parseUrlQuery(url);
10862 var hash = url.split('#')[1];
10863 var params = {};
10864 var path = url.split('#')[0].split('?')[0];
10865 return {
10866 query: query,
10867 hash: hash,
10868 params: params,
10869 url: url,
10870 path: path
10871 };
10872 };
10873
10874 _proto.generateUrl = function generateUrl(parameters) {
10875 if (parameters === void 0) {
10876 parameters = {};
10877 }
10878
10879 if (typeof parameters === 'string') {
10880 return parameters;
10881 }
10882
10883 var _parameters = parameters,
10884 name = _parameters.name,
10885 path = _parameters.path,
10886 params = _parameters.params,
10887 query = _parameters.query;
10888
10889 if (!name && !path) {
10890 throw new Error('Framework7: "name" or "path" parameter is required');
10891 }
10892
10893 var router = this;
10894 var route = name ? router.findRouteByKey('name', name) : router.findRouteByKey('path', path);
10895
10896 if (!route) {
10897 if (name) {
10898 throw new Error("Framework7: route with name \"" + name + "\" not found");
10899 } else {
10900 throw new Error("Framework7: route with path \"" + path + "\" not found");
10901 }
10902 }
10903
10904 var url = router.constructRouteUrl(route, {
10905 params: params,
10906 query: query
10907 });
10908
10909 if (!url) {
10910 throw new Error("Framework7: can't construct URL for route with name \"" + name + "\"");
10911 }
10912
10913 return url;
10914 } // eslint-disable-next-line
10915 ;
10916
10917 _proto.constructRouteUrl = function constructRouteUrl(route, _temp) {
10918 var _ref = _temp === void 0 ? {} : _temp,
10919 params = _ref.params,
10920 query = _ref.query;
10921
10922 var path = route.path;
10923 var toUrl = compile(path);
10924 var url;
10925
10926 try {
10927 url = toUrl(params || {});
10928 } catch (error) {
10929 throw new Error("Framework7: error constructing route URL from passed params:\nRoute: " + path + "\n" + error.toString());
10930 }
10931
10932 if (query) {
10933 if (typeof query === 'string') url += "?" + query;else if (Object.keys(query).length) url += "?" + serializeObject(query);
10934 }
10935
10936 return url;
10937 };
10938
10939 _proto.findTabRouteUrl = function findTabRouteUrl(tabEl) {
10940 var router = this;
10941 var $tabEl = $(tabEl);
10942 var parentPath = router.currentRoute.route.parentPath;
10943 var tabId = $tabEl.attr('id');
10944 var flattenedRoutes = router.flattenRoutes(router.routes);
10945 var foundTabRouteUrl;
10946 flattenedRoutes.forEach(function (route) {
10947 if (route.parentPath === parentPath && route.tab && route.tab.id === tabId) {
10948 if (router.currentRoute.params && Object.keys(router.currentRoute.params).length > 0) {
10949 foundTabRouteUrl = router.constructRouteUrl(route, {
10950 params: router.currentRoute.params,
10951 query: router.currentRoute.query
10952 });
10953 } else {
10954 foundTabRouteUrl = route.path;
10955 }
10956 }
10957 });
10958 return foundTabRouteUrl;
10959 };
10960
10961 _proto.findRouteByKey = function findRouteByKey(key, value) {
10962 var router = this;
10963 var routes = router.routes;
10964 var flattenedRoutes = router.flattenRoutes(routes);
10965 var matchingRoute;
10966 flattenedRoutes.forEach(function (route) {
10967 if (matchingRoute) return;
10968
10969 if (route[key] === value) {
10970 matchingRoute = route;
10971 }
10972 });
10973 return matchingRoute;
10974 };
10975
10976 _proto.findMatchingRoute = function findMatchingRoute(url) {
10977 if (!url) return undefined;
10978 var router = this;
10979 var routes = router.routes;
10980 var flattenedRoutes = router.flattenRoutes(routes);
10981
10982 var _router$parseRouteUrl = router.parseRouteUrl(url),
10983 path = _router$parseRouteUrl.path,
10984 query = _router$parseRouteUrl.query,
10985 hash = _router$parseRouteUrl.hash,
10986 params = _router$parseRouteUrl.params;
10987
10988 var matchingRoute;
10989 flattenedRoutes.forEach(function (route) {
10990 if (matchingRoute) return;
10991 var keys = [];
10992 var pathsToMatch = [route.path];
10993
10994 if (route.alias) {
10995 if (typeof route.alias === 'string') pathsToMatch.push(route.alias);else if (Array.isArray(route.alias)) {
10996 route.alias.forEach(function (aliasPath) {
10997 pathsToMatch.push(aliasPath);
10998 });
10999 }
11000 }
11001
11002 var matched;
11003 pathsToMatch.forEach(function (pathToMatch) {
11004 if (matched) return;
11005 matched = pathToRegexp(pathToMatch, keys).exec(path);
11006 });
11007
11008 if (matched) {
11009 keys.forEach(function (keyObj, index) {
11010 if (typeof keyObj.name === 'number') return;
11011 var paramValue = matched[index + 1];
11012
11013 if (typeof paramValue === 'undefined' || paramValue === null) {
11014 params[keyObj.name] = paramValue;
11015 } else {
11016 params[keyObj.name] = decodeURIComponent(paramValue);
11017 }
11018 });
11019 var parentPath;
11020
11021 if (route.parentPath) {
11022 parentPath = path.split('/').slice(0, route.parentPath.split('/').length - 1).join('/');
11023 }
11024
11025 matchingRoute = {
11026 query: query,
11027 hash: hash,
11028 params: params,
11029 url: url,
11030 path: path,
11031 parentPath: parentPath,
11032 route: route,
11033 name: route.name
11034 };
11035 }
11036 });
11037 return matchingRoute;
11038 } // eslint-disable-next-line
11039 ;
11040
11041 _proto.replaceRequestUrlParams = function replaceRequestUrlParams(url, options) {
11042 if (url === void 0) {
11043 url = '';
11044 }
11045
11046 if (options === void 0) {
11047 options = {};
11048 }
11049
11050 var compiledUrl = url;
11051
11052 if (typeof compiledUrl === 'string' && compiledUrl.indexOf('{{') >= 0 && options && options.route && options.route.params && Object.keys(options.route.params).length) {
11053 Object.keys(options.route.params).forEach(function (paramName) {
11054 var regExp = new RegExp("{{" + paramName + "}}", 'g');
11055 compiledUrl = compiledUrl.replace(regExp, options.route.params[paramName] || '');
11056 });
11057 }
11058
11059 return compiledUrl;
11060 };
11061
11062 _proto.removeFromXhrCache = function removeFromXhrCache(url) {
11063 var router = this;
11064 var xhrCache = router.cache.xhr;
11065 var index = false;
11066
11067 for (var i = 0; i < xhrCache.length; i += 1) {
11068 if (xhrCache[i].url === url) index = i;
11069 }
11070
11071 if (index !== false) xhrCache.splice(index, 1);
11072 };
11073
11074 _proto.xhrRequest = function xhrRequest(requestUrl, options) {
11075 var router = this;
11076 var params = router.params;
11077 var ignoreCache = options.ignoreCache;
11078 var url = requestUrl;
11079 var hasQuery = url.indexOf('?') >= 0;
11080
11081 if (params.passRouteQueryToRequest && options && options.route && options.route.query && Object.keys(options.route.query).length) {
11082 url += "" + (hasQuery ? '&' : '?') + serializeObject(options.route.query);
11083 hasQuery = true;
11084 }
11085
11086 if (params.passRouteParamsToRequest && options && options.route && options.route.params && Object.keys(options.route.params).length) {
11087 url += "" + (hasQuery ? '&' : '?') + serializeObject(options.route.params);
11088 hasQuery = true;
11089 }
11090
11091 if (url.indexOf('{{') >= 0) {
11092 url = router.replaceRequestUrlParams(url, options);
11093 } // should we ignore get params or not
11094
11095
11096 if (params.xhrCacheIgnoreGetParameters && url.indexOf('?') >= 0) {
11097 url = url.split('?')[0];
11098 }
11099
11100 return new Promise(function (resolve, reject) {
11101 if (params.xhrCache && !ignoreCache && url.indexOf('nocache') < 0 && params.xhrCacheIgnore.indexOf(url) < 0) {
11102 for (var i = 0; i < router.cache.xhr.length; i += 1) {
11103 var cachedUrl = router.cache.xhr[i];
11104
11105 if (cachedUrl.url === url) {
11106 // Check expiration
11107 if (now$1() - cachedUrl.time < params.xhrCacheDuration) {
11108 // Load from cache
11109 resolve(cachedUrl.content);
11110 return;
11111 }
11112 }
11113 }
11114 }
11115
11116 router.xhrAbortController = router.app.request.abortController();
11117 router.app.request({
11118 abortController: router.xhrAbortController,
11119 url: url,
11120 method: 'GET',
11121 beforeSend: function beforeSend(xhr) {
11122 router.emit('routerAjaxStart', xhr, options);
11123 },
11124 complete: function complete(xhr, status) {
11125 router.emit('routerAjaxComplete', xhr);
11126
11127 if (status !== 'error' && status !== 'timeout' && xhr.status >= 200 && xhr.status < 300 || xhr.status === 0) {
11128 if (params.xhrCache && xhr.responseText !== '') {
11129 router.removeFromXhrCache(url);
11130 router.cache.xhr.push({
11131 url: url,
11132 time: now$1(),
11133 content: xhr.responseText
11134 });
11135 }
11136
11137 router.emit('routerAjaxSuccess', xhr, options);
11138 resolve(xhr.responseText);
11139 } else {
11140 router.emit('routerAjaxError', xhr, options);
11141 reject(xhr);
11142 }
11143 },
11144 error: function error(xhr) {
11145 router.emit('routerAjaxError', xhr, options);
11146 reject(xhr);
11147 }
11148 });
11149 });
11150 };
11151
11152 _proto.setNavbarPosition = function setNavbarPosition($el, position, ariaHidden) {
11153 var router = this;
11154 $el.removeClass('navbar-previous navbar-current navbar-next');
11155
11156 if (position) {
11157 $el.addClass("navbar-" + position);
11158 }
11159
11160 if (ariaHidden === false) {
11161 $el.removeAttr('aria-hidden');
11162 } else if (ariaHidden === true) {
11163 $el.attr('aria-hidden', 'true');
11164 }
11165
11166 $el.trigger('navbar:position', {
11167 position: position
11168 });
11169 router.emit('navbarPosition', $el[0], position);
11170 };
11171
11172 _proto.setPagePosition = function setPagePosition($el, position, ariaHidden) {
11173 var router = this;
11174 $el.removeClass('page-previous page-current page-next');
11175 $el.addClass("page-" + position);
11176
11177 if (ariaHidden === false) {
11178 $el.removeAttr('aria-hidden');
11179 } else if (ariaHidden === true) {
11180 $el.attr('aria-hidden', 'true');
11181 }
11182
11183 $el.trigger('page:position', {
11184 position: position
11185 });
11186 router.emit('pagePosition', $el[0], position);
11187 } // Remove theme elements
11188 ;
11189
11190 _proto.removeThemeElements = function removeThemeElements(el) {
11191 var router = this;
11192 var theme = router.app.theme;
11193 var toRemove;
11194
11195 if (theme === 'ios') {
11196 toRemove = '.md-only, .aurora-only, .if-md, .if-aurora, .if-not-ios, .not-ios';
11197 } else if (theme === 'md') {
11198 toRemove = '.ios-only, .aurora-only, .if-ios, .if-aurora, .if-not-md, .not-md';
11199 } else if (theme === 'aurora') {
11200 toRemove = '.ios-only, .md-only, .if-ios, .if-md, .if-not-aurora, .not-aurora';
11201 }
11202
11203 $(el).find(toRemove).remove();
11204 };
11205
11206 _proto.getPageData = function getPageData(pageEl, navbarEl, from, to, route, pageFromEl) {
11207 if (route === void 0) {
11208 route = {};
11209 }
11210
11211 var router = this;
11212 var $pageEl = $(pageEl).eq(0);
11213 var $navbarEl = $(navbarEl).eq(0);
11214 var currentPage = $pageEl[0].f7Page || {};
11215 var direction;
11216 var pageFrom;
11217 if (from === 'next' && to === 'current' || from === 'current' && to === 'previous') direction = 'forward';
11218 if (from === 'current' && to === 'next' || from === 'previous' && to === 'current') direction = 'backward';
11219
11220 if (currentPage && !currentPage.fromPage) {
11221 var $pageFromEl = $(pageFromEl);
11222
11223 if ($pageFromEl.length) {
11224 pageFrom = $pageFromEl[0].f7Page;
11225 }
11226 }
11227
11228 pageFrom = currentPage.pageFrom || pageFrom;
11229
11230 if (pageFrom && pageFrom.pageFrom) {
11231 pageFrom.pageFrom = null;
11232 }
11233
11234 var page = {
11235 app: router.app,
11236 view: router.view,
11237 router: router,
11238 $el: $pageEl,
11239 el: $pageEl[0],
11240 $pageEl: $pageEl,
11241 pageEl: $pageEl[0],
11242 $navbarEl: $navbarEl,
11243 navbarEl: $navbarEl[0],
11244 name: $pageEl.attr('data-name'),
11245 position: from,
11246 from: from,
11247 to: to,
11248 direction: direction,
11249 route: currentPage.route ? currentPage.route : route,
11250 pageFrom: pageFrom
11251 };
11252 $pageEl[0].f7Page = page;
11253 return page;
11254 } // Callbacks
11255 ;
11256
11257 _proto.pageCallback = function pageCallback(callback, pageEl, navbarEl, from, to, options, pageFromEl) {
11258 if (options === void 0) {
11259 options = {};
11260 }
11261
11262 if (!pageEl) return;
11263 var router = this;
11264 var $pageEl = $(pageEl);
11265 if (!$pageEl.length) return;
11266 var $navbarEl = $(navbarEl);
11267 var _options = options,
11268 route = _options.route;
11269 var restoreScrollTopOnBack = router.params.restoreScrollTopOnBack && !(router.params.masterDetailBreakpoint > 0 && $pageEl.hasClass('page-master') && router.app.width >= router.params.masterDetailBreakpoint);
11270 var keepAlive = $pageEl[0].f7Page && $pageEl[0].f7Page.route && $pageEl[0].f7Page.route.route && $pageEl[0].f7Page.route.route.keepAlive;
11271
11272 if (callback === 'beforeRemove' && keepAlive) {
11273 callback = 'beforeUnmount'; // eslint-disable-line
11274 }
11275
11276 var camelName = "page" + (callback[0].toUpperCase() + callback.slice(1, callback.length));
11277 var colonName = "page:" + callback.toLowerCase();
11278 var page = {};
11279
11280 if (callback === 'beforeRemove' && $pageEl[0].f7Page) {
11281 page = extend$1($pageEl[0].f7Page, {
11282 from: from,
11283 to: to,
11284 position: from
11285 });
11286 } else {
11287 page = router.getPageData($pageEl[0], $navbarEl[0], from, to, route, pageFromEl);
11288 }
11289
11290 page.swipeBack = !!options.swipeBack;
11291
11292 var _ref2 = options.route ? options.route.route : {},
11293 _ref2$on = _ref2.on,
11294 on = _ref2$on === void 0 ? {} : _ref2$on,
11295 _ref2$once = _ref2.once,
11296 once = _ref2$once === void 0 ? {} : _ref2$once;
11297
11298 if (options.on) {
11299 extend$1(on, options.on);
11300 }
11301
11302 if (options.once) {
11303 extend$1(once, options.once);
11304 }
11305
11306 function attachEvents() {
11307 if ($pageEl[0].f7RouteEventsAttached) return;
11308 $pageEl[0].f7RouteEventsAttached = true;
11309
11310 if (on && Object.keys(on).length > 0) {
11311 $pageEl[0].f7RouteEventsOn = on;
11312 Object.keys(on).forEach(function (eventName) {
11313 on[eventName] = on[eventName].bind(router);
11314 $pageEl.on(eventNameToColonCase(eventName), on[eventName]);
11315 });
11316 }
11317
11318 if (once && Object.keys(once).length > 0) {
11319 $pageEl[0].f7RouteEventsOnce = once;
11320 Object.keys(once).forEach(function (eventName) {
11321 once[eventName] = once[eventName].bind(router);
11322 $pageEl.once(eventNameToColonCase(eventName), once[eventName]);
11323 });
11324 }
11325 }
11326
11327 function detachEvents() {
11328 if (!$pageEl[0].f7RouteEventsAttached) return;
11329
11330 if ($pageEl[0].f7RouteEventsOn) {
11331 Object.keys($pageEl[0].f7RouteEventsOn).forEach(function (eventName) {
11332 $pageEl.off(eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOn[eventName]);
11333 });
11334 }
11335
11336 if ($pageEl[0].f7RouteEventsOnce) {
11337 Object.keys($pageEl[0].f7RouteEventsOnce).forEach(function (eventName) {
11338 $pageEl.off(eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOnce[eventName]);
11339 });
11340 }
11341
11342 $pageEl[0].f7RouteEventsAttached = null;
11343 $pageEl[0].f7RouteEventsOn = null;
11344 $pageEl[0].f7RouteEventsOnce = null;
11345 delete $pageEl[0].f7RouteEventsAttached;
11346 delete $pageEl[0].f7RouteEventsOn;
11347 delete $pageEl[0].f7RouteEventsOnce;
11348 }
11349
11350 if (callback === 'mounted') {
11351 attachEvents();
11352 }
11353
11354 if (callback === 'init') {
11355 if (restoreScrollTopOnBack && (from === 'previous' || !from) && to === 'current' && router.scrollHistory[page.route.url] && !$pageEl.hasClass('no-restore-scroll')) {
11356 var $pageContent = $pageEl.find('.page-content');
11357
11358 if ($pageContent.length > 0) {
11359 // eslint-disable-next-line
11360 $pageContent = $pageContent.filter(function (pageContentEl) {
11361 return $(pageContentEl).parents('.tab:not(.tab-active)').length === 0 && !$(pageContentEl).is('.tab:not(.tab-active)');
11362 });
11363 }
11364
11365 $pageContent.scrollTop(router.scrollHistory[page.route.url]);
11366 }
11367
11368 attachEvents();
11369
11370 if ($pageEl[0].f7PageInitialized) {
11371 $pageEl.trigger('page:reinit', page);
11372 router.emit('pageReinit', page);
11373 return;
11374 }
11375
11376 $pageEl[0].f7PageInitialized = true;
11377 }
11378
11379 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'previous') {
11380 // Save scroll position
11381 var _$pageContent = $pageEl.find('.page-content');
11382
11383 if (_$pageContent.length > 0) {
11384 // eslint-disable-next-line
11385 _$pageContent = _$pageContent.filter(function (pageContentEl) {
11386 return $(pageContentEl).parents('.tab:not(.tab-active)').length === 0 && !$(pageContentEl).is('.tab:not(.tab-active)');
11387 });
11388 }
11389
11390 router.scrollHistory[page.route.url] = _$pageContent.scrollTop();
11391 }
11392
11393 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'next') {
11394 // Delete scroll position
11395 delete router.scrollHistory[page.route.url];
11396 }
11397
11398 $pageEl.trigger(colonName, page);
11399 router.emit(camelName, page);
11400
11401 if (callback === 'beforeRemove' || callback === 'beforeUnmount') {
11402 detachEvents();
11403
11404 if (!keepAlive) {
11405 if ($pageEl[0].f7Page && $pageEl[0].f7Page.navbarEl) {
11406 delete $pageEl[0].f7Page.navbarEl.f7Page;
11407 }
11408
11409 $pageEl[0].f7Page = null;
11410 }
11411 }
11412 };
11413
11414 _proto.saveHistory = function saveHistory() {
11415 var router = this;
11416 var window = getWindow();
11417 router.view.history = router.history;
11418
11419 if (router.params.browserHistory && router.params.browserHistoryStoreHistory && window.localStorage) {
11420 window.localStorage["f7router-" + router.view.id + "-history"] = JSON.stringify(router.history);
11421 }
11422 };
11423
11424 _proto.restoreHistory = function restoreHistory() {
11425 var router = this;
11426 var window = getWindow();
11427
11428 if (router.params.browserHistory && router.params.browserHistoryStoreHistory && window.localStorage && window.localStorage["f7router-" + router.view.id + "-history"]) {
11429 router.history = JSON.parse(window.localStorage["f7router-" + router.view.id + "-history"]);
11430 router.view.history = router.history;
11431 }
11432 };
11433
11434 _proto.clearHistory = function clearHistory() {
11435 var router = this;
11436 router.history = [];
11437 if (router.view) router.view.history = [];
11438 router.saveHistory();
11439 };
11440
11441 _proto.updateCurrentUrl = function updateCurrentUrl(newUrl) {
11442 var router = this;
11443 appRouterCheck(router, 'updateCurrentUrl'); // Update history
11444
11445 if (router.history.length) {
11446 router.history[router.history.length - 1] = newUrl;
11447 } else {
11448 router.history.push(newUrl);
11449 } // Update current route params
11450
11451
11452 var _router$parseRouteUrl2 = router.parseRouteUrl(newUrl),
11453 query = _router$parseRouteUrl2.query,
11454 hash = _router$parseRouteUrl2.hash,
11455 params = _router$parseRouteUrl2.params,
11456 url = _router$parseRouteUrl2.url,
11457 path = _router$parseRouteUrl2.path;
11458
11459 if (router.currentRoute) {
11460 extend$1(router.currentRoute, {
11461 query: query,
11462 hash: hash,
11463 params: params,
11464 url: url,
11465 path: path
11466 });
11467 }
11468
11469 if (router.params.browserHistory) {
11470 var browserHistoryRoot = router.params.browserHistoryRoot || '';
11471 History$2.replace(router.view.id, {
11472 url: newUrl
11473 }, browserHistoryRoot + router.params.browserHistorySeparator + newUrl);
11474 } // Save History
11475
11476
11477 router.saveHistory();
11478 router.emit('routeUrlUpdate', router.currentRoute, router);
11479 };
11480
11481 _proto.getInitialUrl = function getInitialUrl() {
11482 var router = this;
11483
11484 if (router.initialUrl) {
11485 return {
11486 initialUrl: router.initialUrl,
11487 historyRestored: router.historyRestored
11488 };
11489 }
11490
11491 var app = router.app,
11492 view = router.view;
11493 var document = getDocument();
11494 var window = getWindow();
11495 var location = app.params.url && typeof app.params.url === 'string' && typeof URL !== 'undefined' ? new URL(app.params.url) : document.location;
11496 var initialUrl = router.params.url;
11497 var documentUrl = location.href.split(location.origin)[1];
11498 var historyRestored;
11499 var _router$params = router.params,
11500 browserHistory = _router$params.browserHistory,
11501 browserHistoryOnLoad = _router$params.browserHistoryOnLoad,
11502 browserHistorySeparator = _router$params.browserHistorySeparator;
11503 var browserHistoryRoot = router.params.browserHistoryRoot;
11504
11505 if ((window.cordova || window.Capacitor && window.Capacitor.isNative) && browserHistory && !browserHistorySeparator && !browserHistoryRoot && location.pathname.indexOf('index.html')) {
11506 // eslint-disable-next-line
11507 console.warn('Framework7: wrong or not complete browserHistory configuration, trying to guess browserHistoryRoot');
11508 browserHistoryRoot = location.pathname.split('index.html')[0];
11509 }
11510
11511 if (!browserHistory || !browserHistoryOnLoad) {
11512 if (!initialUrl) {
11513 initialUrl = documentUrl;
11514 }
11515
11516 if (location.search && initialUrl.indexOf('?') < 0) {
11517 initialUrl += location.search;
11518 }
11519
11520 if (location.hash && initialUrl.indexOf('#') < 0) {
11521 initialUrl += location.hash;
11522 }
11523 } else {
11524 if (browserHistoryRoot && documentUrl.indexOf(browserHistoryRoot) >= 0) {
11525 documentUrl = documentUrl.split(browserHistoryRoot)[1];
11526 if (documentUrl === '') documentUrl = '/';
11527 }
11528
11529 if (browserHistorySeparator.length > 0 && documentUrl.indexOf(browserHistorySeparator) >= 0) {
11530 initialUrl = documentUrl.split(browserHistorySeparator)[1];
11531 } else {
11532 initialUrl = documentUrl;
11533 }
11534
11535 router.restoreHistory();
11536
11537 if (router.history.indexOf(initialUrl) >= 0) {
11538 router.history = router.history.slice(0, router.history.indexOf(initialUrl) + 1);
11539 } else if (router.params.url === initialUrl) {
11540 router.history = [initialUrl];
11541 } else if (History$2.state && History$2.state[view.id] && History$2.state[view.id].url === router.history[router.history.length - 1]) {
11542 initialUrl = router.history[router.history.length - 1];
11543 } else {
11544 router.history = [documentUrl.split(browserHistorySeparator)[0] || '/', initialUrl];
11545 }
11546
11547 if (router.history.length > 1) {
11548 historyRestored = true;
11549 } else {
11550 router.history = [];
11551 }
11552
11553 router.saveHistory();
11554 }
11555
11556 router.initialUrl = initialUrl;
11557 router.historyRestored = historyRestored;
11558 return {
11559 initialUrl: initialUrl,
11560 historyRestored: historyRestored
11561 };
11562 };
11563
11564 _proto.init = function init() {
11565 var router = this;
11566 var app = router.app,
11567 view = router.view;
11568 var document = getDocument();
11569 router.mount();
11570
11571 var _router$getInitialUrl = router.getInitialUrl(),
11572 initialUrl = _router$getInitialUrl.initialUrl,
11573 historyRestored = _router$getInitialUrl.historyRestored; // Init Swipeback
11574
11575
11576 if (view && router.params.iosSwipeBack && app.theme === 'ios' || view && router.params.mdSwipeBack && app.theme === 'md' || view && router.params.auroraSwipeBack && app.theme === 'aurora') {
11577 SwipeBack(router);
11578 }
11579
11580 var _router$params2 = router.params,
11581 browserHistory = _router$params2.browserHistory,
11582 browserHistoryOnLoad = _router$params2.browserHistoryOnLoad,
11583 browserHistoryAnimateOnLoad = _router$params2.browserHistoryAnimateOnLoad,
11584 browserHistoryInitialMatch = _router$params2.browserHistoryInitialMatch;
11585 var currentRoute;
11586
11587 if (router.history.length > 1) {
11588 // Will load page
11589 var initUrl = browserHistoryInitialMatch ? initialUrl : router.history[0];
11590 currentRoute = router.findMatchingRoute(initUrl);
11591
11592 if (!currentRoute) {
11593 currentRoute = extend$1(router.parseRouteUrl(initUrl), {
11594 route: {
11595 url: initUrl,
11596 path: initUrl.split('?')[0]
11597 }
11598 });
11599 }
11600 } else {
11601 // Don't load page
11602 currentRoute = router.findMatchingRoute(initialUrl);
11603
11604 if (!currentRoute) {
11605 currentRoute = extend$1(router.parseRouteUrl(initialUrl), {
11606 route: {
11607 url: initialUrl,
11608 path: initialUrl.split('?')[0]
11609 }
11610 });
11611 }
11612 }
11613
11614 if (router.params.stackPages) {
11615 router.$el.children('.page').each(function (pageEl) {
11616 var $pageEl = $(pageEl);
11617 router.initialPages.push($pageEl[0]);
11618
11619 if (router.dynamicNavbar && $pageEl.children('.navbar').length > 0) {
11620 router.initialNavbars.push($pageEl.children('.navbar')[0]);
11621 }
11622 });
11623 }
11624
11625 if (router.$el.children('.page:not(.stacked)').length === 0 && initialUrl && router.params.loadInitialPage) {
11626 // No pages presented in DOM, reload new page
11627 router.navigate(initialUrl, {
11628 initial: true,
11629 reloadCurrent: true,
11630 browserHistory: false,
11631 animate: false,
11632 once: {
11633 modalOpen: function modalOpen() {
11634 if (!historyRestored) return;
11635 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
11636
11637 if (preloadPreviousPage && router.history.length > 1) {
11638 router.back({
11639 preload: true
11640 });
11641 }
11642 },
11643 pageAfterIn: function pageAfterIn() {
11644 if (!historyRestored) return;
11645 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
11646
11647 if (preloadPreviousPage && router.history.length > 1) {
11648 router.back({
11649 preload: true
11650 });
11651 }
11652 }
11653 }
11654 });
11655 } else if (router.$el.children('.page:not(.stacked)').length) {
11656 // Init current DOM page
11657 var hasTabRoute;
11658 router.currentRoute = currentRoute;
11659 router.$el.children('.page:not(.stacked)').each(function (pageEl) {
11660 var $pageEl = $(pageEl);
11661 var $navbarEl;
11662 router.setPagePosition($pageEl, 'current');
11663
11664 if (router.dynamicNavbar) {
11665 $navbarEl = $pageEl.children('.navbar');
11666
11667 if ($navbarEl.length > 0) {
11668 if (!router.$navbarsEl.parents(document).length) {
11669 router.$el.prepend(router.$navbarsEl);
11670 }
11671
11672 router.setNavbarPosition($navbarEl, 'current');
11673 router.$navbarsEl.append($navbarEl);
11674
11675 if ($navbarEl.children('.title-large').length) {
11676 $navbarEl.addClass('navbar-large');
11677 }
11678
11679 $pageEl.children('.navbar').remove();
11680 } else {
11681 router.$navbarsEl.addClass('navbar-hidden');
11682
11683 if ($navbarEl.children('.title-large').length) {
11684 router.$navbarsEl.addClass('navbar-hidden navbar-large-hidden');
11685 }
11686 }
11687 }
11688
11689 if (router.currentRoute && router.currentRoute.route && (router.currentRoute.route.master === true || typeof router.currentRoute.route.master === 'function' && router.currentRoute.route.master(app, router)) && router.params.masterDetailBreakpoint > 0) {
11690 $pageEl.addClass('page-master');
11691 $pageEl.trigger('page:role', {
11692 role: 'master'
11693 });
11694
11695 if ($navbarEl && $navbarEl.length) {
11696 $navbarEl.addClass('navbar-master');
11697 }
11698
11699 view.checkMasterDetailBreakpoint();
11700 }
11701
11702 var initOptions = {
11703 route: router.currentRoute
11704 };
11705
11706 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.options) {
11707 extend$1(initOptions, router.currentRoute.route.options);
11708 }
11709
11710 router.currentPageEl = $pageEl[0];
11711
11712 if (router.dynamicNavbar && $navbarEl.length) {
11713 router.currentNavbarEl = $navbarEl[0];
11714 }
11715
11716 router.removeThemeElements($pageEl);
11717
11718 if (router.dynamicNavbar && $navbarEl.length) {
11719 router.removeThemeElements($navbarEl);
11720 }
11721
11722 if (initOptions.route.route.tab) {
11723 hasTabRoute = true;
11724 router.tabLoad(initOptions.route.route.tab, extend$1({}, initOptions));
11725 }
11726
11727 router.pageCallback('init', $pageEl, $navbarEl, 'current', undefined, initOptions);
11728 router.pageCallback('beforeIn', $pageEl, $navbarEl, 'current', undefined, initOptions);
11729 router.pageCallback('afterIn', $pageEl, $navbarEl, 'current', undefined, initOptions);
11730 });
11731
11732 if (historyRestored) {
11733 if (browserHistoryInitialMatch) {
11734 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
11735
11736 if (preloadPreviousPage && router.history.length > 1) {
11737 router.back({
11738 preload: true
11739 });
11740 }
11741 } else {
11742 router.navigate(initialUrl, {
11743 initial: true,
11744 browserHistory: false,
11745 history: false,
11746 animate: browserHistoryAnimateOnLoad,
11747 once: {
11748 pageAfterIn: function pageAfterIn() {
11749 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
11750
11751 if (preloadPreviousPage && router.history.length > 2) {
11752 router.back({
11753 preload: true
11754 });
11755 }
11756 }
11757 }
11758 });
11759 }
11760 }
11761
11762 if (!historyRestored && !hasTabRoute) {
11763 router.history.push(initialUrl);
11764 router.saveHistory();
11765 }
11766 }
11767
11768 if (initialUrl && browserHistory && browserHistoryOnLoad && (!History$2.state || !History$2.state[view.id])) {
11769 History$2.initViewState(view.id, {
11770 url: initialUrl
11771 });
11772 }
11773
11774 router.emit('local::init routerInit', router);
11775 };
11776
11777 _proto.destroy = function destroy() {
11778 var router = this;
11779 router.emit('local::destroy routerDestroy', router); // Delete props & methods
11780
11781 Object.keys(router).forEach(function (routerProp) {
11782 router[routerProp] = null;
11783 delete router[routerProp];
11784 });
11785 router = null;
11786 };
11787
11788 return Router;
11789 }(Framework7Class); // Load
11790
11791
11792 Router.prototype.navigate = navigate;
11793 Router.prototype.refreshPage = refreshPage; // Tab
11794
11795 Router.prototype.tabLoad = tabLoad;
11796 Router.prototype.tabRemove = tabRemove; // Modal
11797
11798 Router.prototype.modalLoad = modalLoad;
11799 Router.prototype.modalRemove = modalRemove; // Back
11800
11801 Router.prototype.back = back; // Clear history
11802
11803 Router.prototype.clearPreviousHistory = clearPreviousHistory;
11804
11805 var RouterModule = {
11806 name: 'router',
11807 static: {
11808 Router: Router
11809 },
11810 instance: {
11811 cache: {
11812 xhr: [],
11813 templates: [],
11814 components: []
11815 }
11816 },
11817 create: function create() {
11818 var instance = this;
11819
11820 if (instance.app) {
11821 // View Router
11822 if (instance.params.router) {
11823 instance.router = new Router(instance.app, instance);
11824 }
11825 } else {
11826 // App Router
11827 instance.router = new Router(instance);
11828 }
11829 }
11830 };
11831
11832 function resizableView(view) {
11833 var app = view.app;
11834 var support = getSupport$1();
11835 if (view.resizableInitialized) return;
11836 extend$1(view, {
11837 resizable: true,
11838 resizableWidth: null,
11839 resizableInitialized: true
11840 });
11841 var $htmlEl = $('html');
11842 var $el = view.$el;
11843 if (!$el) return;
11844 var $resizeHandlerEl;
11845 var isTouched;
11846 var isMoved;
11847 var touchesStart = {};
11848 var touchesDiff;
11849 var width;
11850 var minWidth;
11851 var maxWidth;
11852
11853 function transformCSSWidth(v) {
11854 if (!v) return null;
11855
11856 if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {
11857 return parseInt(v, 10) / 100 * app.width;
11858 }
11859
11860 var newV = parseInt(v, 10);
11861 if (Number.isNaN(newV)) return null;
11862 return newV;
11863 }
11864
11865 function isResizable() {
11866 return view.resizable && $el.hasClass('view-resizable') && $el.hasClass('view-master-detail');
11867 }
11868
11869 function handleTouchStart(e) {
11870 if (!isResizable()) return;
11871 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
11872 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
11873 isMoved = false;
11874 isTouched = true;
11875 var $pageMasterEl = $el.children('.page-master');
11876 minWidth = transformCSSWidth($pageMasterEl.css('min-width'));
11877 maxWidth = transformCSSWidth($pageMasterEl.css('max-width'));
11878 }
11879
11880 function handleTouchMove(e) {
11881 if (!isTouched) return;
11882 e.f7PreventSwipePanel = true;
11883 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
11884
11885 if (!isMoved) {
11886 width = $resizeHandlerEl[0].offsetLeft + $resizeHandlerEl[0].offsetWidth;
11887 $el.addClass('view-resizing');
11888 $htmlEl.css('cursor', 'col-resize');
11889 }
11890
11891 isMoved = true;
11892 e.preventDefault();
11893 touchesDiff = pageX - touchesStart.x;
11894 var newWidth = width + touchesDiff;
11895
11896 if (minWidth && !Number.isNaN(minWidth)) {
11897 newWidth = Math.max(newWidth, minWidth);
11898 }
11899
11900 if (maxWidth && !Number.isNaN(maxWidth)) {
11901 newWidth = Math.min(newWidth, maxWidth);
11902 }
11903
11904 newWidth = Math.min(Math.max(newWidth, 0), app.width);
11905 view.resizableWidth = newWidth;
11906 $htmlEl[0].style.setProperty('--f7-page-master-width', newWidth + "px");
11907 $el.trigger('view:resize', newWidth);
11908 view.emit('local::resize viewResize', view, newWidth);
11909 }
11910
11911 function handleTouchEnd() {
11912 $('html').css('cursor', '');
11913
11914 if (!isTouched || !isMoved) {
11915 isTouched = false;
11916 isMoved = false;
11917 return;
11918 }
11919
11920 isTouched = false;
11921 isMoved = false;
11922 $htmlEl[0].style.setProperty('--f7-page-master-width', view.resizableWidth + "px");
11923 $el.removeClass('view-resizing');
11924 }
11925
11926 function handleResize() {
11927 if (!view.resizableWidth) return;
11928 minWidth = transformCSSWidth($resizeHandlerEl.css('min-width'));
11929 maxWidth = transformCSSWidth($resizeHandlerEl.css('max-width'));
11930
11931 if (minWidth && !Number.isNaN(minWidth) && view.resizableWidth < minWidth) {
11932 view.resizableWidth = Math.max(view.resizableWidth, minWidth);
11933 }
11934
11935 if (maxWidth && !Number.isNaN(maxWidth) && view.resizableWidth > maxWidth) {
11936 view.resizableWidth = Math.min(view.resizableWidth, maxWidth);
11937 }
11938
11939 view.resizableWidth = Math.min(Math.max(view.resizableWidth, 0), app.width);
11940 $htmlEl[0].style.setProperty('--f7-page-master-width', view.resizableWidth + "px");
11941 }
11942
11943 $resizeHandlerEl = view.$el.children('.view-resize-handler');
11944
11945 if (!$resizeHandlerEl.length) {
11946 view.$el.append('<div class="view-resize-handler"></div>');
11947 $resizeHandlerEl = view.$el.children('.view-resize-handler');
11948 }
11949
11950 view.$resizeHandlerEl = $resizeHandlerEl;
11951 $el.addClass('view-resizable'); // Add Events
11952
11953 var passive = support.passiveListener ? {
11954 passive: true
11955 } : false;
11956 view.$el.on(app.touchEvents.start, '.view-resize-handler', handleTouchStart, passive);
11957 app.on('touchmove:active', handleTouchMove);
11958 app.on('touchend:passive', handleTouchEnd);
11959 app.on('resize', handleResize);
11960 view.on('beforeOpen', handleResize);
11961 view.once('viewDestroy', function () {
11962 $el.removeClass('view-resizable');
11963 view.$resizeHandlerEl.remove();
11964 view.$el.off(app.touchEvents.start, '.view-resize-handler', handleTouchStart, passive);
11965 app.off('touchmove:active', handleTouchMove);
11966 app.off('touchend:passive', handleTouchEnd);
11967 app.off('resize', handleResize);
11968 view.off('beforeOpen', handleResize);
11969 });
11970 }
11971
11972 var View$1 = /*#__PURE__*/function (_Framework7Class) {
11973 _inheritsLoose(View, _Framework7Class);
11974
11975 function View(app, el, viewParams) {
11976 var _this;
11977
11978 if (viewParams === void 0) {
11979 viewParams = {};
11980 }
11981
11982 _this = _Framework7Class.call(this, viewParams, [app]) || this;
11983
11984 var view = _assertThisInitialized(_this);
11985
11986 var ssr = view.params.routerId;
11987 var defaults = {
11988 routes: [],
11989 routesAdd: []
11990 };
11991
11992 if (!ssr) {
11993 var $el = $(el);
11994
11995 if (!$el.length) {
11996 var message = "Framework7: can't create a View instance because ";
11997 message += typeof el === 'string' ? "the selector \"" + el + "\" didn't match any element" : 'el must be an HTMLElement or Dom7 object';
11998 throw new Error(message);
11999 }
12000 } // Default View params
12001
12002
12003 view.params = extend$1({
12004 el: el
12005 }, defaults, app.params.view, viewParams); // Routes
12006
12007 if (view.params.routes.length > 0) {
12008 view.routes = view.params.routes;
12009 } else {
12010 view.routes = [].concat(app.routes, view.params.routesAdd);
12011 } // View Props
12012
12013
12014 extend$1(false, view, {
12015 app: app,
12016 name: view.params.name,
12017 main: view.params.main,
12018 history: [],
12019 scrollHistory: {}
12020 }); // Install Modules
12021
12022 view.useModules(); // Add to app
12023
12024 app.views.push(view);
12025
12026 if (view.main) {
12027 app.views.main = view;
12028 }
12029
12030 if (view.name) {
12031 app.views[view.name] = view;
12032 } // Index
12033
12034
12035 view.index = app.views.indexOf(view); // View ID
12036
12037 var viewId;
12038
12039 if (view.name) {
12040 viewId = "view_" + view.name;
12041 } else if (view.main) {
12042 viewId = 'view_main';
12043 } else {
12044 viewId = "view_" + view.index;
12045 }
12046
12047 view.id = viewId;
12048
12049 if (!view.params.init) {
12050 return view || _assertThisInitialized(_this);
12051 } // Init View
12052
12053
12054 if (app.initialized) {
12055 view.init();
12056 } else {
12057 app.on('init', function () {
12058 view.init();
12059 });
12060 }
12061
12062 return view || _assertThisInitialized(_this);
12063 }
12064
12065 var _proto = View.prototype;
12066
12067 _proto.destroy = function destroy() {
12068 var view = this;
12069 var app = view.app;
12070 view.$el.trigger('view:beforedestroy');
12071 view.emit('local::beforeDestroy viewBeforeDestroy', view);
12072 app.off('resize', view.checkMasterDetailBreakpoint);
12073
12074 if (view.main) {
12075 app.views.main = null;
12076 delete app.views.main;
12077 } else if (view.name) {
12078 app.views[view.name] = null;
12079 delete app.views[view.name];
12080 }
12081
12082 view.$el[0].f7View = null;
12083 delete view.$el[0].f7View;
12084 app.views.splice(app.views.indexOf(view), 1); // Destroy Router
12085
12086 if (view.params.router && view.router) {
12087 view.router.destroy();
12088 }
12089
12090 view.emit('local::destroy viewDestroy', view); // Delete props & methods
12091
12092 Object.keys(view).forEach(function (viewProp) {
12093 view[viewProp] = null;
12094 delete view[viewProp];
12095 });
12096 view = null;
12097 };
12098
12099 _proto.checkMasterDetailBreakpoint = function checkMasterDetailBreakpoint(force) {
12100 var view = this;
12101 var app = view.app;
12102 var wasMasterDetail = view.$el.hasClass('view-master-detail');
12103 var isMasterDetail = app.width >= view.params.masterDetailBreakpoint && view.$el.children('.page-master').length;
12104
12105 if (typeof force === 'undefined' && isMasterDetail || force === true) {
12106 view.$el.addClass('view-master-detail');
12107
12108 if (!wasMasterDetail) {
12109 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint', view);
12110 view.$el.trigger('view:masterDetailBreakpoint');
12111 }
12112 } else {
12113 view.$el.removeClass('view-master-detail');
12114
12115 if (wasMasterDetail) {
12116 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint', view);
12117 view.$el.trigger('view:masterDetailBreakpoint');
12118 }
12119 }
12120 };
12121
12122 _proto.initMasterDetail = function initMasterDetail() {
12123 var view = this;
12124 var app = view.app;
12125 view.checkMasterDetailBreakpoint = view.checkMasterDetailBreakpoint.bind(view);
12126 view.checkMasterDetailBreakpoint();
12127
12128 if (view.params.masterDetailResizable) {
12129 resizableView(view);
12130 }
12131
12132 app.on('resize', view.checkMasterDetailBreakpoint);
12133 };
12134
12135 _proto.mount = function mount(viewEl) {
12136 var view = this;
12137 var app = view.app;
12138 var el = view.params.el || viewEl;
12139 var $el = $(el); // Selector
12140
12141 var selector;
12142 if (typeof el === 'string') selector = el;else {
12143 // Supposed to be HTMLElement or Dom7
12144 selector = ($el.attr('id') ? "#" + $el.attr('id') : '') + ($el.attr('class') ? "." + $el.attr('class').replace(/ /g, '.').replace('.active', '') : '');
12145 } // DynamicNavbar
12146
12147 var $navbarsEl;
12148
12149 if (app.theme === 'ios' && view.params.iosDynamicNavbar) {
12150 $navbarsEl = $el.children('.navbars').eq(0);
12151
12152 if ($navbarsEl.length === 0) {
12153 $navbarsEl = $('<div class="navbars"></div>');
12154 }
12155 }
12156
12157 extend$1(view, {
12158 $el: $el,
12159 el: $el[0],
12160 main: view.main || $el.hasClass('view-main'),
12161 $navbarsEl: $navbarsEl,
12162 navbarsEl: $navbarsEl ? $navbarsEl[0] : undefined,
12163 selector: selector
12164 });
12165
12166 if (view.main) {
12167 app.views.main = view;
12168 } // Save in DOM
12169
12170
12171 if ($el && $el[0]) {
12172 $el[0].f7View = view;
12173 }
12174
12175 view.emit('local::mount viewMount', view);
12176 };
12177
12178 _proto.init = function init(viewEl) {
12179 var view = this;
12180 view.mount(viewEl);
12181
12182 if (view.params.router) {
12183 if (view.params.masterDetailBreakpoint > 0) {
12184 view.initMasterDetail();
12185 }
12186
12187 view.router.init();
12188 view.$el.trigger('view:init');
12189 view.emit('local::init viewInit', view);
12190 }
12191 };
12192
12193 return View;
12194 }(Framework7Class); // Use Router
12195
12196
12197 View$1.use(RouterModule);
12198
12199 function initClicks(app) {
12200 function handleClicks(e) {
12201 var window = getWindow();
12202 var $clickedEl = $(e.target);
12203 var $clickedLinkEl = $clickedEl.closest('a');
12204 var isLink = $clickedLinkEl.length > 0;
12205 var url = isLink && $clickedLinkEl.attr('href'); // Check if link is external
12206
12207 if (isLink) {
12208 if ($clickedLinkEl.is(app.params.clicks.externalLinks) || // eslint-disable-next-line
12209 url && url.indexOf('javascript:') >= 0) {
12210 var target = $clickedLinkEl.attr('target');
12211
12212 if (url && window.cordova && window.cordova.InAppBrowser && (target === '_system' || target === '_blank')) {
12213 e.preventDefault();
12214 window.cordova.InAppBrowser.open(url, target);
12215 } else if (url && window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Browser && (target === '_system' || target === '_blank')) {
12216 e.preventDefault();
12217 window.Capacitor.Plugins.Browser.open({
12218 url: url
12219 });
12220 }
12221
12222 return;
12223 }
12224 } // Modules Clicks
12225
12226
12227 Object.keys(app.modules).forEach(function (moduleName) {
12228 var moduleClicks = app.modules[moduleName].clicks;
12229 if (!moduleClicks) return;
12230 if (e.preventF7Router) return;
12231 Object.keys(moduleClicks).forEach(function (clickSelector) {
12232 var matchingClickedElement = $clickedEl.closest(clickSelector).eq(0);
12233
12234 if (matchingClickedElement.length > 0) {
12235 moduleClicks[clickSelector].call(app, matchingClickedElement, matchingClickedElement.dataset(), e);
12236 }
12237 });
12238 }); // Load Page
12239
12240 var clickedLinkData = {};
12241
12242 if (isLink) {
12243 e.preventDefault();
12244 clickedLinkData = $clickedLinkEl.dataset();
12245 }
12246
12247 clickedLinkData.clickedEl = $clickedLinkEl[0]; // Prevent Router
12248
12249 if (e.preventF7Router) return;
12250 if ($clickedLinkEl.hasClass('prevent-router') || $clickedLinkEl.hasClass('router-prevent')) return;
12251 var validUrl = url && url.length > 0 && url[0] !== '#';
12252
12253 if (validUrl || $clickedLinkEl.hasClass('back')) {
12254 var view;
12255
12256 if (clickedLinkData.view && clickedLinkData.view === 'current') {
12257 view = app.views.current;
12258 } else if (clickedLinkData.view) {
12259 view = $(clickedLinkData.view)[0].f7View;
12260 } else {
12261 view = $clickedEl.parents('.view')[0] && $clickedEl.parents('.view')[0].f7View;
12262
12263 if (!$clickedLinkEl.hasClass('back') && view && view.params.linksView) {
12264 if (typeof view.params.linksView === 'string') view = $(view.params.linksView)[0].f7View;else if (view.params.linksView instanceof View$1) view = view.params.linksView;
12265 }
12266 }
12267
12268 if (!view) {
12269 if (app.views.main) view = app.views.main;
12270 }
12271
12272 if (!view || !view.router) return;
12273
12274 if ($clickedLinkEl[0].f7RouteProps) {
12275 clickedLinkData.props = $clickedLinkEl[0].f7RouteProps;
12276 }
12277
12278 if ($clickedLinkEl.hasClass('back')) view.router.back(url, clickedLinkData);else view.router.navigate(url, clickedLinkData);
12279 }
12280 }
12281
12282 app.on('click', handleClicks);
12283 }
12284
12285 var ClicksModule = {
12286 name: 'clicks',
12287 params: {
12288 clicks: {
12289 // External Links
12290 externalLinks: '.external'
12291 }
12292 },
12293 on: {
12294 init: function init() {
12295 var app = this;
12296 initClicks(app);
12297 }
12298 }
12299 };
12300
12301 var RouterComponentLoaderModule = {
12302 name: 'routerComponentLoader',
12303 proto: {
12304 componentLoader: function componentLoader(component, componentUrl, options, resolve, reject) {
12305 if (options === void 0) {
12306 options = {};
12307 }
12308
12309 var router = this;
12310 var app = router.app;
12311 var url = typeof component === 'string' ? component : componentUrl;
12312 var compiledUrl = router.replaceRequestUrlParams(url, options);
12313
12314 function compile(componentFunction) {
12315 var context = options.context || {};
12316 if (typeof context === 'function') context = context.call(router);else if (typeof context === 'string') {
12317 try {
12318 context = JSON.parse(context);
12319 } catch (err) {
12320 reject(err);
12321 throw err;
12322 }
12323 }
12324 var componentContext = merge({}, context, {
12325 f7route: options.route,
12326 f7router: router
12327 });
12328 var componentProps = merge(options.route ? options.route.params || {} : {}, options.props || {}, options.routeProps || {});
12329 var componentEl;
12330 var componentRoot;
12331
12332 if (options.componentOptions && options.componentOptions.el) {
12333 componentEl = options.componentOptions.el;
12334 }
12335
12336 if (options.componentOptions && options.componentOptions.root) {
12337 componentRoot = options.componentOptions.root;
12338 }
12339
12340 app.component.create(componentFunction, componentProps, {
12341 context: componentContext,
12342 el: componentEl,
12343 root: componentRoot
12344 }).then(function (createdComponent) {
12345 resolve(createdComponent.el);
12346 }).catch(function (err) {
12347 reject(err);
12348 throw new Error(err);
12349 });
12350 }
12351
12352 var cachedComponent;
12353
12354 if (compiledUrl && router.params.componentCache) {
12355 router.cache.components.forEach(function (cached) {
12356 if (cached.url === compiledUrl) cachedComponent = cached.component;
12357 });
12358 }
12359
12360 if (compiledUrl && cachedComponent) {
12361 compile(cachedComponent);
12362 } else if (compiledUrl && !cachedComponent) {
12363 // Load via XHR
12364 if (router.xhrAbortController) {
12365 router.xhrAbortController.abort();
12366 router.xhrAbortController = false;
12367 }
12368
12369 router.xhrRequest(url, options).then(function (loadedComponent) {
12370 var parsedComponent = app.component.parse(loadedComponent);
12371
12372 if (router.params.componentCache) {
12373 router.cache.components.push({
12374 url: compiledUrl,
12375 component: parsedComponent
12376 });
12377 }
12378
12379 compile(parsedComponent);
12380 }).catch(function (err) {
12381 reject();
12382 throw err;
12383 });
12384 } else {
12385 compile(component);
12386 }
12387 },
12388 modalComponentLoader: function modalComponentLoader(_temp) {
12389 var _ref = _temp === void 0 ? {} : _temp,
12390 component = _ref.component,
12391 componentUrl = _ref.componentUrl,
12392 options = _ref.options,
12393 resolve = _ref.resolve,
12394 reject = _ref.reject;
12395
12396 var router = this;
12397 router.componentLoader(component, componentUrl, options, function (el) {
12398 resolve(el);
12399 }, reject);
12400 },
12401 tabComponentLoader: function tabComponentLoader(_temp2) {
12402 var _ref2 = _temp2 === void 0 ? {} : _temp2,
12403 component = _ref2.component,
12404 componentUrl = _ref2.componentUrl,
12405 options = _ref2.options,
12406 resolve = _ref2.resolve,
12407 reject = _ref2.reject;
12408
12409 var router = this;
12410 router.componentLoader(component, componentUrl, options, function (el) {
12411 resolve(el);
12412 }, reject);
12413 },
12414 pageComponentLoader: function pageComponentLoader(_temp3) {
12415 var _ref3 = _temp3 === void 0 ? {} : _temp3,
12416 component = _ref3.component,
12417 componentUrl = _ref3.componentUrl,
12418 options = _ref3.options,
12419 resolve = _ref3.resolve,
12420 reject = _ref3.reject;
12421
12422 var router = this;
12423 router.componentLoader(component, componentUrl, options, function (el, newOptions) {
12424 if (newOptions === void 0) {
12425 newOptions = {};
12426 }
12427
12428 resolve(el, newOptions);
12429 }, reject);
12430 }
12431 }
12432 };
12433
12434 var n = function n(t, s, r, e) {
12435 var u;
12436 s[0] = 0;
12437
12438 for (var h = 1; h < s.length; h++) {
12439 var p = s[h++],
12440 a = s[h] ? (s[0] |= p ? 1 : 2, r[s[h++]]) : s[++h];
12441 3 === p ? e[0] = a : 4 === p ? e[1] = Object.assign(e[1] || {}, a) : 5 === p ? (e[1] = e[1] || {})[s[++h]] = a : 6 === p ? e[1][s[++h]] += a + "" : p ? (u = t.apply(a, n(t, a, r, ["", null])), e.push(u), a[0] ? s[0] |= 2 : (s[h - 2] = 0, s[h] = u)) : e.push(a);
12442 }
12443
12444 return e;
12445 },
12446 t = new Map();
12447
12448 function htm (s) {
12449 var r = t.get(this);
12450 return r || (r = new Map(), t.set(this, r)), (r = n(this, r.get(s) || (r.set(s, r = function (n) {
12451 for (var t, s, r = 1, e = "", u = "", h = [0], p = function p(n) {
12452 1 === r && (n || (e = e.replace(/^\s*\n\s*|\s*\n\s*$/g, ""))) ? h.push(0, n, e) : 3 === r && (n || e) ? (h.push(3, n, e), r = 2) : 2 === r && "..." === e && n ? h.push(4, n, 0) : 2 === r && e && !n ? h.push(5, 0, !0, e) : r >= 5 && ((e || !n && 5 === r) && (h.push(r, 0, e, s), r = 6), n && (h.push(r, n, 0, s), r = 6)), e = "";
12453 }, a = 0; a < n.length; a++) {
12454 a && (1 === r && p(), p(a));
12455
12456 for (var l = 0; l < n[a].length; l++) {
12457 t = n[a][l], 1 === r ? "<" === t ? (p(), h = [h], r = 3) : e += t : 4 === r ? "--" === e && ">" === t ? (r = 1, e = "") : e = t + e[0] : u ? t === u ? u = "" : e += t : '"' === t || "'" === t ? u = t : ">" === t ? (p(), r = 1) : r && ("=" === t ? (r = 5, s = e, e = "") : "/" === t && (r < 5 || ">" === n[a][l + 1]) ? (p(), 3 === r && (h = h[0]), r = h, (h = h[0]).push(2, 0, r), r = 0) : " " === t || "\t" === t || "\n" === t || "\r" === t ? (p(), r = 2) : e += t), 3 === r && "!--" === e && (r = 4, h = h[0]);
12458 }
12459 }
12460
12461 return p(), h;
12462 }(s)), r), arguments, [])).length > 1 ? r : r[0];
12463 }
12464
12465 var ignoreChildren$1 = [false, null, '', undefined];
12466
12467 var h$1 = function h(type, props) {
12468 for (var _len = arguments.length, children = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
12469 children[_key - 2] = arguments[_key];
12470 }
12471
12472 return {
12473 type: type,
12474 props: props || {},
12475 children: flattenArray(children.filter(function (child) {
12476 return ignoreChildren$1.indexOf(child) < 0;
12477 }))
12478 };
12479 };
12480
12481 var $h = htm.bind(h$1);
12482
12483 function vnode(sel, data, children, text, elm) {
12484 var key = data === undefined ? undefined : data.key;
12485 return {
12486 sel: sel,
12487 data: data,
12488 children: children,
12489 text: text,
12490 elm: elm,
12491 key: key
12492 };
12493 }
12494
12495 var array = Array.isArray;
12496 function primitive(s) {
12497 return typeof s === 'string' || typeof s === 'number';
12498 }
12499
12500 function addNS(data, children, sel) {
12501 data.ns = 'http://www.w3.org/2000/svg';
12502
12503 if (sel !== 'foreignObject' && children !== undefined) {
12504 for (var i = 0; i < children.length; ++i) {
12505 var childData = children[i].data;
12506
12507 if (childData !== undefined) {
12508 addNS(childData, children[i].children, children[i].sel);
12509 }
12510 }
12511 }
12512 }
12513
12514 function h(sel, b, c) {
12515 var data = {},
12516 children,
12517 text,
12518 i;
12519
12520 if (c !== undefined) {
12521 data = b;
12522
12523 if (array(c)) {
12524 children = c;
12525 } else if (primitive(c)) {
12526 text = c;
12527 } else if (c && c.sel) {
12528 children = [c];
12529 }
12530 } else if (b !== undefined) {
12531 if (array(b)) {
12532 children = b;
12533 } else if (primitive(b)) {
12534 text = b;
12535 } else if (b && b.sel) {
12536 children = [b];
12537 } else {
12538 data = b;
12539 }
12540 }
12541
12542 if (array(children)) {
12543 for (i = 0; i < children.length; ++i) {
12544 if (primitive(children[i])) children[i] = vnode(undefined, undefined, undefined, children[i], undefined);
12545 }
12546 }
12547
12548 if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' && (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
12549 addNS(data, children, sel);
12550 }
12551
12552 return vnode(sel, data, children, text, undefined);
12553 }
12554 ;
12555
12556 var customComponents = {};
12557
12558 var SELF_CLOSING = 'area base br col command embed hr img input keygen link menuitem meta param source track wbr'.split(' ');
12559 var PROPS_ATTRS = 'hidden checked disabled readonly selected autofocus autoplay required multiple value indeterminate routeProps innerHTML'.split(' ');
12560 var BOOLEAN_PROPS = 'hidden checked disabled readonly selected autofocus autoplay required multiple readOnly indeterminate'.split(' ');
12561
12562 var getTagName = function getTagName(treeNode) {
12563 return typeof treeNode.type === 'function' ? treeNode.type.name || 'CustomComponent' : treeNode.type;
12564 };
12565
12566 var toCamelCase = function toCamelCase(name) {
12567 return name.split('-').map(function (word, index) {
12568 if (index === 0) return word.toLowerCase();
12569 return word[0].toUpperCase() + word.substr(1);
12570 }).join('');
12571 };
12572
12573 var propsFromAttrs = function propsFromAttrs() {
12574 var context = {};
12575
12576 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
12577 args[_key] = arguments[_key];
12578 }
12579
12580 args.forEach(function (obj) {
12581 if (obj === void 0) {
12582 obj = {};
12583 }
12584
12585 Object.keys(obj).forEach(function (key) {
12586 context[toCamelCase(key)] = obj[key];
12587 });
12588 });
12589 return context;
12590 };
12591
12592 var createCustomComponent = function createCustomComponent(_ref) {
12593 var f7 = _ref.f7,
12594 treeNode = _ref.treeNode,
12595 vnode = _ref.vnode,
12596 data = _ref.data;
12597 var component = typeof treeNode.type === 'function' ? treeNode.type : customComponents[treeNode.type];
12598 f7.component.create(component, propsFromAttrs(data.attrs || {}, data.props || {}), {
12599 el: vnode.elm,
12600 children: treeNode.children
12601 }).then(function (c) {
12602 if (vnode.data && vnode.data.on && c && c.$el) {
12603 Object.keys(vnode.data.on).forEach(function (eventName) {
12604 c.$el.on(eventName, vnode.data.on[eventName]);
12605 });
12606 } // eslint-disable-next-line
12607
12608
12609 vnode.elm.__component__ = c;
12610 });
12611 };
12612
12613 var updateCustomComponent = function updateCustomComponent(vnode) {
12614 // eslint-disable-next-line
12615 var component = vnode && vnode.elm && vnode.elm.__component__;
12616 if (!component) return;
12617 var newProps = propsFromAttrs(vnode.data.attrs || {}, vnode.data.props || {});
12618 component.children = vnode.data.treeNode.children;
12619 Object.assign(component.props, newProps);
12620 component.update();
12621 };
12622
12623 var destroyCustomComponent = function destroyCustomComponent(vnode) {
12624 // eslint-disable-next-line
12625 var component = vnode && vnode.elm && vnode.elm.__component__;
12626
12627 if (component) {
12628 var el = component.el,
12629 $el = component.$el;
12630
12631 if (vnode.data && vnode.data.on && $el) {
12632 Object.keys(vnode.data.on).forEach(function (eventName) {
12633 $el.off(eventName, vnode.data.on[eventName]);
12634 });
12635 }
12636
12637 if (component.destroy) component.destroy();
12638 if (el && el.parentNode) el.parentNode.removeChild(el);
12639 delete vnode.elm.__component__; // eslint-disable-line
12640 }
12641 };
12642
12643 var isCustomComponent = function isCustomComponent(treeNodeType) {
12644 return typeof treeNodeType === 'function' || treeNodeType && treeNodeType.indexOf('-') > 0 && customComponents[treeNodeType];
12645 };
12646
12647 function getHooks(treeNode, data, f7, initial, isRoot) {
12648 var hooks = {};
12649 var insert = [];
12650 var destroy = [];
12651 var update = [];
12652 var postpatch = [];
12653 var isFakeElement = false;
12654 var tagName = getTagName(treeNode);
12655
12656 if (data && data.attrs && data.attrs.component) {
12657 // eslint-disable-next-line
12658 data.attrs.component, _readOnlyError("tagName");
12659 delete data.attrs.component;
12660 isFakeElement = true;
12661 }
12662
12663 var isCustom = isCustomComponent(treeNode.type);
12664
12665 if (isCustom) {
12666 insert.push(function (vnode) {
12667 if (vnode.sel !== tagName && !isFakeElement) return;
12668 createCustomComponent({
12669 f7: f7,
12670 treeNode: treeNode,
12671 vnode: vnode,
12672 data: data
12673 });
12674 });
12675 destroy.push(function (vnode) {
12676 destroyCustomComponent(vnode);
12677 });
12678 update.push(function (oldVnode, vnode) {
12679 updateCustomComponent(vnode);
12680 });
12681 }
12682
12683 if (!isCustom) {
12684 if (!data || !data.attrs || !data.attrs.class) return hooks;
12685 var classNames = data.attrs.class;
12686 classNames.split(' ').forEach(function (className) {
12687 if (!initial) {
12688 insert.push.apply(insert, f7.getVnodeHooks('insert', className));
12689 }
12690
12691 destroy.push.apply(destroy, f7.getVnodeHooks('destroy', className));
12692 update.push.apply(update, f7.getVnodeHooks('update', className));
12693 postpatch.push.apply(postpatch, f7.getVnodeHooks('postpatch', className));
12694 });
12695 }
12696
12697 if (isRoot && !initial) {
12698 postpatch.push(function (oldVnode, vnode) {
12699 var vn = vnode || oldVnode;
12700 if (!vn) return;
12701
12702 if (vn.data && vn.data.component) {
12703 vn.data.component.hook('onUpdated');
12704 }
12705 });
12706 }
12707
12708 if (insert.length === 0 && destroy.length === 0 && update.length === 0 && postpatch.length === 0) {
12709 return hooks;
12710 }
12711
12712 if (insert.length) {
12713 hooks.insert = function (vnode) {
12714 insert.forEach(function (f) {
12715 return f(vnode);
12716 });
12717 };
12718 }
12719
12720 if (destroy.length) {
12721 hooks.destroy = function (vnode) {
12722 destroy.forEach(function (f) {
12723 return f(vnode);
12724 });
12725 };
12726 }
12727
12728 if (update.length) {
12729 hooks.update = function (oldVnode, vnode) {
12730 update.forEach(function (f) {
12731 return f(oldVnode, vnode);
12732 });
12733 };
12734 }
12735
12736 if (postpatch.length) {
12737 hooks.postpatch = function (oldVnode, vnode) {
12738 postpatch.forEach(function (f) {
12739 return f(oldVnode, vnode);
12740 });
12741 };
12742 }
12743
12744 return hooks;
12745 }
12746
12747 var getEventHandler = function getEventHandler(eventHandler, _temp) {
12748 var _ref2 = _temp === void 0 ? {} : _temp,
12749 stop = _ref2.stop,
12750 prevent = _ref2.prevent,
12751 once = _ref2.once;
12752
12753 var fired = false;
12754
12755 function handler() {
12756 var e = arguments.length <= 0 ? undefined : arguments[0];
12757 if (once && fired) return;
12758 if (stop) e.stopPropagation();
12759 if (prevent) e.preventDefault();
12760 fired = true;
12761 eventHandler.apply(void 0, arguments);
12762 }
12763
12764 return handler;
12765 };
12766
12767 var getData = function getData(treeNode, component, f7, initial, isRoot) {
12768 var data = {
12769 component: component,
12770 treeNode: treeNode
12771 };
12772 var tagName = getTagName(treeNode);
12773 Object.keys(treeNode.props).forEach(function (attrName) {
12774 var attrValue = treeNode.props[attrName];
12775 if (typeof attrValue === 'undefined') return;
12776
12777 if (PROPS_ATTRS.indexOf(attrName) >= 0) {
12778 // Props
12779 if (!data.props) data.props = {};
12780
12781 if (attrName === 'readonly') {
12782 // eslint-disable-next-line
12783 attrName = 'readOnly';
12784 }
12785
12786 if (attrName === 'routeProps') {
12787 // eslint-disable-next-line
12788 attrName = 'f7RouteProps';
12789 }
12790
12791 if (tagName === 'option' && attrName === 'value') {
12792 if (!data.attrs) data.attrs = {};
12793 data.attrs.value = attrValue;
12794 }
12795
12796 if (BOOLEAN_PROPS.indexOf(attrName) >= 0) {
12797 // eslint-disable-next-line
12798 data.props[attrName] = attrValue === false ? false : true;
12799 } else {
12800 data.props[attrName] = attrValue;
12801 }
12802 } else if (attrName === 'key') {
12803 // Key
12804 data.key = attrValue;
12805 } else if (attrName.indexOf('@') === 0 || attrName.indexOf('on') === 0 && attrName.length > 2) {
12806 // Events
12807 if (!data.on) data.on = {};
12808 var eventName = attrName.indexOf('@') === 0 ? attrName.substr(1) : eventNameToColonCase(attrName.substr(2));
12809 var stop = false;
12810 var prevent = false;
12811 var once = false;
12812
12813 if (eventName.indexOf('.') >= 0) {
12814 eventName.split('.').forEach(function (eventNamePart, eventNameIndex) {
12815 if (eventNameIndex === 0) eventName = eventNamePart;else {
12816 if (eventNamePart === 'stop') stop = true;
12817 if (eventNamePart === 'prevent') prevent = true;
12818 if (eventNamePart === 'once') once = true;
12819 }
12820 });
12821 }
12822
12823 data.on[eventName] = getEventHandler(attrValue, {
12824 stop: stop,
12825 prevent: prevent,
12826 once: once
12827 });
12828 } else if (attrName === 'style') {
12829 // Style
12830 if (typeof attrValue !== 'string') {
12831 data.style = attrValue;
12832 } else {
12833 if (!data.attrs) data.attrs = {};
12834 data.attrs.style = attrValue;
12835 }
12836 } else {
12837 // Rest of attribures
12838 if (!data.attrs) data.attrs = {};
12839 data.attrs[attrName] = attrValue; // ID -> Key
12840
12841 if (attrName === 'id' && !data.key && !isRoot) {
12842 data.key = attrValue;
12843 }
12844 }
12845 });
12846 var hooks = getHooks(treeNode, data, f7, initial, isRoot);
12847
12848 hooks.prepatch = function (oldVnode, vnode) {
12849 if (!oldVnode || !vnode) return;
12850
12851 if (oldVnode && oldVnode.data && oldVnode.data.props) {
12852 Object.keys(oldVnode.data.props).forEach(function (key) {
12853 if (BOOLEAN_PROPS.indexOf(key) < 0) return;
12854 if (!vnode.data) vnode.data = {};
12855 if (!vnode.data.props) vnode.data.props = {};
12856
12857 if (oldVnode.data.props[key] === true && !(key in vnode.data.props)) {
12858 vnode.data.props[key] = false;
12859 }
12860 });
12861 }
12862 };
12863
12864 data.hook = hooks;
12865 return data;
12866 };
12867
12868 var getChildren = function getChildren(treeNode, component, f7, initial) {
12869 if (treeNode && treeNode.type && SELF_CLOSING.indexOf(treeNode.type) >= 0) {
12870 return [];
12871 }
12872
12873 var children = [];
12874 var nodes = treeNode.children;
12875
12876 for (var i = 0; i < nodes.length; i += 1) {
12877 var childNode = nodes[i];
12878 var child = treeNodeToVNode(childNode, component, f7, initial, false);
12879
12880 if (Array.isArray(child)) {
12881 children.push.apply(children, child);
12882 } else if (child) {
12883 children.push(child);
12884 }
12885 }
12886
12887 return children;
12888 };
12889
12890 var getSlots = function getSlots(treeNode, component, f7, initial) {
12891 var slotName = treeNode.props.name || 'default';
12892 var slotNodes = (component.children || []).filter(function (childTreeNode) {
12893 var childSlotName = 'default';
12894
12895 if (childTreeNode.props) {
12896 childSlotName = childTreeNode.props.slot || 'default';
12897 }
12898
12899 return childSlotName === slotName;
12900 });
12901
12902 if (slotNodes.length === 0) {
12903 return getChildren(treeNode, component, f7, initial);
12904 }
12905
12906 return slotNodes.map(function (subTreeNode) {
12907 return treeNodeToVNode(subTreeNode, component, f7, initial);
12908 });
12909 };
12910
12911 var isTreeNode = function isTreeNode(treeNode) {
12912 return isObject$1(treeNode) && 'props' in treeNode && 'type' in treeNode && 'children' in treeNode;
12913 };
12914
12915 var treeNodeToVNode = function treeNodeToVNode(treeNode, component, f7, initial, isRoot) {
12916 if (!isTreeNode(treeNode)) {
12917 return String(treeNode);
12918 }
12919
12920 if (treeNode.type === 'slot') {
12921 return getSlots(treeNode, component, f7, initial);
12922 }
12923
12924 var data = getData(treeNode, component, f7, initial, isRoot);
12925 var children = isCustomComponent(treeNode.type) ? [] : getChildren(treeNode, component, f7, initial);
12926 return h(getTagName(treeNode), data, children);
12927 };
12928
12929 function vdom(tree, component, initial) {
12930 if (tree === void 0) {
12931 tree = {};
12932 }
12933
12934 return treeNodeToVNode(tree, component, component.f7, initial, true);
12935 }
12936
12937 function createElement(tagName) {
12938 return document.createElement(tagName);
12939 }
12940
12941 function createElementNS(namespaceURI, qualifiedName) {
12942 return document.createElementNS(namespaceURI, qualifiedName);
12943 }
12944
12945 function createTextNode(text) {
12946 return document.createTextNode(text);
12947 }
12948
12949 function createComment(text) {
12950 return document.createComment(text);
12951 }
12952
12953 function insertBefore(parentNode, newNode, referenceNode) {
12954 if (referenceNode && referenceNode.parentNode !== parentNode) {
12955 if (referenceNode.__component__) referenceNode = referenceNode.__component__.el;
12956 }
12957
12958 parentNode.insertBefore(newNode, referenceNode);
12959 }
12960
12961 function removeChild(node, child) {
12962 if (!node) return;
12963 node.removeChild(child);
12964 }
12965
12966 function appendChild(node, child) {
12967 node.appendChild(child);
12968 }
12969
12970 function parentNode(node) {
12971 return node.parentNode;
12972 }
12973
12974 function nextSibling(node) {
12975 return node.nextSibling;
12976 }
12977
12978 function tagName(elm) {
12979 return elm.tagName;
12980 }
12981
12982 function setTextContent(node, text) {
12983 node.textContent = text;
12984 }
12985
12986 function getTextContent(node) {
12987 return node.textContent;
12988 }
12989
12990 function isElement(node) {
12991 return node.nodeType === 1;
12992 }
12993
12994 function isText(node) {
12995 return node.nodeType === 3;
12996 }
12997
12998 function isComment(node) {
12999 return node.nodeType === 8;
13000 }
13001
13002 var htmlDomApi = {
13003 createElement: createElement,
13004 createElementNS: createElementNS,
13005 createTextNode: createTextNode,
13006 createComment: createComment,
13007 insertBefore: insertBefore,
13008 removeChild: removeChild,
13009 appendChild: appendChild,
13010 parentNode: parentNode,
13011 nextSibling: nextSibling,
13012 tagName: tagName,
13013 setTextContent: setTextContent,
13014 getTextContent: getTextContent,
13015 isElement: isElement,
13016 isText: isText,
13017 isComment: isComment
13018 };
13019
13020 function copyToThunk(vnode, thunk) {
13021 thunk.elm = vnode.elm;
13022 vnode.data.fn = thunk.data.fn;
13023 vnode.data.args = thunk.data.args;
13024 thunk.data = vnode.data;
13025 thunk.children = vnode.children;
13026 thunk.text = vnode.text;
13027 thunk.elm = vnode.elm;
13028 }
13029
13030 function init$1(thunk) {
13031 var cur = thunk.data;
13032 var vnode = cur.fn.apply(undefined, cur.args);
13033 copyToThunk(vnode, thunk);
13034 }
13035
13036 function prepatch(oldVnode, thunk) {
13037 var i,
13038 old = oldVnode.data,
13039 cur = thunk.data;
13040 var oldArgs = old.args,
13041 args = cur.args;
13042
13043 if (old.fn !== cur.fn || oldArgs.length !== args.length) {
13044 copyToThunk(cur.fn.apply(undefined, args), thunk);
13045 return;
13046 }
13047
13048 for (i = 0; i < args.length; ++i) {
13049 if (oldArgs[i] !== args[i]) {
13050 copyToThunk(cur.fn.apply(undefined, args), thunk);
13051 return;
13052 }
13053 }
13054
13055 copyToThunk(oldVnode, thunk);
13056 }
13057
13058 var thunk = function thunk(sel, key, fn, args) {
13059 if (args === undefined) {
13060 args = fn;
13061 fn = key;
13062 key = undefined;
13063 }
13064
13065 return h(sel, {
13066 key: key,
13067 hook: {
13068 init: init$1,
13069 prepatch: prepatch
13070 },
13071 fn: fn,
13072 args: args
13073 });
13074 };
13075
13076 function isUndef(s) {
13077 return s === undefined;
13078 }
13079
13080 function isDef(s) {
13081 return s !== undefined;
13082 }
13083
13084 var emptyNode = vnode('', {}, [], undefined, undefined);
13085
13086 function sameVnode(vnode1, vnode2) {
13087 return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
13088 }
13089
13090 function isVnode(vnode) {
13091 return vnode.sel !== undefined;
13092 }
13093
13094 function createKeyToOldIdx(children, beginIdx, endIdx) {
13095 var i,
13096 map = {},
13097 key,
13098 ch;
13099
13100 for (i = beginIdx; i <= endIdx; ++i) {
13101 ch = children[i];
13102
13103 if (ch != null) {
13104 key = ch.key;
13105 if (key !== undefined) map[key] = i;
13106 }
13107 }
13108
13109 return map;
13110 }
13111
13112 var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
13113 function init(modules, domApi) {
13114 var i,
13115 j,
13116 cbs = {};
13117 var api = domApi !== undefined ? domApi : htmlDomApi;
13118
13119 for (i = 0; i < hooks.length; ++i) {
13120 cbs[hooks[i]] = [];
13121
13122 for (j = 0; j < modules.length; ++j) {
13123 var hook = modules[j][hooks[i]];
13124
13125 if (hook !== undefined) {
13126 cbs[hooks[i]].push(hook);
13127 }
13128 }
13129 }
13130
13131 function emptyNodeAt(elm) {
13132 var id = elm.id ? '#' + elm.id : '';
13133 var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
13134 return vnode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
13135 }
13136
13137 function createRmCb(childElm, listeners) {
13138 return function rmCb() {
13139 if (--listeners === 0) {
13140 var parent_1 = api.parentNode(childElm);
13141 api.removeChild(parent_1, childElm);
13142 }
13143 };
13144 }
13145
13146 function createElm(vnode, insertedVnodeQueue) {
13147 var i,
13148 data = vnode.data;
13149
13150 if (data !== undefined) {
13151 if (isDef(i = data.hook) && isDef(i = i.init)) {
13152 i(vnode);
13153 data = vnode.data;
13154 }
13155 }
13156
13157 var children = vnode.children,
13158 sel = vnode.sel;
13159
13160 if (sel === '!') {
13161 if (isUndef(vnode.text)) {
13162 vnode.text = '';
13163 }
13164
13165 vnode.elm = api.createComment(vnode.text);
13166 } else if (sel !== undefined) {
13167 // Parse selector
13168 var hashIdx = sel.indexOf('#');
13169 var dotIdx = sel.indexOf('.', hashIdx);
13170 var hash = hashIdx > 0 ? hashIdx : sel.length;
13171 var dot = dotIdx > 0 ? dotIdx : sel.length;
13172 var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
13173 var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag) : api.createElement(tag);
13174 if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot));
13175 if (dotIdx > 0) elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
13176
13177 for (i = 0; i < cbs.create.length; ++i) {
13178 cbs.create[i](emptyNode, vnode);
13179 }
13180
13181 if (array(children)) {
13182 for (i = 0; i < children.length; ++i) {
13183 var ch = children[i];
13184
13185 if (ch != null) {
13186 api.appendChild(elm, createElm(ch, insertedVnodeQueue));
13187 }
13188 }
13189 } else if (primitive(vnode.text)) {
13190 api.appendChild(elm, api.createTextNode(vnode.text));
13191 }
13192
13193 i = vnode.data.hook; // Reuse variable
13194
13195 if (isDef(i)) {
13196 if (i.create) i.create(emptyNode, vnode);
13197 if (i.insert) insertedVnodeQueue.push(vnode);
13198 }
13199 } else {
13200 vnode.elm = api.createTextNode(vnode.text);
13201 }
13202
13203 return vnode.elm;
13204 }
13205
13206 function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
13207 for (; startIdx <= endIdx; ++startIdx) {
13208 var ch = vnodes[startIdx];
13209
13210 if (ch != null) {
13211 api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
13212 }
13213 }
13214 }
13215
13216 function invokeDestroyHook(vnode) {
13217 var i,
13218 j,
13219 data = vnode.data;
13220
13221 if (data !== undefined) {
13222 if (isDef(i = data.hook) && isDef(i = i.destroy)) i(vnode);
13223
13224 for (i = 0; i < cbs.destroy.length; ++i) {
13225 cbs.destroy[i](vnode);
13226 }
13227
13228 if (vnode.children !== undefined) {
13229 for (j = 0; j < vnode.children.length; ++j) {
13230 i = vnode.children[j];
13231
13232 if (i != null && typeof i !== "string") {
13233 invokeDestroyHook(i);
13234 }
13235 }
13236 }
13237 }
13238 }
13239
13240 function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
13241 for (; startIdx <= endIdx; ++startIdx) {
13242 var i_1 = void 0,
13243 listeners = void 0,
13244 rm = void 0,
13245 ch = vnodes[startIdx];
13246
13247 if (ch != null) {
13248 if (isDef(ch.sel)) {
13249 invokeDestroyHook(ch);
13250 listeners = cbs.remove.length + 1;
13251 rm = createRmCb(ch.elm, listeners);
13252
13253 for (i_1 = 0; i_1 < cbs.remove.length; ++i_1) {
13254 cbs.remove[i_1](ch, rm);
13255 }
13256
13257 if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
13258 i_1(ch, rm);
13259 } else {
13260 rm();
13261 }
13262 } else {
13263 api.removeChild(parentElm, ch.elm);
13264 }
13265 }
13266 }
13267 }
13268
13269 function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
13270 var oldStartIdx = 0,
13271 newStartIdx = 0;
13272 var oldEndIdx = oldCh.length - 1;
13273 var oldStartVnode = oldCh[0];
13274 var oldEndVnode = oldCh[oldEndIdx];
13275 var newEndIdx = newCh.length - 1;
13276 var newStartVnode = newCh[0];
13277 var newEndVnode = newCh[newEndIdx];
13278 var oldKeyToIdx;
13279 var idxInOld;
13280 var elmToMove;
13281 var before;
13282
13283 while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
13284 if (oldStartVnode == null) {
13285 oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
13286 } else if (oldEndVnode == null) {
13287 oldEndVnode = oldCh[--oldEndIdx];
13288 } else if (newStartVnode == null) {
13289 newStartVnode = newCh[++newStartIdx];
13290 } else if (newEndVnode == null) {
13291 newEndVnode = newCh[--newEndIdx];
13292 } else if (sameVnode(oldStartVnode, newStartVnode)) {
13293 patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
13294 oldStartVnode = oldCh[++oldStartIdx];
13295 newStartVnode = newCh[++newStartIdx];
13296 } else if (sameVnode(oldEndVnode, newEndVnode)) {
13297 patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
13298 oldEndVnode = oldCh[--oldEndIdx];
13299 newEndVnode = newCh[--newEndIdx];
13300 } else if (sameVnode(oldStartVnode, newEndVnode)) {
13301 patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
13302 api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
13303 oldStartVnode = oldCh[++oldStartIdx];
13304 newEndVnode = newCh[--newEndIdx];
13305 } else if (sameVnode(oldEndVnode, newStartVnode)) {
13306 patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
13307 api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
13308 oldEndVnode = oldCh[--oldEndIdx];
13309 newStartVnode = newCh[++newStartIdx];
13310 } else {
13311 if (oldKeyToIdx === undefined) {
13312 oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
13313 }
13314
13315 idxInOld = oldKeyToIdx[newStartVnode.key];
13316
13317 if (isUndef(idxInOld)) {
13318 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
13319 newStartVnode = newCh[++newStartIdx];
13320 } else {
13321 elmToMove = oldCh[idxInOld];
13322
13323 if (elmToMove.sel !== newStartVnode.sel) {
13324 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
13325 } else {
13326 patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
13327 oldCh[idxInOld] = undefined;
13328 api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
13329 }
13330
13331 newStartVnode = newCh[++newStartIdx];
13332 }
13333 }
13334 }
13335
13336 if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
13337 if (oldStartIdx > oldEndIdx) {
13338 before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
13339 addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
13340 } else {
13341 removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
13342 }
13343 }
13344 }
13345
13346 function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
13347 var i, hook;
13348
13349 if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
13350 i(oldVnode, vnode);
13351 }
13352
13353 var elm = vnode.elm = oldVnode.elm;
13354 var oldCh = oldVnode.children;
13355 var ch = vnode.children;
13356 if (oldVnode === vnode) return;
13357
13358 if (vnode.data !== undefined) {
13359 for (i = 0; i < cbs.update.length; ++i) {
13360 cbs.update[i](oldVnode, vnode);
13361 }
13362
13363 i = vnode.data.hook;
13364 if (isDef(i) && isDef(i = i.update)) i(oldVnode, vnode);
13365 }
13366
13367 if (isUndef(vnode.text)) {
13368 if (isDef(oldCh) && isDef(ch)) {
13369 if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);
13370 } else if (isDef(ch)) {
13371 if (isDef(oldVnode.text)) api.setTextContent(elm, '');
13372 addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
13373 } else if (isDef(oldCh)) {
13374 removeVnodes(elm, oldCh, 0, oldCh.length - 1);
13375 } else if (isDef(oldVnode.text)) {
13376 api.setTextContent(elm, '');
13377 }
13378 } else if (oldVnode.text !== vnode.text) {
13379 api.setTextContent(elm, vnode.text);
13380 }
13381
13382 if (isDef(hook) && isDef(i = hook.postpatch)) {
13383 i(oldVnode, vnode);
13384 }
13385 }
13386
13387 return function patch(oldVnode, vnode) {
13388 var i, elm, parent;
13389 var insertedVnodeQueue = [];
13390
13391 for (i = 0; i < cbs.pre.length; ++i) {
13392 cbs.pre[i]();
13393 }
13394
13395 if (!isVnode(oldVnode)) {
13396 oldVnode = emptyNodeAt(oldVnode);
13397 }
13398
13399 if (sameVnode(oldVnode, vnode)) {
13400 patchVnode(oldVnode, vnode, insertedVnodeQueue);
13401 } else {
13402 elm = oldVnode.elm;
13403 parent = api.parentNode(elm);
13404 createElm(vnode, insertedVnodeQueue);
13405
13406 if (parent !== null) {
13407 api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
13408 removeVnodes(parent, [oldVnode], 0, 0);
13409 }
13410 }
13411
13412 for (i = 0; i < insertedVnodeQueue.length; ++i) {
13413 insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
13414 }
13415
13416 for (i = 0; i < cbs.post.length; ++i) {
13417 cbs.post[i]();
13418 }
13419
13420 return vnode;
13421 };
13422 }
13423
13424 var xlinkNS = 'http://www.w3.org/1999/xlink';
13425 var xmlNS = 'http://www.w3.org/XML/1998/namespace';
13426 var colonChar = 58;
13427 var xChar = 120;
13428
13429 function updateAttrs(oldVnode, vnode) {
13430 var key,
13431 elm = vnode.elm,
13432 oldAttrs = oldVnode.data.attrs,
13433 attrs = vnode.data.attrs;
13434 if (!oldAttrs && !attrs) return;
13435 if (oldAttrs === attrs) return;
13436 oldAttrs = oldAttrs || {};
13437 attrs = attrs || {}; // update modified attributes, add new attributes
13438
13439 for (key in attrs) {
13440 var cur = attrs[key];
13441 var old = oldAttrs[key];
13442
13443 if (old !== cur) {
13444 if (cur === true) {
13445 elm.setAttribute(key, "");
13446 } else if (cur === false) {
13447 elm.removeAttribute(key);
13448 } else {
13449 if (key.charCodeAt(0) !== xChar) {
13450 elm.setAttribute(key, cur);
13451 } else if (key.charCodeAt(3) === colonChar) {
13452 // Assume xml namespace
13453 elm.setAttributeNS(xmlNS, key, cur);
13454 } else if (key.charCodeAt(5) === colonChar) {
13455 // Assume xlink namespace
13456 elm.setAttributeNS(xlinkNS, key, cur);
13457 } else {
13458 elm.setAttribute(key, cur);
13459 }
13460 }
13461 }
13462 } // remove removed attributes
13463 // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
13464 // the other option is to remove all attributes with value == undefined
13465
13466
13467 for (key in oldAttrs) {
13468 if (!(key in attrs)) {
13469 elm.removeAttribute(key);
13470 }
13471 }
13472 }
13473
13474 var attributesModule = {
13475 create: updateAttrs,
13476 update: updateAttrs
13477 };
13478
13479 function updateProps(oldVnode, vnode) {
13480 var key,
13481 cur,
13482 old,
13483 elm = vnode.elm,
13484 oldProps = oldVnode.data.props,
13485 props = vnode.data.props;
13486 if (!oldProps && !props) return;
13487 if (oldProps === props) return;
13488 oldProps = oldProps || {};
13489 props = props || {};
13490
13491 for (key in oldProps) {
13492 if (!props[key]) {
13493 delete elm[key];
13494 }
13495 }
13496
13497 for (key in props) {
13498 cur = props[key];
13499 old = oldProps[key];
13500
13501 if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
13502 elm[key] = cur;
13503 }
13504 }
13505 }
13506
13507 var propsModule = {
13508 create: updateProps,
13509 update: updateProps
13510 };
13511
13512 var raf = typeof window !== 'undefined' && window.requestAnimationFrame || setTimeout;
13513
13514 var nextFrame = function nextFrame(fn) {
13515 raf(function () {
13516 raf(fn);
13517 });
13518 };
13519
13520 function setNextFrame(obj, prop, val) {
13521 nextFrame(function () {
13522 obj[prop] = val;
13523 });
13524 }
13525
13526 function updateStyle(oldVnode, vnode) {
13527 var cur,
13528 name,
13529 elm = vnode.elm,
13530 oldStyle = oldVnode.data.style,
13531 style = vnode.data.style;
13532 if (!oldStyle && !style) return;
13533 if (oldStyle === style) return;
13534 oldStyle = oldStyle || {};
13535 style = style || {};
13536 var oldHasDel = ('delayed' in oldStyle);
13537
13538 for (name in oldStyle) {
13539 if (!style[name]) {
13540 if (name[0] === '-' && name[1] === '-') {
13541 elm.style.removeProperty(name);
13542 } else {
13543 elm.style[name] = '';
13544 }
13545 }
13546 }
13547
13548 for (name in style) {
13549 cur = style[name];
13550
13551 if (name === 'delayed' && style.delayed) {
13552 for (var name2 in style.delayed) {
13553 cur = style.delayed[name2];
13554
13555 if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
13556 setNextFrame(elm.style, name2, cur);
13557 }
13558 }
13559 } else if (name !== 'remove' && cur !== oldStyle[name]) {
13560 if (name[0] === '-' && name[1] === '-') {
13561 elm.style.setProperty(name, cur);
13562 } else {
13563 elm.style[name] = cur;
13564 }
13565 }
13566 }
13567 }
13568
13569 function applyDestroyStyle(vnode) {
13570 var style,
13571 name,
13572 elm = vnode.elm,
13573 s = vnode.data.style;
13574 if (!s || !(style = s.destroy)) return;
13575
13576 for (name in style) {
13577 elm.style[name] = style[name];
13578 }
13579 }
13580
13581 function applyRemoveStyle(vnode, rm) {
13582 var s = vnode.data.style;
13583
13584 if (!s || !s.remove) {
13585 rm();
13586 return;
13587 }
13588
13589 var name,
13590 elm = vnode.elm,
13591 i = 0,
13592 compStyle,
13593 style = s.remove,
13594 amount = 0,
13595 applied = [];
13596
13597 for (name in style) {
13598 applied.push(name);
13599 elm.style[name] = style[name];
13600 }
13601
13602 compStyle = getComputedStyle(elm);
13603 var props = compStyle['transition-property'].split(', ');
13604
13605 for (; i < props.length; ++i) {
13606 if (applied.indexOf(props[i]) !== -1) amount++;
13607 }
13608
13609 elm.addEventListener('transitionend', function (ev) {
13610 if (ev.target === elm) --amount;
13611 if (amount === 0) rm();
13612 });
13613 }
13614
13615 var styleModule = {
13616 create: updateStyle,
13617 update: updateStyle,
13618 destroy: applyDestroyStyle,
13619 remove: applyRemoveStyle
13620 };
13621
13622 function invokeHandler(handler, event, args) {
13623 if (typeof handler === 'function') {
13624 // call function handler
13625 handler.apply(void 0, [event].concat(args));
13626 }
13627 }
13628
13629 function handleEvent(event, args, vnode) {
13630 var name = event.type;
13631 var on = vnode.data.on; // call event handler(s) if exists
13632
13633 if (on && on[name]) {
13634 invokeHandler(on[name], event, args, vnode);
13635 }
13636 }
13637
13638 function createListener() {
13639 return function handler(event) {
13640 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
13641 args[_key - 1] = arguments[_key];
13642 }
13643
13644 handleEvent(event, args, handler.vnode);
13645 };
13646 }
13647
13648 function updateEvents(oldVnode, vnode) {
13649 var oldOn = oldVnode.data.on;
13650 var oldListener = oldVnode.listener;
13651 var oldElm = oldVnode.elm;
13652 var on = vnode && vnode.data.on;
13653 var elm = vnode && vnode.elm; // optimization for reused immutable handlers
13654
13655 if (oldOn === on) {
13656 return;
13657 } // remove existing listeners which no longer used
13658
13659
13660 if (oldOn && oldListener) {
13661 // if element changed or deleted we remove all existing listeners unconditionally
13662 if (!on) {
13663 Object.keys(oldOn).forEach(function (name) {
13664 $(oldElm).off(name, oldListener);
13665 });
13666 } else {
13667 Object.keys(oldOn).forEach(function (name) {
13668 if (!on[name]) {
13669 $(oldElm).off(name, oldListener);
13670 }
13671 });
13672 }
13673 } // add new listeners which has not already attached
13674
13675
13676 if (on) {
13677 // reuse existing listener or create new
13678 var listener = oldVnode.listener || createListener();
13679 vnode.listener = listener; // update vnode for listener
13680
13681 listener.vnode = vnode; // if element changed or added we add all needed listeners unconditionally
13682
13683 if (!oldOn) {
13684 Object.keys(on).forEach(function (name) {
13685 $(elm).on(name, listener);
13686 });
13687 } else {
13688 Object.keys(on).forEach(function (name) {
13689 if (!oldOn[name]) {
13690 $(elm).on(name, listener);
13691 }
13692 });
13693 }
13694 }
13695 }
13696
13697 var eventListenersModule = {
13698 create: updateEvents,
13699 update: updateEvents,
13700 destroy: updateEvents
13701 };
13702
13703 /* eslint import/no-named-as-default: off */
13704 var patch = init([attributesModule, propsModule, styleModule, eventListenersModule]);
13705
13706 /* eslint no-underscore-dangle: "off" */
13707
13708 var Component = /*#__PURE__*/function () {
13709 function Component(app, component, props, _temp) {
13710 var _this = this;
13711
13712 if (props === void 0) {
13713 props = {};
13714 }
13715
13716 var _ref = _temp === void 0 ? {} : _temp,
13717 el = _ref.el,
13718 context = _ref.context,
13719 children = _ref.children;
13720
13721 var document = getDocument();
13722 merge(this, {
13723 f7: app,
13724 props: props || {},
13725 context: context || {},
13726 id: component.id || id(),
13727 children: children || [],
13728 theme: {
13729 ios: app.theme === 'ios',
13730 md: app.theme === 'md',
13731 aurora: app.theme === 'aurora'
13732 },
13733 style: component.style,
13734 __updateQueue: [],
13735 __eventHandlers: [],
13736 __onceEventHandlers: [],
13737 __onBeforeMount: [],
13738 __onMounted: [],
13739 __onBeforeUpdate: [],
13740 __onUpdated: [],
13741 __onBeforeUnmount: [],
13742 __onUnmounted: []
13743 });
13744
13745 var createComponent = function createComponent() {
13746 return component(_this.props, _this.getComponentContext(true));
13747 };
13748
13749 var getRenderFuncion = function getRenderFuncion(componentResult) {
13750 return new Promise(function (resolve, reject) {
13751 if (typeof componentResult === 'function') {
13752 resolve(componentResult);
13753 } else if (componentResult instanceof Promise) {
13754 componentResult.then(function (render) {
13755 resolve(render);
13756 }).catch(function (err) {
13757 reject(err);
13758 });
13759 } else {
13760 reject(new Error('Framework7: Component render function is not a "function" type. Didn\'t you forget to "return $render"?'));
13761 }
13762 });
13763 };
13764
13765 return new Promise(function (resolve, reject) {
13766 var componentResult = createComponent();
13767 getRenderFuncion(componentResult).then(function (render) {
13768 _this.renderFunction = render;
13769
13770 var tree = _this.render();
13771
13772 if (el) {
13773 _this.vnode = vdom(tree, _this, true);
13774
13775 if (_this.style) {
13776 _this.styleEl = document.createElement('style');
13777 _this.styleEl.innerHTML = _this.style;
13778 }
13779
13780 _this.el = el;
13781 patch(_this.el, _this.vnode);
13782 _this.el = _this.vnode.elm;
13783 _this.$el = $(_this.el);
13784
13785 _this.attachEvents();
13786
13787 _this.el.f7Component = _this;
13788
13789 _this.mount();
13790
13791 resolve(_this);
13792 return;
13793 } // Make Dom
13794
13795
13796 if (tree) {
13797 _this.vnode = vdom(tree, _this, true);
13798 _this.el = document.createElement(_this.vnode.sel || 'div');
13799 patch(_this.el, _this.vnode);
13800 _this.$el = $(_this.el);
13801 }
13802
13803 if (_this.style) {
13804 _this.styleEl = document.createElement('style');
13805 _this.styleEl.innerHTML = _this.style;
13806 }
13807
13808 _this.attachEvents();
13809
13810 if (_this.el) {
13811 _this.el.f7Component = _this;
13812 }
13813
13814 resolve(_this);
13815 }).catch(function (err) {
13816 reject(err);
13817 });
13818 });
13819 }
13820
13821 var _proto = Component.prototype;
13822
13823 _proto.on = function on(eventName, handler) {
13824 if (!this.__eventHandlers) return;
13825
13826 this.__eventHandlers.push({
13827 eventName: eventName,
13828 handler: handler
13829 });
13830 };
13831
13832 _proto.once = function once(eventName, handler) {
13833 if (!this.__eventHandlers) return;
13834
13835 this.__onceEventHandlers.push({
13836 eventName: eventName,
13837 handler: handler
13838 });
13839 };
13840
13841 _proto.getComponentStore = function getComponentStore() {
13842 var _this2 = this;
13843
13844 var _this$f7$store = this.f7.store,
13845 state = _this$f7$store.state,
13846 _gettersPlain = _this$f7$store._gettersPlain,
13847 dispatch = _this$f7$store.dispatch;
13848 var $store = {
13849 state: state,
13850 dispatch: dispatch
13851 };
13852 $store.getters = new Proxy(_gettersPlain, {
13853 get: function get(target, prop) {
13854 var obj = target[prop];
13855
13856 var callback = function callback(v) {
13857 obj.value = v;
13858
13859 _this2.update();
13860 };
13861
13862 obj.onUpdated(callback);
13863 return obj;
13864 }
13865 });
13866 return $store;
13867 };
13868
13869 _proto.getComponentContext = function getComponentContext(includeHooks) {
13870 var _this3 = this;
13871
13872 var ctx = {
13873 $f7route: this.context.f7route,
13874 $f7router: this.context.f7router,
13875 $h: $h,
13876 $: $,
13877 $id: this.id,
13878 $f7: this.f7,
13879 $f7ready: this.f7ready.bind(this),
13880 $theme: this.theme,
13881 $tick: this.tick.bind(this),
13882 $update: this.update.bind(this),
13883 $emit: this.emit.bind(this),
13884 $store: this.getComponentStore(),
13885 $el: {}
13886 };
13887 Object.defineProperty(ctx.$el, 'value', {
13888 get: function get() {
13889 return _this3.$el;
13890 }
13891 });
13892 if (includeHooks) Object.assign(ctx, {
13893 $on: this.on.bind(this),
13894 $once: this.once.bind(this),
13895 $onBeforeMount: function $onBeforeMount(handler) {
13896 return _this3.__onBeforeMount.push(handler);
13897 },
13898 $onMounted: function $onMounted(handler) {
13899 return _this3.__onMounted.push(handler);
13900 },
13901 $onBeforeUpdate: function $onBeforeUpdate(handler) {
13902 return _this3.__onBeforeUpdate.push(handler);
13903 },
13904 $onUpdated: function $onUpdated(handler) {
13905 return _this3.__onUpdated.push(handler);
13906 },
13907 $onBeforeUnmount: function $onBeforeUnmount(handler) {
13908 return _this3.__onBeforeUnmount.push(handler);
13909 },
13910 $onUnmounted: function $onUnmounted(handler) {
13911 return _this3.__onUnmounted.push(handler);
13912 }
13913 });
13914 return ctx;
13915 };
13916
13917 _proto.render = function render() {
13918 return this.renderFunction(this.getComponentContext());
13919 };
13920
13921 _proto.emit = function emit(name, data) {
13922 if (!this.el) return;
13923 this.$el.trigger(name, data);
13924 };
13925
13926 _proto.attachEvents = function attachEvents() {
13927 var $el = this.$el;
13928 if (!this.__eventHandlers) return;
13929
13930 this.__eventHandlers.forEach(function (_ref2) {
13931 var eventName = _ref2.eventName,
13932 handler = _ref2.handler;
13933 $el.on(eventNameToColonCase(eventName), handler);
13934 });
13935
13936 this.__onceEventHandlers.forEach(function (_ref3) {
13937 var eventName = _ref3.eventName,
13938 handler = _ref3.handler;
13939 $el.once(eventNameToColonCase(eventName), handler);
13940 });
13941 };
13942
13943 _proto.detachEvents = function detachEvents() {
13944 var $el = this.$el;
13945 if (!this.__eventHandlers) return;
13946
13947 this.__eventHandlers.forEach(function (_ref4) {
13948 var eventName = _ref4.eventName,
13949 handler = _ref4.handler;
13950 $el.on(eventNameToColonCase(eventName), handler);
13951 });
13952
13953 this.__onceEventHandlers.forEach(function (_ref5) {
13954 var eventName = _ref5.eventName,
13955 handler = _ref5.handler;
13956 $el.once(eventNameToColonCase(eventName), handler);
13957 });
13958 };
13959
13960 _proto.startUpdateQueue = function startUpdateQueue() {
13961 var _this4 = this;
13962
13963 var window = getWindow();
13964 if (this.__requestAnimationFrameId) return;
13965
13966 var update = function update() {
13967 _this4.hook('onBeforeUpdate');
13968
13969 var tree = _this4.render(); // Make Dom
13970
13971
13972 if (tree) {
13973 var newVNode = vdom(tree, _this4, false);
13974 _this4.vnode = patch(_this4.vnode, newVNode);
13975 }
13976 };
13977
13978 this.__requestAnimationFrameId = window.requestAnimationFrame(function () {
13979 if (_this4.__updateIsPending) update();
13980 var resolvers = [].concat(_this4.__updateQueue);
13981 _this4.__updateQueue = [];
13982 _this4.__updateIsPending = false;
13983 window.cancelAnimationFrame(_this4.__requestAnimationFrameId);
13984 delete _this4.__requestAnimationFrameId;
13985 delete _this4.__updateIsPending;
13986 resolvers.forEach(function (resolver) {
13987 return resolver();
13988 });
13989 resolvers = [];
13990 });
13991 };
13992
13993 _proto.tick = function tick(callback) {
13994 var _this5 = this;
13995
13996 return new Promise(function (resolve) {
13997 function resolver() {
13998 resolve();
13999 if (callback) callback();
14000 }
14001
14002 _this5.__updateQueue.push(resolver);
14003
14004 _this5.startUpdateQueue();
14005 });
14006 };
14007
14008 _proto.update = function update(callback) {
14009 var _this6 = this;
14010
14011 if (this.__destroyed) return new Promise(function () {});
14012 return new Promise(function (resolve) {
14013 var resolver = function resolver() {
14014 resolve();
14015 if (callback) callback();
14016 };
14017
14018 _this6.__updateIsPending = true;
14019
14020 _this6.__updateQueue.push(resolver);
14021
14022 _this6.startUpdateQueue();
14023 });
14024 };
14025
14026 _proto.setState = function setState(callback) {
14027 return this.update(callback);
14028 };
14029
14030 _proto.f7ready = function f7ready(callback) {
14031 var _this7 = this;
14032
14033 if (this.f7.initialized) {
14034 callback(this.f7);
14035 return;
14036 }
14037
14038 this.f7.once('init', function () {
14039 callback(_this7.f7);
14040 });
14041 };
14042
14043 _proto.mount = function mount(mountMethod) {
14044 this.hook('onBeforeMount', this.$el);
14045 if (this.styleEl) $('head').append(this.styleEl);
14046 if (mountMethod) mountMethod(this.el);
14047 this.hook('onMounted', this.$el);
14048 };
14049
14050 _proto.destroy = function destroy() {
14051 if (this.__destroyed) return;
14052 var window = getWindow();
14053 this.hook('onBeforeUnmount');
14054 if (this.styleEl) $(this.styleEl).remove();
14055 this.detachEvents();
14056 this.hook('onUnmounted'); // Delete component instance
14057
14058 if (this.el && this.el.f7Component) {
14059 this.el.f7Component = null;
14060 delete this.el.f7Component;
14061 } // Patch with empty node
14062
14063
14064 if (this.vnode) {
14065 this.vnode = patch(this.vnode, {
14066 sel: this.vnode.sel,
14067 data: {}
14068 });
14069 } // Clear update queue
14070
14071
14072 window.cancelAnimationFrame(this.__requestAnimationFrameId);
14073 this.__updateQueue = [];
14074 this.__eventHandlers = [];
14075 this.__onceEventHandlers = [];
14076 this.__onBeforeMount = [];
14077 this.__onMounted = [];
14078 this.__onBeforeUpdate = [];
14079 this.__onUpdated = [];
14080 this.__onBeforeUnmount = [];
14081 this.__onUnmounted = []; // Delete all props
14082
14083 deleteProps$1(this);
14084 this.__destroyed = true;
14085 };
14086
14087 _proto.hook = function hook(name) {
14088 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
14089 args[_key - 1] = arguments[_key];
14090 }
14091
14092 if (this.__destroyed) return;
14093 this["__" + name].forEach(function (handler) {
14094 handler.apply(void 0, args);
14095 });
14096 };
14097
14098 return Component;
14099 }();
14100
14101 function parseComponent(componentString) {
14102 var window = getWindow();
14103 var document = getDocument();
14104 var componentId = id();
14105 var callbackCreateName = "f7_component_create_callback_" + componentId; // Template
14106
14107 var template;
14108 var hasTemplate = componentString.match(/<template([ ]?)([a-z0-9-]*)>/);
14109
14110 if (hasTemplate) {
14111 template = componentString.split(/<template[ ]?[a-z0-9-]*>/).filter(function (item, index) {
14112 return index > 0;
14113 }).join('<template>').split('</template>').filter(function (item, index, arr) {
14114 return index < arr.length - 1;
14115 }).join('</template>').replace(/{{#raw}}([ \n]*)<template/g, '{{#raw}}<template').replace(/\/template>([ \n]*){{\/raw}}/g, '/template>{{/raw}}').replace(/([ \n])<template/g, '$1{{#raw}}<template').replace(/\/template>([ \n])/g, '/template>{{/raw}}$1');
14116 } // Parse Styles
14117
14118
14119 var style = null;
14120
14121 if (componentString.indexOf('<style>') >= 0) {
14122 style = componentString.split('<style>')[1].split('</style>')[0];
14123 }
14124
14125 if (componentString.indexOf('<style scoped>') >= 0) {
14126 style = componentString.split('<style scoped>')[1].split('</style>')[0];
14127 } // Parse Script
14128
14129
14130 var scriptContent;
14131
14132 if (componentString.indexOf('<script>') >= 0) {
14133 var scripts = componentString.split('<script>');
14134 scriptContent = scripts[scripts.length - 1].split('</script>')[0].trim();
14135 } else {
14136 scriptContent = 'return () => {return $render}';
14137 }
14138
14139 if (!scriptContent || !scriptContent.trim()) scriptContent = 'return () => {return $render}'; // Parse Template
14140
14141 if (template) {
14142 scriptContent = scriptContent.replace('$render', "function ($$ctx) {\n var $ = $$ctx.$$;\n var $h = $$ctx.$h;\n var $root = $$ctx.$root;\n var $f7 = $$ctx.$f7;\n var $f7route = $$ctx.$f7route;\n var $f7router = $$ctx.$f7router;\n var $theme = $$ctx.$theme;\n var $update = $$ctx.$update;\n var $store = $$ctx.$store;\n\n return $h`" + template + "`\n }\n ").replace(/export default/g, 'return');
14143 } // Execute Script
14144
14145
14146 scriptContent = "window." + callbackCreateName + " = function () {" + scriptContent + "}"; // Insert Script El
14147
14148 var scriptEl = document.createElement('script');
14149 scriptEl.innerHTML = scriptContent;
14150 $('head').append(scriptEl);
14151 var component = window[callbackCreateName](); // Remove Script El
14152
14153 $(scriptEl).remove();
14154 window[callbackCreateName] = null;
14155 delete window[callbackCreateName]; // Assign Style
14156
14157 if (style) {
14158 component.style = style;
14159 } // Component ID
14160
14161
14162 component.id = componentId;
14163 return component;
14164 }
14165
14166 var ignoreChildren = [false, null, '', undefined];
14167
14168 var $jsx$1 = function $jsx(type, props) {
14169 for (var _len = arguments.length, children = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
14170 children[_key - 2] = arguments[_key];
14171 }
14172
14173 return {
14174 type: type,
14175 props: props || {},
14176 children: flattenArray((children || []).filter(function (child) {
14177 return ignoreChildren.indexOf(child) < 0;
14178 }))
14179 };
14180 };
14181
14182 function registerComponent(tagName, component) {
14183 customComponents[tagName] = component;
14184 }
14185
14186 function unregisterComponent(tagName) {
14187 delete customComponents[tagName];
14188 }
14189 var ComponentModule = {
14190 name: 'component',
14191 static: {
14192 Component: Component,
14193 registerComponent: registerComponent,
14194 unregisterComponent: unregisterComponent
14195 },
14196 create: function create() {
14197 var app = this;
14198 app.component = {
14199 registerComponent: registerComponent,
14200 unregisterComponent: unregisterComponent,
14201 parse: function parse(componentString) {
14202 return parseComponent(componentString);
14203 },
14204 create: function create(component, props, _ref) {
14205 var root = _ref.root,
14206 el = _ref.el,
14207 context = _ref.context,
14208 children = _ref.children;
14209 return new Component(app, component, props, {
14210 root: root,
14211 el: el,
14212 context: context,
14213 children: children
14214 });
14215 }
14216 };
14217 }
14218 };
14219
14220 var HistoryModule = {
14221 name: 'history',
14222 static: {
14223 history: History$2
14224 },
14225 on: {
14226 init: function init() {
14227 History$2.init(this);
14228 }
14229 }
14230 };
14231
14232 var SW = {
14233 registrations: [],
14234 register: function register(path, scope) {
14235 var app = this;
14236 var window = getWindow();
14237
14238 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
14239 return new Promise(function (resolve, reject) {
14240 reject(new Error('Service worker is not supported'));
14241 });
14242 }
14243
14244 return new Promise(function (resolve, reject) {
14245 app.serviceWorker.container.register(path, scope ? {
14246 scope: scope
14247 } : {}).then(function (reg) {
14248 SW.registrations.push(reg);
14249 app.emit('serviceWorkerRegisterSuccess', reg);
14250 resolve(reg);
14251 }).catch(function (error) {
14252 app.emit('serviceWorkerRegisterError', error);
14253 reject(error);
14254 });
14255 });
14256 },
14257 unregister: function unregister(registration) {
14258 var app = this;
14259 var window = getWindow();
14260
14261 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
14262 return new Promise(function (resolve, reject) {
14263 reject(new Error('Service worker is not supported'));
14264 });
14265 }
14266
14267 var registrations;
14268 if (!registration) registrations = SW.registrations;else if (Array.isArray(registration)) registrations = registration;else registrations = [registration];
14269 return Promise.all(registrations.map(function (reg) {
14270 return new Promise(function (resolve, reject) {
14271 reg.unregister().then(function () {
14272 if (SW.registrations.indexOf(reg) >= 0) {
14273 SW.registrations.splice(SW.registrations.indexOf(reg), 1);
14274 }
14275
14276 app.emit('serviceWorkerUnregisterSuccess', reg);
14277 resolve();
14278 }).catch(function (error) {
14279 app.emit('serviceWorkerUnregisterError', reg, error);
14280 reject(error);
14281 });
14282 });
14283 }));
14284 }
14285 };
14286 var ServiceWorkerModule = {
14287 name: 'sw',
14288 params: {
14289 serviceWorker: {
14290 path: undefined,
14291 scope: undefined
14292 }
14293 },
14294 create: function create() {
14295 var app = this;
14296 var window = getWindow();
14297 extend$1(app, {
14298 serviceWorker: {
14299 container: 'serviceWorker' in window.navigator ? window.navigator.serviceWorker : undefined,
14300 registrations: SW.registrations,
14301 register: SW.register.bind(app),
14302 unregister: SW.unregister.bind(app)
14303 }
14304 });
14305 },
14306 on: {
14307 init: function init() {
14308 var window = getWindow();
14309 if (!('serviceWorker' in window.navigator)) return;
14310 var app = this;
14311 if (app.device.cordova || window.Capacitor && window.Capacitor.isNative) return;
14312 if (!app.serviceWorker.container) return;
14313 var paths = app.params.serviceWorker.path;
14314 var scope = app.params.serviceWorker.scope;
14315 if (!paths || Array.isArray(paths) && !paths.length) return;
14316 var toRegister = Array.isArray(paths) ? paths : [paths];
14317 toRegister.forEach(function (path) {
14318 app.serviceWorker.register(path, scope);
14319 });
14320 }
14321 }
14322 };
14323
14324 function createStore(storeParams) {
14325 if (storeParams === void 0) {
14326 storeParams = {};
14327 }
14328
14329 var store = {
14330 __store: true
14331 };
14332
14333 var originalState = _extends$j({}, storeParams.state || {});
14334
14335 var actions = _extends$j({}, storeParams.actions || {});
14336
14337 var getters = _extends$j({}, storeParams.getters || {});
14338
14339 var state = extend$1({}, originalState);
14340 var propsQueue = [];
14341 var gettersDependencies = {};
14342 var gettersCallbacks = {};
14343 Object.keys(getters).forEach(function (getterKey) {
14344 gettersDependencies[getterKey] = [];
14345 gettersCallbacks[getterKey] = [];
14346 });
14347
14348 var getGetterValue = function getGetterValue(getterKey) {
14349 return getters[getterKey]({
14350 state: store.state
14351 });
14352 };
14353
14354 var addGetterDependencies = function addGetterDependencies(getterKey, deps) {
14355 if (!gettersDependencies[getterKey]) gettersDependencies[getterKey] = [];
14356 deps.forEach(function (dep) {
14357 if (gettersDependencies[getterKey].indexOf(dep) < 0) {
14358 gettersDependencies[getterKey].push(dep);
14359 }
14360 });
14361 };
14362
14363 var addGetterCallback = function addGetterCallback(getterKey, callback) {
14364 if (!gettersCallbacks[getterKey]) gettersCallbacks[getterKey] = [];
14365 gettersCallbacks[getterKey].push(callback);
14366 };
14367
14368 var runGetterCallbacks = function runGetterCallbacks(stateKey) {
14369 var keys = Object.keys(gettersDependencies).filter(function (getterKey) {
14370 return gettersDependencies[getterKey].indexOf(stateKey) >= 0;
14371 });
14372 keys.forEach(function (getterKey) {
14373 if (!gettersCallbacks[getterKey] || !gettersCallbacks[getterKey].length) return;
14374 gettersCallbacks[getterKey].forEach(function (callback) {
14375 callback(getGetterValue(getterKey));
14376 });
14377 });
14378 };
14379
14380 var removeGetterCallback = function removeGetterCallback(callback) {
14381 Object.keys(gettersCallbacks).forEach(function (stateKey) {
14382 var callbacks = gettersCallbacks[stateKey];
14383
14384 if (callbacks.indexOf(callback) >= 0) {
14385 callbacks.splice(callbacks.indexOf(callback), 1);
14386 }
14387 });
14388 }; // eslint-disable-next-line
14389
14390
14391 store.__removeCallback = function (callback) {
14392 removeGetterCallback(callback);
14393 };
14394
14395 var getterValue = function getterValue(getterKey, addCallback) {
14396 if (addCallback === void 0) {
14397 addCallback = true;
14398 }
14399
14400 if (getterKey === 'constructor') return undefined;
14401 propsQueue = [];
14402 var value = getGetterValue(getterKey);
14403 addGetterDependencies(getterKey, propsQueue);
14404
14405 var onUpdated = function onUpdated(callback) {
14406 addGetterCallback(getterKey, callback);
14407 };
14408
14409 var obj = {
14410 value: value,
14411 onUpdated: onUpdated
14412 };
14413
14414 if (!addCallback) {
14415 return obj;
14416 }
14417
14418 var callback = function callback(v) {
14419 obj.value = v;
14420 };
14421
14422 obj.__callback = callback;
14423 addGetterCallback(getterKey, callback); // eslint-disable-next-line
14424
14425 return obj;
14426 };
14427
14428 store.state = new Proxy(state, {
14429 set: function set(target, prop, value) {
14430 target[prop] = value;
14431 runGetterCallbacks(prop);
14432 return true;
14433 },
14434 get: function get(target, prop) {
14435 propsQueue.push(prop);
14436 return target[prop];
14437 }
14438 });
14439 store.getters = new Proxy(getters, {
14440 set: function set() {
14441 return false;
14442 },
14443 get: function get(target, prop) {
14444 if (!target[prop]) {
14445 return undefined;
14446 }
14447
14448 return getterValue(prop, true);
14449 }
14450 });
14451 store._gettersPlain = new Proxy(getters, {
14452 set: function set() {
14453 return false;
14454 },
14455 get: function get(target, prop) {
14456 if (!target[prop]) {
14457 return undefined;
14458 }
14459
14460 return getterValue(prop, false);
14461 }
14462 });
14463
14464 store.dispatch = function (actionName, data) {
14465 return new Promise(function (resolve, reject) {
14466 if (!actions[actionName]) {
14467 reject();
14468 throw new Error("Framework7: Store action \"" + actionName + "\" is not found");
14469 }
14470
14471 var result = actions[actionName]({
14472 state: store.state,
14473 dispatch: store.dispatch
14474 }, data);
14475 resolve(result);
14476 });
14477 };
14478
14479 return store;
14480 }
14481
14482 var StoreModule = {
14483 name: 'store',
14484 static: {
14485 createStore: createStore
14486 },
14487 proto: {
14488 createStore: createStore
14489 }
14490 };
14491
14492 var isCapacitor = function isCapacitor() {
14493 var window = getWindow();
14494 return window.Capacitor && window.Capacitor.isNative && window.Capacitor.Plugins && window.Capacitor.Plugins.StatusBar;
14495 };
14496
14497 var Statusbar = {
14498 hide: function hide() {
14499 var window = getWindow();
14500 var device = getDevice$1();
14501
14502 if (device.cordova && window.StatusBar) {
14503 window.StatusBar.hide();
14504 }
14505
14506 if (isCapacitor()) {
14507 window.Capacitor.Plugins.StatusBar.hide();
14508 }
14509 },
14510 show: function show() {
14511 var window = getWindow();
14512 var device = getDevice$1();
14513
14514 if (device.cordova && window.StatusBar) {
14515 window.StatusBar.show();
14516 }
14517
14518 if (isCapacitor()) {
14519 window.Capacitor.Plugins.StatusBar.show();
14520 }
14521 },
14522 onClick: function onClick() {
14523 var app = this;
14524 var pageContent;
14525
14526 if ($('.popup.modal-in').length > 0) {
14527 // Check for opened popup
14528 pageContent = $('.popup.modal-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
14529 } else if ($('.panel.panel-in').length > 0) {
14530 // Check for opened panel
14531 pageContent = $('.panel.panel-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
14532 } else if ($('.views > .view.tab-active').length > 0) {
14533 // View in tab bar app layout
14534 pageContent = $('.views > .view.tab-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
14535 } else if ($('.views').length > 0) {
14536 pageContent = $('.views').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
14537 } else {
14538 pageContent = app.$el.children('.view').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
14539 }
14540
14541 if (pageContent && pageContent.length > 0) {
14542 // Check for tab
14543 if (pageContent.hasClass('tab')) {
14544 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
14545 }
14546
14547 if (pageContent.length > 0) pageContent.scrollTop(0, 300);
14548 }
14549 },
14550 setTextColor: function setTextColor(color) {
14551 var window = getWindow();
14552 var device = getDevice$1();
14553
14554 if (device.cordova && window.StatusBar) {
14555 if (color === 'white') {
14556 window.StatusBar.styleLightContent();
14557 } else {
14558 window.StatusBar.styleDefault();
14559 }
14560 }
14561
14562 if (isCapacitor()) {
14563 if (color === 'white') {
14564 window.Capacitor.Plugins.StatusBar.setStyle({
14565 style: 'DARK'
14566 });
14567 } else {
14568 window.Capacitor.Plugins.StatusBar.setStyle({
14569 style: 'LIGHT'
14570 });
14571 }
14572 }
14573 },
14574 setBackgroundColor: function setBackgroundColor(color) {
14575 var window = getWindow();
14576 var device = getDevice$1();
14577
14578 if (device.cordova && window.StatusBar) {
14579 window.StatusBar.backgroundColorByHexString(color);
14580 }
14581
14582 if (isCapacitor()) {
14583 window.Capacitor.Plugins.StatusBar.setBackgroundColor({
14584 color: color
14585 });
14586 }
14587 },
14588 isVisible: function isVisible() {
14589 var window = getWindow();
14590 var device = getDevice$1();
14591 return new Promise(function (resolve) {
14592 if (device.cordova && window.StatusBar) {
14593 resolve(window.StatusBar.isVisible);
14594 }
14595
14596 if (isCapacitor()) {
14597 window.Capacitor.Plugins.StatusBar.getInfo().then(function (info) {
14598 resolve(info.visible);
14599 });
14600 }
14601
14602 resolve(false);
14603 });
14604 },
14605 overlaysWebView: function overlaysWebView(overlays) {
14606 if (overlays === void 0) {
14607 overlays = true;
14608 }
14609
14610 var window = getWindow();
14611 var device = getDevice$1();
14612
14613 if (device.cordova && window.StatusBar) {
14614 window.StatusBar.overlaysWebView(overlays);
14615 }
14616
14617 if (isCapacitor()) {
14618 window.Capacitor.Plugins.StatusBar.setOverlaysWebView({
14619 overlay: overlays
14620 });
14621 }
14622 },
14623 init: function init() {
14624 var app = this;
14625 var window = getWindow();
14626 var device = getDevice$1();
14627 var params = app.params.statusbar;
14628 if (!params.enabled) return;
14629 var isCordova = device.cordova && window.StatusBar;
14630 var isCap = isCapacitor();
14631
14632 if (isCordova || isCap) {
14633 if (params.scrollTopOnClick) {
14634 $(window).on('statusTap', Statusbar.onClick.bind(app));
14635 }
14636
14637 if (device.ios) {
14638 if (params.iosOverlaysWebView) {
14639 Statusbar.overlaysWebView(true);
14640 } else {
14641 Statusbar.overlaysWebView(false);
14642 }
14643
14644 if (params.iosTextColor === 'white') {
14645 Statusbar.setTextColor('white');
14646 } else {
14647 Statusbar.setTextColor('black');
14648 }
14649 }
14650
14651 if (device.android) {
14652 if (params.androidOverlaysWebView) {
14653 Statusbar.overlaysWebView(true);
14654 } else {
14655 Statusbar.overlaysWebView(false);
14656 }
14657
14658 if (params.androidTextColor === 'white') {
14659 Statusbar.setTextColor('white');
14660 } else {
14661 Statusbar.setTextColor('black');
14662 }
14663 }
14664 }
14665
14666 if (params.iosBackgroundColor && device.ios) {
14667 Statusbar.setBackgroundColor(params.iosBackgroundColor);
14668 }
14669
14670 if (params.androidBackgroundColor && device.android) {
14671 Statusbar.setBackgroundColor(params.androidBackgroundColor);
14672 }
14673 }
14674 };
14675 var Statusbar$1 = {
14676 name: 'statusbar',
14677 params: {
14678 statusbar: {
14679 enabled: true,
14680 scrollTopOnClick: true,
14681 iosOverlaysWebView: true,
14682 iosTextColor: 'black',
14683 iosBackgroundColor: null,
14684 androidOverlaysWebView: false,
14685 androidTextColor: 'black',
14686 androidBackgroundColor: null
14687 }
14688 },
14689 create: function create() {
14690 var app = this;
14691 bindMethods(app, {
14692 statusbar: Statusbar
14693 });
14694 },
14695 on: {
14696 init: function init() {
14697 var app = this;
14698 Statusbar.init.call(app);
14699 }
14700 }
14701 };
14702
14703 function getCurrentView(app) {
14704 var $popoverView = $('.popover.modal-in .view');
14705 var $popupView = $('.popup.modal-in .view');
14706 var $panelView = $('.panel.panel-in .view');
14707 var $viewsEl = $('.views');
14708 if ($viewsEl.length === 0) $viewsEl = app.$el; // Find active view as tab
14709
14710 var $viewEl = $viewsEl.children('.view');
14711
14712 if ($viewEl.length === 0) {
14713 $viewEl = $viewsEl.children('.tabs').children('.view');
14714 } // Propably in tabs or split view
14715
14716
14717 if ($viewEl.length > 1) {
14718 if ($viewEl.hasClass('tab')) {
14719 // Tabs
14720 $viewEl = $viewsEl.children('.view.tab-active');
14721
14722 if ($viewEl.length === 0) {
14723 $viewEl = $viewsEl.children('.tabs').children('.view.tab-active');
14724 }
14725 } else {// Split View, leave appView intact
14726 }
14727 }
14728
14729 if ($popoverView.length > 0 && $popoverView[0].f7View) return $popoverView[0].f7View;
14730 if ($popupView.length > 0 && $popupView[0].f7View) return $popupView[0].f7View;
14731 if ($panelView.length > 0 && $panelView[0].f7View) return $panelView[0].f7View;
14732
14733 if ($viewEl.length > 0) {
14734 if ($viewEl.length === 1 && $viewEl[0].f7View) return $viewEl[0].f7View;
14735
14736 if ($viewEl.length > 1) {
14737 return app.views.main;
14738 }
14739 }
14740
14741 return undefined;
14742 }
14743
14744 var View = {
14745 name: 'view',
14746 params: {
14747 view: {
14748 init: true,
14749 name: undefined,
14750 main: false,
14751 router: true,
14752 linksView: null,
14753 stackPages: false,
14754 xhrCache: true,
14755 xhrCacheIgnore: [],
14756 xhrCacheIgnoreGetParameters: false,
14757 xhrCacheDuration: 1000 * 60 * 10,
14758 // Ten minutes
14759 componentCache: true,
14760 preloadPreviousPage: true,
14761 allowDuplicateUrls: false,
14762 reloadPages: false,
14763 reloadDetail: false,
14764 masterDetailBreakpoint: 0,
14765 masterDetailResizable: false,
14766 removeElements: true,
14767 removeElementsWithTimeout: false,
14768 removeElementsTimeout: 0,
14769 restoreScrollTopOnBack: true,
14770 unloadTabContent: true,
14771 passRouteQueryToRequest: true,
14772 passRouteParamsToRequest: false,
14773 loadInitialPage: true,
14774 // Swipe Back
14775 iosSwipeBack: true,
14776 iosSwipeBackAnimateShadow: true,
14777 iosSwipeBackAnimateOpacity: true,
14778 iosSwipeBackActiveArea: 30,
14779 iosSwipeBackThreshold: 0,
14780 mdSwipeBack: false,
14781 mdSwipeBackAnimateShadow: true,
14782 mdSwipeBackAnimateOpacity: false,
14783 mdSwipeBackActiveArea: 30,
14784 mdSwipeBackThreshold: 0,
14785 auroraSwipeBack: false,
14786 auroraSwipeBackAnimateShadow: false,
14787 auroraSwipeBackAnimateOpacity: true,
14788 auroraSwipeBackActiveArea: 30,
14789 auroraSwipeBackThreshold: 0,
14790 // Push State
14791 browserHistory: false,
14792 browserHistoryRoot: undefined,
14793 browserHistoryAnimate: true,
14794 browserHistoryAnimateOnLoad: false,
14795 browserHistorySeparator: '#!',
14796 browserHistoryOnLoad: true,
14797 browserHistoryInitialMatch: false,
14798 browserHistoryStoreHistory: true,
14799 // Animate Pages
14800 animate: true,
14801 // iOS Dynamic Navbar
14802 iosDynamicNavbar: true,
14803 // Animate iOS Navbar Back Icon
14804 iosAnimateNavbarBackIcon: true,
14805 // Delays
14806 iosPageLoadDelay: 0,
14807 mdPageLoadDelay: 0,
14808 auroraPageLoadDelay: 0,
14809 // Routes hooks
14810 routesBeforeEnter: null,
14811 routesBeforeLeave: null
14812 }
14813 },
14814 static: {
14815 View: View$1
14816 },
14817 create: function create() {
14818 var app = this;
14819 extend$1(app, {
14820 views: extend$1([], {
14821 create: function create(el, params) {
14822 return new View$1(app, el, params);
14823 },
14824 get: function get(viewEl) {
14825 var $viewEl = $(viewEl);
14826 if ($viewEl.length && $viewEl[0].f7View) return $viewEl[0].f7View;
14827 return undefined;
14828 }
14829 })
14830 });
14831 Object.defineProperty(app.views, 'current', {
14832 enumerable: true,
14833 configurable: true,
14834 get: function get() {
14835 return getCurrentView(app);
14836 }
14837 }); // Alias
14838
14839 app.view = app.views;
14840 },
14841 on: {
14842 init: function init() {
14843 var app = this;
14844 $('.view-init').each(function (viewEl) {
14845 if (viewEl.f7View) return;
14846 var viewParams = $(viewEl).dataset();
14847 app.views.create(viewEl, viewParams);
14848 });
14849 },
14850 'modalOpen panelOpen': function onOpen(instance) {
14851 var app = this;
14852 instance.$el.find('.view-init').each(function (viewEl) {
14853 if (viewEl.f7View) return;
14854 var viewParams = $(viewEl).dataset();
14855 app.views.create(viewEl, viewParams);
14856 });
14857 },
14858 'modalBeforeDestroy panelBeforeDestroy': function onClose(instance) {
14859 if (!instance || !instance.$el) return;
14860 instance.$el.find('.view-init').each(function (viewEl) {
14861 var view = viewEl.f7View;
14862 if (!view) return;
14863 view.destroy();
14864 });
14865 }
14866 },
14867 vnode: {
14868 'view-init': {
14869 insert: function insert(vnode) {
14870 var app = this;
14871 var viewEl = vnode.elm;
14872 if (viewEl.f7View) return;
14873 var viewParams = $(viewEl).dataset();
14874 app.views.create(viewEl, viewParams);
14875 },
14876 destroy: function destroy(vnode) {
14877 var viewEl = vnode.elm;
14878 var view = viewEl.f7View;
14879 if (!view) return;
14880 view.destroy();
14881 }
14882 }
14883 }
14884 };
14885
14886 var Navbar = {
14887 size: function size(el) {
14888 var app = this;
14889 var $el = $(el);
14890
14891 if ($el.hasClass('navbars')) {
14892 $el = $el.children('.navbar').each(function (navbarEl) {
14893 app.navbar.size(navbarEl);
14894 });
14895 return;
14896 }
14897
14898 var $innerEl = $el.children('.navbar-inner');
14899 if (!$innerEl.length) return;
14900 var needCenterTitle = $innerEl.hasClass('navbar-inner-centered-title') || app.params.navbar[app.theme + "CenterTitle"];
14901 var needLeftTitle = app.theme === 'ios' && !app.params.navbar[app.theme + "CenterTitle"];
14902 if (!needCenterTitle && !needLeftTitle) return;
14903
14904 if ($el.hasClass('stacked') || $el.parents('.stacked').length > 0 || $el.parents('.tab:not(.tab-active)').length > 0 || $el.parents('.popup:not(.modal-in)').length > 0) {
14905 return;
14906 }
14907
14908 if (app.theme !== 'ios' && app.params.navbar[app.theme + "CenterTitle"]) {
14909 $innerEl.addClass('navbar-inner-centered-title');
14910 }
14911
14912 if (app.theme === 'ios' && !app.params.navbar.iosCenterTitle) {
14913 $innerEl.addClass('navbar-inner-left-title');
14914 }
14915
14916 var $viewEl = $el.parents('.view').eq(0);
14917 var left = app.rtl ? $innerEl.children('.right') : $innerEl.children('.left');
14918 var right = app.rtl ? $innerEl.children('.left') : $innerEl.children('.right');
14919 var title = $innerEl.children('.title');
14920 var subnavbar = $innerEl.children('.subnavbar');
14921 var noLeft = left.length === 0;
14922 var noRight = right.length === 0;
14923 var leftWidth = noLeft ? 0 : left.outerWidth(true);
14924 var rightWidth = noRight ? 0 : right.outerWidth(true);
14925 var titleWidth = title.outerWidth(true);
14926 var navbarStyles = $innerEl.styles();
14927 var navbarWidth = $innerEl[0].offsetWidth;
14928 var navbarInnerWidth = navbarWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10);
14929 var isPrevious = $el.hasClass('navbar-previous');
14930 var sliding = $innerEl.hasClass('sliding');
14931 var router;
14932 var dynamicNavbar;
14933
14934 if ($viewEl.length > 0 && $viewEl[0].f7View) {
14935 router = $viewEl[0].f7View.router;
14936 dynamicNavbar = router && router.dynamicNavbar;
14937 }
14938
14939 var currLeft;
14940 var diff;
14941
14942 if (noRight) {
14943 currLeft = navbarInnerWidth - titleWidth;
14944 }
14945
14946 if (noLeft) {
14947 currLeft = 0;
14948 }
14949
14950 if (!noLeft && !noRight) {
14951 currLeft = (navbarInnerWidth - rightWidth - titleWidth + leftWidth) / 2;
14952 }
14953
14954 var requiredLeft = (navbarInnerWidth - titleWidth) / 2;
14955
14956 if (navbarInnerWidth - leftWidth - rightWidth > titleWidth) {
14957 if (requiredLeft < leftWidth) {
14958 requiredLeft = leftWidth;
14959 }
14960
14961 if (requiredLeft + titleWidth > navbarInnerWidth - rightWidth) {
14962 requiredLeft = navbarInnerWidth - rightWidth - titleWidth;
14963 }
14964
14965 diff = requiredLeft - currLeft;
14966 } else {
14967 diff = 0;
14968 } // RTL inverter
14969
14970
14971 var inverter = app.rtl ? -1 : 1;
14972
14973 if (dynamicNavbar && app.theme === 'ios') {
14974 if (title.hasClass('sliding') || title.length > 0 && sliding) {
14975 var titleLeftOffset = -(currLeft + diff) * inverter;
14976 var titleRightOffset = (navbarInnerWidth - currLeft - diff - titleWidth) * inverter;
14977
14978 if (isPrevious) {
14979 if (router && router.params.iosAnimateNavbarBackIcon) {
14980 var activeNavbarBackLink = $el.parent().find('.navbar-current').children('.left.sliding').find('.back .icon ~ span');
14981
14982 if (activeNavbarBackLink.length > 0) {
14983 titleLeftOffset += activeNavbarBackLink[0].offsetLeft;
14984 }
14985 }
14986 }
14987
14988 title[0].f7NavbarLeftOffset = titleLeftOffset;
14989 title[0].f7NavbarRightOffset = titleRightOffset;
14990 }
14991
14992 if (!noLeft && (left.hasClass('sliding') || sliding)) {
14993 if (app.rtl) {
14994 left[0].f7NavbarLeftOffset = -(navbarInnerWidth - left[0].offsetWidth) / 2 * inverter;
14995 left[0].f7NavbarRightOffset = leftWidth * inverter;
14996 } else {
14997 left[0].f7NavbarLeftOffset = -leftWidth;
14998 left[0].f7NavbarRightOffset = (navbarInnerWidth - left[0].offsetWidth) / 2;
14999
15000 if (router && router.params.iosAnimateNavbarBackIcon && left.find('.back .icon').length > 0) {
15001 if (left.find('.back .icon ~ span').length) {
15002 var leftOffset = left[0].f7NavbarLeftOffset;
15003 var rightOffset = left[0].f7NavbarRightOffset;
15004 left[0].f7NavbarLeftOffset = 0;
15005 left[0].f7NavbarRightOffset = 0;
15006 left.find('.back .icon ~ span')[0].f7NavbarLeftOffset = leftOffset;
15007 left.find('.back .icon ~ span')[0].f7NavbarRightOffset = rightOffset - left.find('.back .icon')[0].offsetWidth;
15008 }
15009 }
15010 }
15011 }
15012
15013 if (!noRight && (right.hasClass('sliding') || sliding)) {
15014 if (app.rtl) {
15015 right[0].f7NavbarLeftOffset = -rightWidth * inverter;
15016 right[0].f7NavbarRightOffset = (navbarInnerWidth - right[0].offsetWidth) / 2 * inverter;
15017 } else {
15018 right[0].f7NavbarLeftOffset = -(navbarInnerWidth - right[0].offsetWidth) / 2;
15019 right[0].f7NavbarRightOffset = rightWidth;
15020 }
15021 }
15022
15023 if (subnavbar.length && (subnavbar.hasClass('sliding') || sliding)) {
15024 subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : -subnavbar[0].offsetWidth;
15025 subnavbar[0].f7NavbarRightOffset = -subnavbar[0].f7NavbarLeftOffset;
15026 }
15027 } // Center title
15028
15029
15030 if (needCenterTitle) {
15031 var titleLeft = diff;
15032 if (app.rtl && noLeft && noRight && title.length > 0) titleLeft = -titleLeft;
15033 title.css({
15034 left: titleLeft + "px"
15035 });
15036 }
15037 },
15038 hide: function hide(el, animate, hideStatusbar, hideOnlyCurrent) {
15039 if (animate === void 0) {
15040 animate = true;
15041 }
15042
15043 if (hideStatusbar === void 0) {
15044 hideStatusbar = false;
15045 }
15046
15047 if (hideOnlyCurrent === void 0) {
15048 hideOnlyCurrent = false;
15049 }
15050
15051 var app = this;
15052 var $el = $(el);
15053 var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length && !hideOnlyCurrent;
15054 if (isDynamic) $el = $el.parents('.navbars');
15055 if (!$el.length) return;
15056 if ($el.hasClass('navbar-hidden')) return;
15057 var className = "navbar-hidden" + (animate ? ' navbar-transitioning' : '');
15058 var currentIsLarge = isDynamic ? $el.find('.navbar-current .title-large').length : $el.find('.title-large').length;
15059
15060 if (currentIsLarge) {
15061 className += ' navbar-large-hidden';
15062 }
15063
15064 if (hideStatusbar) {
15065 className += ' navbar-hidden-statusbar';
15066 }
15067
15068 $el.transitionEnd(function () {
15069 $el.removeClass('navbar-transitioning');
15070 });
15071 $el.addClass(className);
15072
15073 if (isDynamic) {
15074 $el.children('.navbar').each(function (subEl) {
15075 $(subEl).trigger('navbar:hide');
15076 app.emit('navbarHide', subEl);
15077 });
15078 } else {
15079 $el.trigger('navbar:hide');
15080 app.emit('navbarHide', $el[0]);
15081 }
15082 },
15083 show: function show(el, animate, hideOnlyCurrent) {
15084 if (el === void 0) {
15085 el = '.navbar-hidden';
15086 }
15087
15088 if (animate === void 0) {
15089 animate = true;
15090 }
15091
15092 if (hideOnlyCurrent === void 0) {
15093 hideOnlyCurrent = false;
15094 }
15095
15096 var app = this;
15097 var $el = $(el);
15098 var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length && !hideOnlyCurrent;
15099 if (isDynamic) $el = $el.parents('.navbars');
15100 if (!$el.length) return;
15101 if (!$el.hasClass('navbar-hidden')) return;
15102
15103 if (animate) {
15104 $el.addClass('navbar-transitioning');
15105 $el.transitionEnd(function () {
15106 $el.removeClass('navbar-transitioning');
15107 });
15108 }
15109
15110 $el.removeClass('navbar-hidden navbar-large-hidden navbar-hidden-statusbar');
15111
15112 if (isDynamic) {
15113 $el.children('.navbar').each(function (subEl) {
15114 $(subEl).trigger('navbar:show');
15115 app.emit('navbarShow', subEl);
15116 });
15117 } else {
15118 $el.trigger('navbar:show');
15119 app.emit('navbarShow', $el[0]);
15120 }
15121 },
15122 getElByPage: function getElByPage(page) {
15123 var $pageEl;
15124 var $navbarEl;
15125 var pageData;
15126
15127 if (page.$navbarEl || page.$el) {
15128 pageData = page;
15129 $pageEl = page.$el;
15130 } else {
15131 $pageEl = $(page);
15132 if ($pageEl.length > 0) pageData = $pageEl[0].f7Page;
15133 }
15134
15135 if (pageData && pageData.$navbarEl && pageData.$navbarEl.length > 0) {
15136 $navbarEl = pageData.$navbarEl;
15137 } else if ($pageEl) {
15138 $navbarEl = $pageEl.children('.navbar');
15139 }
15140
15141 if (!$navbarEl || $navbarEl && $navbarEl.length === 0) return undefined;
15142 return $navbarEl[0];
15143 },
15144 getPageByEl: function getPageByEl(navbarEl) {
15145 var $navbarEl = $(navbarEl);
15146
15147 if ($navbarEl.parents('.page').length) {
15148 return $navbarEl.parents('.page')[0];
15149 }
15150
15151 var pageEl;
15152 $navbarEl.parents('.view').find('.page').each(function (el) {
15153 if (el && el.f7Page && el.f7Page.navbarEl && $navbarEl[0] === el.f7Page.navbarEl) {
15154 pageEl = el;
15155 }
15156 });
15157 return pageEl;
15158 },
15159 collapseLargeTitle: function collapseLargeTitle(navbarEl) {
15160 var app = this;
15161 var $navbarEl = $(navbarEl);
15162
15163 if ($navbarEl.hasClass('navbars')) {
15164 $navbarEl = $navbarEl.find('.navbar');
15165
15166 if ($navbarEl.length > 1) {
15167 $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
15168 }
15169
15170 if ($navbarEl.length > 1 || !$navbarEl.length) {
15171 return;
15172 }
15173 }
15174
15175 var $pageEl = $(app.navbar.getPageByEl($navbarEl));
15176 $navbarEl.addClass('navbar-large-collapsed');
15177 $pageEl.eq(0).addClass('page-with-navbar-large-collapsed').trigger('page:navbarlargecollapsed');
15178 app.emit('pageNavbarLargeCollapsed', $pageEl[0]);
15179 $navbarEl.trigger('navbar:collapse');
15180 app.emit('navbarCollapse', $navbarEl[0]);
15181 },
15182 expandLargeTitle: function expandLargeTitle(navbarEl) {
15183 var app = this;
15184 var $navbarEl = $(navbarEl);
15185
15186 if ($navbarEl.hasClass('navbars')) {
15187 $navbarEl = $navbarEl.find('.navbar-large');
15188
15189 if ($navbarEl.length > 1) {
15190 $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
15191 }
15192
15193 if ($navbarEl.length > 1 || !$navbarEl.length) {
15194 return;
15195 }
15196 }
15197
15198 var $pageEl = $(app.navbar.getPageByEl($navbarEl));
15199 $navbarEl.removeClass('navbar-large-collapsed');
15200 $pageEl.eq(0).removeClass('page-with-navbar-large-collapsed').trigger('page:navbarlargeexpanded');
15201 app.emit('pageNavbarLargeExpanded', $pageEl[0]);
15202 $navbarEl.trigger('navbar:expand');
15203 app.emit('navbarExpand', $navbarEl[0]);
15204 },
15205 toggleLargeTitle: function toggleLargeTitle(navbarEl) {
15206 var app = this;
15207 var $navbarEl = $(navbarEl);
15208
15209 if ($navbarEl.hasClass('navbars')) {
15210 $navbarEl = $navbarEl.find('.navbar-large');
15211
15212 if ($navbarEl.length > 1) {
15213 $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
15214 }
15215
15216 if ($navbarEl.length > 1 || !$navbarEl.length) {
15217 return;
15218 }
15219 }
15220
15221 if ($navbarEl.hasClass('navbar-large-collapsed')) {
15222 app.navbar.expandLargeTitle($navbarEl);
15223 } else {
15224 app.navbar.collapseLargeTitle($navbarEl);
15225 }
15226 },
15227 initNavbarOnScroll: function initNavbarOnScroll(pageEl, navbarEl, needHide, needCollapse, needTransparent) {
15228 var app = this;
15229 var support = getSupport$1();
15230 var $pageEl = $(pageEl);
15231 var $navbarEl = $(navbarEl);
15232 var $titleLargeEl = $navbarEl.find('.title-large');
15233 var isLarge = $titleLargeEl.length || $navbarEl.hasClass('.navbar-large');
15234 var navbarHideHeight = 44;
15235 var snapPageScrollToLargeTitle = app.params.navbar.snapPageScrollToLargeTitle;
15236 var snapPageScrollToTransparentNavbar = app.params.navbar.snapPageScrollToTransparentNavbar;
15237 var previousScrollTop;
15238 var currentScrollTop;
15239 var scrollHeight;
15240 var offsetHeight;
15241 var reachEnd;
15242 var action;
15243 var navbarHidden;
15244 var navbarCollapsed;
15245 var navbarTitleLargeHeight;
15246 var navbarOffsetHeight;
15247
15248 if (needCollapse || needHide && isLarge) {
15249 navbarTitleLargeHeight = $navbarEl.css('--f7-navbar-large-title-height');
15250
15251 if (navbarTitleLargeHeight && navbarTitleLargeHeight.indexOf('px') >= 0) {
15252 navbarTitleLargeHeight = parseInt(navbarTitleLargeHeight, 10);
15253
15254 if (Number.isNaN(navbarTitleLargeHeight) && $titleLargeEl.length) {
15255 navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
15256 } else if (Number.isNaN(navbarTitleLargeHeight)) {
15257 if (app.theme === 'ios') navbarTitleLargeHeight = 52;else if (app.theme === 'md') navbarTitleLargeHeight = 48;else if (app.theme === 'aurora') navbarTitleLargeHeight = 38;
15258 }
15259 } else if ($titleLargeEl.length) {
15260 navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
15261 } else {
15262 // eslint-disable-next-line
15263 if (app.theme === 'ios') navbarTitleLargeHeight = 52;else if (app.theme === 'md') navbarTitleLargeHeight = 48;else if (app.theme === 'aurora') navbarTitleLargeHeight = 38;
15264 }
15265 }
15266
15267 if (needHide && isLarge) {
15268 navbarHideHeight += navbarTitleLargeHeight;
15269 }
15270
15271 var scrollChanged;
15272 var scrollContent;
15273 var scrollTimeoutId;
15274 var touchEndTimeoutId;
15275 var touchSnapTimeout = 70;
15276 var desktopSnapTimeout = 300;
15277
15278 function calcScrollableDistance() {
15279 $pageEl.find('.page-content').each(function (pageContentEl) {
15280 pageContentEl.f7ScrollableDistance = pageContentEl.scrollHeight - pageContentEl.offsetHeight;
15281 });
15282 }
15283
15284 function snapLargeNavbar() {
15285 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
15286 if (inSearchbarExpanded) return;
15287 if (!scrollContent || currentScrollTop < 0) return;
15288
15289 if (currentScrollTop >= navbarTitleLargeHeight / 2 && currentScrollTop < navbarTitleLargeHeight) {
15290 $(scrollContent).scrollTop(navbarTitleLargeHeight, 100);
15291 } else if (currentScrollTop < navbarTitleLargeHeight) {
15292 $(scrollContent).scrollTop(0, 200);
15293 }
15294 }
15295
15296 function snapTransparentNavbar() {
15297 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
15298 if (inSearchbarExpanded) return;
15299 if (!scrollContent || currentScrollTop < 0) return;
15300
15301 if (currentScrollTop >= navbarOffsetHeight / 2 && currentScrollTop < navbarOffsetHeight) {
15302 $(scrollContent).scrollTop(navbarOffsetHeight, 100);
15303 } else if (currentScrollTop < navbarOffsetHeight) {
15304 $(scrollContent).scrollTop(0, 200);
15305 }
15306 }
15307
15308 function handleNavbarTransparent() {
15309 var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
15310 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
15311 if (inSearchbarExpanded || isHidden) return;
15312
15313 if (!navbarOffsetHeight) {
15314 navbarOffsetHeight = navbarEl.offsetHeight;
15315 }
15316
15317 var opacity = currentScrollTop / navbarOffsetHeight;
15318 var notTransparent = $navbarEl.hasClass('navbar-transparent-visible');
15319 opacity = Math.max(Math.min(opacity, 1), 0);
15320
15321 if (notTransparent && opacity === 1 || !notTransparent && opacity === 0) {
15322 $navbarEl.find('.navbar-bg, .title').css('opacity', '');
15323 return;
15324 }
15325
15326 if (notTransparent && opacity === 0) {
15327 $navbarEl.trigger('navbar:transparenthide');
15328 app.emit('navbarTransparentHide', $navbarEl[0]);
15329 $navbarEl.removeClass('navbar-transparent-visible');
15330 $navbarEl.find('.navbar-bg, .title').css('opacity', '');
15331 return;
15332 }
15333
15334 if (!notTransparent && opacity === 1) {
15335 $navbarEl.trigger('navbar:transparentshow');
15336 app.emit('navbarTransparentShow', $navbarEl[0]);
15337 $navbarEl.addClass('navbar-transparent-visible');
15338 $navbarEl.find('.navbar-bg, .title').css('opacity', '');
15339 return;
15340 }
15341
15342 $navbarEl.find('.navbar-bg, .title').css('opacity', opacity);
15343
15344 if (snapPageScrollToTransparentNavbar) {
15345 if (!support.touch) {
15346 clearTimeout(scrollTimeoutId);
15347 scrollTimeoutId = setTimeout(function () {
15348 snapTransparentNavbar();
15349 }, desktopSnapTimeout);
15350 } else if (touchEndTimeoutId) {
15351 clearTimeout(touchEndTimeoutId);
15352 touchEndTimeoutId = null;
15353 touchEndTimeoutId = setTimeout(function () {
15354 snapTransparentNavbar();
15355 clearTimeout(touchEndTimeoutId);
15356 touchEndTimeoutId = null;
15357 }, touchSnapTimeout);
15358 }
15359 }
15360 }
15361
15362 var previousCollapseProgress = null;
15363 var collapseProgress = null;
15364
15365 function handleLargeNavbarCollapse(pageContentEl) {
15366 var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
15367 if (isHidden) return;
15368 var isLargeTransparent = $navbarEl.hasClass('navbar-large-transparent') || $navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-transparent');
15369 previousCollapseProgress = collapseProgress;
15370 var scrollableDistance = Math.min(navbarTitleLargeHeight, pageContentEl.f7ScrollableDistance || navbarTitleLargeHeight);
15371 collapseProgress = Math.min(Math.max(currentScrollTop / scrollableDistance, 0), 1);
15372 var previousCollapseWasInMiddle = previousCollapseProgress > 0 && previousCollapseProgress < 1;
15373 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
15374 if (inSearchbarExpanded) return;
15375 navbarCollapsed = $navbarEl.hasClass('navbar-large-collapsed');
15376
15377 if (collapseProgress === 0 && navbarCollapsed) {
15378 app.navbar.expandLargeTitle($navbarEl[0]);
15379 } else if (collapseProgress === 1 && !navbarCollapsed) {
15380 app.navbar.collapseLargeTitle($navbarEl[0]);
15381 }
15382
15383 if (collapseProgress === 0 && navbarCollapsed || collapseProgress === 0 && previousCollapseWasInMiddle || collapseProgress === 1 && !navbarCollapsed || collapseProgress === 1 && previousCollapseWasInMiddle) {
15384 if (app.theme === 'md') {
15385 $navbarEl.find('.navbar-inner').css('overflow', '');
15386 }
15387
15388 $navbarEl.find('.title').css('opacity', '');
15389 $navbarEl.find('.title-large-text, .subnavbar').css('transform', '');
15390
15391 if (isLargeTransparent) {
15392 $navbarEl.find('.navbar-bg').css('opacity', '');
15393 } else {
15394 $navbarEl.find('.navbar-bg').css('transform', '');
15395 }
15396 } else if (collapseProgress > 0 && collapseProgress < 1) {
15397 if (app.theme === 'md') {
15398 $navbarEl.find('.navbar-inner').css('overflow', 'visible');
15399 }
15400
15401 $navbarEl.find('.title').css('opacity', collapseProgress);
15402 $navbarEl.find('.title-large-text, .subnavbar').css('transform', "translate3d(0px, " + -1 * collapseProgress * navbarTitleLargeHeight + "px, 0)");
15403
15404 if (isLargeTransparent) {
15405 $navbarEl.find('.navbar-bg').css('opacity', collapseProgress);
15406 } else {
15407 $navbarEl.find('.navbar-bg').css('transform', "translate3d(0px, " + -1 * collapseProgress * navbarTitleLargeHeight + "px, 0)");
15408 }
15409 }
15410
15411 if (snapPageScrollToLargeTitle) {
15412 if (!support.touch) {
15413 clearTimeout(scrollTimeoutId);
15414 scrollTimeoutId = setTimeout(function () {
15415 snapLargeNavbar();
15416 }, desktopSnapTimeout);
15417 } else if (touchEndTimeoutId) {
15418 clearTimeout(touchEndTimeoutId);
15419 touchEndTimeoutId = null;
15420 touchEndTimeoutId = setTimeout(function () {
15421 snapLargeNavbar();
15422 clearTimeout(touchEndTimeoutId);
15423 touchEndTimeoutId = null;
15424 }, touchSnapTimeout);
15425 }
15426 }
15427 }
15428
15429 function handleTitleHideShow() {
15430 if ($pageEl.hasClass('page-with-card-opened')) return;
15431 scrollHeight = scrollContent.scrollHeight;
15432 offsetHeight = scrollContent.offsetHeight;
15433 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
15434 navbarHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
15435
15436 if (reachEnd) {
15437 if (app.params.navbar.showOnPageScrollEnd) {
15438 action = 'show';
15439 }
15440 } else if (previousScrollTop > currentScrollTop) {
15441 if (app.params.navbar.showOnPageScrollTop || currentScrollTop <= navbarHideHeight) {
15442 action = 'show';
15443 } else {
15444 action = 'hide';
15445 }
15446 } else if (currentScrollTop > navbarHideHeight) {
15447 action = 'hide';
15448 } else {
15449 action = 'show';
15450 }
15451
15452 if (action === 'show' && navbarHidden) {
15453 app.navbar.show($navbarEl, true, true);
15454 navbarHidden = false;
15455 } else if (action === 'hide' && !navbarHidden) {
15456 app.navbar.hide($navbarEl, true, false, true);
15457 navbarHidden = true;
15458 }
15459
15460 previousScrollTop = currentScrollTop;
15461 }
15462
15463 function handleScroll(e) {
15464 scrollContent = this;
15465
15466 if (e && e.target && e.target !== scrollContent) {
15467 return;
15468 }
15469
15470 currentScrollTop = scrollContent.scrollTop;
15471 scrollChanged = currentScrollTop;
15472
15473 if (needCollapse) {
15474 handleLargeNavbarCollapse(scrollContent);
15475 } else if (needTransparent) {
15476 handleNavbarTransparent();
15477 }
15478
15479 if ($pageEl.hasClass('page-previous')) return;
15480
15481 if (needHide) {
15482 handleTitleHideShow();
15483 }
15484 }
15485
15486 function handeTouchStart() {
15487 scrollChanged = false;
15488 }
15489
15490 function handleTouchEnd() {
15491 clearTimeout(touchEndTimeoutId);
15492 touchEndTimeoutId = null;
15493 touchEndTimeoutId = setTimeout(function () {
15494 if (scrollChanged !== false) {
15495 if (needTransparent && !needCollapse) {
15496 snapTransparentNavbar();
15497 } else {
15498 snapLargeNavbar();
15499 }
15500
15501 clearTimeout(touchEndTimeoutId);
15502 touchEndTimeoutId = null;
15503 }
15504 }, touchSnapTimeout);
15505 }
15506
15507 $pageEl.on('scroll', '.page-content', handleScroll, true);
15508
15509 if (support.touch && (needCollapse && snapPageScrollToLargeTitle || needTransparent && snapPageScrollToTransparentNavbar)) {
15510 app.on('touchstart:passive', handeTouchStart);
15511 app.on('touchend:passive', handleTouchEnd);
15512 }
15513
15514 calcScrollableDistance();
15515
15516 if (needCollapse || needTransparent) {
15517 $pageEl.find('.page-content').each(function (pageContentEl) {
15518 if (pageContentEl.scrollTop > 0) handleScroll.call(pageContentEl);
15519 });
15520 }
15521
15522 app.on('resize', calcScrollableDistance);
15523
15524 $pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
15525 app.off('resize', calcScrollableDistance);
15526 delete $pageEl[0].f7DetachNavbarScrollHandlers;
15527 $pageEl.off('scroll', '.page-content', handleScroll, true);
15528
15529 if (support.touch && (needCollapse && snapPageScrollToLargeTitle || needTransparent && snapPageScrollToTransparentNavbar)) {
15530 app.off('touchstart:passive', handeTouchStart);
15531 app.off('touchend:passive', handleTouchEnd);
15532 }
15533 };
15534 }
15535 };
15536 var Navbar$1 = {
15537 name: 'navbar',
15538 create: function create() {
15539 var app = this;
15540 bindMethods(app, {
15541 navbar: Navbar
15542 });
15543 },
15544 params: {
15545 navbar: {
15546 scrollTopOnTitleClick: true,
15547 iosCenterTitle: true,
15548 mdCenterTitle: false,
15549 auroraCenterTitle: true,
15550 hideOnPageScroll: false,
15551 showOnPageScrollEnd: true,
15552 showOnPageScrollTop: true,
15553 collapseLargeTitleOnScroll: true,
15554 snapPageScrollToLargeTitle: true,
15555 snapPageScrollToTransparentNavbar: true
15556 }
15557 },
15558 on: {
15559 'panelBreakpoint panelCollapsedBreakpoint panelResize viewResize resize viewMasterDetailBreakpoint': function onPanelResize() {
15560 var app = this;
15561 $('.navbar').each(function (navbarEl) {
15562 app.navbar.size(navbarEl);
15563 });
15564 },
15565 pageBeforeRemove: function pageBeforeRemove(page) {
15566 if (page.$el[0].f7DetachNavbarScrollHandlers) {
15567 page.$el[0].f7DetachNavbarScrollHandlers();
15568 }
15569 },
15570 pageBeforeIn: function pageBeforeIn(page) {
15571 var app = this;
15572 if (app.theme !== 'ios') return;
15573 var $navbarsEl;
15574 var view = page.$el.parents('.view')[0].f7View;
15575 var navbarEl = app.navbar.getElByPage(page);
15576
15577 if (!navbarEl) {
15578 $navbarsEl = page.$el.parents('.view').children('.navbars');
15579 } else {
15580 $navbarsEl = $(navbarEl).parents('.navbars');
15581 }
15582
15583 if (page.$el.hasClass('no-navbar') || view.router.dynamicNavbar && !navbarEl) {
15584 var animate = !!(page.pageFrom && page.router.history.length > 0);
15585 app.navbar.hide($navbarsEl, animate);
15586 } else {
15587 app.navbar.show($navbarsEl);
15588 }
15589 },
15590 pageReinit: function pageReinit(page) {
15591 var app = this;
15592 var $navbarEl = $(app.navbar.getElByPage(page));
15593 if (!$navbarEl || $navbarEl.length === 0) return;
15594 app.navbar.size($navbarEl);
15595 },
15596 pageInit: function pageInit(page) {
15597 var app = this;
15598 var $navbarEl = $(app.navbar.getElByPage(page));
15599 if (!$navbarEl || $navbarEl.length === 0) return; // Size
15600
15601 app.navbar.size($navbarEl); // Need Collapse On Scroll
15602
15603 var needCollapseOnScrollHandler;
15604
15605 if ($navbarEl.find('.title-large').length > 0) {
15606 $navbarEl.addClass('navbar-large');
15607 }
15608
15609 if ($navbarEl.hasClass('navbar-large')) {
15610 if (app.params.navbar.collapseLargeTitleOnScroll) needCollapseOnScrollHandler = true;
15611 page.$el.addClass('page-with-navbar-large');
15612 } // Need transparent on scroll
15613
15614
15615 var needTransparentOnScroll;
15616
15617 if (!needCollapseOnScrollHandler && $navbarEl.hasClass('navbar-transparent')) {
15618 needTransparentOnScroll = true;
15619 } // Need Hide On Scroll
15620
15621
15622 var needHideOnScrollHandler;
15623
15624 if (app.params.navbar.hideOnPageScroll || page.$el.find('.hide-navbar-on-scroll').length || page.$el.hasClass('hide-navbar-on-scroll') || page.$el.find('.hide-bars-on-scroll').length || page.$el.hasClass('hide-bars-on-scroll')) {
15625 if (page.$el.find('.keep-navbar-on-scroll').length || page.$el.hasClass('keep-navbar-on-scroll') || page.$el.find('.keep-bars-on-scroll').length || page.$el.hasClass('keep-bars-on-scroll')) {
15626 needHideOnScrollHandler = false;
15627 } else {
15628 needHideOnScrollHandler = true;
15629 }
15630 }
15631
15632 if (needCollapseOnScrollHandler || needHideOnScrollHandler || needTransparentOnScroll) {
15633 app.navbar.initNavbarOnScroll(page.el, $navbarEl[0], needHideOnScrollHandler, needCollapseOnScrollHandler, needTransparentOnScroll);
15634 }
15635 },
15636 'panelOpen panelSwipeOpen modalOpen': function onPanelModalOpen(instance) {
15637 var app = this;
15638 instance.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (navbarEl) {
15639 app.navbar.size(navbarEl);
15640 });
15641 },
15642 tabShow: function tabShow(tabEl) {
15643 var app = this;
15644 $(tabEl).find('.navbar:not(.navbar-previous):not(.stacked)').each(function (navbarEl) {
15645 app.navbar.size(navbarEl);
15646 });
15647 }
15648 },
15649 clicks: {
15650 '.navbar .title': function onTitleClick($clickedEl) {
15651 var app = this;
15652 if (!app.params.navbar.scrollTopOnTitleClick) return;
15653
15654 if ($clickedEl.closest('a').length > 0) {
15655 return;
15656 }
15657
15658 var $pageContentEl; // Find active page
15659
15660 var $navbarEl = $clickedEl.parents('.navbar');
15661 var $navbarsEl = $navbarEl.parents('.navbars'); // Static Layout
15662
15663 $pageContentEl = $navbarEl.parents('.page-content');
15664
15665 if ($pageContentEl.length === 0) {
15666 // Fixed Layout
15667 if ($navbarEl.parents('.page').length > 0) {
15668 $pageContentEl = $navbarEl.parents('.page').find('.page-content');
15669 } // Through Layout iOS
15670
15671
15672 if ($pageContentEl.length === 0 && $navbarsEl.length) {
15673 if ($navbarsEl.nextAll('.page-current:not(.stacked)').length > 0) {
15674 $pageContentEl = $navbarsEl.nextAll('.page-current:not(.stacked)').find('.page-content');
15675 }
15676 } // Through Layout
15677
15678
15679 if ($pageContentEl.length === 0) {
15680 if ($navbarEl.nextAll('.page-current:not(.stacked)').length > 0) {
15681 $pageContentEl = $navbarEl.nextAll('.page-current:not(.stacked)').find('.page-content');
15682 }
15683 }
15684 }
15685
15686 if ($pageContentEl && $pageContentEl.length > 0) {
15687 // Check for tab
15688 if ($pageContentEl.hasClass('tab')) {
15689 $pageContentEl = $pageContentEl.parent('.tabs').children('.page-content.tab-active');
15690 }
15691
15692 if ($pageContentEl.length > 0) $pageContentEl.scrollTop(0, 300);
15693 }
15694 }
15695 },
15696 vnode: {
15697 navbar: {
15698 postpatch: function postpatch(vnode) {
15699 var app = this;
15700 app.navbar.size(vnode.elm);
15701 }
15702 }
15703 }
15704 };
15705
15706 var Toolbar = {
15707 setHighlight: function setHighlight(tabbarEl) {
15708 var app = this;
15709 if (app.theme === 'ios') return;
15710 var $tabbarEl = $(tabbarEl);
15711 if ($tabbarEl.length === 0 || !($tabbarEl.hasClass('tabbar') || $tabbarEl.hasClass('tabbar-labels'))) return;
15712 var $highlightEl = $tabbarEl.find('.tab-link-highlight');
15713 var tabLinksCount = $tabbarEl.find('.tab-link').length;
15714
15715 if (tabLinksCount === 0) {
15716 $highlightEl.remove();
15717 return;
15718 }
15719
15720 if ($highlightEl.length === 0) {
15721 $tabbarEl.children('.toolbar-inner').append('<span class="tab-link-highlight"></span>');
15722 $highlightEl = $tabbarEl.find('.tab-link-highlight');
15723 } else if ($highlightEl.next().length) {
15724 $tabbarEl.children('.toolbar-inner').append($highlightEl);
15725 }
15726
15727 var $activeLink = $tabbarEl.find('.tab-link-active');
15728 var highlightWidth;
15729 var highlightTranslate;
15730
15731 if ($tabbarEl.hasClass('tabbar-scrollable') && $activeLink && $activeLink[0]) {
15732 highlightWidth = $activeLink[0].offsetWidth + "px";
15733 highlightTranslate = $activeLink[0].offsetLeft + "px";
15734 } else {
15735 var activeIndex = $activeLink.index();
15736 highlightWidth = 100 / tabLinksCount + "%";
15737 highlightTranslate = (app.rtl ? -activeIndex : activeIndex) * 100 + "%";
15738 }
15739
15740 nextFrame$1(function () {
15741 $highlightEl.css('width', highlightWidth).transform("translate3d(" + highlightTranslate + ",0,0)");
15742 });
15743 },
15744 init: function init(tabbarEl) {
15745 var app = this;
15746 app.toolbar.setHighlight(tabbarEl);
15747 },
15748 hide: function hide(el, animate) {
15749 if (animate === void 0) {
15750 animate = true;
15751 }
15752
15753 var app = this;
15754 var $el = $(el);
15755 if ($el.hasClass('toolbar-hidden')) return;
15756 var className = "toolbar-hidden" + (animate ? ' toolbar-transitioning' : '');
15757 $el.transitionEnd(function () {
15758 $el.removeClass('toolbar-transitioning');
15759 });
15760 $el.addClass(className);
15761 $el.trigger('toolbar:hide');
15762 app.emit('toolbarHide', $el[0]);
15763 },
15764 show: function show(el, animate) {
15765 if (animate === void 0) {
15766 animate = true;
15767 }
15768
15769 var app = this;
15770 var $el = $(el);
15771 if (!$el.hasClass('toolbar-hidden')) return;
15772
15773 if (animate) {
15774 $el.addClass('toolbar-transitioning');
15775 $el.transitionEnd(function () {
15776 $el.removeClass('toolbar-transitioning');
15777 });
15778 }
15779
15780 $el.removeClass('toolbar-hidden');
15781 $el.trigger('toolbar:show');
15782 app.emit('toolbarShow', $el[0]);
15783 },
15784 initToolbarOnScroll: function initToolbarOnScroll(pageEl) {
15785 var app = this;
15786 var $pageEl = $(pageEl);
15787 var $toolbarEl = $pageEl.parents('.view').children('.toolbar');
15788
15789 if ($toolbarEl.length === 0) {
15790 $toolbarEl = $pageEl.find('.toolbar');
15791 }
15792
15793 if ($toolbarEl.length === 0) {
15794 $toolbarEl = $pageEl.parents('.views').children('.tabbar, .tabbar-labels');
15795 }
15796
15797 if ($toolbarEl.length === 0) {
15798 return;
15799 }
15800
15801 var previousScrollTop;
15802 var currentScrollTop;
15803 var scrollHeight;
15804 var offsetHeight;
15805 var reachEnd;
15806 var action;
15807 var toolbarHidden;
15808
15809 function handleScroll(e) {
15810 if ($pageEl.hasClass('page-with-card-opened')) return;
15811 if ($pageEl.hasClass('page-previous')) return;
15812 var scrollContent = this;
15813
15814 if (e && e.target && e.target !== scrollContent) {
15815 return;
15816 }
15817
15818 currentScrollTop = scrollContent.scrollTop;
15819 scrollHeight = scrollContent.scrollHeight;
15820 offsetHeight = scrollContent.offsetHeight;
15821 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
15822 toolbarHidden = $toolbarEl.hasClass('toolbar-hidden');
15823
15824 if (reachEnd) {
15825 if (app.params.toolbar.showOnPageScrollEnd) {
15826 action = 'show';
15827 }
15828 } else if (previousScrollTop > currentScrollTop) {
15829 if (app.params.toolbar.showOnPageScrollTop || currentScrollTop <= 44) {
15830 action = 'show';
15831 } else {
15832 action = 'hide';
15833 }
15834 } else if (currentScrollTop > 44) {
15835 action = 'hide';
15836 } else {
15837 action = 'show';
15838 }
15839
15840 if (action === 'show' && toolbarHidden) {
15841 app.toolbar.show($toolbarEl);
15842 toolbarHidden = false;
15843 } else if (action === 'hide' && !toolbarHidden) {
15844 app.toolbar.hide($toolbarEl);
15845 toolbarHidden = true;
15846 }
15847
15848 previousScrollTop = currentScrollTop;
15849 }
15850
15851 $pageEl.on('scroll', '.page-content', handleScroll, true);
15852 $pageEl[0].f7ScrollToolbarHandler = handleScroll;
15853 }
15854 };
15855 var Toolbar$1 = {
15856 name: 'toolbar',
15857 create: function create() {
15858 var app = this;
15859 bindMethods(app, {
15860 toolbar: Toolbar
15861 });
15862 },
15863 params: {
15864 toolbar: {
15865 hideOnPageScroll: false,
15866 showOnPageScrollEnd: true,
15867 showOnPageScrollTop: true
15868 }
15869 },
15870 on: {
15871 pageBeforeRemove: function pageBeforeRemove(page) {
15872 if (page.$el[0].f7ScrollToolbarHandler) {
15873 page.$el.off('scroll', '.page-content', page.$el[0].f7ScrollToolbarHandler, true);
15874 }
15875 },
15876 pageBeforeIn: function pageBeforeIn(page) {
15877 var app = this;
15878 var $toolbarEl = page.$el.parents('.view').children('.toolbar');
15879
15880 if ($toolbarEl.length === 0) {
15881 $toolbarEl = page.$el.parents('.views').children('.tabbar, .tabbar-labels');
15882 }
15883
15884 if ($toolbarEl.length === 0) {
15885 $toolbarEl = page.$el.find('.toolbar');
15886 }
15887
15888 if ($toolbarEl.length === 0) {
15889 return;
15890 }
15891
15892 if (page.$el.hasClass('no-toolbar')) {
15893 app.toolbar.hide($toolbarEl);
15894 } else {
15895 app.toolbar.show($toolbarEl);
15896 }
15897 },
15898 pageInit: function pageInit(page) {
15899 var app = this;
15900 page.$el.find('.tabbar, .tabbar-labels').each(function (tabbarEl) {
15901 app.toolbar.init(tabbarEl);
15902 });
15903
15904 if (app.params.toolbar.hideOnPageScroll || page.$el.find('.hide-toolbar-on-scroll').length || page.$el.hasClass('hide-toolbar-on-scroll') || page.$el.find('.hide-bars-on-scroll').length || page.$el.hasClass('hide-bars-on-scroll')) {
15905 if (page.$el.find('.keep-toolbar-on-scroll').length || page.$el.hasClass('keep-toolbar-on-scroll') || page.$el.find('.keep-bars-on-scroll').length || page.$el.hasClass('keep-bars-on-scroll')) {
15906 return;
15907 }
15908
15909 app.toolbar.initToolbarOnScroll(page.el);
15910 }
15911 },
15912 init: function init() {
15913 var app = this;
15914 app.$el.find('.tabbar, .tabbar-labels').each(function (tabbarEl) {
15915 app.toolbar.init(tabbarEl);
15916 });
15917 }
15918 },
15919 vnode: {
15920 tabbar: {
15921 insert: function insert(vnode) {
15922 var app = this;
15923 app.toolbar.init(vnode.elm);
15924 }
15925 }
15926 }
15927 };
15928
15929 var Subnavbar = {
15930 name: 'subnavbar',
15931 on: {
15932 pageInit: function pageInit(page) {
15933 if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length) {
15934 page.$el.addClass('page-with-subnavbar');
15935 }
15936
15937 var $innerSubnavbars = page.$el.find('.subnavbar').filter(function (subnavbarEl) {
15938 return $(subnavbarEl).parents('.page')[0] === page.$el[0];
15939 });
15940
15941 if ($innerSubnavbars.length) {
15942 page.$el.addClass('page-with-subnavbar');
15943 }
15944 }
15945 }
15946 };
15947
15948 var TouchRipple$1 = /*#__PURE__*/function () {
15949 function TouchRipple(app, $el, x, y) {
15950 var ripple = this;
15951 if (!$el) return undefined;
15952
15953 var _$el$0$getBoundingCli = $el[0].getBoundingClientRect(),
15954 left = _$el$0$getBoundingCli.left,
15955 top = _$el$0$getBoundingCli.top,
15956 width = _$el$0$getBoundingCli.width,
15957 height = _$el$0$getBoundingCli.height;
15958
15959 var center = {
15960 x: x - left,
15961 y: y - top
15962 };
15963 var diameter = Math.max(Math.pow(Math.pow(height, 2) + Math.pow(width, 2), 0.5), 48);
15964 var isInset = false;
15965 var insetElements = app.params.touch.touchRippleInsetElements || '';
15966
15967 if (insetElements && $el.is(insetElements)) {
15968 isInset = true;
15969 }
15970
15971 if (isInset) {
15972 diameter = Math.max(Math.min(width, height), 48);
15973 }
15974
15975 if (!isInset && $el.css('overflow') === 'hidden') {
15976 var distanceFromCenter = Math.pow(Math.pow(center.x - width / 2, 2) + Math.pow(center.y - height / 2, 2), 0.5);
15977 var scale = (diameter / 2 + distanceFromCenter) / (diameter / 2);
15978 ripple.rippleTransform = "translate3d(0px, 0px, 0) scale(" + scale + ")";
15979 } else {
15980 // prettier-ignore
15981 ripple.rippleTransform = "translate3d(" + (-center.x + width / 2) + "px, " + (-center.y + height / 2) + "px, 0) scale(1)";
15982 }
15983
15984 if (isInset) {
15985 $el.addClass('ripple-inset');
15986 }
15987
15988 ripple.$rippleWaveEl = $("<div class=\"ripple-wave\" style=\"width: " + diameter + "px; height: " + diameter + "px; margin-top:-" + diameter / 2 + "px; margin-left:-" + diameter / 2 + "px; left:" + center.x + "px; top:" + center.y + "px; --f7-ripple-transform: " + ripple.rippleTransform + "\"></div>");
15989 $el.prepend(ripple.$rippleWaveEl);
15990 ripple.$rippleWaveEl.animationEnd(function () {
15991 if (!ripple.$rippleWaveEl) return;
15992 if (ripple.$rippleWaveEl.hasClass('ripple-wave-out')) return;
15993 ripple.$rippleWaveEl.addClass('ripple-wave-in');
15994
15995 if (ripple.shouldBeRemoved) {
15996 ripple.out();
15997 }
15998 });
15999 return ripple;
16000 }
16001
16002 var _proto = TouchRipple.prototype;
16003
16004 _proto.destroy = function destroy() {
16005 var ripple = this;
16006
16007 if (ripple.$rippleWaveEl) {
16008 ripple.$rippleWaveEl.remove();
16009 }
16010
16011 Object.keys(ripple).forEach(function (key) {
16012 ripple[key] = null;
16013 delete ripple[key];
16014 });
16015 ripple = null;
16016 };
16017
16018 _proto.out = function out() {
16019 var ripple = this;
16020 var $rippleWaveEl = this.$rippleWaveEl;
16021 clearTimeout(ripple.removeTimeout);
16022 $rippleWaveEl.addClass('ripple-wave-out');
16023 ripple.removeTimeout = setTimeout(function () {
16024 ripple.destroy();
16025 }, 300);
16026 $rippleWaveEl.animationEnd(function () {
16027 clearTimeout(ripple.removeTimeout);
16028 ripple.destroy();
16029 });
16030 };
16031
16032 _proto.remove = function remove() {
16033 var ripple = this;
16034 if (ripple.shouldBeRemoved) return;
16035 ripple.removeTimeout = setTimeout(function () {
16036 ripple.destroy();
16037 }, 400);
16038 ripple.shouldBeRemoved = true;
16039
16040 if (ripple.$rippleWaveEl.hasClass('ripple-wave-in')) {
16041 ripple.out();
16042 }
16043 };
16044
16045 return TouchRipple;
16046 }();
16047
16048 var TouchRipple = {
16049 name: 'touch-ripple',
16050 static: {
16051 TouchRipple: TouchRipple$1
16052 },
16053 create: function create() {
16054 var app = this;
16055 app.touchRipple = {
16056 create: function create() {
16057 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
16058 args[_key] = arguments[_key];
16059 }
16060
16061 return _construct(TouchRipple$1, args);
16062 }
16063 };
16064 }
16065 };
16066
16067 var openedModals = [];
16068 var dialogsQueue = [];
16069
16070 function clearDialogsQueue() {
16071 if (dialogsQueue.length === 0) return;
16072 var dialog = dialogsQueue.shift();
16073 dialog.open();
16074 }
16075
16076 var Modal$1 = /*#__PURE__*/function (_Framework7Class) {
16077 _inheritsLoose(Modal, _Framework7Class);
16078
16079 function Modal(app, params) {
16080 var _this;
16081
16082 _this = _Framework7Class.call(this, params, [app]) || this;
16083
16084 var modal = _assertThisInitialized(_this);
16085
16086 var defaults = {}; // Extend defaults with modules params
16087
16088 modal.useModulesParams(defaults);
16089 modal.params = extend$1(defaults, params);
16090 modal.opened = false;
16091 var $containerEl = modal.params.containerEl ? $(modal.params.containerEl).eq(0) : app.$el;
16092 if (!$containerEl.length) $containerEl = app.$el;
16093 modal.$containerEl = $containerEl;
16094 modal.containerEl = $containerEl[0]; // Install Modules
16095
16096 modal.useModules();
16097 return _assertThisInitialized(_this) || _assertThisInitialized(_this);
16098 }
16099
16100 var _proto = Modal.prototype;
16101
16102 _proto.onOpen = function onOpen() {
16103 var modal = this;
16104 modal.opened = true;
16105 openedModals.push(modal);
16106 $('html').addClass("with-modal-" + modal.type.toLowerCase());
16107 modal.$el.trigger("modal:open " + modal.type.toLowerCase() + ":open");
16108 modal.emit("local::open modalOpen " + modal.type + "Open", modal);
16109 };
16110
16111 _proto.onOpened = function onOpened() {
16112 var modal = this;
16113 modal.$el.trigger("modal:opened " + modal.type.toLowerCase() + ":opened");
16114 modal.emit("local::opened modalOpened " + modal.type + "Opened", modal);
16115 };
16116
16117 _proto.onClose = function onClose() {
16118 var modal = this;
16119 modal.opened = false;
16120 if (!modal.type || !modal.$el) return;
16121 openedModals.splice(openedModals.indexOf(modal), 1);
16122 $('html').removeClass("with-modal-" + modal.type.toLowerCase());
16123 modal.$el.trigger("modal:close " + modal.type.toLowerCase() + ":close");
16124 modal.emit("local::close modalClose " + modal.type + "Close", modal);
16125 };
16126
16127 _proto.onClosed = function onClosed() {
16128 var modal = this;
16129 if (!modal.type || !modal.$el) return;
16130 modal.$el.removeClass('modal-out');
16131 modal.$el.hide();
16132 modal.$el.trigger("modal:closed " + modal.type.toLowerCase() + ":closed");
16133 modal.emit("local::closed modalClosed " + modal.type + "Closed", modal);
16134 };
16135
16136 _proto.open = function open(animateModal) {
16137 var modal = this;
16138 var document = getDocument();
16139 var app = modal.app;
16140 var $el = modal.$el;
16141 var $backdropEl = modal.$backdropEl;
16142 var type = modal.type;
16143 var animate = true;
16144 if (typeof animateModal !== 'undefined') animate = animateModal;else if (typeof modal.params.animate !== 'undefined') {
16145 animate = modal.params.animate;
16146 }
16147
16148 if (!$el || $el.hasClass('modal-in')) {
16149 if (animateModal === false && $el[0] && type !== 'dialog') {
16150 $el[0].style.display = 'block';
16151 }
16152
16153 return modal;
16154 }
16155
16156 if (type === 'dialog' && app.params.modal.queueDialogs) {
16157 var pushToQueue;
16158
16159 if ($('.dialog.modal-in').length > 0) {
16160 pushToQueue = true;
16161 } else if (openedModals.length > 0) {
16162 openedModals.forEach(function (openedModal) {
16163 if (openedModal.type === 'dialog') pushToQueue = true;
16164 });
16165 }
16166
16167 if (pushToQueue) {
16168 dialogsQueue.push(modal);
16169 return modal;
16170 }
16171 }
16172
16173 var $modalParentEl = $el.parent();
16174 var wasInDom = $el.parents(document).length > 0;
16175
16176 if (!$modalParentEl.is(modal.$containerEl)) {
16177 modal.$containerEl.append($el);
16178 modal.once(type + "Closed", function () {
16179 if (wasInDom) {
16180 $modalParentEl.append($el);
16181 } else {
16182 $el.remove();
16183 }
16184 });
16185 } // Show Modal
16186
16187
16188 $el.show();
16189 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
16190
16191 modal._clientLeft = $el[0].clientLeft; // Modal
16192
16193 function transitionEnd() {
16194 if ($el.hasClass('modal-out')) {
16195 modal.onClosed();
16196 } else if ($el.hasClass('modal-in')) {
16197 modal.onOpened();
16198 }
16199 }
16200
16201 if (animate) {
16202 if ($backdropEl) {
16203 $backdropEl.removeClass('not-animated');
16204 $backdropEl.addClass('backdrop-in');
16205 }
16206
16207 $el.animationEnd(function () {
16208 transitionEnd();
16209 });
16210 $el.transitionEnd(function () {
16211 transitionEnd();
16212 });
16213 $el.removeClass('modal-out not-animated').addClass('modal-in');
16214 modal.onOpen();
16215 } else {
16216 if ($backdropEl) {
16217 $backdropEl.addClass('backdrop-in not-animated');
16218 }
16219
16220 $el.removeClass('modal-out').addClass('modal-in not-animated');
16221 modal.onOpen();
16222 modal.onOpened();
16223 }
16224
16225 return modal;
16226 };
16227
16228 _proto.close = function close(animateModal) {
16229 var modal = this;
16230 var $el = modal.$el;
16231 var $backdropEl = modal.$backdropEl;
16232 var animate = true;
16233 if (typeof animateModal !== 'undefined') animate = animateModal;else if (typeof modal.params.animate !== 'undefined') {
16234 animate = modal.params.animate;
16235 }
16236
16237 if (!$el || !$el.hasClass('modal-in')) {
16238 if (dialogsQueue.indexOf(modal) >= 0) {
16239 dialogsQueue.splice(dialogsQueue.indexOf(modal), 1);
16240 }
16241
16242 return modal;
16243 } // backdrop
16244
16245
16246 if ($backdropEl) {
16247 var needToHideBackdrop = true;
16248
16249 if (modal.type === 'popup') {
16250 modal.$el.prevAll('.popup.modal-in').add(modal.$el.nextAll('.popup.modal-in')).each(function (popupEl) {
16251 var popupInstance = popupEl.f7Modal;
16252 if (!popupInstance) return;
16253
16254 if (popupInstance.params.closeByBackdropClick && popupInstance.params.backdrop && popupInstance.backdropEl === modal.backdropEl) {
16255 needToHideBackdrop = false;
16256 }
16257 });
16258 }
16259
16260 if (needToHideBackdrop) {
16261 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
16262 $backdropEl.removeClass('backdrop-in');
16263 }
16264 } // Modal
16265
16266
16267 $el[animate ? 'removeClass' : 'addClass']('not-animated');
16268
16269 function transitionEnd() {
16270 if ($el.hasClass('modal-out')) {
16271 modal.onClosed();
16272 } else if ($el.hasClass('modal-in')) {
16273 modal.onOpened();
16274 }
16275 }
16276
16277 if (animate) {
16278 $el.animationEnd(function () {
16279 transitionEnd();
16280 });
16281 $el.transitionEnd(function () {
16282 transitionEnd();
16283 });
16284 $el.removeClass('modal-in').addClass('modal-out'); // Emit close
16285
16286 modal.onClose();
16287 } else {
16288 $el.addClass('not-animated').removeClass('modal-in').addClass('modal-out'); // Emit close
16289
16290 modal.onClose();
16291 modal.onClosed();
16292 }
16293
16294 if (modal.type === 'dialog') {
16295 clearDialogsQueue();
16296 }
16297
16298 return modal;
16299 };
16300
16301 _proto.destroy = function destroy() {
16302 var modal = this;
16303 if (modal.destroyed) return;
16304 modal.emit("local::beforeDestroy modalBeforeDestroy " + modal.type + "BeforeDestroy", modal);
16305
16306 if (modal.$el) {
16307 modal.$el.trigger("modal:beforedestroy " + modal.type.toLowerCase() + ":beforedestroy");
16308
16309 if (modal.$el.length && modal.$el[0].f7Modal) {
16310 delete modal.$el[0].f7Modal;
16311 }
16312 }
16313
16314 deleteProps$1(modal);
16315 modal.destroyed = true;
16316 };
16317
16318 return Modal;
16319 }(Framework7Class);
16320
16321 var CustomModal = /*#__PURE__*/function (_Modal) {
16322 _inheritsLoose(CustomModal, _Modal);
16323
16324 function CustomModal(app, params) {
16325 var _this;
16326
16327 var extendedParams = extend$1({
16328 backdrop: true,
16329 closeByBackdropClick: true,
16330 on: {}
16331 }, params); // Extends with open/close Modal methods;
16332
16333 _this = _Modal.call(this, app, extendedParams) || this;
16334
16335 var customModal = _assertThisInitialized(_this);
16336
16337 customModal.params = extendedParams; // Find Element
16338
16339 var $el;
16340
16341 if (!customModal.params.el) {
16342 $el = $(customModal.params.content);
16343 } else {
16344 $el = $(customModal.params.el);
16345 }
16346
16347 if ($el && $el.length > 0 && $el[0].f7Modal) {
16348 return $el[0].f7Modal || _assertThisInitialized(_this);
16349 }
16350
16351 if ($el.length === 0) {
16352 return customModal.destroy() || _assertThisInitialized(_this);
16353 }
16354
16355 var $backdropEl;
16356
16357 if (customModal.params.backdrop) {
16358 $backdropEl = app.$el.children('.custom-modal-backdrop');
16359
16360 if ($backdropEl.length === 0) {
16361 $backdropEl = $('<div class="custom-modal-backdrop"></div>');
16362 app.$el.append($backdropEl);
16363 }
16364 }
16365
16366 function handleClick(e) {
16367 if (!customModal || customModal.destroyed) return;
16368
16369 if ($backdropEl && e.target === $backdropEl[0]) {
16370 customModal.close();
16371 }
16372 }
16373
16374 customModal.on('customModalOpened', function () {
16375 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
16376 app.on('click', handleClick);
16377 }
16378 });
16379 customModal.on('customModalClose', function () {
16380 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
16381 app.off('click', handleClick);
16382 }
16383 });
16384 extend$1(customModal, {
16385 app: app,
16386 $el: $el,
16387 el: $el[0],
16388 $backdropEl: $backdropEl,
16389 backdropEl: $backdropEl && $backdropEl[0],
16390 type: 'customModal'
16391 });
16392 $el[0].f7Modal = customModal;
16393 return customModal || _assertThisInitialized(_this);
16394 }
16395
16396 return CustomModal;
16397 }(Modal$1);
16398
16399 var Modal = {
16400 name: 'modal',
16401 static: {
16402 Modal: Modal$1,
16403 CustomModal: CustomModal
16404 },
16405 create: function create() {
16406 var app = this;
16407 app.customModal = {
16408 create: function create(params) {
16409 return new CustomModal(app, params);
16410 }
16411 };
16412 },
16413 params: {
16414 modal: {
16415 queueDialogs: true
16416 }
16417 }
16418 };
16419
16420 var Appbar = {
16421 name: 'appbar'
16422 };
16423
16424 /* eslint-disable prefer-rest-params */
16425 var $jsx = function $jsx(tag, props) {
16426 var attrs = props || {};
16427
16428 for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
16429 args[_key - 2] = arguments[_key];
16430 }
16431
16432 var children = args || [];
16433 var attrsString = Object.keys(attrs).map(function (attr) {
16434 if (attr[0] === '_') {
16435 if (attrs[attr]) return attr.replace('_', '');
16436 return '';
16437 }
16438
16439 return attr + "=\"" + attrs[attr] + "\"";
16440 }).filter(function (attr) {
16441 return !!attr;
16442 }).join(' ');
16443
16444 if (['path', 'img', 'circle', 'polygon', 'line', 'input'].indexOf(tag) >= 0) {
16445 return ("<" + tag + " " + attrsString + " />").trim();
16446 }
16447
16448 var childrenContent = children.filter(function (c) {
16449 return !!c;
16450 }).map(function (c) {
16451 return Array.isArray(c) ? c.join('') : c;
16452 }).join('');
16453 return ("<" + tag + " " + attrsString + ">" + childrenContent + "</" + tag + ">").trim();
16454 };
16455
16456 var Dialog$1 = /*#__PURE__*/function (_Modal) {
16457 _inheritsLoose(Dialog, _Modal);
16458
16459 function Dialog(app, params) {
16460 var _this;
16461
16462 var extendedParams = extend$1({
16463 title: app.params.dialog.title,
16464 text: undefined,
16465 content: '',
16466 buttons: [],
16467 verticalButtons: false,
16468 onClick: undefined,
16469 cssClass: undefined,
16470 destroyOnClose: false,
16471 on: {}
16472 }, params);
16473
16474 if (typeof extendedParams.closeByBackdropClick === 'undefined') {
16475 extendedParams.closeByBackdropClick = app.params.dialog.closeByBackdropClick;
16476 }
16477
16478 if (typeof extendedParams.backdrop === 'undefined') {
16479 extendedParams.backdrop = app.params.dialog.backdrop;
16480 } // Extends with open/close Modal methods;
16481
16482
16483 _this = _Modal.call(this, app, extendedParams) || this;
16484
16485 var dialog = _assertThisInitialized(_this);
16486
16487 var device = getDevice$1();
16488 var document = getDocument();
16489 var title = extendedParams.title,
16490 text = extendedParams.text,
16491 content = extendedParams.content,
16492 buttons = extendedParams.buttons,
16493 verticalButtons = extendedParams.verticalButtons,
16494 cssClass = extendedParams.cssClass,
16495 backdrop = extendedParams.backdrop;
16496 dialog.params = extendedParams; // Find Element
16497
16498 var $el;
16499
16500 if (!dialog.params.el) {
16501 var dialogClasses = ['dialog'];
16502 if (buttons.length === 0) dialogClasses.push('dialog-no-buttons');
16503 if (buttons.length > 0) dialogClasses.push("dialog-buttons-" + buttons.length);
16504 if (verticalButtons) dialogClasses.push('dialog-buttons-vertical');
16505 if (cssClass) dialogClasses.push(cssClass);
16506 var buttonsHTML = '';
16507
16508 if (buttons.length > 0) {
16509 buttonsHTML = $jsx("div", {
16510 class: "dialog-buttons"
16511 }, buttons.map(function (button) {
16512 return $jsx("span", {
16513 class: "dialog-button" + (button.bold ? ' dialog-button-bold' : '') + (button.color ? " color-" + button.color : '') + (button.cssClass ? " " + button.cssClass : '')
16514 }, button.text);
16515 }));
16516 }
16517
16518 var dialogHtml = $jsx("div", {
16519 class: dialogClasses.join(' ')
16520 }, $jsx("div", {
16521 class: "dialog-inner"
16522 }, title && $jsx("div", {
16523 class: "dialog-title"
16524 }, title), text && $jsx("div", {
16525 class: "dialog-text"
16526 }, text), content), buttonsHTML);
16527 $el = $(dialogHtml);
16528 } else {
16529 $el = $(dialog.params.el);
16530 }
16531
16532 if ($el && $el.length > 0 && $el[0].f7Modal) {
16533 return $el[0].f7Modal || _assertThisInitialized(_this);
16534 }
16535
16536 if ($el.length === 0) {
16537 return dialog.destroy() || _assertThisInitialized(_this);
16538 }
16539
16540 var $backdropEl;
16541
16542 if (backdrop) {
16543 $backdropEl = app.$el.children('.dialog-backdrop');
16544
16545 if ($backdropEl.length === 0) {
16546 $backdropEl = $('<div class="dialog-backdrop"></div>');
16547 app.$el.append($backdropEl);
16548 }
16549 } // Assign events
16550
16551
16552 function buttonOnClick(e) {
16553 var buttonEl = this;
16554 var index = $(buttonEl).index();
16555 var button = buttons[index];
16556 if (button.onClick) button.onClick(dialog, e);
16557 if (dialog.params.onClick) dialog.params.onClick(dialog, index);
16558 if (button.close !== false) dialog.close();
16559 }
16560
16561 var addKeyboardHander;
16562
16563 function onKeyDown(e) {
16564 var keyCode = e.keyCode;
16565 buttons.forEach(function (button, index) {
16566 if (button.keyCodes && button.keyCodes.indexOf(keyCode) >= 0) {
16567 if (document.activeElement) document.activeElement.blur();
16568 if (button.onClick) button.onClick(dialog, e);
16569 if (dialog.params.onClick) dialog.params.onClick(dialog, index);
16570 if (button.close !== false) dialog.close();
16571 }
16572 });
16573 }
16574
16575 if (buttons && buttons.length > 0) {
16576 dialog.on('open', function () {
16577 $el.find('.dialog-button').each(function (buttonEl, index) {
16578 var button = buttons[index];
16579 if (button.keyCodes) addKeyboardHander = true;
16580 $(buttonEl).on('click', buttonOnClick);
16581 });
16582
16583 if (addKeyboardHander && !device.ios && !device.android && !device.cordova && !device.capacitor) {
16584 $(document).on('keydown', onKeyDown);
16585 }
16586 });
16587 dialog.on('close', function () {
16588 $el.find('.dialog-button').each(function (buttonEl) {
16589 $(buttonEl).off('click', buttonOnClick);
16590 });
16591
16592 if (addKeyboardHander && !device.ios && !device.android && !device.cordova && !device.capacitor) {
16593 $(document).off('keydown', onKeyDown);
16594 }
16595
16596 addKeyboardHander = false;
16597 });
16598 }
16599
16600 extend$1(dialog, {
16601 app: app,
16602 $el: $el,
16603 el: $el[0],
16604 $backdropEl: $backdropEl,
16605 backdropEl: $backdropEl && $backdropEl[0],
16606 type: 'dialog',
16607 setProgress: function setProgress(progress, duration) {
16608 app.progressbar.set($el.find('.progressbar'), progress, duration);
16609 return dialog;
16610 },
16611 setText: function setText(newText) {
16612 var $textEl = $el.find('.dialog-text');
16613
16614 if ($textEl.length === 0) {
16615 $textEl = $('<div class="dialog-text"></div>');
16616
16617 if (typeof title !== 'undefined') {
16618 $textEl.insertAfter($el.find('.dialog-title'));
16619 } else {
16620 $el.find('.dialog-inner').prepend($textEl);
16621 }
16622 }
16623
16624 $textEl.html(newText);
16625 dialog.params.text = newText;
16626 return dialog;
16627 },
16628 setTitle: function setTitle(newTitle) {
16629 var $titleEl = $el.find('.dialog-title');
16630
16631 if ($titleEl.length === 0) {
16632 $titleEl = $('<div class="dialog-title"></div>');
16633 $el.find('.dialog-inner').prepend($titleEl);
16634 }
16635
16636 $titleEl.html(newTitle);
16637 dialog.params.title = newTitle;
16638 return dialog;
16639 }
16640 });
16641
16642 function handleClick(e) {
16643 var target = e.target;
16644 var $target = $(target);
16645
16646 if ($target.closest(dialog.el).length === 0) {
16647 if (dialog.params.closeByBackdropClick && dialog.backdropEl && dialog.backdropEl === target) {
16648 dialog.close();
16649 }
16650 }
16651 }
16652
16653 dialog.on('opened', function () {
16654 if (dialog.params.closeByBackdropClick) {
16655 app.on('click', handleClick);
16656 }
16657 });
16658 dialog.on('close', function () {
16659 if (dialog.params.closeByBackdropClick) {
16660 app.off('click', handleClick);
16661 }
16662 });
16663 $el[0].f7Modal = dialog;
16664
16665 if (dialog.params.destroyOnClose) {
16666 dialog.once('closed', function () {
16667 setTimeout(function () {
16668 dialog.destroy();
16669 }, 0);
16670 });
16671 }
16672
16673 return dialog || _assertThisInitialized(_this);
16674 }
16675
16676 return Dialog;
16677 }(Modal$1);
16678
16679 var Dialog = {
16680 name: 'dialog',
16681 params: {
16682 dialog: {
16683 title: undefined,
16684 buttonOk: 'OK',
16685 buttonCancel: 'Cancel',
16686 usernamePlaceholder: 'Username',
16687 passwordPlaceholder: 'Password',
16688 preloaderTitle: 'Loading... ',
16689 progressTitle: 'Loading... ',
16690 backdrop: true,
16691 closeByBackdropClick: false,
16692 destroyPredefinedDialogs: true,
16693 keyboardActions: true,
16694 autoFocus: true
16695 }
16696 },
16697 static: {
16698 Dialog: Dialog$1
16699 },
16700 create: function create() {
16701 var app = this;
16702
16703 function defaultDialogTitle() {
16704 return app.params.dialog.title || app.name;
16705 }
16706
16707 var destroyOnClose = app.params.dialog.destroyPredefinedDialogs;
16708 var keyboardActions = app.params.dialog.keyboardActions;
16709 var autoFocus = app.params.dialog.autoFocus;
16710 var autoFocusHandler = autoFocus ? {
16711 on: {
16712 opened: function opened(dialog) {
16713 dialog.$el.find('input').eq(0).focus();
16714 }
16715 }
16716 } : {};
16717 app.dialog = extend$1(ModalMethods({
16718 app: app,
16719 constructor: Dialog$1,
16720 defaultSelector: '.dialog.modal-in'
16721 }), {
16722 // Shortcuts
16723 alert: function alert() {
16724 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
16725 args[_key] = arguments[_key];
16726 }
16727
16728 var text = args[0],
16729 title = args[1],
16730 callbackOk = args[2];
16731
16732 if (args.length === 2 && typeof args[1] === 'function') {
16733 text = args[0];
16734 callbackOk = args[1];
16735 title = args[2];
16736 }
16737
16738 return new Dialog$1(app, {
16739 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
16740 text: text,
16741 buttons: [{
16742 text: app.params.dialog.buttonOk,
16743 bold: true,
16744 onClick: callbackOk,
16745 keyCodes: keyboardActions ? [13, 27] : null
16746 }],
16747 destroyOnClose: destroyOnClose
16748 }).open();
16749 },
16750 prompt: function prompt() {
16751 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
16752 args[_key2] = arguments[_key2];
16753 }
16754
16755 var text = args[0],
16756 title = args[1],
16757 callbackOk = args[2],
16758 callbackCancel = args[3],
16759 defaultValue = args[4];
16760
16761 if (typeof args[1] === 'function') {
16762 text = args[0];
16763 callbackOk = args[1];
16764 callbackCancel = args[2];
16765 defaultValue = args[3];
16766 title = args[4];
16767 }
16768
16769 defaultValue = typeof defaultValue === 'undefined' || defaultValue === null ? '' : defaultValue;
16770 return new Dialog$1(app, _extends$j({
16771 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
16772 text: text,
16773 content: "<div class=\"dialog-input-field input\"><input type=\"text\" class=\"dialog-input\" value=\"" + defaultValue + "\"></div>",
16774 buttons: [{
16775 text: app.params.dialog.buttonCancel,
16776 keyCodes: keyboardActions ? [27] : null,
16777 color: app.theme === 'aurora' ? 'gray' : null
16778 }, {
16779 text: app.params.dialog.buttonOk,
16780 bold: true,
16781 keyCodes: keyboardActions ? [13] : null
16782 }],
16783 onClick: function onClick(dialog, index) {
16784 var inputValue = dialog.$el.find('.dialog-input').val();
16785 if (index === 0 && callbackCancel) callbackCancel(inputValue);
16786 if (index === 1 && callbackOk) callbackOk(inputValue);
16787 },
16788 destroyOnClose: destroyOnClose
16789 }, autoFocusHandler)).open();
16790 },
16791 confirm: function confirm() {
16792 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
16793 args[_key3] = arguments[_key3];
16794 }
16795
16796 var text = args[0],
16797 title = args[1],
16798 callbackOk = args[2],
16799 callbackCancel = args[3];
16800
16801 if (typeof args[1] === 'function') {
16802 text = args[0];
16803 callbackOk = args[1];
16804 callbackCancel = args[2];
16805 title = args[3];
16806 }
16807
16808 return new Dialog$1(app, {
16809 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
16810 text: text,
16811 buttons: [{
16812 text: app.params.dialog.buttonCancel,
16813 onClick: callbackCancel,
16814 keyCodes: keyboardActions ? [27] : null,
16815 color: app.theme === 'aurora' ? 'gray' : null
16816 }, {
16817 text: app.params.dialog.buttonOk,
16818 bold: true,
16819 onClick: callbackOk,
16820 keyCodes: keyboardActions ? [13] : null
16821 }],
16822 destroyOnClose: destroyOnClose
16823 }).open();
16824 },
16825 login: function login() {
16826 for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
16827 args[_key4] = arguments[_key4];
16828 }
16829
16830 var text = args[0],
16831 title = args[1],
16832 callbackOk = args[2],
16833 callbackCancel = args[3];
16834
16835 if (typeof args[1] === 'function') {
16836 text = args[0];
16837 callbackOk = args[1];
16838 callbackCancel = args[2];
16839 title = args[3];
16840 }
16841
16842 return new Dialog$1(app, _extends$j({
16843 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
16844 text: text,
16845 // prettier-ignore
16846 content: "\n <div class=\"dialog-input-field dialog-input-double input\">\n <input type=\"text\" name=\"dialog-username\" placeholder=\"" + app.params.dialog.usernamePlaceholder + "\" class=\"dialog-input\">\n </div>\n <div class=\"dialog-input-field dialog-input-double input\">\n <input type=\"password\" name=\"dialog-password\" placeholder=\"" + app.params.dialog.passwordPlaceholder + "\" class=\"dialog-input\">\n </div>",
16847 buttons: [{
16848 text: app.params.dialog.buttonCancel,
16849 keyCodes: keyboardActions ? [27] : null,
16850 color: app.theme === 'aurora' ? 'gray' : null
16851 }, {
16852 text: app.params.dialog.buttonOk,
16853 bold: true,
16854 keyCodes: keyboardActions ? [13] : null
16855 }],
16856 onClick: function onClick(dialog, index) {
16857 var username = dialog.$el.find('[name="dialog-username"]').val();
16858 var password = dialog.$el.find('[name="dialog-password"]').val();
16859 if (index === 0 && callbackCancel) callbackCancel(username, password);
16860 if (index === 1 && callbackOk) callbackOk(username, password);
16861 },
16862 destroyOnClose: destroyOnClose
16863 }, autoFocusHandler)).open();
16864 },
16865 password: function password() {
16866 for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
16867 args[_key5] = arguments[_key5];
16868 }
16869
16870 var text = args[0],
16871 title = args[1],
16872 callbackOk = args[2],
16873 callbackCancel = args[3];
16874
16875 if (typeof args[1] === 'function') {
16876 text = args[0];
16877 callbackOk = args[1];
16878 callbackCancel = args[2];
16879 title = args[3];
16880 }
16881
16882 return new Dialog$1(app, _extends$j({
16883 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
16884 text: text,
16885 // prettier-ignore
16886 content: "\n <div class=\"dialog-input-field input\">\n <input type=\"password\" name=\"dialog-password\" placeholder=\"" + app.params.dialog.passwordPlaceholder + "\" class=\"dialog-input\">\n </div>",
16887 buttons: [{
16888 text: app.params.dialog.buttonCancel,
16889 keyCodes: keyboardActions ? [27] : null,
16890 color: app.theme === 'aurora' ? 'gray' : null
16891 }, {
16892 text: app.params.dialog.buttonOk,
16893 bold: true,
16894 keyCodes: keyboardActions ? [13] : null
16895 }],
16896 onClick: function onClick(dialog, index) {
16897 var password = dialog.$el.find('[name="dialog-password"]').val();
16898 if (index === 0 && callbackCancel) callbackCancel(password);
16899 if (index === 1 && callbackOk) callbackOk(password);
16900 },
16901 destroyOnClose: destroyOnClose
16902 }, autoFocusHandler)).open();
16903 },
16904 preloader: function preloader(title, color) {
16905 var preloaders = {
16906 iosPreloaderContent: iosPreloaderContent,
16907 mdPreloaderContent: mdPreloaderContent,
16908 auroraPreloaderContent: auroraPreloaderContent
16909 };
16910 var preloaderInner = preloaders[app.theme + "PreloaderContent"] || '';
16911 return new Dialog$1(app, {
16912 title: typeof title === 'undefined' || title === null ? app.params.dialog.preloaderTitle : title,
16913 // prettier-ignore
16914 content: "<div class=\"preloader" + (color ? " color-" + color : '') + "\">" + preloaderInner + "</div>",
16915 cssClass: 'dialog-preloader',
16916 destroyOnClose: destroyOnClose
16917 }).open();
16918 },
16919 progress: function progress() {
16920 for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
16921 args[_key6] = arguments[_key6];
16922 }
16923
16924 var title = args[0],
16925 progress = args[1],
16926 color = args[2];
16927
16928 if (args.length === 2) {
16929 if (typeof args[0] === 'number') {
16930 progress = args[0];
16931 color = args[1];
16932 title = args[2];
16933 } else if (typeof args[0] === 'string' && typeof args[1] === 'string') {
16934 title = args[0];
16935 color = args[1];
16936 progress = args[2];
16937 }
16938 } else if (args.length === 1) {
16939 if (typeof args[0] === 'number') {
16940 progress = args[0];
16941 title = args[1];
16942 color = args[2];
16943 }
16944 }
16945
16946 var infinite = typeof progress === 'undefined';
16947 var dialog = new Dialog$1(app, {
16948 title: typeof title === 'undefined' ? app.params.dialog.progressTitle : title,
16949 cssClass: 'dialog-progress',
16950 // prettier-ignore
16951 content: "\n <div class=\"progressbar" + (infinite ? '-infinite' : '') + (color ? " color-" + color : '') + "\">\n " + (!infinite ? '<span></span>' : '') + "\n </div>\n ",
16952 destroyOnClose: destroyOnClose
16953 });
16954 if (!infinite) dialog.setProgress(progress);
16955 return dialog.open();
16956 }
16957 });
16958 }
16959 };
16960
16961 var Popup$1 = /*#__PURE__*/function (_Modal) {
16962 _inheritsLoose(Popup, _Modal);
16963
16964 function Popup(app, params) {
16965 var _this;
16966
16967 var extendedParams = extend$1({
16968 on: {}
16969 }, app.params.popup, params); // Extends with open/close Modal methods;
16970
16971 _this = _Modal.call(this, app, extendedParams) || this;
16972
16973 var popup = _assertThisInitialized(_this);
16974
16975 var window = getWindow();
16976 var document = getDocument();
16977 var support = getSupport$1();
16978 var device = getDevice$1();
16979 popup.params = extendedParams; // Find Element
16980
16981 var $el;
16982
16983 if (!popup.params.el) {
16984 $el = $(popup.params.content).filter(function (node) {
16985 return node.nodeType === 1;
16986 }).eq(0);
16987 } else {
16988 $el = $(popup.params.el).eq(0);
16989 }
16990
16991 if ($el && $el.length > 0 && $el[0].f7Modal) {
16992 return $el[0].f7Modal || _assertThisInitialized(_this);
16993 }
16994
16995 if ($el.length === 0) {
16996 return popup.destroy() || _assertThisInitialized(_this);
16997 }
16998
16999 var $backdropEl;
17000
17001 if (popup.params.backdrop && popup.params.backdropEl) {
17002 $backdropEl = $(popup.params.backdropEl);
17003 } else if (popup.params.backdrop) {
17004 $backdropEl = popup.$containerEl.children('.popup-backdrop');
17005
17006 if ($backdropEl.length === 0) {
17007 $backdropEl = $('<div class="popup-backdrop"></div>');
17008 popup.$containerEl.append($backdropEl);
17009 }
17010 }
17011
17012 extend$1(popup, {
17013 app: app,
17014 push: $el.hasClass('popup-push') || popup.params.push,
17015 $el: $el,
17016 el: $el[0],
17017 $backdropEl: $backdropEl,
17018 backdropEl: $backdropEl && $backdropEl[0],
17019 type: 'popup',
17020 $htmlEl: $('html')
17021 });
17022
17023 if (popup.params.push) {
17024 $el.addClass('popup-push');
17025 }
17026
17027 function handleClick(e) {
17028 var target = e.target;
17029 var $target = $(target);
17030 var keyboardOpened = !device.desktop && device.cordova && (window.Keyboard && window.Keyboard.isVisible || window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible);
17031 if (keyboardOpened) return;
17032
17033 if ($target.closest(popup.el).length === 0) {
17034 if (popup.params && popup.params.closeByBackdropClick && popup.params.backdrop && popup.backdropEl && popup.backdropEl === target) {
17035 var needToClose = true;
17036 popup.$el.nextAll('.popup.modal-in').each(function (popupEl) {
17037 var popupInstance = popupEl.f7Modal;
17038 if (!popupInstance) return;
17039
17040 if (popupInstance.params.closeByBackdropClick && popupInstance.params.backdrop && popupInstance.backdropEl === popup.backdropEl) {
17041 needToClose = false;
17042 }
17043 });
17044
17045 if (needToClose) {
17046 popup.close();
17047 }
17048 }
17049 }
17050 }
17051
17052 function onKeyDown(e) {
17053 var keyCode = e.keyCode;
17054
17055 if (keyCode === 27 && popup.params.closeOnEscape) {
17056 popup.close();
17057 }
17058 }
17059
17060 var pushOffset;
17061 var isPush;
17062
17063 function pushViewScale(offset) {
17064 return (app.height - offset * 2) / app.height;
17065 }
17066
17067 var allowSwipeToClose = true;
17068 var isTouched = false;
17069 var startTouch;
17070 var currentTouch;
17071 var isScrolling;
17072 var touchStartTime;
17073 var touchesDiff;
17074 var isMoved = false;
17075 var pageContentEl;
17076 var pageContentScrollTop;
17077 var pageContentOffsetHeight;
17078 var pageContentScrollHeight;
17079 var popupHeight;
17080 var $pushEl;
17081
17082 function handleTouchStart(e) {
17083 if (isTouched || !allowSwipeToClose || !popup.params.swipeToClose) return;
17084
17085 if (popup.params.swipeHandler && $(e.target).closest(popup.params.swipeHandler).length === 0) {
17086 return;
17087 }
17088
17089 isTouched = true;
17090 isMoved = false;
17091 startTouch = {
17092 x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
17093 y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY
17094 };
17095 touchStartTime = now$1();
17096 isScrolling = undefined;
17097
17098 if (!popup.params.swipeHandler && e.type === 'touchstart') {
17099 pageContentEl = $(e.target).closest('.page-content')[0];
17100 }
17101 }
17102
17103 function handleTouchMove(e) {
17104 if (!isTouched) return;
17105 currentTouch = {
17106 x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
17107 y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY
17108 };
17109
17110 if (typeof isScrolling === 'undefined') {
17111 isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
17112 }
17113
17114 if (isScrolling) {
17115 isTouched = false;
17116 isMoved = false;
17117 return;
17118 }
17119
17120 touchesDiff = startTouch.y - currentTouch.y;
17121
17122 if (isPush && pushOffset && touchesDiff > 0) {
17123 touchesDiff = 0;
17124 }
17125
17126 var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
17127 $el.transition(0);
17128
17129 if (typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose) {
17130 $el.transform('');
17131 $el.transition('');
17132 return;
17133 }
17134
17135 if (!isMoved) {
17136 if (isPush && pushOffset) {
17137 popupHeight = $el[0].offsetHeight;
17138 $pushEl = $el.prevAll('.popup.modal-in').eq(0);
17139
17140 if ($pushEl.length === 0) {
17141 $pushEl = app.$el.children('.view, .views');
17142 }
17143 }
17144
17145 if (pageContentEl) {
17146 pageContentScrollTop = pageContentEl.scrollTop;
17147 pageContentScrollHeight = pageContentEl.scrollHeight;
17148 pageContentOffsetHeight = pageContentEl.offsetHeight;
17149
17150 if (!(pageContentScrollHeight === pageContentOffsetHeight) && !(direction === 'to-bottom' && pageContentScrollTop === 0) && !(direction === 'to-top' && pageContentScrollTop === pageContentScrollHeight - pageContentOffsetHeight)) {
17151 $el.transform('');
17152 $el.transition('');
17153 isTouched = false;
17154 isMoved = false;
17155 return;
17156 }
17157 }
17158
17159 isMoved = true;
17160 popup.emit('local::swipeStart popupSwipeStart', popup);
17161 popup.$el.trigger('popup:swipestart');
17162 } else {
17163 popup.emit('local::swipeMove popupSwipeMove', popup);
17164 popup.$el.trigger('popup:swipemove');
17165 }
17166
17167 e.preventDefault();
17168
17169 if (isPush && pushOffset) {
17170 var pushProgress = 1 - Math.abs(touchesDiff / popupHeight);
17171 var scale = 1 - (1 - pushViewScale(pushOffset)) * pushProgress;
17172
17173 if ($pushEl.hasClass('popup')) {
17174 if ($pushEl.hasClass('popup-push')) {
17175 $pushEl.transition(0).forEach(function (el) {
17176 el.style.setProperty('transform', "translate3d(0, calc(-1 * " + pushProgress + " * (var(--f7-popup-push-offset) + 10px)) , 0px) scale(" + scale + ")", 'important');
17177 });
17178 } else {
17179 $pushEl.transition(0).forEach(function (el) {
17180 el.style.setProperty('transform', "translate3d(0, 0px , 0px) scale(" + scale + ")", 'important');
17181 });
17182 }
17183 } else {
17184 $pushEl.transition(0).forEach(function (el) {
17185 el.style.setProperty('transform', "translate3d(0,0,0) scale(" + scale + ")", 'important');
17186 });
17187 }
17188 }
17189
17190 $el.transition(0).transform("translate3d(0," + -touchesDiff + "px,0)");
17191 }
17192
17193 function handleTouchEnd() {
17194 isTouched = false;
17195
17196 if (!isMoved) {
17197 return;
17198 }
17199
17200 popup.emit('local::swipeEnd popupSwipeEnd', popup);
17201 popup.$el.trigger('popup:swipeend');
17202 isMoved = false;
17203 allowSwipeToClose = false;
17204 $el.transition('');
17205
17206 if (isPush && pushOffset) {
17207 $pushEl.transition('').transform('');
17208 }
17209
17210 var direction = touchesDiff <= 0 ? 'to-bottom' : 'to-top';
17211
17212 if (typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose) {
17213 $el.transform('');
17214 allowSwipeToClose = true;
17215 return;
17216 }
17217
17218 var diff = Math.abs(touchesDiff);
17219 var timeDiff = new Date().getTime() - touchStartTime;
17220
17221 if (timeDiff < 300 && diff > 20 || timeDiff >= 300 && diff > 100) {
17222 nextTick$1(function () {
17223 if (direction === 'to-bottom') {
17224 $el.addClass('swipe-close-to-bottom');
17225 } else {
17226 $el.addClass('swipe-close-to-top');
17227 }
17228
17229 $el.transform('');
17230 popup.emit('local::swipeclose popupSwipeClose', popup);
17231 popup.$el.trigger('popup:swipeclose');
17232 popup.close();
17233 allowSwipeToClose = true;
17234 });
17235 return;
17236 }
17237
17238 allowSwipeToClose = true;
17239 $el.transform('');
17240 }
17241
17242 var passive = support.passiveListener ? {
17243 passive: true
17244 } : false;
17245
17246 if (popup.params.swipeToClose) {
17247 $el.on(app.touchEvents.start, handleTouchStart, passive);
17248 app.on('touchmove', handleTouchMove);
17249 app.on('touchend:passive', handleTouchEnd);
17250 popup.once('popupDestroy', function () {
17251 $el.off(app.touchEvents.start, handleTouchStart, passive);
17252 app.off('touchmove', handleTouchMove);
17253 app.off('touchend:passive', handleTouchEnd);
17254 });
17255 }
17256
17257 var hasPreviousPushPopup;
17258
17259 var updatePushOffset = function updatePushOffset() {
17260 var wasPush = isPush;
17261
17262 if (popup.push) {
17263 isPush = popup.push && (app.width < 630 || app.height < 630 || $el.hasClass('popup-tablet-fullscreen'));
17264 }
17265
17266 if (isPush && !wasPush) {
17267 // eslint-disable-next-line
17268 setPushOffset();
17269 } else if (isPush && wasPush) {
17270 popup.$htmlEl[0].style.setProperty('--f7-popup-push-scale', pushViewScale(pushOffset));
17271 } else if (!isPush && wasPush) {
17272 popup.$htmlEl.removeClass('with-modal-popup-push');
17273 popup.$htmlEl[0].style.removeProperty('--f7-popup-push-scale');
17274 }
17275 };
17276
17277 var setPushOffset = function setPushOffset() {
17278 app.off('resize', updatePushOffset);
17279
17280 if (popup.push) {
17281 isPush = popup.push && (app.width < 630 || app.height < 630 || $el.hasClass('popup-tablet-fullscreen'));
17282 }
17283
17284 if (isPush) {
17285 pushOffset = parseInt($el.css('--f7-popup-push-offset'), 10);
17286 if (Number.isNaN(pushOffset)) pushOffset = 0;
17287
17288 if (pushOffset) {
17289 $el.addClass('popup-push');
17290 popup.$htmlEl.addClass('with-modal-popup-push');
17291 popup.$htmlEl[0].style.setProperty('--f7-popup-push-scale', pushViewScale(pushOffset));
17292 }
17293 }
17294
17295 app.on('resize', updatePushOffset);
17296 };
17297
17298 popup.on('open', function () {
17299 hasPreviousPushPopup = false;
17300
17301 if (popup.params.closeOnEscape) {
17302 $(document).on('keydown', onKeyDown);
17303 }
17304
17305 $el.prevAll('.popup.modal-in').addClass('popup-behind');
17306 setPushOffset();
17307 });
17308 popup.on('opened', function () {
17309 $el.removeClass('swipe-close-to-bottom swipe-close-to-top');
17310
17311 if (popup.params.closeByBackdropClick) {
17312 app.on('click', handleClick);
17313 }
17314 });
17315 popup.on('close', function () {
17316 hasPreviousPushPopup = popup.$el.prevAll('.popup-push.modal-in').length > 0;
17317
17318 if (popup.params.closeOnEscape) {
17319 $(document).off('keydown', onKeyDown);
17320 }
17321
17322 if (popup.params.closeByBackdropClick) {
17323 app.off('click', handleClick);
17324 }
17325
17326 $el.prevAll('.popup.modal-in').eq(0).removeClass('popup-behind');
17327
17328 if (isPush && pushOffset && !hasPreviousPushPopup) {
17329 popup.$htmlEl.removeClass('with-modal-popup-push');
17330 popup.$htmlEl.addClass('with-modal-popup-push-closing');
17331 }
17332
17333 app.off('resize', updatePushOffset);
17334 });
17335 popup.on('closed', function () {
17336 $el.removeClass('popup-behind');
17337
17338 if (isPush && pushOffset && !hasPreviousPushPopup) {
17339 popup.$htmlEl.removeClass('with-modal-popup-push-closing');
17340 popup.$htmlEl[0].style.removeProperty('--f7-popup-push-scale');
17341 }
17342 });
17343 $el[0].f7Modal = popup;
17344 return popup || _assertThisInitialized(_this);
17345 }
17346
17347 return Popup;
17348 }(Modal$1);
17349
17350 var Popup = {
17351 name: 'popup',
17352 params: {
17353 popup: {
17354 backdrop: true,
17355 backdropEl: undefined,
17356 closeByBackdropClick: true,
17357 closeOnEscape: false,
17358 swipeToClose: false,
17359 swipeHandler: null,
17360 push: false,
17361 containerEl: null
17362 }
17363 },
17364 static: {
17365 Popup: Popup$1
17366 },
17367 create: function create() {
17368 var app = this;
17369 app.popup = ModalMethods({
17370 app: app,
17371 constructor: Popup$1,
17372 defaultSelector: '.popup.modal-in',
17373 parentSelector: '.popup'
17374 });
17375 },
17376 clicks: {
17377 '.popup-open': function openPopup($clickedEl, data) {
17378 if (data === void 0) {
17379 data = {};
17380 }
17381
17382 var app = this;
17383 app.popup.open(data.popup, data.animate, $clickedEl);
17384 },
17385 '.popup-close': function closePopup($clickedEl, data) {
17386 if (data === void 0) {
17387 data = {};
17388 }
17389
17390 var app = this;
17391 app.popup.close(data.popup, data.animate, $clickedEl);
17392 }
17393 }
17394 };
17395
17396 var LoginScreen$1 = /*#__PURE__*/function (_Modal) {
17397 _inheritsLoose(LoginScreen, _Modal);
17398
17399 function LoginScreen(app, params) {
17400 var _this;
17401
17402 var extendedParams = extend$1({
17403 on: {}
17404 }, params); // Extends with open/close Modal methods;
17405
17406 _this = _Modal.call(this, app, extendedParams) || this;
17407
17408 var loginScreen = _assertThisInitialized(_this);
17409
17410 loginScreen.params = extendedParams; // Find Element
17411
17412 var $el;
17413
17414 if (!loginScreen.params.el) {
17415 $el = $(loginScreen.params.content).filter(function (node) {
17416 return node.nodeType === 1;
17417 }).eq(0);
17418 } else {
17419 $el = $(loginScreen.params.el).eq(0);
17420 }
17421
17422 if ($el && $el.length > 0 && $el[0].f7Modal) {
17423 return $el[0].f7Modal || _assertThisInitialized(_this);
17424 }
17425
17426 if ($el.length === 0) {
17427 return loginScreen.destroy() || _assertThisInitialized(_this);
17428 }
17429
17430 extend$1(loginScreen, {
17431 app: app,
17432 $el: $el,
17433 el: $el[0],
17434 type: 'loginScreen'
17435 });
17436 $el[0].f7Modal = loginScreen;
17437 return loginScreen || _assertThisInitialized(_this);
17438 }
17439
17440 return LoginScreen;
17441 }(Modal$1);
17442
17443 var LoginScreen = {
17444 name: 'loginScreen',
17445 static: {
17446 LoginScreen: LoginScreen$1
17447 },
17448 create: function create() {
17449 var app = this;
17450 app.loginScreen = ModalMethods({
17451 app: app,
17452 constructor: LoginScreen$1,
17453 defaultSelector: '.login-screen.modal-in'
17454 });
17455 },
17456 clicks: {
17457 '.login-screen-open': function openLoginScreen($clickedEl, data) {
17458 if (data === void 0) {
17459 data = {};
17460 }
17461
17462 var app = this;
17463 app.loginScreen.open(data.loginScreen, data.animate, $clickedEl);
17464 },
17465 '.login-screen-close': function closeLoginScreen($clickedEl, data) {
17466 if (data === void 0) {
17467 data = {};
17468 }
17469
17470 var app = this;
17471 app.loginScreen.close(data.loginScreen, data.animate, $clickedEl);
17472 }
17473 }
17474 };
17475
17476 var Popover$1 = /*#__PURE__*/function (_Modal) {
17477 _inheritsLoose(Popover, _Modal);
17478
17479 function Popover(app, params) {
17480 var _this;
17481
17482 var extendedParams = extend$1({
17483 on: {}
17484 }, app.params.popover, params); // Extends with open/close Modal methods;
17485
17486 _this = _Modal.call(this, app, extendedParams) || this;
17487
17488 var popover = _assertThisInitialized(_this);
17489
17490 var device = getDevice$1();
17491 var window = getWindow();
17492 var document = getDocument();
17493 popover.params = extendedParams; // Find Element
17494
17495 var $el;
17496
17497 if (!popover.params.el) {
17498 $el = $(popover.params.content).filter(function (node) {
17499 return node.nodeType === 1;
17500 }).eq(0);
17501 } else {
17502 $el = $(popover.params.el).eq(0);
17503 }
17504
17505 if ($el && $el.length > 0 && $el[0].f7Modal) {
17506 return $el[0].f7Modal || _assertThisInitialized(_this);
17507 } // Find Target
17508
17509
17510 var $targetEl = $(popover.params.targetEl).eq(0);
17511
17512 if ($el.length === 0) {
17513 return popover.destroy() || _assertThisInitialized(_this);
17514 } // Backdrop
17515
17516
17517 var $backdropEl;
17518
17519 if (popover.params.backdrop && popover.params.backdropEl) {
17520 $backdropEl = $(popover.params.backdropEl);
17521 } else if (popover.params.backdrop) {
17522 $backdropEl = popover.$containerEl.children('.popover-backdrop');
17523
17524 if ($backdropEl.length === 0) {
17525 $backdropEl = $('<div class="popover-backdrop"></div>');
17526 popover.$containerEl.append($backdropEl);
17527 }
17528 } // Find Angle
17529
17530
17531 var $angleEl;
17532
17533 if ($el.find('.popover-angle').length === 0) {
17534 $angleEl = $('<div class="popover-angle"></div>');
17535 $el.prepend($angleEl);
17536 } else {
17537 $angleEl = $el.find('.popover-angle');
17538 } // Open
17539
17540
17541 var originalOpen = popover.open;
17542 extend$1(popover, {
17543 app: app,
17544 $el: $el,
17545 el: $el[0],
17546 $targetEl: $targetEl,
17547 targetEl: $targetEl[0],
17548 $angleEl: $angleEl,
17549 angleEl: $angleEl[0],
17550 $backdropEl: $backdropEl,
17551 backdropEl: $backdropEl && $backdropEl[0],
17552 type: 'popover',
17553 open: function open() {
17554 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
17555 args[_key] = arguments[_key];
17556 }
17557
17558 var targetEl = args[0],
17559 animate = args[1];
17560
17561 if (typeof args[0] === 'boolean') {
17562 animate = args[0];
17563 targetEl = args[1];
17564 }
17565
17566 if (targetEl) {
17567 popover.$targetEl = $(targetEl);
17568 popover.targetEl = popover.$targetEl[0];
17569 }
17570
17571 return originalOpen.call(popover, animate);
17572 }
17573 });
17574
17575 function handleResize() {
17576 popover.resize();
17577 }
17578
17579 popover.on('popoverOpen', function () {
17580 popover.resize();
17581 app.on('resize', handleResize);
17582 $(window).on('keyboardDidShow keyboardDidHide', handleResize);
17583 popover.on('popoverClose popoverBeforeDestroy', function () {
17584 app.off('resize', handleResize);
17585 $(window).off('keyboardDidShow keyboardDidHide', handleResize);
17586 });
17587 });
17588
17589 function handleClick(e) {
17590 var target = e.target;
17591 var $target = $(target);
17592 var keyboardOpened = !device.desktop && device.cordova && (window.Keyboard && window.Keyboard.isVisible || window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible);
17593 if (keyboardOpened) return;
17594
17595 if ($target.closest(popover.el).length === 0) {
17596 if (popover.params.closeByBackdropClick && popover.params.backdrop && popover.backdropEl && popover.backdropEl === target) {
17597 popover.close();
17598 } else if (popover.params.closeByOutsideClick) {
17599 popover.close();
17600 }
17601 }
17602 }
17603
17604 function onKeyDown(e) {
17605 var keyCode = e.keyCode;
17606
17607 if (keyCode === 27 && popover.params.closeOnEscape) {
17608 popover.close();
17609 }
17610 }
17611
17612 if (popover.params.closeOnEscape) {
17613 popover.on('popoverOpen', function () {
17614 $(document).on('keydown', onKeyDown);
17615 });
17616 popover.on('popoverClose', function () {
17617 $(document).off('keydown', onKeyDown);
17618 });
17619 }
17620
17621 popover.on('popoverOpened', function () {
17622 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
17623 app.on('click', handleClick);
17624 }
17625 });
17626 popover.on('popoverClose', function () {
17627 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
17628 app.off('click', handleClick);
17629 }
17630 });
17631 $el[0].f7Modal = popover;
17632 return popover || _assertThisInitialized(_this);
17633 }
17634
17635 var _proto = Popover.prototype;
17636
17637 _proto.resize = function resize() {
17638 var popover = this;
17639 var app = popover.app,
17640 $el = popover.$el,
17641 $targetEl = popover.$targetEl,
17642 $angleEl = popover.$angleEl;
17643 var _popover$params = popover.params,
17644 targetX = _popover$params.targetX,
17645 targetY = _popover$params.targetY;
17646 $el.css({
17647 left: '',
17648 top: ''
17649 });
17650 var _ref = [$el.width(), $el.height()],
17651 width = _ref[0],
17652 height = _ref[1];
17653 var angleSize = 0;
17654 var angleLeft;
17655 var angleTop;
17656
17657 if (app.theme === 'ios' || app.theme === 'aurora') {
17658 $angleEl.removeClass('on-left on-right on-top on-bottom').css({
17659 left: '',
17660 top: ''
17661 });
17662 angleSize = $angleEl.width() / 2;
17663 } else {
17664 $el.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom popover-on-middle').css({
17665 left: '',
17666 top: ''
17667 });
17668 }
17669
17670 var targetWidth;
17671 var targetHeight;
17672 var targetOffsetLeft;
17673 var targetOffsetTop;
17674 var safeAreaTop = parseInt($('html').css('--f7-safe-area-top'), 10);
17675 var safeAreaLeft = parseInt($('html').css('--f7-safe-area-left'), 10);
17676 var safeAreaRight = parseInt($('html').css('--f7-safe-area-right'), 10);
17677 if (Number.isNaN(safeAreaTop)) safeAreaTop = 0;
17678 if (Number.isNaN(safeAreaLeft)) safeAreaLeft = 0;
17679 if (Number.isNaN(safeAreaRight)) safeAreaRight = 0;
17680
17681 if ($targetEl && $targetEl.length > 0) {
17682 targetWidth = $targetEl.outerWidth();
17683 targetHeight = $targetEl.outerHeight();
17684 var targetOffset = $targetEl.offset();
17685 targetOffsetLeft = targetOffset.left - app.left;
17686 targetOffsetTop = targetOffset.top - app.top;
17687 var targetParentPage = $targetEl.parents('.page');
17688
17689 if (targetParentPage.length > 0) {
17690 targetOffsetTop -= targetParentPage[0].scrollTop;
17691 }
17692 } else if (typeof targetX !== 'undefined' && targetY !== 'undefined') {
17693 targetOffsetLeft = targetX;
17694 targetOffsetTop = targetY;
17695 targetWidth = popover.params.targetWidth || 0;
17696 targetHeight = popover.params.targetHeight || 0;
17697 }
17698
17699 var left = 0,
17700 top = 0,
17701 diff = 0; // Top Position
17702
17703 var position = app.theme === 'md' ? 'bottom' : 'top';
17704
17705 if (app.theme === 'md') {
17706 if (height < app.height - targetOffsetTop - targetHeight) {
17707 // On bottom
17708 position = 'bottom';
17709 top = targetOffsetTop + targetHeight;
17710 } else if (height < targetOffsetTop - safeAreaTop) {
17711 // On top
17712 top = targetOffsetTop - height;
17713 position = 'top';
17714 } else {
17715 // On middle
17716 position = 'middle';
17717 top = targetHeight / 2 + targetOffsetTop - height / 2;
17718 }
17719
17720 top = Math.max(8, Math.min(top, app.height - height - 8)); // Horizontal Position
17721
17722 var hPosition;
17723
17724 if (targetOffsetLeft < app.width / 2) {
17725 hPosition = 'right';
17726 left = position === 'middle' ? targetOffsetLeft + targetWidth : targetOffsetLeft;
17727 } else {
17728 hPosition = 'left';
17729 left = position === 'middle' ? targetOffsetLeft - width : targetOffsetLeft + targetWidth - width;
17730 }
17731
17732 left = Math.max(8, Math.min(left, app.width - width - 8 - safeAreaRight), safeAreaLeft);
17733 $el.addClass("popover-on-" + position + " popover-on-" + hPosition);
17734 } else {
17735 // ios and aurora
17736 if (height + angleSize < targetOffsetTop - safeAreaTop) {
17737 // On top
17738 top = targetOffsetTop - height - angleSize;
17739 } else if (height + angleSize < app.height - targetOffsetTop - targetHeight) {
17740 // On bottom
17741 position = 'bottom';
17742 top = targetOffsetTop + targetHeight + angleSize;
17743 } else {
17744 // On middle
17745 position = 'middle';
17746 top = targetHeight / 2 + targetOffsetTop - height / 2;
17747 diff = top;
17748 top = Math.max(5, Math.min(top, app.height - height - 5));
17749 diff -= top;
17750 } // Horizontal Position
17751
17752
17753 if (position === 'top' || position === 'bottom') {
17754 left = targetWidth / 2 + targetOffsetLeft - width / 2;
17755 diff = left;
17756 left = Math.max(5, Math.min(left, app.width - width - 5));
17757
17758 if (safeAreaLeft) {
17759 left = Math.max(left, safeAreaLeft);
17760 }
17761
17762 if (safeAreaRight && left + width > app.width - 5 - safeAreaRight) {
17763 left = app.width - 5 - safeAreaRight - width;
17764 }
17765
17766 if (position === 'top') {
17767 $angleEl.addClass('on-bottom');
17768 }
17769
17770 if (position === 'bottom') {
17771 $angleEl.addClass('on-top');
17772 }
17773
17774 diff -= left;
17775 angleLeft = width / 2 - angleSize + diff;
17776 angleLeft = Math.max(Math.min(angleLeft, width - angleSize * 2 - 13), 13);
17777 $angleEl.css({
17778 left: angleLeft + "px"
17779 });
17780 } else if (position === 'middle') {
17781 left = targetOffsetLeft - width - angleSize;
17782 $angleEl.addClass('on-right');
17783
17784 if (left < 5 || left + width + safeAreaRight > app.width || left < safeAreaLeft) {
17785 if (left < 5) left = targetOffsetLeft + targetWidth + angleSize;
17786 if (left + width + safeAreaRight > app.width) left = app.width - width - 5 - safeAreaRight;
17787 if (left < safeAreaLeft) left = safeAreaLeft;
17788 $angleEl.removeClass('on-right').addClass('on-left');
17789 }
17790
17791 angleTop = height / 2 - angleSize + diff;
17792 angleTop = Math.max(Math.min(angleTop, height - angleSize * 2 - 13), 13);
17793 $angleEl.css({
17794 top: angleTop + "px"
17795 });
17796 }
17797 } // Apply Styles
17798
17799
17800 $el.css({
17801 top: top + "px",
17802 left: left + "px"
17803 });
17804 };
17805
17806 return Popover;
17807 }(Modal$1);
17808
17809 var Popover = {
17810 name: 'popover',
17811 params: {
17812 popover: {
17813 backdrop: true,
17814 backdropEl: undefined,
17815 closeByBackdropClick: true,
17816 closeByOutsideClick: true,
17817 closeOnEscape: false,
17818 containerEl: null
17819 }
17820 },
17821 static: {
17822 Popover: Popover$1
17823 },
17824 create: function create() {
17825 var app = this;
17826 app.popover = extend$1(ModalMethods({
17827 app: app,
17828 constructor: Popover$1,
17829 defaultSelector: '.popover.modal-in'
17830 }), {
17831 open: function open(popoverEl, targetEl, animate) {
17832 var $popoverEl = $(popoverEl);
17833
17834 if ($popoverEl.length > 1) {
17835 // check if same popover in other page
17836 var $targetPage = $(targetEl).parents('.page');
17837
17838 if ($targetPage.length) {
17839 $popoverEl.each(function (el) {
17840 var $el = $(el);
17841
17842 if ($el.parents($targetPage)[0] === $targetPage[0]) {
17843 $popoverEl = $el;
17844 }
17845 });
17846 }
17847 }
17848
17849 if ($popoverEl.length > 1) {
17850 $popoverEl = $popoverEl.eq($popoverEl.length - 1);
17851 }
17852
17853 var popover = $popoverEl[0].f7Modal;
17854 var data = $popoverEl.dataset();
17855
17856 if (!popover) {
17857 popover = new Popover$1(app, Object.assign({
17858 el: $popoverEl,
17859 targetEl: targetEl
17860 }, data));
17861 }
17862
17863 return popover.open(targetEl, animate);
17864 }
17865 });
17866 },
17867 clicks: {
17868 '.popover-open': function openPopover($clickedEl, data) {
17869 if (data === void 0) {
17870 data = {};
17871 }
17872
17873 var app = this;
17874 app.popover.open(data.popover, $clickedEl, data.animate);
17875 },
17876 '.popover-close': function closePopover($clickedEl, data) {
17877 if (data === void 0) {
17878 data = {};
17879 }
17880
17881 var app = this;
17882 app.popover.close(data.popover, data.animate, $clickedEl);
17883 }
17884 }
17885 };
17886
17887 var Actions$1 = /*#__PURE__*/function (_Modal) {
17888 _inheritsLoose(Actions, _Modal);
17889
17890 function Actions(app, params) {
17891 var _this;
17892
17893 var extendedParams = extend$1({
17894 on: {}
17895 }, app.params.actions, params); // Extends with open/close Modal methods;
17896
17897 _this = _Modal.call(this, app, extendedParams) || this;
17898
17899 var actions = _assertThisInitialized(_this);
17900
17901 var device = getDevice$1();
17902 var window = getWindow();
17903 var document = getDocument();
17904 actions.params = extendedParams; // Buttons
17905
17906 var groups;
17907
17908 if (actions.params.buttons) {
17909 groups = actions.params.buttons;
17910 if (!Array.isArray(groups[0])) groups = [groups];
17911 }
17912
17913 actions.groups = groups; // Find Element
17914
17915 var $el;
17916
17917 if (actions.params.el) {
17918 $el = $(actions.params.el).eq(0);
17919 } else if (actions.params.content) {
17920 $el = $(actions.params.content).filter(function (node) {
17921 return node.nodeType === 1;
17922 }).eq(0);
17923 } else if (actions.params.buttons) {
17924 if (actions.params.convertToPopover) {
17925 actions.popoverHtml = actions.renderPopover();
17926 }
17927
17928 actions.actionsHtml = actions.render();
17929 }
17930
17931 if ($el && $el.length > 0 && $el[0].f7Modal) {
17932 return $el[0].f7Modal || _assertThisInitialized(_this);
17933 }
17934
17935 if ($el && $el.length === 0 && !(actions.actionsHtml || actions.popoverHtml)) {
17936 return actions.destroy() || _assertThisInitialized(_this);
17937 } // Backdrop
17938
17939
17940 var $backdropEl;
17941
17942 if (actions.params.backdrop && actions.params.backdropEl) {
17943 $backdropEl = $(actions.params.backdropEl);
17944 } else if (actions.params.backdrop) {
17945 $backdropEl = actions.$containerEl.children('.actions-backdrop');
17946
17947 if ($backdropEl.length === 0) {
17948 $backdropEl = $('<div class="actions-backdrop"></div>');
17949 actions.$containerEl.append($backdropEl);
17950 }
17951 }
17952
17953 var originalOpen = actions.open;
17954 var originalClose = actions.close;
17955 var popover;
17956
17957 function buttonOnClick(e) {
17958 var $buttonEl = $(this);
17959 var buttonIndex;
17960 var groupIndex;
17961
17962 if ($buttonEl.hasClass('list-button') || $buttonEl.hasClass('item-link')) {
17963 buttonIndex = $buttonEl.parents('li').index();
17964 groupIndex = $buttonEl.parents('.list').index();
17965 } else {
17966 buttonIndex = $buttonEl.index();
17967 groupIndex = $buttonEl.parents('.actions-group').index();
17968 }
17969
17970 if (typeof groups !== 'undefined') {
17971 var button = groups[groupIndex][buttonIndex];
17972 if (button.onClick) button.onClick(actions, e);
17973 if (actions.params.onClick) actions.params.onClick(actions, e);
17974 if (button.close !== false) actions.close();
17975 }
17976 }
17977
17978 actions.open = function open(animate) {
17979 var convertToPopover = false;
17980 var _actions$params = actions.params,
17981 targetEl = _actions$params.targetEl,
17982 targetX = _actions$params.targetX,
17983 targetY = _actions$params.targetY,
17984 targetWidth = _actions$params.targetWidth,
17985 targetHeight = _actions$params.targetHeight;
17986
17987 if (actions.params.convertToPopover && (targetEl || targetX !== undefined && targetY !== undefined)) {
17988 // Popover
17989 if (actions.params.forceToPopover || device.ios && device.ipad || app.width >= 768 || device.desktop && app.theme === 'aurora') {
17990 convertToPopover = true;
17991 }
17992 }
17993
17994 if (convertToPopover && actions.popoverHtml) {
17995 popover = app.popover.create({
17996 content: actions.popoverHtml,
17997 backdrop: actions.params.backdrop,
17998 targetEl: targetEl,
17999 targetX: targetX,
18000 targetY: targetY,
18001 targetWidth: targetWidth,
18002 targetHeight: targetHeight,
18003 on: {
18004 open: function open() {
18005 if (!actions.$el) {
18006 actions.$el = popover.$el;
18007 }
18008
18009 actions.$el.trigger("modal:open " + actions.type.toLowerCase() + ":open");
18010 actions.emit("local::open modalOpen " + actions.type + "Open", actions);
18011 },
18012 opened: function opened() {
18013 if (!actions.$el) {
18014 actions.$el = popover.$el;
18015 }
18016
18017 actions.$el.trigger("modal:opened " + actions.type.toLowerCase() + ":opened");
18018 actions.emit("local::opened modalOpened " + actions.type + "Opened", actions);
18019 },
18020 close: function close() {
18021 if (!actions.$el) {
18022 actions.$el = popover.$el;
18023 }
18024
18025 actions.$el.trigger("modal:close " + actions.type.toLowerCase() + ":close");
18026 actions.emit("local::close modalClose " + actions.type + "Close", actions);
18027 },
18028 closed: function closed() {
18029 if (!actions.$el) {
18030 actions.$el = popover.$el;
18031 }
18032
18033 actions.$el.trigger("modal:closed " + actions.type.toLowerCase() + ":closed");
18034 actions.emit("local::closed modalClosed " + actions.type + "Closed", actions);
18035 }
18036 }
18037 });
18038 popover.open(animate);
18039 popover.once('popoverOpened', function () {
18040 popover.$el.find('.list-button, .item-link').each(function (buttonEl) {
18041 $(buttonEl).on('click', buttonOnClick);
18042 });
18043 });
18044 popover.once('popoverClosed', function () {
18045 popover.$el.find('.list-button, .item-link').each(function (buttonEl) {
18046 $(buttonEl).off('click', buttonOnClick);
18047 });
18048 nextTick$1(function () {
18049 popover.destroy();
18050 popover = undefined;
18051 });
18052 });
18053 } else {
18054 actions.$el = actions.actionsHtml ? $(actions.actionsHtml) : actions.$el;
18055 actions.$el[0].f7Modal = actions;
18056
18057 if (actions.groups) {
18058 actions.$el.find('.actions-button').each(function (buttonEl) {
18059 $(buttonEl).on('click', buttonOnClick);
18060 });
18061 actions.once('actionsClosed', function () {
18062 actions.$el.find('.actions-button').each(function (buttonEl) {
18063 $(buttonEl).off('click', buttonOnClick);
18064 });
18065 });
18066 }
18067
18068 actions.el = actions.$el[0];
18069 originalOpen.call(actions, animate);
18070 }
18071
18072 return actions;
18073 };
18074
18075 actions.close = function close(animate) {
18076 if (popover) {
18077 popover.close(animate);
18078 } else {
18079 originalClose.call(actions, animate);
18080 }
18081
18082 return actions;
18083 };
18084
18085 extend$1(actions, {
18086 app: app,
18087 $el: $el,
18088 el: $el ? $el[0] : undefined,
18089 $backdropEl: $backdropEl,
18090 backdropEl: $backdropEl && $backdropEl[0],
18091 type: 'actions'
18092 });
18093
18094 function handleClick(e) {
18095 var target = e.target;
18096 var $target = $(target);
18097 var keyboardOpened = !device.desktop && device.cordova && (window.Keyboard && window.Keyboard.isVisible || window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible);
18098 if (keyboardOpened) return;
18099
18100 if ($target.closest(actions.el).length === 0) {
18101 if (actions.params.closeByBackdropClick && actions.params.backdrop && actions.backdropEl && actions.backdropEl === target) {
18102 actions.close();
18103 } else if (actions.params.closeByOutsideClick) {
18104 actions.close();
18105 }
18106 }
18107 }
18108
18109 function onKeyDown(e) {
18110 var keyCode = e.keyCode;
18111
18112 if (keyCode === 27 && actions.params.closeOnEscape) {
18113 actions.close();
18114 }
18115 }
18116
18117 if (actions.params.closeOnEscape) {
18118 actions.on('open', function () {
18119 $(document).on('keydown', onKeyDown);
18120 });
18121 actions.on('close', function () {
18122 $(document).off('keydown', onKeyDown);
18123 });
18124 }
18125
18126 actions.on('opened', function () {
18127 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
18128 app.on('click', handleClick);
18129 }
18130 });
18131 actions.on('close', function () {
18132 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
18133 app.off('click', handleClick);
18134 }
18135 });
18136
18137 if ($el) {
18138 $el[0].f7Modal = actions;
18139 }
18140
18141 return actions || _assertThisInitialized(_this);
18142 }
18143
18144 var _proto = Actions.prototype;
18145
18146 _proto.render = function render() {
18147 var actions = this;
18148 if (actions.params.render) return actions.params.render.call(actions, actions);
18149 var groups = actions.groups;
18150 var cssClass = actions.params.cssClass;
18151 return $jsx("div", {
18152 class: "actions-modal" + (actions.params.grid ? ' actions-grid' : '') + " " + (cssClass || '')
18153 }, groups.map(function (group) {
18154 return $jsx("div", {
18155 class: "actions-group"
18156 }, group.map(function (button) {
18157 var buttonClasses = ["actions-" + (button.label ? 'label' : 'button')];
18158 var color = button.color,
18159 bg = button.bg,
18160 bold = button.bold,
18161 disabled = button.disabled,
18162 label = button.label,
18163 text = button.text,
18164 icon = button.icon;
18165 if (color) buttonClasses.push("color-" + color);
18166 if (bg) buttonClasses.push("bg-color-" + bg);
18167 if (bold) buttonClasses.push('actions-button-bold');
18168 if (disabled) buttonClasses.push('disabled');
18169
18170 if (label) {
18171 return $jsx("div", {
18172 class: buttonClasses.join(' ')
18173 }, text);
18174 }
18175
18176 return $jsx("div", {
18177 class: buttonClasses.join(' ')
18178 }, icon && $jsx("div", {
18179 class: "actions-button-media"
18180 }, icon), $jsx("div", {
18181 class: "actions-button-text"
18182 }, text));
18183 }));
18184 }));
18185 };
18186
18187 _proto.renderPopover = function renderPopover() {
18188 var actions = this;
18189 if (actions.params.renderPopover) return actions.params.renderPopover.call(actions, actions);
18190 var groups = actions.groups;
18191 var cssClass = actions.params.cssClass;
18192 return $jsx("div", {
18193 class: "popover popover-from-actions " + (cssClass || '')
18194 }, $jsx("div", {
18195 class: "popover-inner"
18196 }, groups.map(function (group) {
18197 return $jsx("div", {
18198 class: "list"
18199 }, $jsx("ul", null, group.map(function (button) {
18200 var itemClasses = [];
18201 var color = button.color,
18202 bg = button.bg,
18203 bold = button.bold,
18204 disabled = button.disabled,
18205 label = button.label,
18206 text = button.text,
18207 icon = button.icon;
18208 if (color) itemClasses.push("color-" + color);
18209 if (bg) itemClasses.push("bg-color-" + bg);
18210 if (bold) itemClasses.push('popover-from-actions-bold');
18211 if (disabled) itemClasses.push('disabled');
18212
18213 if (label) {
18214 itemClasses.push('popover-from-actions-label');
18215 return "<li class=\"" + itemClasses.join(' ') + "\">" + text + "</li>";
18216 }
18217
18218 if (icon) {
18219 itemClasses.push('item-link item-content');
18220 return $jsx("li", null, $jsx("a", {
18221 class: itemClasses.join(' ')
18222 }, $jsx("div", {
18223 class: "item-media"
18224 }, icon), $jsx("div", {
18225 class: "item-inner"
18226 }, $jsx("div", {
18227 class: "item-title"
18228 }, text))));
18229 }
18230
18231 itemClasses.push('list-button');
18232 return $jsx("li", null, $jsx("a", {
18233 class: itemClasses.join(' ')
18234 }, text));
18235 })));
18236 })));
18237 };
18238
18239 return Actions;
18240 }(Modal$1);
18241
18242 var Actions = {
18243 name: 'actions',
18244 params: {
18245 actions: {
18246 convertToPopover: true,
18247 forceToPopover: false,
18248 backdrop: true,
18249 backdropEl: undefined,
18250 cssClass: null,
18251 closeByBackdropClick: true,
18252 closeOnEscape: false,
18253 render: null,
18254 renderPopover: null,
18255 containerEl: null
18256 }
18257 },
18258 static: {
18259 Actions: Actions$1
18260 },
18261 create: function create() {
18262 var app = this;
18263 app.actions = ModalMethods({
18264 app: app,
18265 constructor: Actions$1,
18266 defaultSelector: '.actions-modal.modal-in'
18267 });
18268 },
18269 clicks: {
18270 '.actions-open': function openActions($clickedEl, data) {
18271 if (data === void 0) {
18272 data = {};
18273 }
18274
18275 var app = this;
18276 app.actions.open(data.actions, data.animate, $clickedEl);
18277 },
18278 '.actions-close': function closeActions($clickedEl, data) {
18279 if (data === void 0) {
18280 data = {};
18281 }
18282
18283 var app = this;
18284 app.actions.close(data.actions, data.animate, $clickedEl);
18285 }
18286 }
18287 };
18288
18289 var Sheet$1 = /*#__PURE__*/function (_Modal) {
18290 _inheritsLoose(Sheet, _Modal);
18291
18292 function Sheet(app, params) {
18293 var _this;
18294
18295 var extendedParams = extend$1({
18296 on: {}
18297 }, app.params.sheet, params); // Extends with open/close Modal methods;
18298
18299 _this = _Modal.call(this, app, extendedParams) || this;
18300
18301 var sheet = _assertThisInitialized(_this);
18302
18303 var window = getWindow();
18304 var document = getDocument();
18305 var support = getSupport$1();
18306 var device = getDevice$1();
18307 sheet.params = extendedParams;
18308
18309 if (typeof sheet.params.backdrop === 'undefined') {
18310 sheet.params.backdrop = app.theme !== 'ios';
18311 } // Find Element
18312
18313
18314 var $el;
18315
18316 if (!sheet.params.el) {
18317 $el = $(sheet.params.content).filter(function (node) {
18318 return node.nodeType === 1;
18319 }).eq(0);
18320 } else {
18321 $el = $(sheet.params.el).eq(0);
18322 }
18323
18324 if ($el && $el.length > 0 && $el[0].f7Modal) {
18325 return $el[0].f7Modal || _assertThisInitialized(_this);
18326 }
18327
18328 if ($el.length === 0) {
18329 return sheet.destroy() || _assertThisInitialized(_this);
18330 }
18331
18332 var $backdropEl;
18333
18334 if (sheet.params.backdrop && sheet.params.backdropEl) {
18335 $backdropEl = $(sheet.params.backdropEl);
18336 } else if (sheet.params.backdrop) {
18337 $backdropEl = sheet.$containerEl.children('.sheet-backdrop');
18338
18339 if ($backdropEl.length === 0) {
18340 $backdropEl = $('<div class="sheet-backdrop"></div>');
18341 sheet.$containerEl.append($backdropEl);
18342 }
18343 }
18344
18345 extend$1(sheet, {
18346 app: app,
18347 push: $el.hasClass('sheet-modal-push') || sheet.params.push,
18348 $el: $el,
18349 el: $el[0],
18350 $backdropEl: $backdropEl,
18351 backdropEl: $backdropEl && $backdropEl[0],
18352 type: 'sheet',
18353 $htmlEl: $('html')
18354 });
18355
18356 if (sheet.params.push) {
18357 $el.addClass('sheet-modal-push');
18358 }
18359
18360 var $pageContentEl;
18361
18362 function scrollToElementOnOpen() {
18363 var $scrollEl = $(sheet.params.scrollToEl).eq(0);
18364 if ($scrollEl.length === 0) return;
18365 $pageContentEl = $scrollEl.parents('.page-content');
18366 if ($pageContentEl.length === 0) return;
18367 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
18368 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
18369 var pageHeight = $pageContentEl[0].offsetHeight - paddingTop - $el.height();
18370 var pageScrollHeight = $pageContentEl[0].scrollHeight - paddingTop - $el.height();
18371 var pageScroll = $pageContentEl.scrollTop();
18372 var newPaddingBottom;
18373 var scrollElTop = $scrollEl.offset().top - paddingTop + $scrollEl[0].offsetHeight;
18374
18375 if (scrollElTop > pageHeight) {
18376 var scrollTop = pageScroll + scrollElTop - pageHeight;
18377
18378 if (scrollTop + pageHeight > pageScrollHeight) {
18379 newPaddingBottom = scrollTop + pageHeight - pageScrollHeight + paddingBottom;
18380
18381 if (pageHeight === pageScrollHeight) {
18382 newPaddingBottom = $el.height();
18383 }
18384
18385 $pageContentEl.css({
18386 'padding-bottom': newPaddingBottom + "px"
18387 });
18388 }
18389
18390 $pageContentEl.scrollTop(scrollTop, 300);
18391 }
18392 }
18393
18394 function scrollToElementOnClose() {
18395 if ($pageContentEl && $pageContentEl.length > 0) {
18396 $pageContentEl.css({
18397 'padding-bottom': ''
18398 });
18399 }
18400 }
18401
18402 function handleClick(e) {
18403 var target = e.target;
18404 var $target = $(target);
18405 var keyboardOpened = !device.desktop && device.cordova && (window.Keyboard && window.Keyboard.isVisible || window.cordova.plugins && window.cordova.plugins.Keyboard && window.cordova.plugins.Keyboard.isVisible);
18406 if (keyboardOpened) return;
18407
18408 if ($target.closest(sheet.el).length === 0) {
18409 if (sheet.params.closeByBackdropClick && sheet.params.backdrop && sheet.backdropEl && sheet.backdropEl === target) {
18410 sheet.close();
18411 } else if (sheet.params.closeByOutsideClick) {
18412 sheet.close();
18413 }
18414 }
18415 }
18416
18417 function onKeyDown(e) {
18418 var keyCode = e.keyCode;
18419
18420 if (keyCode === 27 && sheet.params.closeOnEscape) {
18421 sheet.close();
18422 }
18423 }
18424
18425 var pushOffset;
18426
18427 function pushViewScale(offset) {
18428 return (app.height - offset * 2) / app.height;
18429 }
18430
18431 var isTouched = false;
18432 var startTouch;
18433 var currentTouch;
18434 var isScrolling;
18435 var touchStartTime;
18436 var touchesDiff;
18437 var isMoved = false;
18438 var isTopSheetModal;
18439 var swipeStepTranslate;
18440 var startTranslate;
18441 var currentTranslate;
18442 var sheetElOffsetHeight;
18443 var minTranslate;
18444 var maxTranslate;
18445 var $pushViewEl;
18446 var pushBorderRadius;
18447 var sheetPageContentEl;
18448 var sheetPageContentScrollTop;
18449 var sheetPageContentScrollHeight;
18450 var sheetPageContentOffsetHeight;
18451
18452 function handleTouchStart(e) {
18453 if (isTouched || !(sheet.params.swipeToClose || sheet.params.swipeToStep)) return;
18454
18455 if (sheet.params.swipeHandler && $(e.target).closest(sheet.params.swipeHandler).length === 0) {
18456 return;
18457 }
18458
18459 isTouched = true;
18460 isMoved = false;
18461 startTouch = {
18462 x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
18463 y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY
18464 };
18465 touchStartTime = now$1();
18466 isScrolling = undefined;
18467 isTopSheetModal = $el.hasClass('sheet-modal-top');
18468
18469 if (!sheet.params.swipeHandler && e.type === 'touchstart') {
18470 sheetPageContentEl = $(e.target).closest('.page-content')[0];
18471 }
18472 }
18473
18474 function handleTouchMove(e) {
18475 if (!isTouched) return;
18476 currentTouch = {
18477 x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
18478 y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY
18479 };
18480
18481 if (typeof isScrolling === 'undefined') {
18482 isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
18483 }
18484
18485 if (isScrolling) {
18486 isTouched = false;
18487 isMoved = false;
18488 return;
18489 }
18490
18491 touchesDiff = startTouch.y - currentTouch.y;
18492 var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
18493
18494 if (!isMoved) {
18495 if (sheetPageContentEl && !$el.hasClass('modal-in-swipe-step')) {
18496 sheetPageContentScrollTop = sheetPageContentEl.scrollTop;
18497 sheetPageContentScrollHeight = sheetPageContentEl.scrollHeight;
18498 sheetPageContentOffsetHeight = sheetPageContentEl.offsetHeight;
18499
18500 if (!(sheetPageContentScrollHeight === sheetPageContentOffsetHeight) && !(direction === 'to-bottom' && sheetPageContentScrollTop === 0) && !(direction === 'to-top' && sheetPageContentScrollTop === sheetPageContentScrollHeight - sheetPageContentOffsetHeight)) {
18501 $el.transform('');
18502 isTouched = false;
18503 isMoved = false;
18504 return;
18505 }
18506 }
18507
18508 if (sheet.push && pushOffset) {
18509 $pushViewEl = app.$el.children('.view, .views');
18510 }
18511
18512 sheetElOffsetHeight = $el[0].offsetHeight;
18513 startTranslate = getTranslate$1($el[0], 'y');
18514
18515 if (isTopSheetModal) {
18516 minTranslate = sheet.params.swipeToClose ? -sheetElOffsetHeight : -swipeStepTranslate;
18517 maxTranslate = 0;
18518 } else {
18519 minTranslate = 0;
18520 maxTranslate = sheet.params.swipeToClose ? sheetElOffsetHeight : swipeStepTranslate;
18521 }
18522
18523 isMoved = true;
18524 }
18525
18526 currentTranslate = startTranslate - touchesDiff;
18527 currentTranslate = Math.min(Math.max(currentTranslate, minTranslate), maxTranslate);
18528 e.preventDefault();
18529
18530 if (sheet.push && pushOffset) {
18531 var progress = (currentTranslate - startTranslate) / sheetElOffsetHeight;
18532
18533 if (sheet.params.swipeToStep) {
18534 if (isTopSheetModal) {
18535 progress = currentTranslate / swipeStepTranslate;
18536 } else {
18537 progress = 1 - (swipeStepTranslate - currentTranslate) / swipeStepTranslate;
18538 }
18539 }
18540
18541 progress = Math.abs(progress);
18542 progress = Math.min(Math.max(progress, 0), 1);
18543 var pushProgress = 1 - progress;
18544 var scale = 1 - (1 - pushViewScale(pushOffset)) * pushProgress;
18545 $pushViewEl.transition(0).forEach(function (el) {
18546 el.style.setProperty('transform', "translate3d(0,0,0) scale(" + scale + ")", 'important');
18547 });
18548
18549 if (sheet.params.swipeToStep) {
18550 $pushViewEl.css('border-radius', pushBorderRadius * pushProgress + "px");
18551 }
18552 }
18553
18554 $el.transition(0).transform("translate3d(0," + currentTranslate + "px,0)");
18555
18556 if (sheet.params.swipeToStep) {
18557 var _progress;
18558
18559 if (isTopSheetModal) {
18560 _progress = 1 - currentTranslate / swipeStepTranslate;
18561 } else {
18562 _progress = (swipeStepTranslate - currentTranslate) / swipeStepTranslate;
18563 }
18564
18565 _progress = Math.min(Math.max(_progress, 0), 1);
18566 $el.trigger('sheet:stepprogress', _progress);
18567 sheet.emit('local::stepProgress sheetStepProgress', sheet, _progress);
18568 }
18569 }
18570
18571 function handleTouchEnd() {
18572 isTouched = false;
18573
18574 if (!isMoved) {
18575 return;
18576 }
18577
18578 isMoved = false;
18579 $el.transform('').transition('');
18580
18581 if (sheet.push && pushOffset) {
18582 $pushViewEl.transition('').transform('');
18583 $pushViewEl.css('border-radius', '');
18584 }
18585
18586 var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
18587 var diff = Math.abs(touchesDiff);
18588 if (diff === 0 || currentTranslate === startTranslate) return;
18589 var timeDiff = new Date().getTime() - touchStartTime;
18590
18591 if (!sheet.params.swipeToStep) {
18592 if (direction !== (isTopSheetModal ? 'to-top' : 'to-bottom')) {
18593 return;
18594 }
18595
18596 if (timeDiff < 300 && diff > 20 || timeDiff >= 300 && diff > sheetElOffsetHeight / 2) {
18597 sheet.close();
18598 }
18599
18600 return;
18601 }
18602
18603 var openDirection = isTopSheetModal ? 'to-bottom' : 'to-top';
18604 var closeDirection = isTopSheetModal ? 'to-top' : 'to-bottom';
18605 var absCurrentTranslate = Math.abs(currentTranslate);
18606 var absSwipeStepTranslate = Math.abs(swipeStepTranslate);
18607
18608 if (timeDiff < 300 && diff > 10) {
18609 if (direction === openDirection && absCurrentTranslate < absSwipeStepTranslate) {
18610 // open step
18611 $el.removeClass('modal-in-swipe-step');
18612 $el.trigger('sheet:stepprogress', 1);
18613 sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
18614 $el.trigger('sheet:stepopen');
18615 sheet.emit('local::stepOpen sheetStepOpen', sheet);
18616
18617 if (sheet.push && pushOffset) {
18618 sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
18619 $pushViewEl.css('border-radius', '');
18620 }
18621 }
18622
18623 if (direction === closeDirection && absCurrentTranslate > absSwipeStepTranslate) {
18624 // close sheet
18625 if (sheet.params.swipeToClose) {
18626 sheet.close();
18627 } else {
18628 // close step
18629 $el.addClass('modal-in-swipe-step');
18630 $el.trigger('sheet:stepprogress', 0);
18631 sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
18632 $el.trigger('sheet:stepclose');
18633 sheet.emit('local::stepClose sheetStepClose', sheet);
18634
18635 if (sheet.push && pushOffset) {
18636 sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
18637 $pushViewEl.css('border-radius', '0px');
18638 }
18639 }
18640 }
18641
18642 if (direction === closeDirection && absCurrentTranslate <= absSwipeStepTranslate) {
18643 // close step
18644 $el.addClass('modal-in-swipe-step');
18645 $el.trigger('sheet:stepprogress', 0);
18646 sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
18647 $el.trigger('sheet:stepclose');
18648 sheet.emit('local::stepClose sheetStepClose', sheet);
18649
18650 if (sheet.push && pushOffset) {
18651 sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
18652 $pushViewEl.css('border-radius', '0px');
18653 }
18654 }
18655
18656 return;
18657 }
18658
18659 if (timeDiff >= 300) {
18660 var stepOpened = !$el.hasClass('modal-in-swipe-step');
18661
18662 if (!stepOpened) {
18663 if (absCurrentTranslate < absSwipeStepTranslate / 2) {
18664 // open step
18665 $el.removeClass('modal-in-swipe-step');
18666 $el.trigger('sheet:stepprogress', 1);
18667 sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
18668 $el.trigger('sheet:stepopen');
18669 sheet.emit('local::stepOpen sheetStepOpen', sheet);
18670
18671 if (sheet.push && pushOffset) {
18672 sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
18673 $pushViewEl.css('border-radius', '');
18674 }
18675 } else if (absCurrentTranslate - absSwipeStepTranslate > (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
18676 // close sheet
18677 if (sheet.params.swipeToClose) sheet.close();
18678 }
18679 } else if (stepOpened) {
18680 if (absCurrentTranslate > absSwipeStepTranslate + (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
18681 // close sheet
18682 if (sheet.params.swipeToClose) sheet.close();
18683 } else if (absCurrentTranslate > absSwipeStepTranslate / 2) {
18684 // close step
18685 $el.addClass('modal-in-swipe-step');
18686 $el.trigger('sheet:stepprogress', 0);
18687 sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
18688 $el.trigger('sheet:stepclose');
18689 sheet.emit('local::stepClose sheetStepClose', sheet);
18690
18691 if (sheet.push && pushOffset) {
18692 sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
18693 $pushViewEl.css('border-radius', '0px');
18694 }
18695 }
18696 }
18697 }
18698 }
18699
18700 sheet.setSwipeStep = function setSwipeStep(byResize) {
18701 if (byResize === void 0) {
18702 byResize = true;
18703 }
18704
18705 var $swipeStepEl = $el.find('.sheet-modal-swipe-step').eq(0);
18706 if (!$swipeStepEl.length) return;
18707
18708 if ($el.hasClass('sheet-modal-top')) {
18709 swipeStepTranslate = -($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
18710 } else {
18711 swipeStepTranslate = $el[0].offsetHeight - ($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
18712 }
18713
18714 $el[0].style.setProperty('--f7-sheet-swipe-step', swipeStepTranslate + "px");
18715
18716 if (!byResize) {
18717 $el.addClass('modal-in-swipe-step');
18718 }
18719 };
18720
18721 function onResize() {
18722 sheet.setSwipeStep(true);
18723 }
18724
18725 var passive = support.passiveListener ? {
18726 passive: true
18727 } : false;
18728
18729 if (sheet.params.swipeToClose || sheet.params.swipeToStep) {
18730 $el.on(app.touchEvents.start, handleTouchStart, passive);
18731 app.on('touchmove', handleTouchMove);
18732 app.on('touchend:passive', handleTouchEnd);
18733 sheet.once('sheetDestroy', function () {
18734 $el.off(app.touchEvents.start, handleTouchStart, passive);
18735 app.off('touchmove', handleTouchMove);
18736 app.off('touchend:passive', handleTouchEnd);
18737 });
18738 }
18739
18740 sheet.on('open', function () {
18741 if (sheet.params.closeOnEscape) {
18742 $(document).on('keydown', onKeyDown);
18743 }
18744
18745 $el.prevAll('.popup.modal-in').addClass('popup-behind');
18746
18747 if (sheet.params.swipeToStep) {
18748 sheet.setSwipeStep(false);
18749 app.on('resize', onResize);
18750 }
18751
18752 if (sheet.params.scrollToEl) {
18753 scrollToElementOnOpen();
18754 }
18755
18756 if (sheet.push) {
18757 pushOffset = parseInt($el.css('--f7-sheet-push-offset'), 10);
18758 if (Number.isNaN(pushOffset)) pushOffset = 0;
18759
18760 if (pushOffset) {
18761 $el.addClass('sheet-modal-push');
18762 sheet.$htmlEl.addClass('with-modal-sheet-push');
18763
18764 if (!sheet.params.swipeToStep) {
18765 sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
18766 } else {
18767 $pushViewEl = app.$el.children('.view, .views');
18768 pushBorderRadius = parseFloat($el.css("border-" + (isTopSheetModal ? 'bottom' : 'top') + "-left-radius"));
18769 $pushViewEl.css('border-radius', '0px');
18770 }
18771 }
18772 }
18773 });
18774 sheet.on('opened', function () {
18775 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
18776 app.on('click', handleClick);
18777 }
18778 });
18779 sheet.on('close', function () {
18780 if (sheet.params.swipeToStep) {
18781 $el.removeClass('modal-in-swipe-step');
18782 app.off('resize', onResize);
18783 }
18784
18785 if (sheet.params.closeOnEscape) {
18786 $(document).off('keydown', onKeyDown);
18787 }
18788
18789 if (sheet.params.scrollToEl) {
18790 scrollToElementOnClose();
18791 }
18792
18793 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
18794 app.off('click', handleClick);
18795 }
18796
18797 $el.prevAll('.popup.modal-in').eq(0).removeClass('popup-behind');
18798
18799 if (sheet.push && pushOffset) {
18800 sheet.$htmlEl.removeClass('with-modal-sheet-push');
18801 sheet.$htmlEl.addClass('with-modal-sheet-push-closing');
18802 }
18803 });
18804 sheet.on('closed', function () {
18805 if (sheet.push && pushOffset) {
18806 sheet.$htmlEl.removeClass('with-modal-sheet-push-closing');
18807 sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
18808 }
18809 });
18810
18811 sheet.stepOpen = function stepOpen() {
18812 $el.removeClass('modal-in-swipe-step');
18813
18814 if (sheet.push) {
18815 if (!pushOffset) {
18816 pushOffset = parseInt($el.css('--f7-sheet-push-offset'), 10);
18817 if (Number.isNaN(pushOffset)) pushOffset = 0;
18818 }
18819
18820 if (pushOffset) {
18821 sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
18822 }
18823 }
18824 };
18825
18826 sheet.stepClose = function stepClose() {
18827 $el.addClass('modal-in-swipe-step');
18828
18829 if (sheet.push) {
18830 sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
18831 }
18832 };
18833
18834 sheet.stepToggle = function stepToggle() {
18835 $el.toggleClass('modal-in-swipe-step');
18836 };
18837
18838 $el[0].f7Modal = sheet;
18839 return sheet || _assertThisInitialized(_this);
18840 }
18841
18842 return Sheet;
18843 }(Modal$1);
18844
18845 var Sheet = {
18846 name: 'sheet',
18847 params: {
18848 sheet: {
18849 push: false,
18850 backdrop: undefined,
18851 backdropEl: undefined,
18852 closeByBackdropClick: true,
18853 closeByOutsideClick: false,
18854 closeOnEscape: false,
18855 swipeToClose: false,
18856 swipeToStep: false,
18857 swipeHandler: null,
18858 containerEl: null
18859 }
18860 },
18861 static: {
18862 Sheet: Sheet$1
18863 },
18864 create: function create() {
18865 var app = this;
18866 app.sheet = extend$1({}, ModalMethods({
18867 app: app,
18868 constructor: Sheet$1,
18869 defaultSelector: '.sheet-modal.modal-in'
18870 }), {
18871 stepOpen: function stepOpen(sheet) {
18872 var sheetInstance = app.sheet.get(sheet);
18873 if (sheetInstance && sheetInstance.stepOpen) return sheetInstance.stepOpen();
18874 return undefined;
18875 },
18876 stepClose: function stepClose(sheet) {
18877 var sheetInstance = app.sheet.get(sheet);
18878 if (sheetInstance && sheetInstance.stepClose) return sheetInstance.stepClose();
18879 return undefined;
18880 },
18881 stepToggle: function stepToggle(sheet) {
18882 var sheetInstance = app.sheet.get(sheet);
18883 if (sheetInstance && sheetInstance.stepToggle) return sheetInstance.stepToggle();
18884 return undefined;
18885 }
18886 });
18887 },
18888 clicks: {
18889 '.sheet-open': function openSheet($clickedEl, data) {
18890 if (data === void 0) {
18891 data = {};
18892 }
18893
18894 var app = this;
18895
18896 if ($('.sheet-modal.modal-in').length > 0 && data.sheet && $(data.sheet)[0] !== $('.sheet-modal.modal-in')[0]) {
18897 app.sheet.close('.sheet-modal.modal-in');
18898 }
18899
18900 app.sheet.open(data.sheet, data.animate, $clickedEl);
18901 },
18902 '.sheet-close': function closeSheet($clickedEl, data) {
18903 if (data === void 0) {
18904 data = {};
18905 }
18906
18907 var app = this;
18908 app.sheet.close(data.sheet, data.animate, $clickedEl);
18909 }
18910 }
18911 };
18912
18913 var Toast$1 = /*#__PURE__*/function (_Modal) {
18914 _inheritsLoose(Toast, _Modal);
18915
18916 function Toast(app, params) {
18917 var _this;
18918
18919 var extendedParams = extend$1({
18920 on: {}
18921 }, app.params.toast, params); // Extends with open/close Modal methods;
18922
18923 _this = _Modal.call(this, app, extendedParams) || this;
18924
18925 var toast = _assertThisInitialized(_this);
18926
18927 var window = getWindow();
18928 toast.app = app;
18929 toast.params = extendedParams;
18930 var _toast$params = toast.params,
18931 closeButton = _toast$params.closeButton,
18932 closeTimeout = _toast$params.closeTimeout;
18933 var $el;
18934
18935 if (!toast.params.el) {
18936 // Find Element
18937 var toastHtml = toast.render();
18938 $el = $(toastHtml);
18939 } else {
18940 $el = $(toast.params.el);
18941 }
18942
18943 if ($el && $el.length > 0 && $el[0].f7Modal) {
18944 return $el[0].f7Modal || _assertThisInitialized(_this);
18945 }
18946
18947 if ($el.length === 0) {
18948 return toast.destroy() || _assertThisInitialized(_this);
18949 }
18950
18951 extend$1(toast, {
18952 $el: $el,
18953 el: $el[0],
18954 type: 'toast'
18955 });
18956 $el[0].f7Modal = toast;
18957
18958 if (closeButton) {
18959 $el.find('.toast-button').on('click', function () {
18960 toast.emit('local::closeButtonClick toastCloseButtonClick', toast);
18961 toast.close();
18962 });
18963 toast.on('beforeDestroy', function () {
18964 $el.find('.toast-button').off('click');
18965 });
18966 }
18967
18968 var timeoutId;
18969 toast.on('open', function () {
18970 $('.toast.modal-in').each(function (openedEl) {
18971 var toastInstance = app.toast.get(openedEl);
18972
18973 if (openedEl !== toast.el && toastInstance) {
18974 toastInstance.close();
18975 }
18976 });
18977
18978 if (closeTimeout) {
18979 timeoutId = nextTick$1(function () {
18980 toast.close();
18981 }, closeTimeout);
18982 }
18983 });
18984 toast.on('close', function () {
18985 window.clearTimeout(timeoutId);
18986 });
18987
18988 if (toast.params.destroyOnClose) {
18989 toast.once('closed', function () {
18990 setTimeout(function () {
18991 toast.destroy();
18992 }, 0);
18993 });
18994 }
18995
18996 return toast || _assertThisInitialized(_this);
18997 }
18998
18999 var _proto = Toast.prototype;
19000
19001 _proto.render = function render() {
19002 var toast = this;
19003 if (toast.params.render) return toast.params.render.call(toast, toast);
19004 var _toast$params2 = toast.params,
19005 position = _toast$params2.position,
19006 horizontalPosition = _toast$params2.horizontalPosition,
19007 cssClass = _toast$params2.cssClass,
19008 icon = _toast$params2.icon,
19009 text = _toast$params2.text,
19010 closeButton = _toast$params2.closeButton,
19011 closeButtonColor = _toast$params2.closeButtonColor,
19012 closeButtonText = _toast$params2.closeButtonText;
19013 var horizontalClass = position === 'top' || position === 'bottom' ? "toast-horizontal-" + horizontalPosition : '';
19014 return $jsx("div", {
19015 class: "toast toast-" + position + " " + horizontalClass + " " + (cssClass || '') + " " + (icon ? 'toast-with-icon' : '')
19016 }, $jsx("div", {
19017 class: "toast-content"
19018 }, icon && $jsx("div", {
19019 class: "toast-icon"
19020 }, icon), $jsx("div", {
19021 class: "toast-text"
19022 }, text), closeButton && !icon && $jsx("a", {
19023 class: "toast-button button " + (closeButtonColor ? "color-" + closeButtonColor : '')
19024 }, closeButtonText)));
19025 };
19026
19027 return Toast;
19028 }(Modal$1);
19029
19030 var Toast = {
19031 name: 'toast',
19032 static: {
19033 Toast: Toast$1
19034 },
19035 create: function create() {
19036 var app = this;
19037 app.toast = extend$1({}, ModalMethods({
19038 app: app,
19039 constructor: Toast$1,
19040 defaultSelector: '.toast.modal-in'
19041 }), {
19042 // Shortcuts
19043 show: function show(params) {
19044 extend$1(params, {
19045 destroyOnClose: true
19046 });
19047 return new Toast$1(app, params).open();
19048 }
19049 });
19050 },
19051 params: {
19052 toast: {
19053 icon: null,
19054 text: null,
19055 position: 'bottom',
19056 horizontalPosition: 'left',
19057 closeButton: false,
19058 closeButtonColor: null,
19059 closeButtonText: 'Ok',
19060 closeTimeout: null,
19061 cssClass: null,
19062 render: null,
19063 containerEl: null
19064 }
19065 }
19066 };
19067
19068 var Preloader = {
19069 init: function init(el) {
19070 var app = this;
19071 var preloaders = {
19072 iosPreloaderContent: iosPreloaderContent,
19073 mdPreloaderContent: mdPreloaderContent,
19074 auroraPreloaderContent: auroraPreloaderContent
19075 };
19076 var $el = $(el);
19077 if ($el.length === 0 || $el.children('.preloader-inner').length > 0 || $el.children('.preloader-inner-line').length > 0) return;
19078 $el.append(preloaders[app.theme + "PreloaderContent"]);
19079 },
19080 // Modal
19081 visible: false,
19082 show: function show(color) {
19083 if (color === void 0) {
19084 color = 'white';
19085 }
19086
19087 var app = this;
19088 if (Preloader.visible) return;
19089 var preloaders = {
19090 iosPreloaderContent: iosPreloaderContent,
19091 mdPreloaderContent: mdPreloaderContent,
19092 auroraPreloaderContent: auroraPreloaderContent
19093 };
19094 var preloaderInner = preloaders[app.theme + "PreloaderContent"] || '';
19095 $('html').addClass('with-modal-preloader'); // prettier-ignore
19096
19097 app.$el.append("\n <div class=\"preloader-backdrop\"></div>\n <div class=\"preloader-modal\">\n <div class=\"preloader color-" + color + "\">" + preloaderInner + "</div>\n </div>\n ");
19098 Preloader.visible = true;
19099 },
19100 showIn: function showIn(el, color) {
19101 if (color === void 0) {
19102 color = 'white';
19103 }
19104
19105 var app = this;
19106 var preloaders = {
19107 iosPreloaderContent: iosPreloaderContent,
19108 mdPreloaderContent: mdPreloaderContent,
19109 auroraPreloaderContent: auroraPreloaderContent
19110 };
19111 var preloaderInner = preloaders[app.theme + "PreloaderContent"] || '';
19112 $(el || 'html').addClass('with-modal-preloader'); // prettier-ignore
19113
19114 $(el || app.$el).append("\n <div class=\"preloader-backdrop\"></div>\n <div class=\"preloader-modal\">\n <div class=\"preloader color-" + color + "\">" + preloaderInner + "</div>\n </div>\n ");
19115 },
19116 hide: function hide() {
19117 var app = this;
19118 if (!Preloader.visible) return;
19119 $('html').removeClass('with-modal-preloader');
19120 app.$el.find('.preloader-backdrop, .preloader-modal').remove();
19121 Preloader.visible = false;
19122 },
19123 hideIn: function hideIn(el) {
19124 var app = this;
19125 $(el || 'html').removeClass('with-modal-preloader');
19126 $(el || app.$el).find('.preloader-backdrop, .preloader-modal').remove();
19127 }
19128 };
19129 var Preloader$1 = {
19130 name: 'preloader',
19131 create: function create() {
19132 var app = this;
19133 bindMethods(app, {
19134 preloader: Preloader
19135 });
19136 },
19137 on: {
19138 photoBrowserOpen: function photoBrowserOpen(pb) {
19139 var app = this;
19140 pb.$el.find('.preloader').each(function (preloaderEl) {
19141 app.preloader.init(preloaderEl);
19142 });
19143 },
19144 tabMounted: function tabMounted(tabEl) {
19145 var app = this;
19146 $(tabEl).find('.preloader').each(function (preloaderEl) {
19147 app.preloader.init(preloaderEl);
19148 });
19149 },
19150 pageInit: function pageInit(page) {
19151 var app = this;
19152 page.$el.find('.preloader').each(function (preloaderEl) {
19153 app.preloader.init(preloaderEl);
19154 });
19155 }
19156 },
19157 vnode: {
19158 preloader: {
19159 insert: function insert(vnode) {
19160 var app = this;
19161 var preloaderEl = vnode.elm;
19162 app.preloader.init(preloaderEl);
19163 }
19164 }
19165 }
19166 };
19167
19168 var Progressbar = {
19169 set: function set() {
19170 var app = this;
19171
19172 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
19173 args[_key] = arguments[_key];
19174 }
19175
19176 var el = args[0],
19177 progress = args[1],
19178 duration = args[2];
19179
19180 if (typeof args[0] === 'number') {
19181 progress = args[0];
19182 duration = args[1];
19183 el = app.$el;
19184 }
19185
19186 if (typeof progress === 'undefined' || progress === null) return el;
19187 if (!progress) progress = 0;
19188 var $el = $(el || app.$el);
19189
19190 if ($el.length === 0) {
19191 return el;
19192 }
19193
19194 var progressNormalized = Math.min(Math.max(progress, 0), 100);
19195 var $progressbarEl;
19196 if ($el.hasClass('progressbar')) $progressbarEl = $el.eq(0);else {
19197 $progressbarEl = $el.children('.progressbar');
19198 }
19199
19200 if ($progressbarEl.length === 0 || $progressbarEl.hasClass('progressbar-infinite')) {
19201 return $progressbarEl;
19202 }
19203
19204 var $progressbarLine = $progressbarEl.children('span');
19205
19206 if ($progressbarLine.length === 0) {
19207 $progressbarLine = $('<span></span>');
19208 $progressbarEl.append($progressbarLine);
19209 }
19210
19211 $progressbarLine.transition(typeof duration !== 'undefined' ? duration : '').transform("translate3d(" + (-100 + progressNormalized) + "%,0,0)");
19212 return $progressbarEl[0];
19213 },
19214 show: function show() {
19215 var app = this; // '.page', 50, 'multi'
19216
19217 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
19218 args[_key2] = arguments[_key2];
19219 }
19220
19221 var el = args[0],
19222 progress = args[1],
19223 color = args[2];
19224 var type = 'determined';
19225
19226 if (args.length === 2) {
19227 if ((typeof args[0] === 'string' || typeof args[0] === 'object') && typeof args[1] === 'string') {
19228 // '.page', 'multi'
19229 el = args[0];
19230 color = args[1];
19231 progress = args[2];
19232 type = 'infinite';
19233 } else if (typeof args[0] === 'number' && typeof args[1] === 'string') {
19234 // 50, 'multi'
19235 progress = args[0];
19236 color = args[1];
19237 el = app.$el;
19238 }
19239 } else if (args.length === 1) {
19240 if (typeof args[0] === 'number') {
19241 el = app.$el;
19242 progress = args[0];
19243 } else if (typeof args[0] === 'string') {
19244 type = 'infinite';
19245 el = app.$el;
19246 color = args[0];
19247 }
19248 } else if (args.length === 0) {
19249 type = 'infinite';
19250 el = app.$el;
19251 }
19252
19253 var $el = $(el);
19254 if ($el.length === 0) return undefined;
19255 var $progressbarEl;
19256
19257 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
19258 $progressbarEl = $el;
19259 } else {
19260 $progressbarEl = $el.children('.progressbar:not(.progressbar-out), .progressbar-infinite:not(.progressbar-out)');
19261
19262 if ($progressbarEl.length === 0) {
19263 $progressbarEl = $("\n <span class=\"progressbar" + (type === 'infinite' ? '-infinite' : '') + (color ? " color-" + color : '') + " progressbar-in\">\n " + (type === 'infinite' ? '' : '<span></span>') + "\n </span>");
19264 $el.append($progressbarEl);
19265 }
19266 }
19267
19268 if (typeof progress !== 'undefined') {
19269 app.progressbar.set($progressbarEl, progress);
19270 }
19271
19272 return $progressbarEl[0];
19273 },
19274 hide: function hide(el, removeAfterHide) {
19275 if (removeAfterHide === void 0) {
19276 removeAfterHide = true;
19277 }
19278
19279 var app = this;
19280 var $el = $(el || app.$el);
19281 if ($el.length === 0) return undefined;
19282 var $progressbarEl;
19283
19284 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
19285 $progressbarEl = $el;
19286 } else {
19287 $progressbarEl = $el.children('.progressbar, .progressbar-infinite');
19288 }
19289
19290 if ($progressbarEl.length === 0 || !$progressbarEl.hasClass('progressbar-in') || $progressbarEl.hasClass('progressbar-out')) {
19291 return $progressbarEl;
19292 }
19293
19294 $progressbarEl.removeClass('progressbar-in').addClass('progressbar-out').animationEnd(function () {
19295 if (removeAfterHide) {
19296 $progressbarEl.remove();
19297 }
19298 });
19299 return $progressbarEl;
19300 }
19301 };
19302 var Progressbar$1 = {
19303 name: 'progressbar',
19304 create: function create() {
19305 var app = this;
19306 bindMethods(app, {
19307 progressbar: Progressbar
19308 });
19309 },
19310 on: {
19311 tabMounted: function tabMounted(tabEl) {
19312 var app = this;
19313 $(tabEl).find('.progressbar').each(function (progressbarEl) {
19314 var $progressbarEl = $(progressbarEl);
19315 app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
19316 });
19317 },
19318 pageInit: function pageInit(page) {
19319 var app = this;
19320 page.$el.find('.progressbar').each(function (progressbarEl) {
19321 var $progressbarEl = $(progressbarEl);
19322 app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
19323 });
19324 }
19325 },
19326 vnode: {
19327 progressbar: {
19328 insert: function insert(vnode) {
19329 var app = this;
19330 var el = vnode.elm;
19331 app.progressbar.set(el, el.getAttribute('data-progress'));
19332 },
19333 update: function update(vnode) {
19334 var app = this;
19335 var el = vnode.elm;
19336 app.progressbar.set(el, el.getAttribute('data-progress'));
19337 }
19338 }
19339 }
19340 };
19341
19342 var Sortable = {
19343 init: function init() {
19344 var app = this;
19345 var document = getDocument();
19346 var isTouched;
19347 var isMoved;
19348 var touchStartY;
19349 var touchesDiff;
19350 var $sortingEl;
19351 var $sortingItems;
19352 var $sortableContainer;
19353 var sortingElHeight;
19354 var minTop;
19355 var maxTop;
19356 var $insertAfterEl;
19357 var $insertBeforeEl;
19358 var indexFrom;
19359 var $pageEl;
19360 var $pageContentEl;
19361 var pageHeight;
19362 var pageOffset;
19363 var sortingElOffsetLocal;
19364 var sortingElOffsetTop;
19365 var initialScrollTop;
19366 var wasTapHold;
19367
19368 function handleTouchStart(e, isTapHold) {
19369 isMoved = false;
19370 isTouched = true;
19371 wasTapHold = false;
19372 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
19373 $sortingEl = $(e.target).closest('li').eq(0);
19374 indexFrom = $sortingEl.index();
19375 $sortableContainer = $sortingEl.parents('.sortable');
19376 var $listGroup = $sortingEl.parents('.list-group');
19377
19378 if ($listGroup.length && $listGroup.parents($sortableContainer).length) {
19379 $sortableContainer = $listGroup;
19380 }
19381
19382 $sortingItems = $sortableContainer.children('ul').children('li:not(.disallow-sorting):not(.no-sorting)');
19383 if (app.panel) app.panel.allowOpen = false;
19384 if (app.swipeout) app.swipeout.allow = false;
19385
19386 if (isTapHold) {
19387 $sortingEl.addClass('sorting');
19388 $sortableContainer.addClass('sortable-sorting');
19389 wasTapHold = true;
19390 }
19391 }
19392
19393 function handleTouchMove(e) {
19394 if (!isTouched || !$sortingEl) return;
19395 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
19396
19397 if (!isMoved) {
19398 $pageEl = $sortingEl.parents('.page');
19399 $pageContentEl = $sortingEl.parents('.page-content');
19400 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
19401 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
19402 initialScrollTop = $pageContentEl[0].scrollTop;
19403 pageOffset = $pageEl.offset().top + paddingTop;
19404 pageHeight = $pageEl.height() - paddingTop - paddingBottom;
19405 $sortingEl.addClass('sorting');
19406 $sortableContainer.addClass('sortable-sorting');
19407 sortingElOffsetLocal = $sortingEl[0].offsetTop;
19408 minTop = $sortingEl[0].offsetTop;
19409 maxTop = $sortingEl.parent().height() - sortingElOffsetLocal - $sortingEl.height();
19410 sortingElHeight = $sortingEl[0].offsetHeight;
19411 sortingElOffsetTop = $sortingEl.offset().top;
19412 }
19413
19414 isMoved = true;
19415 e.preventDefault();
19416 e.f7PreventSwipePanel = true;
19417 touchesDiff = pageY - touchStartY;
19418 var translateScrollOffset = $pageContentEl[0].scrollTop - initialScrollTop;
19419 var translate = Math.min(Math.max(touchesDiff + translateScrollOffset, -minTop), maxTop);
19420 $sortingEl.transform("translate3d(0," + translate + "px,0)");
19421 var scrollAddition = 44;
19422 var allowScroll = true;
19423
19424 if (touchesDiff + translateScrollOffset + scrollAddition < -minTop) {
19425 allowScroll = false;
19426 }
19427
19428 if (touchesDiff + translateScrollOffset - scrollAddition > maxTop) {
19429 allowScroll = false;
19430 }
19431
19432 $insertBeforeEl = undefined;
19433 $insertAfterEl = undefined;
19434 var scrollDiff;
19435
19436 if (allowScroll) {
19437 if (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition > pageOffset + pageHeight) {
19438 // To Bottom
19439 scrollDiff = sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition - (pageOffset + pageHeight);
19440 }
19441
19442 if (sortingElOffsetTop + touchesDiff < pageOffset + scrollAddition) {
19443 // To Top
19444 scrollDiff = sortingElOffsetTop + touchesDiff - pageOffset - scrollAddition;
19445 }
19446
19447 if (scrollDiff) {
19448 $pageContentEl[0].scrollTop += scrollDiff;
19449 }
19450 }
19451
19452 $sortingItems.each(function (el) {
19453 var $currentEl = $(el);
19454 if ($currentEl[0] === $sortingEl[0]) return;
19455 var currentElOffset = $currentEl[0].offsetTop;
19456 var currentElHeight = $currentEl.height();
19457 var sortingElOffset = sortingElOffsetLocal + translate;
19458
19459 if (sortingElOffset >= currentElOffset - currentElHeight / 2 && $sortingEl.index() < $currentEl.index()) {
19460 $currentEl.transform("translate3d(0, " + -sortingElHeight + "px,0)");
19461 $insertAfterEl = $currentEl;
19462 $insertBeforeEl = undefined;
19463 } else if (sortingElOffset <= currentElOffset + currentElHeight / 2 && $sortingEl.index() > $currentEl.index()) {
19464 $currentEl.transform("translate3d(0, " + sortingElHeight + "px,0)");
19465 $insertAfterEl = undefined;
19466 if (!$insertBeforeEl) $insertBeforeEl = $currentEl;
19467 } else {
19468 $currentEl.transform('translate3d(0, 0%,0)');
19469 }
19470 });
19471 }
19472
19473 function handleTouchEnd() {
19474 if (!isTouched || !isMoved) {
19475 if (isTouched && !isMoved) {
19476 if (app.panel) app.panel.allowOpen = true;
19477 if (app.swipeout) app.swipeout.allow = true;
19478
19479 if (wasTapHold) {
19480 $sortingEl.removeClass('sorting');
19481 $sortableContainer.removeClass('sortable-sorting');
19482 }
19483 }
19484
19485 isTouched = false;
19486 isMoved = false;
19487 return;
19488 }
19489
19490 if (app.panel) app.panel.allowOpen = true;
19491 if (app.swipeout) app.swipeout.allow = true;
19492 $sortingItems.transform('');
19493 $sortingEl.removeClass('sorting');
19494 $sortableContainer.removeClass('sortable-sorting');
19495 var indexTo;
19496 if ($insertAfterEl) indexTo = $insertAfterEl.index();else if ($insertBeforeEl) indexTo = $insertBeforeEl.index();
19497 var moveElements = $sortableContainer.dataset().sortableMoveElements;
19498
19499 if (typeof moveElements === 'undefined') {
19500 moveElements = app.params.sortable.moveElements;
19501 }
19502
19503 if (moveElements) {
19504 if ($insertAfterEl) {
19505 $sortingEl.insertAfter($insertAfterEl);
19506 }
19507
19508 if ($insertBeforeEl) {
19509 $sortingEl.insertBefore($insertBeforeEl);
19510 }
19511 }
19512
19513 if (($insertAfterEl || $insertBeforeEl) && $sortableContainer.hasClass('virtual-list')) {
19514 indexFrom = $sortingEl[0].f7VirtualListIndex;
19515 if (typeof indexFrom === 'undefined') indexFrom = $sortingEl.attr('data-virtual-list-index');
19516
19517 if ($insertBeforeEl) {
19518 indexTo = $insertBeforeEl[0].f7VirtualListIndex;
19519 if (typeof indexTo === 'undefined') indexTo = $insertBeforeEl.attr('data-virtual-list-index');
19520 } else {
19521 indexTo = $insertAfterEl[0].f7VirtualListIndex;
19522 if (typeof indexTo === 'undefined') indexTo = $insertAfterEl.attr('data-virtual-list-index');
19523 }
19524
19525 if (indexTo !== null) indexTo = parseInt(indexTo, 10);else indexTo = undefined;
19526 var virtualList = $sortableContainer[0].f7VirtualList;
19527 if (indexFrom) indexFrom = parseInt(indexFrom, 10);
19528 if (indexTo) indexTo = parseInt(indexTo, 10);
19529 if (virtualList) virtualList.moveItem(indexFrom, indexTo);
19530 }
19531
19532 if (typeof indexTo !== 'undefined' && !Number.isNaN(indexTo) && indexTo !== indexFrom) {
19533 $sortingEl.trigger('sortable:sort', {
19534 from: indexFrom,
19535 to: indexTo
19536 });
19537 app.emit('sortableSort', $sortingEl[0], {
19538 from: indexFrom,
19539 to: indexTo,
19540 el: $sortingEl[0]
19541 }, $sortableContainer[0]);
19542 }
19543
19544 $insertBeforeEl = undefined;
19545 $insertAfterEl = undefined;
19546 isTouched = false;
19547 isMoved = false;
19548 }
19549
19550 var activeListener = getSupport$1().passiveListener ? {
19551 passive: false,
19552 capture: false
19553 } : false;
19554 $(document).on(app.touchEvents.start, '.list.sortable .sortable-handler', handleTouchStart, activeListener);
19555 app.on('touchmove:active', handleTouchMove);
19556 app.on('touchend:passive', handleTouchEnd);
19557 $(document).on('taphold', '.sortable-tap-hold', function (e, pointerEvent) {
19558 handleTouchStart(pointerEvent, true);
19559 });
19560 },
19561 enable: function enable(el) {
19562 if (el === void 0) {
19563 el = '.list.sortable';
19564 }
19565
19566 var app = this;
19567 var $el = $(el);
19568 if ($el.length === 0) return;
19569 $el.addClass('sortable-enabled');
19570 $el.trigger('sortable:enable');
19571 app.emit('sortableEnable', $el[0]);
19572 },
19573 disable: function disable(el) {
19574 if (el === void 0) {
19575 el = '.list.sortable';
19576 }
19577
19578 var app = this;
19579 var $el = $(el);
19580 if ($el.length === 0) return;
19581 $el.removeClass('sortable-enabled');
19582 $el.trigger('sortable:disable');
19583 app.emit('sortableDisable', $el[0]);
19584 },
19585 toggle: function toggle(el) {
19586 if (el === void 0) {
19587 el = '.list.sortable';
19588 }
19589
19590 var app = this;
19591 var $el = $(el);
19592 if ($el.length === 0) return;
19593
19594 if ($el.hasClass('sortable-enabled')) {
19595 app.sortable.disable($el);
19596 } else {
19597 app.sortable.enable($el);
19598 }
19599 }
19600 };
19601 var Sortable$1 = {
19602 name: 'sortable',
19603 params: {
19604 sortable: {
19605 moveElements: true
19606 }
19607 },
19608 create: function create() {
19609 var app = this;
19610 bindMethods(app, {
19611 sortable: Sortable
19612 });
19613 },
19614 on: {
19615 init: function init() {
19616 var app = this;
19617 if (!app.params.sortable) return;
19618 app.sortable.init();
19619 }
19620 },
19621 clicks: {
19622 '.sortable-enable': function enable($clickedEl, data) {
19623 if (data === void 0) {
19624 data = {};
19625 }
19626
19627 var app = this;
19628 app.sortable.enable(data.sortable);
19629 },
19630 '.sortable-disable': function disable($clickedEl, data) {
19631 if (data === void 0) {
19632 data = {};
19633 }
19634
19635 var app = this;
19636 app.sortable.disable(data.sortable);
19637 },
19638 '.sortable-toggle': function toggle($clickedEl, data) {
19639 if (data === void 0) {
19640 data = {};
19641 }
19642
19643 var app = this;
19644 app.sortable.toggle(data.sortable);
19645 }
19646 }
19647 };
19648
19649 var Swipeout = {
19650 init: function init() {
19651 var app = this;
19652 var document = getDocument();
19653 var touchesStart = {};
19654 var isTouched;
19655 var isMoved;
19656 var isScrolling;
19657 var touchStartTime;
19658 var touchesDiff;
19659 var $swipeoutEl;
19660 var $swipeoutContent;
19661 var $actionsRight;
19662 var $actionsLeft;
19663 var actionsLeftWidth;
19664 var actionsRightWidth;
19665 var translate;
19666 var opened;
19667 var openedActionsSide;
19668 var $leftButtons;
19669 var $rightButtons;
19670 var direction;
19671 var $overswipeLeftButton;
19672 var $overswipeRightButton;
19673 var overswipeLeft;
19674 var overswipeRight;
19675
19676 function handleTouchStart(e) {
19677 if (!app.swipeout.allow) return;
19678 isMoved = false;
19679 isTouched = true;
19680 isScrolling = undefined;
19681 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
19682 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
19683 touchStartTime = new Date().getTime();
19684 $swipeoutEl = $(this);
19685 }
19686
19687 function handleTouchMove(e) {
19688 if (!isTouched) return;
19689 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
19690 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
19691
19692 if (typeof isScrolling === 'undefined') {
19693 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
19694 }
19695
19696 if (isScrolling) {
19697 isTouched = false;
19698 return;
19699 }
19700
19701 if (!isMoved) {
19702 if ($('.list.sortable-opened').length > 0) return;
19703 $swipeoutContent = $swipeoutEl.find('.swipeout-content');
19704 $actionsRight = $swipeoutEl.find('.swipeout-actions-right');
19705 $actionsLeft = $swipeoutEl.find('.swipeout-actions-left');
19706 actionsLeftWidth = null;
19707 actionsRightWidth = null;
19708 $leftButtons = null;
19709 $rightButtons = null;
19710 $overswipeRightButton = null;
19711 $overswipeLeftButton = null;
19712
19713 if ($actionsLeft.length > 0) {
19714 actionsLeftWidth = $actionsLeft.outerWidth();
19715 $leftButtons = $actionsLeft.children('a');
19716 $overswipeLeftButton = $actionsLeft.find('.swipeout-overswipe');
19717 }
19718
19719 if ($actionsRight.length > 0) {
19720 actionsRightWidth = $actionsRight.outerWidth();
19721 $rightButtons = $actionsRight.children('a');
19722 $overswipeRightButton = $actionsRight.find('.swipeout-overswipe');
19723 }
19724
19725 opened = $swipeoutEl.hasClass('swipeout-opened');
19726
19727 if (opened) {
19728 openedActionsSide = $swipeoutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right';
19729 }
19730
19731 $swipeoutEl.removeClass('swipeout-transitioning');
19732
19733 if (!app.params.swipeout.noFollow) {
19734 $swipeoutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
19735 $swipeoutEl.removeClass('swipeout-opened');
19736 }
19737 }
19738
19739 isMoved = true;
19740
19741 if (e.cancelable) {
19742 e.preventDefault();
19743 }
19744
19745 touchesDiff = pageX - touchesStart.x;
19746 translate = touchesDiff;
19747
19748 if (opened) {
19749 if (openedActionsSide === 'right') translate -= actionsRightWidth;else translate += actionsLeftWidth;
19750 }
19751
19752 if (translate > 0 && $actionsLeft.length === 0 || translate < 0 && $actionsRight.length === 0) {
19753 if (!opened) {
19754 isTouched = false;
19755 isMoved = false;
19756 $swipeoutContent.transform('');
19757
19758 if ($rightButtons && $rightButtons.length > 0) {
19759 $rightButtons.transform('');
19760 }
19761
19762 if ($leftButtons && $leftButtons.length > 0) {
19763 $leftButtons.transform('');
19764 }
19765
19766 return;
19767 }
19768
19769 translate = 0;
19770 }
19771
19772 if (translate < 0) direction = 'to-left';else if (translate > 0) direction = 'to-right';else if (!direction) direction = 'to-left';
19773 var buttonOffset;
19774 var progress;
19775 e.f7PreventSwipePanel = true;
19776
19777 if (app.params.swipeout.noFollow) {
19778 if (opened) {
19779 if (openedActionsSide === 'right' && touchesDiff > 0) {
19780 app.swipeout.close($swipeoutEl);
19781 }
19782
19783 if (openedActionsSide === 'left' && touchesDiff < 0) {
19784 app.swipeout.close($swipeoutEl);
19785 }
19786 } else {
19787 if (touchesDiff < 0 && $actionsRight.length > 0) {
19788 app.swipeout.open($swipeoutEl, 'right');
19789 }
19790
19791 if (touchesDiff > 0 && $actionsLeft.length > 0) {
19792 app.swipeout.open($swipeoutEl, 'left');
19793 }
19794 }
19795
19796 isTouched = false;
19797 isMoved = false;
19798 return;
19799 }
19800
19801 overswipeLeft = false;
19802 overswipeRight = false;
19803
19804 if ($actionsRight.length > 0) {
19805 // Show right actions
19806 var buttonTranslate = translate;
19807 progress = buttonTranslate / actionsRightWidth;
19808
19809 if (buttonTranslate < -actionsRightWidth) {
19810 var ratio = buttonTranslate / -actionsRightWidth;
19811 buttonTranslate = -actionsRightWidth - Math.pow(-buttonTranslate - actionsRightWidth, 0.8);
19812 translate = buttonTranslate;
19813
19814 if ($overswipeRightButton.length > 0 && ratio > app.params.swipeout.overswipeRatio) {
19815 overswipeRight = true;
19816 }
19817 }
19818
19819 if (direction !== 'to-left') {
19820 progress = 0;
19821 buttonTranslate = 0;
19822 }
19823
19824 $rightButtons.each(function (buttonEl) {
19825 var $buttonEl = $(buttonEl);
19826
19827 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
19828 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
19829 }
19830
19831 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
19832
19833 if ($overswipeRightButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-left') {
19834 $buttonEl.css({
19835 left: (overswipeRight ? -buttonOffset : 0) + "px"
19836 });
19837
19838 if (overswipeRight) {
19839 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
19840 $swipeoutEl.trigger('swipeout:overswipeenter');
19841 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
19842 }
19843
19844 $buttonEl.addClass('swipeout-overswipe-active');
19845 } else {
19846 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
19847 $swipeoutEl.trigger('swipeout:overswipeexit');
19848 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
19849 }
19850
19851 $buttonEl.removeClass('swipeout-overswipe-active');
19852 }
19853 }
19854
19855 $buttonEl.transform("translate3d(" + (buttonTranslate - buttonOffset * (1 + Math.max(progress, -1))) + "px,0,0)");
19856 });
19857 }
19858
19859 if ($actionsLeft.length > 0) {
19860 // Show left actions
19861 var _buttonTranslate = translate;
19862 progress = _buttonTranslate / actionsLeftWidth;
19863
19864 if (_buttonTranslate > actionsLeftWidth) {
19865 var _ratio = _buttonTranslate / actionsRightWidth;
19866
19867 _buttonTranslate = actionsLeftWidth + Math.pow(_buttonTranslate - actionsLeftWidth, 0.8);
19868 translate = _buttonTranslate;
19869
19870 if ($overswipeLeftButton.length > 0 && _ratio > app.params.swipeout.overswipeRatio) {
19871 overswipeLeft = true;
19872 }
19873 }
19874
19875 if (direction !== 'to-right') {
19876 _buttonTranslate = 0;
19877 progress = 0;
19878 }
19879
19880 $leftButtons.each(function (buttonEl, index) {
19881 var $buttonEl = $(buttonEl);
19882
19883 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
19884 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
19885 }
19886
19887 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
19888
19889 if ($overswipeLeftButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-right') {
19890 $buttonEl.css({
19891 left: (overswipeLeft ? buttonOffset : 0) + "px"
19892 });
19893
19894 if (overswipeLeft) {
19895 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
19896 $swipeoutEl.trigger('swipeout:overswipeenter');
19897 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
19898 }
19899
19900 $buttonEl.addClass('swipeout-overswipe-active');
19901 } else {
19902 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
19903 $swipeoutEl.trigger('swipeout:overswipeexit');
19904 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
19905 }
19906
19907 $buttonEl.removeClass('swipeout-overswipe-active');
19908 }
19909 }
19910
19911 if ($leftButtons.length > 1) {
19912 $buttonEl.css('z-index', $leftButtons.length - index);
19913 }
19914
19915 $buttonEl.transform("translate3d(" + (_buttonTranslate + buttonOffset * (1 - Math.min(progress, 1))) + "px,0,0)");
19916 });
19917 }
19918
19919 $swipeoutEl.trigger('swipeout', progress);
19920 app.emit('swipeout', $swipeoutEl[0], progress);
19921 $swipeoutContent.transform("translate3d(" + translate + "px,0,0)");
19922 }
19923
19924 function handleTouchEnd() {
19925 if (!isTouched || !isMoved) {
19926 isTouched = false;
19927 isMoved = false;
19928 return;
19929 }
19930
19931 isTouched = false;
19932 isMoved = false;
19933 var timeDiff = new Date().getTime() - touchStartTime;
19934 var $actions = direction === 'to-left' ? $actionsRight : $actionsLeft;
19935 var actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth;
19936 var action;
19937 var $buttons;
19938 var i;
19939
19940 if (timeDiff < 300 && (touchesDiff < -10 && direction === 'to-left' || touchesDiff > 10 && direction === 'to-right') || timeDiff >= 300 && Math.abs(translate) > actionsWidth / 2) {
19941 action = 'open';
19942 } else {
19943 action = 'close';
19944 }
19945
19946 if (timeDiff < 300) {
19947 if (Math.abs(translate) === 0) action = 'close';
19948 if (Math.abs(translate) === actionsWidth) action = 'open';
19949 }
19950
19951 if (action === 'open') {
19952 Swipeout.el = $swipeoutEl[0];
19953 $swipeoutEl.trigger('swipeout:open');
19954 app.emit('swipeoutOpen', $swipeoutEl[0]);
19955 $swipeoutEl.addClass('swipeout-opened swipeout-transitioning');
19956 var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth;
19957 $swipeoutContent.transform("translate3d(" + newTranslate + "px,0,0)");
19958 $actions.addClass('swipeout-actions-opened');
19959 $buttons = direction === 'to-left' ? $rightButtons : $leftButtons;
19960
19961 if ($buttons) {
19962 for (i = 0; i < $buttons.length; i += 1) {
19963 $($buttons[i]).transform("translate3d(" + newTranslate + "px,0,0)");
19964 }
19965 }
19966
19967 if (overswipeRight) {
19968 $actionsRight.find('.swipeout-overswipe').trigger('click', 'f7Overswipe');
19969 }
19970
19971 if (overswipeLeft) {
19972 $actionsLeft.find('.swipeout-overswipe').trigger('click', 'f7Overswipe');
19973 }
19974 } else {
19975 $swipeoutEl.trigger('swipeout:close');
19976 app.emit('swipeoutClose', $swipeoutEl[0]);
19977 Swipeout.el = undefined;
19978 $swipeoutEl.addClass('swipeout-transitioning').removeClass('swipeout-opened');
19979 $swipeoutContent.transform('');
19980 $actions.removeClass('swipeout-actions-opened');
19981 }
19982
19983 var buttonOffset;
19984
19985 if ($leftButtons && $leftButtons.length > 0 && $leftButtons !== $buttons) {
19986 $leftButtons.each(function (buttonEl) {
19987 var $buttonEl = $(buttonEl);
19988 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
19989
19990 if (typeof buttonOffset === 'undefined') {
19991 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
19992 }
19993
19994 $buttonEl.transform("translate3d(" + buttonOffset + "px,0,0)");
19995 });
19996 }
19997
19998 if ($rightButtons && $rightButtons.length > 0 && $rightButtons !== $buttons) {
19999 $rightButtons.each(function (buttonEl) {
20000 var $buttonEl = $(buttonEl);
20001 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
20002
20003 if (typeof buttonOffset === 'undefined') {
20004 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
20005 }
20006
20007 $buttonEl.transform("translate3d(" + -buttonOffset + "px,0,0)");
20008 });
20009 }
20010
20011 $swipeoutContent.transitionEnd(function () {
20012 if (opened && action === 'open' || !opened && action === 'close') return;
20013 $swipeoutEl.trigger(action === 'open' ? 'swipeout:opened' : 'swipeout:closed');
20014 app.emit(action === 'open' ? 'swipeoutOpened' : 'swipeoutClosed', $swipeoutEl[0]);
20015 $swipeoutEl.removeClass('swipeout-transitioning');
20016
20017 if (opened && action === 'close') {
20018 if ($actionsRight.length > 0) {
20019 $rightButtons.transform('');
20020 }
20021
20022 if ($actionsLeft.length > 0) {
20023 $leftButtons.transform('');
20024 }
20025 }
20026 });
20027 }
20028
20029 var passiveListener = getSupport$1().passiveListener ? {
20030 passive: true
20031 } : false;
20032 app.on('touchstart', function (e) {
20033 if (Swipeout.el) {
20034 var $targetEl = $(e.target);
20035
20036 if (!($(Swipeout.el).is($targetEl[0]) || $targetEl.parents('.swipeout').is(Swipeout.el) || $targetEl.hasClass('modal-in') || ($targetEl.attr('class') || '').indexOf('-backdrop') > 0 || $targetEl.hasClass('actions-modal') || $targetEl.parents('.actions-modal.modal-in, .dialog.modal-in').length > 0)) {
20037 app.swipeout.close(Swipeout.el);
20038 }
20039 }
20040 });
20041 $(document).on(app.touchEvents.start, 'li.swipeout', handleTouchStart, passiveListener);
20042 app.on('touchmove:active', handleTouchMove);
20043 app.on('touchend:passive', handleTouchEnd);
20044 },
20045 allow: true,
20046 el: undefined,
20047 open: function open() {
20048 var app = this;
20049
20050 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
20051 args[_key] = arguments[_key];
20052 }
20053
20054 var el = args[0],
20055 side = args[1],
20056 callback = args[2];
20057
20058 if (typeof args[1] === 'function') {
20059 el = args[0];
20060 callback = args[1];
20061 side = args[2];
20062 }
20063
20064 var $el = $(el).eq(0);
20065 if ($el.length === 0) return;
20066 if (!$el.hasClass('swipeout') || $el.hasClass('swipeout-opened')) return;
20067
20068 if (!side) {
20069 if ($el.find('.swipeout-actions-right').length > 0) side = 'right';else side = 'left';
20070 }
20071
20072 var $swipeoutActions = $el.find(".swipeout-actions-" + side);
20073 var $swipeoutContent = $el.find('.swipeout-content');
20074 if ($swipeoutActions.length === 0) return;
20075 $el.trigger('swipeout:open').addClass('swipeout-opened').removeClass('swipeout-transitioning');
20076 app.emit('swipeoutOpen', $el[0]);
20077 $swipeoutActions.addClass('swipeout-actions-opened');
20078 var $buttons = $swipeoutActions.children('a');
20079 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
20080 var translate = side === 'right' ? -swipeoutActionsWidth : swipeoutActionsWidth;
20081
20082 if ($buttons.length > 1) {
20083 $buttons.each(function (buttonEl, buttonIndex) {
20084 var $buttonEl = $(buttonEl);
20085
20086 if (side === 'right') {
20087 $buttonEl.transform("translate3d(" + -buttonEl.offsetLeft + "px,0,0)");
20088 } else {
20089 $buttonEl.css('z-index', $buttons.length - buttonIndex).transform("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)");
20090 }
20091 });
20092 }
20093
20094 $el.addClass('swipeout-transitioning');
20095 $swipeoutContent.transitionEnd(function () {
20096 $el.trigger('swipeout:opened');
20097 app.emit('swipeoutOpened', $el[0]);
20098 if (callback) callback.call($el[0]);
20099 });
20100 nextFrame$1(function () {
20101 $buttons.transform("translate3d(" + translate + "px,0,0)");
20102 $swipeoutContent.transform("translate3d(" + translate + "px,0,0)");
20103 });
20104 Swipeout.el = $el[0];
20105 },
20106 close: function close(el, callback) {
20107 var app = this;
20108 var $el = $(el).eq(0);
20109 if ($el.length === 0) return;
20110 if (!$el.hasClass('swipeout-opened')) return;
20111 var side = $el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left';
20112 var $swipeoutActions = $el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
20113 var $buttons = $swipeoutActions.children('a');
20114 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
20115 app.swipeout.allow = false;
20116 $el.trigger('swipeout:close');
20117 app.emit('swipeoutClose', $el[0]);
20118 $el.removeClass('swipeout-opened').addClass('swipeout-transitioning');
20119 var closeTimeout;
20120
20121 function onSwipeoutClose() {
20122 app.swipeout.allow = true;
20123 if ($el.hasClass('swipeout-opened')) return;
20124 $el.removeClass('swipeout-transitioning');
20125 $buttons.transform('');
20126 $el.trigger('swipeout:closed');
20127 app.emit('swipeoutClosed', $el[0]);
20128 if (callback) callback.call($el[0]);
20129 if (closeTimeout) clearTimeout(closeTimeout);
20130 }
20131
20132 $el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose);
20133 closeTimeout = setTimeout(onSwipeoutClose, 500);
20134 $buttons.each(function (buttonEl) {
20135 var $buttonEl = $(buttonEl);
20136
20137 if (side === 'right') {
20138 $buttonEl.transform("translate3d(" + -buttonEl.offsetLeft + "px,0,0)");
20139 } else {
20140 $buttonEl.transform("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)");
20141 }
20142
20143 $buttonEl.css({
20144 left: '0px'
20145 }).removeClass('swipeout-overswipe-active');
20146 });
20147 if (Swipeout.el && Swipeout.el === $el[0]) Swipeout.el = undefined;
20148 },
20149 delete: function _delete(el, callback) {
20150 var app = this;
20151 var $el = $(el).eq(0);
20152 if ($el.length === 0) return;
20153 Swipeout.el = undefined;
20154 $el.trigger('swipeout:delete');
20155 app.emit('swipeoutDelete', $el[0]);
20156 $el.css({
20157 height: $el.outerHeight() + "px"
20158 });
20159 $el.transitionEnd(function () {
20160 $el.trigger('swipeout:deleted');
20161 app.emit('swipeoutDeleted', $el[0]);
20162 if (callback) callback.call($el[0]);
20163
20164 if ($el.parents('.virtual-list').length > 0) {
20165 var virtualList = $el.parents('.virtual-list')[0].f7VirtualList;
20166 var virtualIndex = $el[0].f7VirtualListIndex;
20167 if (virtualList && typeof virtualIndex !== 'undefined') virtualList.deleteItem(virtualIndex);
20168 } else if (app.params.swipeout.removeElements) {
20169 if (app.params.swipeout.removeElementsWithTimeout) {
20170 setTimeout(function () {
20171 $el.remove();
20172 }, app.params.swipeout.removeElementsTimeout);
20173 } else {
20174 $el.remove();
20175 }
20176 } else {
20177 $el.removeClass('swipeout-deleting swipeout-transitioning');
20178 }
20179 }); // eslint-disable-next-line
20180 // $el[0]._clientLeft = $el[0].clientLeft;
20181
20182 nextFrame$1(function () {
20183 $el.addClass('swipeout-deleting swipeout-transitioning').css({
20184 height: '0px'
20185 }).find('.swipeout-content').transform('translate3d(-100%,0,0)');
20186 });
20187 }
20188 };
20189 var Swipeout$1 = {
20190 name: 'swipeout',
20191 params: {
20192 swipeout: {
20193 actionsNoFold: false,
20194 noFollow: false,
20195 removeElements: true,
20196 removeElementsWithTimeout: false,
20197 removeElementsTimeout: 0,
20198 overswipeRatio: 1.2
20199 }
20200 },
20201 create: function create() {
20202 var app = this;
20203 bindMethods(app, {
20204 swipeout: Swipeout
20205 });
20206 },
20207 clicks: {
20208 '.swipeout-open': function openSwipeout($clickedEl, data) {
20209 if (data === void 0) {
20210 data = {};
20211 }
20212
20213 var app = this;
20214 app.swipeout.open(data.swipeout, data.side);
20215 },
20216 '.swipeout-close': function closeSwipeout($clickedEl) {
20217 var app = this;
20218 var $swipeoutEl = $clickedEl.closest('.swipeout');
20219 if ($swipeoutEl.length === 0) return;
20220 app.swipeout.close($swipeoutEl);
20221 },
20222 '.swipeout-delete': function deleteSwipeout($clickedEl, data) {
20223 if (data === void 0) {
20224 data = {};
20225 }
20226
20227 var app = this;
20228 var $swipeoutEl = $clickedEl.closest('.swipeout');
20229 if ($swipeoutEl.length === 0) return;
20230 var _data = data,
20231 confirm = _data.confirm,
20232 confirmTitle = _data.confirmTitle;
20233
20234 if (data.confirm) {
20235 app.dialog.confirm(confirm, confirmTitle, function () {
20236 app.swipeout.delete($swipeoutEl);
20237 });
20238 } else {
20239 app.swipeout.delete($swipeoutEl);
20240 }
20241 }
20242 },
20243 on: {
20244 init: function init() {
20245 var app = this;
20246 if (!app.params.swipeout) return;
20247 app.swipeout.init();
20248 }
20249 }
20250 };
20251
20252 var Accordion = {
20253 toggleClicked: function toggleClicked($clickedEl) {
20254 var app = this;
20255 var $accordionItemEl = $clickedEl.closest('.accordion-item').eq(0);
20256 if (!$accordionItemEl.length) $accordionItemEl = $clickedEl.parents('li').eq(0);
20257 var $accordionContent = $clickedEl.parents('.accordion-item-content').eq(0);
20258
20259 if ($accordionContent.length) {
20260 if ($accordionContent.parents($accordionItemEl).length) return;
20261 }
20262
20263 if ($clickedEl.parents('li').length > 1 && $clickedEl.parents('li')[0] !== $accordionItemEl[0]) return;
20264 app.accordion.toggle($accordionItemEl);
20265 },
20266 open: function open(el) {
20267 var app = this;
20268 var $el = $(el);
20269 var prevented = false;
20270
20271 function prevent() {
20272 prevented = true;
20273 }
20274
20275 $el.trigger('accordion:beforeopen', {
20276 prevent: prevent
20277 }, prevent);
20278 app.emit('accordionBeforeOpen', $el[0], prevent);
20279 if (prevented) return;
20280 var $list = $el.parents('.accordion-list').eq(0);
20281 var $contentEl = $el.children('.accordion-item-content');
20282 $contentEl.removeAttr('aria-hidden');
20283 if ($contentEl.length === 0) $contentEl = $el.find('.accordion-item-content');
20284 if ($contentEl.length === 0) return;
20285 var $openedItem = $list.length > 0 && $el.parent().children('.accordion-item-opened');
20286
20287 if ($openedItem.length > 0) {
20288 app.accordion.close($openedItem);
20289 }
20290
20291 $contentEl.transitionEnd(function () {
20292 if ($el.hasClass('accordion-item-opened')) {
20293 $contentEl.transition(0);
20294 $contentEl.css('height', 'auto');
20295 nextFrame$1(function () {
20296 $contentEl.transition('');
20297 $el.trigger('accordion:opened');
20298 app.emit('accordionOpened', $el[0]);
20299 });
20300 } else {
20301 $contentEl.css('height', '');
20302 $el.trigger('accordion:closed');
20303 app.emit('accordionClosed', $el[0]);
20304 }
20305 });
20306 $contentEl.css('height', $contentEl[0].scrollHeight + "px");
20307 $el.trigger('accordion:open');
20308 $el.addClass('accordion-item-opened');
20309 app.emit('accordionOpen', $el[0]);
20310 },
20311 close: function close(el) {
20312 var app = this;
20313 var $el = $(el);
20314 var prevented = false;
20315
20316 function prevent() {
20317 prevented = true;
20318 }
20319
20320 $el.trigger('accordion:beforeclose', {
20321 prevent: prevent
20322 }, prevent);
20323 app.emit('accordionBeforeClose', $el[0], prevent);
20324 if (prevented) return;
20325 var $contentEl = $el.children('.accordion-item-content');
20326 if ($contentEl.length === 0) $contentEl = $el.find('.accordion-item-content');
20327 $el.removeClass('accordion-item-opened');
20328 $contentEl.attr('aria-hidden', true);
20329 $contentEl.transition(0);
20330 $contentEl.css('height', $contentEl[0].scrollHeight + "px"); // Close
20331
20332 $contentEl.transitionEnd(function () {
20333 if ($el.hasClass('accordion-item-opened')) {
20334 $contentEl.transition(0);
20335 $contentEl.css('height', 'auto');
20336 nextFrame$1(function () {
20337 $contentEl.transition('');
20338 $el.trigger('accordion:opened');
20339 app.emit('accordionOpened', $el[0]);
20340 });
20341 } else {
20342 $contentEl.css('height', '');
20343 $el.trigger('accordion:closed');
20344 app.emit('accordionClosed', $el[0]);
20345 }
20346 });
20347 nextFrame$1(function () {
20348 $contentEl.transition('');
20349 $contentEl.css('height', '');
20350 $el.trigger('accordion:close');
20351 app.emit('accordionClose', $el[0]);
20352 });
20353 },
20354 toggle: function toggle(el) {
20355 var app = this;
20356 var $el = $(el);
20357 if ($el.length === 0) return;
20358 if ($el.hasClass('accordion-item-opened')) app.accordion.close(el);else app.accordion.open(el);
20359 }
20360 };
20361 var Accordion$1 = {
20362 name: 'accordion',
20363 create: function create() {
20364 var app = this;
20365 bindMethods(app, {
20366 accordion: Accordion
20367 });
20368 },
20369 clicks: {
20370 '.accordion-item .item-link, .accordion-item-toggle, .links-list.accordion-list > ul > li > a': function open($clickedEl) {
20371 var app = this;
20372 Accordion.toggleClicked.call(app, $clickedEl);
20373 }
20374 }
20375 };
20376
20377 var ContactsList = {
20378 name: 'contactsList'
20379 };
20380
20381 var VirtualList$1 = /*#__PURE__*/function (_Framework7Class) {
20382 _inheritsLoose(VirtualList, _Framework7Class);
20383
20384 function VirtualList(app, params) {
20385 var _this;
20386
20387 if (params === void 0) {
20388 params = {};
20389 }
20390
20391 _this = _Framework7Class.call(this, params, [app]) || this;
20392
20393 var vl = _assertThisInitialized(_this);
20394
20395 var device = getDevice$1();
20396 var document = getDocument();
20397 var defaultHeight;
20398
20399 if (app.theme === 'md') {
20400 defaultHeight = 48;
20401 } else if (app.theme === 'ios') {
20402 defaultHeight = 44;
20403 } else if (app.theme === 'aurora') {
20404 defaultHeight = 38;
20405 }
20406
20407 var defaults = {
20408 cols: 1,
20409 height: defaultHeight,
20410 cache: true,
20411 dynamicHeightBufferSize: 1,
20412 showFilteredItemsOnly: false,
20413 renderExternal: undefined,
20414 setListHeight: true,
20415 searchByItem: undefined,
20416 searchAll: undefined,
20417 ul: null,
20418 createUl: true,
20419 scrollableParentEl: undefined,
20420 renderItem: function renderItem(item) {
20421 return ("\n <li>\n <div class=\"item-content\">\n <div class=\"item-inner\">\n <div class=\"item-title\">" + item + "</div>\n </div>\n </div>\n </li>\n ").trim();
20422 },
20423 on: {}
20424 }; // Extend defaults with modules params
20425
20426 vl.useModulesParams(defaults);
20427 vl.params = extend$1(defaults, params);
20428
20429 if (vl.params.height === undefined || !vl.params.height) {
20430 vl.params.height = defaultHeight;
20431 }
20432
20433 vl.$el = $(params.el);
20434 vl.el = vl.$el[0];
20435 if (vl.$el.length === 0) return undefined || _assertThisInitialized(_this);
20436 vl.$el[0].f7VirtualList = vl;
20437 vl.items = vl.params.items;
20438
20439 if (vl.params.showFilteredItemsOnly) {
20440 vl.filteredItems = [];
20441 }
20442
20443 if (vl.params.renderItem) {
20444 vl.renderItem = vl.params.renderItem;
20445 }
20446
20447 vl.$pageContentEl = vl.$el.parents('.page-content');
20448 vl.pageContentEl = vl.$pageContentEl[0];
20449 vl.$scrollableParentEl = vl.params.scrollableParentEl ? $(vl.params.scrollableParentEl).eq(0) : vl.$pageContentEl;
20450
20451 if (!vl.$scrollableParentEl.length && vl.$pageContentEl.length) {
20452 vl.$scrollableParentEl = vl.$pageContentEl;
20453 }
20454
20455 vl.scrollableParentEl = vl.$scrollableParentEl[0]; // Bad scroll
20456
20457 if (typeof vl.params.updatableScroll !== 'undefined') {
20458 vl.updatableScroll = vl.params.updatableScroll;
20459 } else {
20460 vl.updatableScroll = true;
20461
20462 if (device.ios && device.osVersion.split('.')[0] < 8) {
20463 vl.updatableScroll = false;
20464 }
20465 } // Append <ul>
20466
20467
20468 var ul = vl.params.ul;
20469 vl.$ul = ul ? $(vl.params.ul) : vl.$el.children('ul');
20470
20471 if (vl.$ul.length === 0 && vl.params.createUl) {
20472 vl.$el.append('<ul></ul>');
20473 vl.$ul = vl.$el.children('ul');
20474 }
20475
20476 vl.ul = vl.$ul[0];
20477 var $itemsWrapEl;
20478 if (!vl.ul && !vl.params.createUl) $itemsWrapEl = vl.$el;else $itemsWrapEl = vl.$ul;
20479 extend$1(vl, {
20480 $itemsWrapEl: $itemsWrapEl,
20481 itemsWrapEl: $itemsWrapEl[0],
20482 // DOM cached items
20483 domCache: {},
20484 displayDomCache: {},
20485 // Temporary DOM Element
20486 tempDomElement: document.createElement('ul'),
20487 // Last repain position
20488 lastRepaintY: null,
20489 // Fragment
20490 fragment: document.createDocumentFragment(),
20491 // Props
20492 pageHeight: undefined,
20493 rowsPerScreen: undefined,
20494 rowsBefore: undefined,
20495 rowsAfter: undefined,
20496 rowsToRender: undefined,
20497 maxBufferHeight: 0,
20498 listHeight: undefined,
20499 dynamicHeight: typeof vl.params.height === 'function'
20500 }); // Install Modules
20501
20502 vl.useModules(); // Attach events
20503
20504 var handleScrollBound = vl.handleScroll.bind(vl);
20505 var handleResizeBound = vl.handleResize.bind(vl);
20506 var $pageEl;
20507 var $tabEl;
20508 var $panelEl;
20509 var $popupEl;
20510
20511 vl.attachEvents = function attachEvents() {
20512 $pageEl = vl.$el.parents('.page').eq(0);
20513 $tabEl = vl.$el.parents('.tab').filter(function (tabEl) {
20514 return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, .tabs-swipeable-wrap').length === 0;
20515 }).eq(0);
20516 $panelEl = vl.$el.parents('.panel').eq(0);
20517 $popupEl = vl.$el.parents('.popup').eq(0);
20518 vl.$scrollableParentEl.on('scroll', handleScrollBound);
20519 if ($pageEl.length) $pageEl.on('page:reinit', handleResizeBound);
20520 if ($tabEl.length) $tabEl.on('tab:show', handleResizeBound);
20521 if ($panelEl.length) $panelEl.on('panel:open', handleResizeBound);
20522 if ($popupEl.length) $popupEl.on('popup:open', handleResizeBound);
20523 app.on('resize', handleResizeBound);
20524 };
20525
20526 vl.detachEvents = function attachEvents() {
20527 vl.$scrollableParentEl.off('scroll', handleScrollBound);
20528 if ($pageEl.length) $pageEl.off('page:reinit', handleResizeBound);
20529 if ($tabEl.length) $tabEl.off('tab:show', handleResizeBound);
20530 if ($panelEl.length) $panelEl.off('panel:open', handleResizeBound);
20531 if ($popupEl.length) $popupEl.off('popup:open', handleResizeBound);
20532 app.off('resize', handleResizeBound);
20533 }; // Init
20534
20535
20536 vl.init();
20537 return vl || _assertThisInitialized(_this);
20538 }
20539
20540 var _proto = VirtualList.prototype;
20541
20542 _proto.setListSize = function setListSize() {
20543 var vl = this;
20544 var items = vl.filteredItems || vl.items;
20545 vl.pageHeight = vl.$scrollableParentEl[0].offsetHeight;
20546
20547 if (vl.dynamicHeight) {
20548 vl.listHeight = 0;
20549 vl.heights = [];
20550
20551 for (var i = 0; i < items.length; i += 1) {
20552 var itemHeight = vl.params.height(items[i]);
20553 vl.listHeight += itemHeight;
20554 vl.heights.push(itemHeight);
20555 }
20556 } else {
20557 vl.listHeight = Math.ceil(items.length / vl.params.cols) * vl.params.height;
20558 vl.rowsPerScreen = Math.ceil(vl.pageHeight / vl.params.height);
20559 vl.rowsBefore = vl.params.rowsBefore || vl.rowsPerScreen * 2;
20560 vl.rowsAfter = vl.params.rowsAfter || vl.rowsPerScreen;
20561 vl.rowsToRender = vl.rowsPerScreen + vl.rowsBefore + vl.rowsAfter;
20562 vl.maxBufferHeight = vl.rowsBefore / 2 * vl.params.height;
20563 }
20564
20565 if (vl.updatableScroll || vl.params.setListHeight) {
20566 vl.$itemsWrapEl.css({
20567 height: vl.listHeight + "px"
20568 });
20569 }
20570 };
20571
20572 _proto.render = function render(force, forceScrollTop) {
20573 var vl = this;
20574 if (force) vl.lastRepaintY = null;
20575 var scrollTop = -(vl.$el[0].getBoundingClientRect().top - vl.$scrollableParentEl[0].getBoundingClientRect().top);
20576 if (typeof forceScrollTop !== 'undefined') scrollTop = forceScrollTop;
20577
20578 if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > vl.maxBufferHeight || !vl.updatableScroll && vl.$scrollableParentEl[0].scrollTop + vl.pageHeight >= vl.$scrollableParentEl[0].scrollHeight) {
20579 vl.lastRepaintY = scrollTop;
20580 } else {
20581 return;
20582 }
20583
20584 var items = vl.filteredItems || vl.items;
20585 var fromIndex;
20586 var toIndex;
20587 var heightBeforeFirstItem = 0;
20588 var heightBeforeLastItem = 0;
20589
20590 if (vl.dynamicHeight) {
20591 var itemTop = 0;
20592 var itemHeight;
20593 vl.maxBufferHeight = vl.pageHeight;
20594
20595 for (var j = 0; j < vl.heights.length; j += 1) {
20596 itemHeight = vl.heights[j];
20597
20598 if (typeof fromIndex === 'undefined') {
20599 if (itemTop + itemHeight >= scrollTop - vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize) fromIndex = j;else heightBeforeFirstItem += itemHeight;
20600 }
20601
20602 if (typeof toIndex === 'undefined') {
20603 if (itemTop + itemHeight >= scrollTop + vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize || j === vl.heights.length - 1) toIndex = j + 1;
20604 heightBeforeLastItem += itemHeight;
20605 }
20606
20607 itemTop += itemHeight;
20608 }
20609
20610 toIndex = Math.min(toIndex, items.length);
20611 } else {
20612 fromIndex = (parseInt(scrollTop / vl.params.height, 10) - vl.rowsBefore) * vl.params.cols;
20613
20614 if (fromIndex < 0) {
20615 fromIndex = 0;
20616 }
20617
20618 toIndex = Math.min(fromIndex + vl.rowsToRender * vl.params.cols, items.length);
20619 }
20620
20621 var topPosition;
20622 var renderExternalItems = [];
20623 vl.reachEnd = false;
20624 var i;
20625
20626 for (i = fromIndex; i < toIndex; i += 1) {
20627 var itemEl = void 0; // Define real item index
20628
20629 var index = vl.items.indexOf(items[i]);
20630 if (i === fromIndex) vl.currentFromIndex = index;
20631 if (i === toIndex - 1) vl.currentToIndex = index;
20632
20633 if (vl.filteredItems) {
20634 if (vl.items[index] === vl.filteredItems[vl.filteredItems.length - 1]) vl.reachEnd = true;
20635 } else if (index === vl.items.length - 1) vl.reachEnd = true; // Find items
20636
20637
20638 if (vl.params.renderExternal) {
20639 renderExternalItems.push(items[i]);
20640 } else if (vl.domCache[index]) {
20641 itemEl = vl.domCache[index];
20642 itemEl.f7VirtualListIndex = index;
20643 } else {
20644 if (vl.renderItem) {
20645 vl.tempDomElement.innerHTML = vl.renderItem(items[i], index).trim();
20646 } else {
20647 vl.tempDomElement.innerHTML = items[i].toString().trim();
20648 }
20649
20650 itemEl = vl.tempDomElement.childNodes[0];
20651 if (vl.params.cache) vl.domCache[index] = itemEl;
20652 itemEl.f7VirtualListIndex = index;
20653 } // Set item top position
20654
20655
20656 if (i === fromIndex) {
20657 if (vl.dynamicHeight) {
20658 topPosition = heightBeforeFirstItem;
20659 } else {
20660 topPosition = i * vl.params.height / vl.params.cols;
20661 }
20662 }
20663
20664 if (!vl.params.renderExternal) {
20665 itemEl.style.top = topPosition + "px"; // Before item insert
20666
20667 vl.emit('local::itemBeforeInsert vlItemBeforeInsert', vl, itemEl, items[i]); // Append item to fragment
20668
20669 vl.fragment.appendChild(itemEl);
20670 }
20671 } // Update list height with not updatable scroll
20672
20673
20674 if (!vl.updatableScroll) {
20675 if (vl.dynamicHeight) {
20676 vl.itemsWrapEl.style.height = heightBeforeLastItem + "px";
20677 } else {
20678 vl.itemsWrapEl.style.height = i * vl.params.height / vl.params.cols + "px";
20679 }
20680 } // Update list html
20681
20682
20683 if (vl.params.renderExternal) {
20684 if (items && items.length === 0) {
20685 vl.reachEnd = true;
20686 }
20687 } else {
20688 vl.emit('local::beforeClear vlBeforeClear', vl, vl.fragment);
20689 vl.itemsWrapEl.innerHTML = '';
20690 vl.emit('local::itemsBeforeInsert vlItemsBeforeInsert', vl, vl.fragment);
20691
20692 if (items && items.length === 0) {
20693 vl.reachEnd = true;
20694 if (vl.params.emptyTemplate) vl.itemsWrapEl.innerHTML = vl.params.emptyTemplate;
20695 } else {
20696 vl.itemsWrapEl.appendChild(vl.fragment);
20697 }
20698
20699 vl.emit('local::itemsAfterInsert vlItemsAfterInsert', vl, vl.fragment);
20700 }
20701
20702 if (typeof forceScrollTop !== 'undefined' && force) {
20703 vl.$scrollableParentEl.scrollTop(forceScrollTop, 0);
20704 }
20705
20706 if (vl.params.renderExternal) {
20707 vl.params.renderExternal(vl, {
20708 fromIndex: fromIndex,
20709 toIndex: toIndex,
20710 listHeight: vl.listHeight,
20711 topPosition: topPosition,
20712 items: renderExternalItems
20713 });
20714 }
20715 } // Filter
20716 ;
20717
20718 _proto.filterItems = function filterItems(indexes, resetScrollTop) {
20719 if (resetScrollTop === void 0) {
20720 resetScrollTop = true;
20721 }
20722
20723 var vl = this;
20724 vl.filteredItems = [];
20725
20726 for (var i = 0; i < indexes.length; i += 1) {
20727 vl.filteredItems.push(vl.items[indexes[i]]);
20728 }
20729
20730 if (resetScrollTop) {
20731 vl.$scrollableParentEl[0].scrollTop = 0;
20732 }
20733
20734 vl.update();
20735 };
20736
20737 _proto.resetFilter = function resetFilter() {
20738 var vl = this;
20739
20740 if (vl.params.showFilteredItemsOnly) {
20741 vl.filteredItems = [];
20742 } else {
20743 vl.filteredItems = null;
20744 delete vl.filteredItems;
20745 }
20746
20747 vl.update();
20748 };
20749
20750 _proto.scrollToItem = function scrollToItem(index) {
20751 var vl = this;
20752 if (index > vl.items.length) return false;
20753 var itemTop = 0;
20754
20755 if (vl.dynamicHeight) {
20756 for (var i = 0; i < index; i += 1) {
20757 itemTop += vl.heights[i];
20758 }
20759 } else {
20760 itemTop = index * vl.params.height;
20761 }
20762
20763 var listTop = vl.$el[0].offsetTop;
20764 vl.render(true, listTop + itemTop - parseInt(vl.$scrollableParentEl.css('padding-top'), 10));
20765 return true;
20766 };
20767
20768 _proto.handleScroll = function handleScroll() {
20769 var vl = this;
20770 vl.render();
20771 } // Handle resize event
20772 ;
20773
20774 _proto.isVisible = function isVisible() {
20775 var vl = this;
20776 return !!(vl.el.offsetWidth || vl.el.offsetHeight || vl.el.getClientRects().length);
20777 };
20778
20779 _proto.handleResize = function handleResize() {
20780 var vl = this;
20781
20782 if (vl.isVisible()) {
20783 vl.setListSize();
20784 vl.render(true);
20785 }
20786 } // Append
20787 ;
20788
20789 _proto.appendItems = function appendItems(items) {
20790 var vl = this;
20791
20792 for (var i = 0; i < items.length; i += 1) {
20793 vl.items.push(items[i]);
20794 }
20795
20796 vl.update();
20797 };
20798
20799 _proto.appendItem = function appendItem(item) {
20800 var vl = this;
20801 vl.appendItems([item]);
20802 } // Replace
20803 ;
20804
20805 _proto.replaceAllItems = function replaceAllItems(items) {
20806 var vl = this;
20807 vl.items = items;
20808 delete vl.filteredItems;
20809 vl.domCache = {};
20810 vl.update();
20811 };
20812
20813 _proto.replaceItem = function replaceItem(index, item) {
20814 var vl = this;
20815 vl.items[index] = item;
20816 if (vl.params.cache) delete vl.domCache[index];
20817 vl.update();
20818 } // Prepend
20819 ;
20820
20821 _proto.prependItems = function prependItems(items) {
20822 var vl = this;
20823
20824 for (var i = items.length - 1; i >= 0; i -= 1) {
20825 vl.items.unshift(items[i]);
20826 }
20827
20828 if (vl.params.cache) {
20829 var newCache = {};
20830 Object.keys(vl.domCache).forEach(function (cached) {
20831 newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];
20832 });
20833 vl.domCache = newCache;
20834 }
20835
20836 vl.update();
20837 };
20838
20839 _proto.prependItem = function prependItem(item) {
20840 var vl = this;
20841 vl.prependItems([item]);
20842 } // Move
20843 ;
20844
20845 _proto.moveItem = function moveItem(from, to) {
20846 var vl = this;
20847 var fromIndex = from;
20848 var toIndex = to;
20849 if (fromIndex === toIndex) return; // remove item from array
20850
20851 var item = vl.items.splice(fromIndex, 1)[0];
20852
20853 if (toIndex >= vl.items.length) {
20854 // Add item to the end
20855 vl.items.push(item);
20856 toIndex = vl.items.length - 1;
20857 } else {
20858 // Add item to new index
20859 vl.items.splice(toIndex, 0, item);
20860 } // Update cache
20861
20862
20863 if (vl.params.cache) {
20864 var newCache = {};
20865 Object.keys(vl.domCache).forEach(function (cached) {
20866 var cachedIndex = parseInt(cached, 10);
20867 var leftIndex = fromIndex < toIndex ? fromIndex : toIndex;
20868 var rightIndex = fromIndex < toIndex ? toIndex : fromIndex;
20869 var indexShift = fromIndex < toIndex ? -1 : 1;
20870 if (cachedIndex < leftIndex || cachedIndex > rightIndex) newCache[cachedIndex] = vl.domCache[cachedIndex];
20871 if (cachedIndex === leftIndex) newCache[rightIndex] = vl.domCache[cachedIndex];
20872 if (cachedIndex > leftIndex && cachedIndex <= rightIndex) newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex];
20873 });
20874 vl.domCache = newCache;
20875 }
20876
20877 vl.update();
20878 } // Insert before
20879 ;
20880
20881 _proto.insertItemBefore = function insertItemBefore(index, item) {
20882 var vl = this;
20883
20884 if (index === 0) {
20885 vl.prependItem(item);
20886 return;
20887 }
20888
20889 if (index >= vl.items.length) {
20890 vl.appendItem(item);
20891 return;
20892 }
20893
20894 vl.items.splice(index, 0, item); // Update cache
20895
20896 if (vl.params.cache) {
20897 var newCache = {};
20898 Object.keys(vl.domCache).forEach(function (cached) {
20899 var cachedIndex = parseInt(cached, 10);
20900
20901 if (cachedIndex >= index) {
20902 newCache[cachedIndex + 1] = vl.domCache[cachedIndex];
20903 }
20904 });
20905 vl.domCache = newCache;
20906 }
20907
20908 vl.update();
20909 } // Delete
20910 ;
20911
20912 _proto.deleteItems = function deleteItems(indexes) {
20913 var vl = this;
20914 var prevIndex;
20915 var indexShift = 0;
20916
20917 var _loop = function _loop(i) {
20918 var index = indexes[i];
20919
20920 if (typeof prevIndex !== 'undefined') {
20921 if (index > prevIndex) {
20922 indexShift = -i;
20923 }
20924 }
20925
20926 index += indexShift;
20927 prevIndex = indexes[i]; // Delete item
20928
20929 var deletedItem = vl.items.splice(index, 1)[0]; // Delete from filtered
20930
20931 if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {
20932 vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);
20933 } // Update cache
20934
20935
20936 if (vl.params.cache) {
20937 var newCache = {};
20938 Object.keys(vl.domCache).forEach(function (cached) {
20939 var cachedIndex = parseInt(cached, 10);
20940
20941 if (cachedIndex === index) {
20942 delete vl.domCache[index];
20943 } else if (parseInt(cached, 10) > index) {
20944 newCache[cachedIndex - 1] = vl.domCache[cached];
20945 } else {
20946 newCache[cachedIndex] = vl.domCache[cached];
20947 }
20948 });
20949 vl.domCache = newCache;
20950 }
20951 };
20952
20953 for (var i = 0; i < indexes.length; i += 1) {
20954 _loop(i);
20955 }
20956
20957 vl.update();
20958 };
20959
20960 _proto.deleteAllItems = function deleteAllItems() {
20961 var vl = this;
20962 vl.items = [];
20963 delete vl.filteredItems;
20964 if (vl.params.cache) vl.domCache = {};
20965 vl.update();
20966 };
20967
20968 _proto.deleteItem = function deleteItem(index) {
20969 var vl = this;
20970 vl.deleteItems([index]);
20971 } // Clear cache
20972 ;
20973
20974 _proto.clearCache = function clearCache() {
20975 var vl = this;
20976 vl.domCache = {};
20977 } // Update Virtual List
20978 ;
20979
20980 _proto.update = function update(deleteCache) {
20981 var vl = this;
20982
20983 if (deleteCache && vl.params.cache) {
20984 vl.domCache = {};
20985 }
20986
20987 vl.setListSize();
20988 vl.render(true);
20989 };
20990
20991 _proto.init = function init() {
20992 var vl = this;
20993 vl.attachEvents();
20994 vl.setListSize();
20995 vl.render();
20996 };
20997
20998 _proto.destroy = function destroy() {
20999 var vl = this;
21000 vl.detachEvents();
21001 vl.$el[0].f7VirtualList = null;
21002 delete vl.$el[0].f7VirtualList;
21003 deleteProps$1(vl);
21004 vl = null;
21005 };
21006
21007 return VirtualList;
21008 }(Framework7Class);
21009
21010 var VirtualList = {
21011 name: 'virtualList',
21012 static: {
21013 VirtualList: VirtualList$1
21014 },
21015 create: function create() {
21016 var app = this;
21017 app.virtualList = ConstructorMethods({
21018 defaultSelector: '.virtual-list',
21019 constructor: VirtualList$1,
21020 app: app,
21021 domProp: 'f7VirtualList'
21022 });
21023 }
21024 };
21025
21026 var ListIndex$1 = /*#__PURE__*/function (_Framework7Class) {
21027 _inheritsLoose(ListIndex, _Framework7Class);
21028
21029 function ListIndex(app, params) {
21030 var _this;
21031
21032 if (params === void 0) {
21033 params = {};
21034 }
21035
21036 _this = _Framework7Class.call(this, params, [app]) || this;
21037
21038 var index = _assertThisInitialized(_this);
21039
21040 var defaults = {
21041 el: null,
21042 // where to render indexes
21043 listEl: null,
21044 // list el to generate indexes
21045 indexes: 'auto',
21046 // or array of indexes
21047 iosItemHeight: 14,
21048 mdItemHeight: 14,
21049 auroraItemHeight: 14,
21050 scrollList: true,
21051 label: false,
21052 // eslint-disable-next-line
21053 renderItem: function renderItem(itemContent, itemIndex) {
21054 return ("\n <li>" + itemContent + "</li>\n ").trim();
21055 },
21056 renderSkipPlaceholder: function renderSkipPlaceholder() {
21057 return '<li class="list-index-skip-placeholder"></li>';
21058 },
21059 on: {}
21060 }; // Extend defaults with modules params
21061
21062 index.useModulesParams(defaults);
21063 index.params = extend$1(defaults, params);
21064 var $el;
21065 var $listEl;
21066 var $pageContentEl;
21067 var $ul;
21068
21069 if (index.params.el) {
21070 $el = $(index.params.el);
21071 } else {
21072 return index || _assertThisInitialized(_this);
21073 }
21074
21075 if ($el[0].f7ListIndex) {
21076 return $el[0].f7ListIndex || _assertThisInitialized(_this);
21077 }
21078
21079 $ul = $el.find('ul');
21080
21081 if ($ul.length === 0) {
21082 $ul = $('<ul></ul>');
21083 $el.append($ul);
21084 }
21085
21086 if (index.params.listEl) {
21087 $listEl = $(index.params.listEl);
21088 }
21089
21090 if (index.params.indexes === 'auto' && !$listEl) {
21091 return index || _assertThisInitialized(_this);
21092 }
21093
21094 if ($listEl) {
21095 $pageContentEl = $listEl.parents('.page-content').eq(0);
21096 } else {
21097 $pageContentEl = $el.siblings('.page-content').eq(0);
21098
21099 if ($pageContentEl.length === 0) {
21100 $pageContentEl = $el.parents('.page').eq(0).find('.page-content').eq(0);
21101 }
21102 }
21103
21104 $el[0].f7ListIndex = index;
21105 extend$1(index, {
21106 app: app,
21107 $el: $el,
21108 el: $el && $el[0],
21109 $ul: $ul,
21110 ul: $ul && $ul[0],
21111 $listEl: $listEl,
21112 listEl: $listEl && $listEl[0],
21113 $pageContentEl: $pageContentEl,
21114 pageContentEl: $pageContentEl && $pageContentEl[0],
21115 indexes: params.indexes,
21116 height: 0,
21117 skipRate: 0
21118 }); // Install Modules
21119
21120 index.useModules(); // Attach events
21121
21122 function handleResize() {
21123 var height = {
21124 index: index
21125 };
21126 index.calcSize();
21127
21128 if (height !== index.height) {
21129 index.render();
21130 }
21131 }
21132
21133 function handleClick(e) {
21134 var $clickedLi = $(e.target).closest('li');
21135 if (!$clickedLi.length) return;
21136 var itemIndex = $clickedLi.index();
21137
21138 if (index.skipRate > 0) {
21139 var percentage = itemIndex / ($clickedLi.siblings('li').length - 1);
21140 itemIndex = Math.round((index.indexes.length - 1) * percentage);
21141 }
21142
21143 var itemContent = index.indexes[itemIndex];
21144 index.$el.trigger('listindex:click', {
21145 content: itemContent,
21146 index: itemIndex
21147 });
21148 index.emit('local::click listIndexClick', index, itemContent, itemIndex);
21149 index.$el.trigger('listindex:select', {
21150 content: itemContent,
21151 index: itemIndex
21152 });
21153 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
21154
21155 if (index.$listEl && index.params.scrollList) {
21156 index.scrollListToIndex(itemContent, itemIndex);
21157 }
21158 }
21159
21160 var touchesStart = {};
21161 var isTouched;
21162 var isMoved;
21163 var topPoint;
21164 var bottomPoint;
21165 var $labelEl;
21166 var previousIndex = null;
21167
21168 function handleTouchStart(e) {
21169 var $children = $ul.children();
21170 if (!$children.length) return;
21171 topPoint = $children[0].getBoundingClientRect().top;
21172 bottomPoint = $children[$children.length - 1].getBoundingClientRect().top + $children[0].offsetHeight;
21173 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
21174 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
21175 isTouched = true;
21176 isMoved = false;
21177 previousIndex = null;
21178 }
21179
21180 function handleTouchMove(e) {
21181 if (!isTouched) return;
21182
21183 if (!isMoved && index.params.label) {
21184 $labelEl = $('<span class="list-index-label"></span>');
21185 $el.append($labelEl);
21186 }
21187
21188 isMoved = true;
21189 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
21190 e.preventDefault();
21191 var percentage = (pageY - topPoint) / (bottomPoint - topPoint);
21192 percentage = Math.min(Math.max(percentage, 0), 1);
21193 var itemIndex = Math.round((index.indexes.length - 1) * percentage);
21194 var itemContent = index.indexes[itemIndex];
21195 var ulHeight = bottomPoint - topPoint;
21196 var bubbleBottom = (index.height - ulHeight) / 2 + (1 - percentage) * ulHeight;
21197
21198 if (itemIndex !== previousIndex) {
21199 if (index.params.label) {
21200 $labelEl.html(itemContent).transform("translateY(-" + bubbleBottom + "px)");
21201 }
21202
21203 if (index.$listEl && index.params.scrollList) {
21204 index.scrollListToIndex(itemContent, itemIndex);
21205 }
21206 }
21207
21208 previousIndex = itemIndex;
21209 index.$el.trigger('listindex:select');
21210 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
21211 }
21212
21213 function handleTouchEnd() {
21214 if (!isTouched) return;
21215 isTouched = false;
21216 isMoved = false;
21217
21218 if (index.params.label) {
21219 if ($labelEl) $labelEl.remove();
21220 $labelEl = undefined;
21221 }
21222 }
21223
21224 var passiveListener = getSupport$1().passiveListener ? {
21225 passive: true
21226 } : false;
21227
21228 index.attachEvents = function attachEvents() {
21229 $el.parents('.tab').on('tab:show', handleResize);
21230 $el.parents('.page').on('page:reinit', handleResize);
21231 $el.parents('.panel').on('panel:open', handleResize);
21232 $el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast').on('modal:open', handleResize);
21233 app.on('resize', handleResize);
21234 $el.on('click', handleClick);
21235 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
21236 app.on('touchmove:active', handleTouchMove);
21237 app.on('touchend:passive', handleTouchEnd);
21238 };
21239
21240 index.detachEvents = function attachEvents() {
21241 $el.parents('.tab').off('tab:show', handleResize);
21242 $el.parents('.page').off('page:reinit', handleResize);
21243 $el.parents('.panel').off('panel:open', handleResize);
21244 $el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast').off('modal:open', handleResize);
21245 app.off('resize', handleResize);
21246 $el.off('click', handleClick);
21247 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
21248 app.off('touchmove:active', handleTouchMove);
21249 app.off('touchend:passive', handleTouchEnd);
21250 }; // Init
21251
21252
21253 index.init();
21254 return index || _assertThisInitialized(_this);
21255 } // eslint-disable-next-line
21256
21257
21258 var _proto = ListIndex.prototype;
21259
21260 _proto.scrollListToIndex = function scrollListToIndex(itemContent, itemIndex) {
21261 var index = this;
21262 var $listEl = index.$listEl,
21263 $pageContentEl = index.$pageContentEl,
21264 app = index.app;
21265 if (!$listEl || !$pageContentEl || $pageContentEl.length === 0) return index;
21266 var $scrollToEl;
21267 $listEl.find('.list-group-title, .item-divider').each(function (el) {
21268 if ($scrollToEl) return;
21269 var $el = $(el);
21270
21271 if ($el.text() === itemContent) {
21272 $scrollToEl = $el;
21273 }
21274 });
21275 if (!$scrollToEl || $scrollToEl.length === 0) return index;
21276 var parentTop = $scrollToEl.parent().offset().top;
21277 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
21278 var scrollTop = $pageContentEl[0].scrollTop;
21279 var scrollToElTop = $scrollToEl.offset().top;
21280
21281 if ($pageContentEl.parents('.page-with-navbar-large').length) {
21282 var navbarInnerEl = app.navbar.getElByPage($pageContentEl.parents('.page-with-navbar-large').eq(0));
21283 var $titleLargeEl = $(navbarInnerEl).find('.title-large');
21284
21285 if ($titleLargeEl.length) {
21286 paddingTop -= $titleLargeEl[0].offsetHeight || 0;
21287 }
21288 }
21289
21290 if (parentTop <= paddingTop) {
21291 $pageContentEl.scrollTop(parentTop + scrollTop - paddingTop);
21292 } else {
21293 $pageContentEl.scrollTop(scrollToElTop + scrollTop - paddingTop);
21294 }
21295
21296 return index;
21297 };
21298
21299 _proto.renderSkipPlaceholder = function renderSkipPlaceholder() {
21300 var index = this;
21301 return index.params.renderSkipPlaceholder.call(index);
21302 };
21303
21304 _proto.renderItem = function renderItem(itemContent, itemIndex) {
21305 var index = this;
21306 return index.params.renderItem.call(index, itemContent, itemIndex);
21307 };
21308
21309 _proto.render = function render() {
21310 var index = this;
21311 var $ul = index.$ul,
21312 indexes = index.indexes,
21313 skipRate = index.skipRate;
21314 var wasSkipped;
21315 var html = indexes.map(function (itemContent, itemIndex) {
21316 if (itemIndex % skipRate !== 0 && skipRate > 0) {
21317 wasSkipped = true;
21318 return '';
21319 }
21320
21321 var itemHtml = index.renderItem(itemContent, itemIndex);
21322
21323 if (wasSkipped) {
21324 itemHtml = index.renderSkipPlaceholder() + itemHtml;
21325 }
21326
21327 wasSkipped = false;
21328 return itemHtml;
21329 }).join('');
21330 $ul.html(html);
21331 return index;
21332 };
21333
21334 _proto.calcSize = function calcSize() {
21335 var index = this;
21336 var app = index.app,
21337 params = index.params,
21338 el = index.el,
21339 indexes = index.indexes;
21340 var height = el.offsetHeight;
21341 var itemHeight = params[app.theme + "ItemHeight"];
21342 var maxItems = Math.floor(height / itemHeight);
21343 var items = indexes.length;
21344 var skipRate = 0;
21345
21346 if (items > maxItems) {
21347 skipRate = Math.ceil((items * 2 - 1) / maxItems);
21348 }
21349
21350 index.height = height;
21351 index.skipRate = skipRate;
21352 return index;
21353 };
21354
21355 _proto.calcIndexes = function calcIndexes() {
21356 var index = this;
21357
21358 if (index.params.indexes === 'auto') {
21359 index.indexes = [];
21360 index.$listEl.find('.list-group-title, .item-divider').each(function (el) {
21361 var elContent = $(el).text();
21362
21363 if (index.indexes.indexOf(elContent) < 0) {
21364 index.indexes.push(elContent);
21365 }
21366 });
21367 } else {
21368 index.indexes = index.params.indexes;
21369 }
21370
21371 return index;
21372 };
21373
21374 _proto.update = function update() {
21375 var index = this;
21376 index.calcIndexes();
21377 index.calcSize();
21378 index.render();
21379 return index;
21380 };
21381
21382 _proto.init = function init() {
21383 var index = this;
21384 index.calcIndexes();
21385 index.calcSize();
21386 index.render();
21387 index.attachEvents();
21388 };
21389
21390 _proto.destroy = function destroy() {
21391 var index = this;
21392 index.$el.trigger('listindex:beforedestroy', index);
21393 index.emit('local::beforeDestroy listIndexBeforeDestroy');
21394 index.detachEvents();
21395
21396 if (index.$el[0]) {
21397 index.$el[0].f7ListIndex = null;
21398 delete index.$el[0].f7ListIndex;
21399 }
21400
21401 deleteProps$1(index);
21402 index = null;
21403 };
21404
21405 return ListIndex;
21406 }(Framework7Class);
21407
21408 var ListIndex = {
21409 name: 'listIndex',
21410 static: {
21411 ListIndex: ListIndex$1
21412 },
21413 create: function create() {
21414 var app = this;
21415 app.listIndex = ConstructorMethods({
21416 defaultSelector: '.list-index',
21417 constructor: ListIndex$1,
21418 app: app,
21419 domProp: 'f7ListIndex'
21420 });
21421 },
21422 on: {
21423 tabMounted: function tabMounted(tabEl) {
21424 var app = this;
21425 $(tabEl).find('.list-index-init').each(function (listIndexEl) {
21426 var params = extend$1($(listIndexEl).dataset(), {
21427 el: listIndexEl
21428 });
21429 app.listIndex.create(params);
21430 });
21431 },
21432 tabBeforeRemove: function tabBeforeRemove(tabEl) {
21433 $(tabEl).find('.list-index-init').each(function (listIndexEl) {
21434 if (listIndexEl.f7ListIndex) listIndexEl.f7ListIndex.destroy();
21435 });
21436 },
21437 pageInit: function pageInit(page) {
21438 var app = this;
21439 page.$el.find('.list-index-init').each(function (listIndexEl) {
21440 var params = extend$1($(listIndexEl).dataset(), {
21441 el: listIndexEl
21442 });
21443 app.listIndex.create(params);
21444 });
21445 },
21446 pageBeforeRemove: function pageBeforeRemove(page) {
21447 page.$el.find('.list-index-init').each(function (listIndexEl) {
21448 if (listIndexEl.f7ListIndex) listIndexEl.f7ListIndex.destroy();
21449 });
21450 }
21451 },
21452 vnode: {
21453 'list-index-init': {
21454 insert: function insert(vnode) {
21455 var app = this;
21456 var listIndexEl = vnode.elm;
21457 var params = extend$1($(listIndexEl).dataset(), {
21458 el: listIndexEl
21459 });
21460 app.listIndex.create(params);
21461 },
21462 destroy: function destroy(vnode) {
21463 var listIndexEl = vnode.elm;
21464 if (listIndexEl.f7ListIndex) listIndexEl.f7ListIndex.destroy();
21465 }
21466 }
21467 }
21468 };
21469
21470 var Timeline = {
21471 name: 'timeline'
21472 };
21473
21474 var Tab = {
21475 show: function show() {
21476 var app = this;
21477 var tabEl;
21478 var tabLinkEl;
21479 var animate;
21480 var tabRoute;
21481 var animatedInit;
21482
21483 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
21484 args[_key] = arguments[_key];
21485 }
21486
21487 if (args.length === 1 && args[0] && args[0].constructor === Object) {
21488 tabEl = args[0].tabEl;
21489 tabLinkEl = args[0].tabLinkEl;
21490 animate = args[0].animate;
21491 tabRoute = args[0].tabRoute;
21492 animatedInit = args[0].animatedInit;
21493 } else {
21494 tabEl = args[0];
21495 tabLinkEl = args[1];
21496 animate = args[2];
21497 tabRoute = args[3];
21498
21499 if (typeof args[1] === 'boolean') {
21500 tabEl = args[0];
21501 animate = args[1];
21502 tabLinkEl = args[2];
21503 tabRoute = args[3];
21504
21505 if (args.length > 2 && tabLinkEl.constructor === Object) {
21506 tabEl = args[0];
21507 animate = args[1];
21508 tabRoute = args[2];
21509 tabLinkEl = args[3];
21510 }
21511 }
21512 }
21513
21514 if (typeof animate === 'undefined') animate = true;
21515 var $newTabEl = $(tabEl);
21516
21517 if (tabRoute && $newTabEl[0]) {
21518 $newTabEl[0].f7TabRoute = tabRoute;
21519 }
21520
21521 if (!animatedInit && ($newTabEl.length === 0 || $newTabEl.hasClass('tab-active'))) {
21522 return {
21523 $newTabEl: $newTabEl,
21524 newTabEl: $newTabEl[0]
21525 };
21526 }
21527
21528 var $tabLinkEl;
21529 if (tabLinkEl) $tabLinkEl = $(tabLinkEl);
21530 var $tabsEl = $newTabEl.parent('.tabs');
21531
21532 if ($tabsEl.length === 0) {
21533 return {
21534 $newTabEl: $newTabEl,
21535 newTabEl: $newTabEl[0]
21536 };
21537 } // Release swipeouts in hidden tabs
21538
21539
21540 if (app.swipeout) app.swipeout.allowOpen = true; // Animated tabs
21541
21542 var tabsChangedCallbacks = [];
21543
21544 function onTabsChanged(callback) {
21545 tabsChangedCallbacks.push(callback);
21546 }
21547
21548 function tabsChanged() {
21549 tabsChangedCallbacks.forEach(function (callback) {
21550 callback();
21551 });
21552 }
21553
21554 var animated = false;
21555
21556 if ($tabsEl.parent().hasClass('tabs-animated-wrap')) {
21557 $tabsEl.parent()[animate ? 'removeClass' : 'addClass']('not-animated');
21558 var transitionDuration = parseFloat($tabsEl.css('transition-duration').replace(',', '.'));
21559
21560 if (animate && transitionDuration) {
21561 $tabsEl.transitionEnd(tabsChanged);
21562 animated = true;
21563 }
21564
21565 var tabsTranslate = (app.rtl ? $newTabEl.index() : -$newTabEl.index()) * 100;
21566 $tabsEl.transform("translate3d(" + tabsTranslate + "%,0,0)");
21567 } // Swipeable tabs
21568
21569
21570 var swiper;
21571
21572 if ($tabsEl.parent().hasClass('tabs-swipeable-wrap') && app.swiper) {
21573 swiper = $tabsEl.parent()[0].swiper;
21574
21575 if (swiper && swiper.activeIndex !== $newTabEl.index()) {
21576 animated = true;
21577 swiper.once('slideChangeTransitionEnd', function () {
21578 tabsChanged();
21579 }).slideTo($newTabEl.index(), animate ? undefined : 0);
21580 } else if (swiper && swiper.animating) {
21581 animated = true;
21582 swiper.once('slideChangeTransitionEnd', function () {
21583 tabsChanged();
21584 });
21585 }
21586 } // Remove active class from old tabs
21587
21588
21589 var $oldTabEl = $tabsEl.children('.tab-active');
21590 $oldTabEl.removeClass('tab-active');
21591
21592 if (!animatedInit && (!swiper || swiper && !swiper.animating || swiper && tabRoute)) {
21593 if ($oldTabEl.hasClass('view') && $oldTabEl.children('.page').length) {
21594 $oldTabEl.children('.page').each(function (pageEl) {
21595 $(pageEl).trigger('page:tabhide');
21596 app.emit('pageTabHide', pageEl);
21597 });
21598 }
21599
21600 $oldTabEl.trigger('tab:hide');
21601 app.emit('tabHide', $oldTabEl[0]);
21602 } // Trigger 'show' event on new tab
21603
21604
21605 $newTabEl.addClass('tab-active');
21606
21607 if (!animatedInit && (!swiper || swiper && !swiper.animating || swiper && tabRoute)) {
21608 if ($newTabEl.hasClass('view') && $newTabEl.children('.page').length) {
21609 $newTabEl.children('.page').each(function (pageEl) {
21610 $(pageEl).trigger('page:tabshow');
21611 app.emit('pageTabShow', pageEl);
21612 });
21613 }
21614
21615 $newTabEl.trigger('tab:show');
21616 app.emit('tabShow', $newTabEl[0]);
21617 } // Find related link for new tab
21618
21619
21620 if (!$tabLinkEl) {
21621 // Search by id
21622 if (typeof tabEl === 'string') $tabLinkEl = $(".tab-link[href=\"" + tabEl + "\"]");else $tabLinkEl = $(".tab-link[href=\"#" + $newTabEl.attr('id') + "\"]"); // Search by data-tab
21623
21624 if (!$tabLinkEl || $tabLinkEl && $tabLinkEl.length === 0) {
21625 $('[data-tab]').each(function (el) {
21626 if ($newTabEl.is($(el).attr('data-tab'))) $tabLinkEl = $(el);
21627 });
21628 }
21629
21630 if (tabRoute && (!$tabLinkEl || $tabLinkEl && $tabLinkEl.length === 0)) {
21631 $tabLinkEl = $("[data-route-tab-id=\"" + tabRoute.route.tab.id + "\"]");
21632
21633 if ($tabLinkEl.length === 0) {
21634 $tabLinkEl = $(".tab-link[href=\"" + tabRoute.url + "\"]");
21635 }
21636 }
21637
21638 if ($tabLinkEl.length > 1 && $newTabEl.parents('.page').length) {
21639 // eslint-disable-next-line
21640 $tabLinkEl = $tabLinkEl.filter(function (tabLinkElement) {
21641 return $(tabLinkElement).parents('.page')[0] === $newTabEl.parents('.page')[0];
21642 });
21643
21644 if (app.theme === 'ios' && $tabLinkEl.length === 0 && tabRoute) {
21645 var $pageEl = $newTabEl.parents('.page');
21646 var $navbarEl = $(app.navbar.getElByPage($pageEl));
21647 $tabLinkEl = $navbarEl.find("[data-route-tab-id=\"" + tabRoute.route.tab.id + "\"]");
21648
21649 if ($tabLinkEl.length === 0) {
21650 $tabLinkEl = $navbarEl.find(".tab-link[href=\"" + tabRoute.url + "\"]");
21651 }
21652 }
21653 }
21654 }
21655
21656 if ($tabLinkEl.length > 0) {
21657 // Find related link for old tab
21658 var $oldTabLinkEl;
21659
21660 if ($oldTabEl && $oldTabEl.length > 0) {
21661 // Search by id
21662 var oldTabId = $oldTabEl.attr('id');
21663
21664 if (oldTabId) {
21665 $oldTabLinkEl = $(".tab-link[href=\"#" + oldTabId + "\"]"); // Search by data-route-tab-id
21666
21667 if (!$oldTabLinkEl || $oldTabLinkEl && $oldTabLinkEl.length === 0) {
21668 $oldTabLinkEl = $(".tab-link[data-route-tab-id=\"" + oldTabId + "\"]");
21669 }
21670 } // Search by data-tab
21671
21672
21673 if (!$oldTabLinkEl || $oldTabLinkEl && $oldTabLinkEl.length === 0) {
21674 $('[data-tab]').each(function (tabLinkElement) {
21675 if ($oldTabEl.is($(tabLinkElement).attr('data-tab'))) $oldTabLinkEl = $(tabLinkElement);
21676 });
21677 }
21678
21679 if (!$oldTabLinkEl || $oldTabLinkEl && $oldTabLinkEl.length === 0) {
21680 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
21681 }
21682 } else if (tabRoute) {
21683 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
21684 }
21685
21686 if ($oldTabLinkEl && $oldTabLinkEl.length > 1 && $oldTabEl && $oldTabEl.parents('.page').length) {
21687 // eslint-disable-next-line
21688 $oldTabLinkEl = $oldTabLinkEl.filter(function (tabLinkElement) {
21689 return $(tabLinkElement).parents('.page')[0] === $oldTabEl.parents('.page')[0];
21690 });
21691 }
21692
21693 if ($oldTabLinkEl && $oldTabLinkEl.length > 0) $oldTabLinkEl.removeClass('tab-link-active'); // Update links' classes
21694
21695 if ($tabLinkEl && $tabLinkEl.length > 0) {
21696 $tabLinkEl.addClass('tab-link-active'); // Material Highlight
21697
21698 if (app.theme !== 'ios' && app.toolbar) {
21699 var $tabbarEl = $tabLinkEl.parents('.tabbar, .tabbar-labels');
21700
21701 if ($tabbarEl.length > 0) {
21702 app.toolbar.setHighlight($tabbarEl);
21703 }
21704 }
21705 }
21706 }
21707
21708 return {
21709 $newTabEl: $newTabEl,
21710 newTabEl: $newTabEl[0],
21711 $oldTabEl: $oldTabEl,
21712 oldTabEl: $oldTabEl[0],
21713 onTabsChanged: onTabsChanged,
21714 animated: animated
21715 };
21716 }
21717 };
21718 var Tabs = {
21719 name: 'tabs',
21720 create: function create() {
21721 var app = this;
21722 extend$1(app, {
21723 tab: {
21724 show: Tab.show.bind(app)
21725 }
21726 });
21727 },
21728 on: {
21729 'pageInit tabMounted': function onInit(pageOrTabEl) {
21730 var $el = $(pageOrTabEl.el || pageOrTabEl);
21731 var animatedTabEl = $el.find('.tabs-animated-wrap > .tabs > .tab-active')[0];
21732 if (!animatedTabEl) return;
21733 var app = this;
21734 app.tab.show({
21735 tabEl: animatedTabEl,
21736 animatedInit: true,
21737 animate: false
21738 });
21739 }
21740 },
21741 clicks: {
21742 '.tab-link': function tabLinkClick($clickedEl, data) {
21743 if (data === void 0) {
21744 data = {};
21745 }
21746
21747 if ($clickedEl.attr('href') && $clickedEl.attr('href').indexOf('#') === 0 || $clickedEl.attr('data-tab')) {
21748 var app = this;
21749 app.tab.show({
21750 tabEl: data.tab || $clickedEl.attr('href'),
21751 tabLinkEl: $clickedEl,
21752 animate: data.animate
21753 });
21754 }
21755 }
21756 }
21757 };
21758
21759 function swipePanel(panel) {
21760 var app = panel.app;
21761
21762 if (panel.swipeInitialized) {
21763 return;
21764 }
21765
21766 extend$1(panel, {
21767 swipeable: true,
21768 swipeInitialized: true
21769 });
21770 var params = panel.params;
21771 var $el = panel.$el,
21772 $backdropEl = panel.$backdropEl,
21773 side = panel.side,
21774 effect = panel.effect;
21775 var otherPanel;
21776 var isTouched;
21777 var isGestureStarted;
21778 var isMoved;
21779 var isScrolling;
21780 var isInterrupted;
21781 var touchesStart = {};
21782 var touchStartTime;
21783 var touchesDiff;
21784 var translate;
21785 var backdropOpacity;
21786 var panelWidth;
21787 var direction;
21788 var $viewEl;
21789 var touchMoves = 0;
21790
21791 function handleTouchStart(e) {
21792 if (!panel.swipeable || isGestureStarted) return;
21793 if (!app.panel.allowOpen || !params.swipe && !params.swipeOnlyClose || isTouched) return;
21794 if ($('.modal-in:not(.toast):not(.notification), .photo-browser-in').length > 0) return;
21795 otherPanel = app.panel.get(side === 'left' ? 'right' : 'left') || {};
21796 var otherPanelOpened = otherPanel.opened && otherPanel.$el && !otherPanel.$el.hasClass('panel-in-breakpoint');
21797
21798 if (!panel.opened && otherPanelOpened) {
21799 return;
21800 }
21801
21802 if (!params.swipeOnlyClose) {
21803 if (otherPanelOpened) return;
21804 }
21805
21806 if (e.target && e.target.nodeName.toLowerCase() === 'input' && e.target.type === 'range') return;
21807 if ($(e.target).closest('.range-slider, .tabs-swipeable-wrap, .calendar-months, .no-swipe-panel, .card-opened').length > 0) return;
21808 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
21809 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
21810
21811 if (params.swipeOnlyClose && !panel.opened) {
21812 return;
21813 }
21814
21815 if (params.swipeActiveArea && !panel.opened) {
21816 if (side === 'left') {
21817 if (touchesStart.x > params.swipeActiveArea) return;
21818 }
21819
21820 if (side === 'right') {
21821 if (touchesStart.x < app.width - params.swipeActiveArea) return;
21822 }
21823 }
21824
21825 touchMoves = 0;
21826 $viewEl = $(panel.getViewEl());
21827 isMoved = false;
21828 isTouched = true;
21829 isScrolling = undefined;
21830 isInterrupted = false;
21831 touchStartTime = now$1();
21832 direction = undefined;
21833 }
21834
21835 function handleTouchMove(e) {
21836 if (!isTouched || isGestureStarted || isInterrupted) return;
21837 touchMoves += 1;
21838 if (touchMoves < 2) return;
21839
21840 if (e.f7PreventSwipePanel || app.preventSwipePanelBySwipeBack || app.preventSwipePanel) {
21841 isTouched = false;
21842 return;
21843 }
21844
21845 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
21846 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
21847
21848 if (typeof isScrolling === 'undefined') {
21849 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
21850 }
21851
21852 if (isScrolling) {
21853 isTouched = false;
21854 return;
21855 }
21856
21857 if (!direction) {
21858 if (pageX > touchesStart.x) {
21859 direction = 'to-right';
21860 } else {
21861 direction = 'to-left';
21862 }
21863
21864 if (params.swipeActiveArea > 0 && !panel.opened) {
21865 if (side === 'left' && touchesStart.x > params.swipeActiveArea) {
21866 isTouched = false;
21867 return;
21868 }
21869
21870 if (side === 'right' && touchesStart.x < app.width - params.swipeActiveArea) {
21871 isTouched = false;
21872 return;
21873 }
21874 }
21875
21876 if ($el.hasClass('panel-in-breakpoint')) {
21877 isTouched = false;
21878 return;
21879 }
21880
21881 if (side === 'left' && direction === 'to-left' && !$el.hasClass('panel-in') || side === 'right' && direction === 'to-right' && !$el.hasClass('panel-in')) {
21882 isTouched = false;
21883 return;
21884 }
21885 }
21886
21887 var threshold = panel.opened ? 0 : -params.swipeThreshold;
21888 if (side === 'right') threshold = -threshold;
21889
21890 if (!isMoved) {
21891 if (!panel.opened) {
21892 panel.insertToRoot();
21893 $el.addClass('panel-in-swipe');
21894 $backdropEl.css('visibility', 'visible');
21895 $el.trigger('panel:swipeopen');
21896 panel.emit('local::swipeOpen panelSwipeOpen', panel);
21897 }
21898
21899 panelWidth = $el[0].offsetWidth;
21900
21901 if (effect === 'reveal' && $el.hasClass('panel-in-collapsed')) {
21902 panelWidth -= parseFloat($viewEl.css("margin-" + side));
21903 }
21904
21905 $el.transition(0);
21906 }
21907
21908 isMoved = true;
21909 e.preventDefault();
21910 touchesDiff = pageX - touchesStart.x + threshold;
21911
21912 if (side === 'right') {
21913 if (effect === 'cover') {
21914 translate = touchesDiff + (panel.opened ? 0 : panelWidth);
21915 if (translate < 0) translate = 0;
21916
21917 if (translate > panelWidth) {
21918 translate = panelWidth;
21919 }
21920 } else {
21921 translate = touchesDiff - (panel.opened ? panelWidth : 0);
21922 if (translate > 0) translate = 0;
21923
21924 if (translate < -panelWidth) {
21925 translate = -panelWidth;
21926 }
21927 }
21928 } else {
21929 translate = touchesDiff + (panel.opened ? panelWidth : 0);
21930 if (translate < 0) translate = 0;
21931
21932 if (translate > panelWidth) {
21933 translate = panelWidth;
21934 }
21935 }
21936
21937 var noFollowProgress = Math.abs(translate / panelWidth);
21938
21939 if (effect === 'reveal') {
21940 if (!params.swipeNoFollow) {
21941 $viewEl.transform("translate3d(" + translate + "px,0,0)").transition(0);
21942 $backdropEl.transform("translate3d(" + translate + "px,0,0)").transition(0);
21943 }
21944
21945 $el.trigger('panel:swipe', Math.abs(translate / panelWidth));
21946 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
21947 } else {
21948 if (side === 'left') translate -= panelWidth;
21949
21950 if (!params.swipeNoFollow) {
21951 $el.transform("translate3d(" + translate + "px,0,0)").transition(0);
21952 $backdropEl.transition(0);
21953 backdropOpacity = 1 - Math.abs(translate / panelWidth);
21954 $backdropEl.css({
21955 opacity: backdropOpacity
21956 });
21957 }
21958
21959 $el.trigger('panel:swipe', Math.abs(translate / panelWidth));
21960 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
21961 }
21962
21963 if (params.swipeNoFollow) {
21964 var stateChanged = panel.opened && noFollowProgress === 0 || !panel.opened && noFollowProgress === 1;
21965
21966 if (stateChanged) {
21967 isInterrupted = true; // eslint-disable-next-line
21968
21969 handleTouchEnd(e);
21970 }
21971 }
21972 }
21973
21974 function handleTouchEnd(e) {
21975 if (!isTouched || !isMoved) {
21976 isTouched = false;
21977 isMoved = false;
21978 return;
21979 }
21980
21981 var isGesture = e.type === 'gesturestart' || isGestureStarted;
21982 isTouched = false;
21983 isMoved = false;
21984 var timeDiff = new Date().getTime() - touchStartTime;
21985 var action;
21986 var edge = (translate === 0 || Math.abs(translate) === panelWidth) && !params.swipeNoFollow;
21987 var threshold = params.swipeThreshold || 0;
21988
21989 if (isGesture) {
21990 action = 'reset';
21991 } else if (!panel.opened) {
21992 if (Math.abs(touchesDiff) < threshold) {
21993 action = 'reset';
21994 } else if (effect === 'cover') {
21995 if (translate === 0) {
21996 action = 'swap'; // open
21997 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
21998 action = 'swap'; // open
21999 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
22000 action = 'swap'; // open
22001 } else {
22002 action = 'reset'; // close
22003 }
22004 } else if (translate === 0) {
22005 action = 'reset';
22006 } else if (timeDiff < 300 && Math.abs(translate) > 0 || timeDiff >= 300 && Math.abs(translate) >= panelWidth / 2) {
22007 action = 'swap';
22008 } else {
22009 action = 'reset';
22010 }
22011 } else if (effect === 'cover') {
22012 if (translate === 0) {
22013 action = 'reset'; // open
22014 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
22015 action = 'swap'; // open
22016 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
22017 action = 'reset'; // open
22018 } else {
22019 action = 'swap'; // close
22020 }
22021 } else if (translate === -panelWidth) {
22022 action = 'reset';
22023 } else if (timeDiff < 300 && Math.abs(translate) >= 0 || timeDiff >= 300 && Math.abs(translate) <= panelWidth / 2) {
22024 if (side === 'left' && translate === panelWidth) action = 'reset';else action = 'swap';
22025 } else {
22026 action = 'reset';
22027 }
22028
22029 if (action === 'swap') {
22030 if (panel.opened) {
22031 panel.close(!edge);
22032 } else {
22033 panel.open(!edge);
22034 }
22035 }
22036
22037 var removePanelInClass = true;
22038
22039 if (action === 'reset') {
22040 if (!panel.opened) {
22041 if (edge) {
22042 // edge position
22043 $el.removeClass('panel-in-swipe');
22044 } else {
22045 removePanelInClass = false;
22046 var target = effect === 'reveal' ? $viewEl : $el;
22047 panel.setStateClasses('before-closing');
22048 target.transitionEnd(function () {
22049 if ($el.hasClass('panel-in')) return;
22050 $el.removeClass('panel-in-swipe');
22051 panel.setStateClasses('after-closing');
22052 });
22053 }
22054 }
22055 }
22056
22057 if (effect === 'reveal') {
22058 nextFrame$1(function () {
22059 $viewEl.transition('');
22060 $viewEl.transform('');
22061 });
22062 }
22063
22064 if (removePanelInClass) {
22065 $el.removeClass('panel-in-swipe');
22066 }
22067
22068 $el.transition('').transform('');
22069 $backdropEl.transform('').transition('').css({
22070 opacity: '',
22071 visibility: ''
22072 });
22073 }
22074
22075 function handleGestureStart(e) {
22076 isGestureStarted = true;
22077 handleTouchEnd(e);
22078 }
22079
22080 function handleGestureEnd() {
22081 isGestureStarted = false;
22082 } // Add Events
22083
22084
22085 app.on('touchstart:passive', handleTouchStart);
22086 app.on('touchmove:active', handleTouchMove);
22087 app.on('touchend:passive', handleTouchEnd);
22088 app.on('gesturestart', handleGestureStart);
22089 app.on('gestureend', handleGestureEnd);
22090 panel.on('panelDestroy', function () {
22091 app.off('touchstart:passive', handleTouchStart);
22092 app.off('touchmove:active', handleTouchMove);
22093 app.off('touchend:passive', handleTouchEnd);
22094 app.off('gesturestart', handleGestureStart);
22095 app.off('gestureend', handleGestureEnd);
22096 });
22097 }
22098
22099 function resizablePanel(panel) {
22100 var app = panel.app;
22101 var support = getSupport$1();
22102 if (panel.resizableInitialized) return;
22103 extend$1(panel, {
22104 resizable: true,
22105 resizableWidth: null,
22106 resizableInitialized: true
22107 });
22108 var $htmlEl = $('html');
22109 var $el = panel.$el,
22110 $backdropEl = panel.$backdropEl,
22111 side = panel.side,
22112 effect = panel.effect;
22113 if (!$el) return;
22114 var isTouched;
22115 var isMoved;
22116 var touchesStart = {};
22117 var touchesDiff;
22118 var panelWidth;
22119 var $viewEl;
22120 var panelMinWidth;
22121 var panelMaxWidth;
22122 var visibleByBreakpoint;
22123
22124 function transformCSSWidth(v) {
22125 if (!v) return null;
22126
22127 if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {
22128 return parseInt(v, 10) / 100 * app.width;
22129 }
22130
22131 var newV = parseInt(v, 10);
22132 if (Number.isNaN(newV)) return null;
22133 return newV;
22134 }
22135
22136 function isResizable() {
22137 return panel.resizable && $el.hasClass('panel-resizable');
22138 }
22139
22140 function handleTouchStart(e) {
22141 if (!isResizable()) return;
22142 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
22143 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
22144 isMoved = false;
22145 isTouched = true;
22146 panelMinWidth = transformCSSWidth($el.css('min-width'));
22147 panelMaxWidth = transformCSSWidth($el.css('max-width'));
22148 visibleByBreakpoint = $el.hasClass('panel-in-breakpoint');
22149 }
22150
22151 function handleTouchMove(e) {
22152 if (!isTouched) return;
22153 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
22154
22155 if (!isMoved) {
22156 panelWidth = $el[0].offsetWidth;
22157 $el.transition(0);
22158 $el.addClass('panel-resizing');
22159 $htmlEl.css('cursor', 'col-resize');
22160
22161 if (effect === 'reveal' || visibleByBreakpoint) {
22162 $viewEl = $(panel.getViewEl());
22163
22164 if (panel.$containerEl && panel.$containerEl.hasClass('page')) {
22165 $viewEl.add(panel.$containerEl.children('.page-content, .tabs, .fab'));
22166 }
22167 }
22168
22169 if (effect === 'reveal' && !visibleByBreakpoint) {
22170 $backdropEl.transition(0);
22171 $viewEl.transition(0);
22172 }
22173 }
22174
22175 isMoved = true;
22176 e.preventDefault();
22177 touchesDiff = pageX - touchesStart.x;
22178 var newPanelWidth = side === 'left' ? panelWidth + touchesDiff : panelWidth - touchesDiff;
22179
22180 if (panelMinWidth && !Number.isNaN(panelMinWidth)) {
22181 newPanelWidth = Math.max(newPanelWidth, panelMinWidth);
22182 }
22183
22184 if (panelMaxWidth && !Number.isNaN(panelMaxWidth)) {
22185 newPanelWidth = Math.min(newPanelWidth, panelMaxWidth);
22186 }
22187
22188 newPanelWidth = Math.min(Math.max(newPanelWidth, 0), app.width);
22189 panel.resizableWidth = newPanelWidth;
22190 $el[0].style.width = newPanelWidth + "px";
22191
22192 if (effect === 'reveal' && !visibleByBreakpoint) {
22193 if ($viewEl) {
22194 $viewEl.transform("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)");
22195 }
22196
22197 if ($backdropEl) {
22198 $backdropEl.transform("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)");
22199 }
22200 } else if (visibleByBreakpoint && $viewEl) {
22201 $viewEl.css("margin-" + side, newPanelWidth + "px");
22202 }
22203
22204 $el.trigger('panel:resize', newPanelWidth);
22205 panel.emit('local::resize panelResize', panel, newPanelWidth);
22206 }
22207
22208 function handleTouchEnd() {
22209 $('html').css('cursor', '');
22210
22211 if (!isTouched || !isMoved) {
22212 isTouched = false;
22213 isMoved = false;
22214 return;
22215 }
22216
22217 isTouched = false;
22218 isMoved = false;
22219 $htmlEl[0].style.setProperty("--f7-panel-" + side + "-width", panel.resizableWidth + "px");
22220 $el[0].style.width = '';
22221
22222 if (effect === 'reveal' && !visibleByBreakpoint) {
22223 $viewEl.transform('');
22224 $backdropEl.transform('');
22225 }
22226
22227 $el.removeClass('panel-resizing');
22228 nextFrame$1(function () {
22229 $el.transition('');
22230
22231 if (effect === 'reveal') {
22232 $backdropEl.transition('');
22233 if ($viewEl) $viewEl.transition('');
22234 }
22235 });
22236 }
22237
22238 function handleResize() {
22239 if (!panel.opened || !panel.resizableWidth) return;
22240 panelMinWidth = transformCSSWidth($el.css('min-width'));
22241 panelMaxWidth = transformCSSWidth($el.css('max-width'));
22242
22243 if (panelMinWidth && !Number.isNaN(panelMinWidth) && panel.resizableWidth < panelMinWidth) {
22244 panel.resizableWidth = Math.max(panel.resizableWidth, panelMinWidth);
22245 }
22246
22247 if (panelMaxWidth && !Number.isNaN(panelMaxWidth) && panel.resizableWidth > panelMaxWidth) {
22248 panel.resizableWidth = Math.min(panel.resizableWidth, panelMaxWidth);
22249 }
22250
22251 panel.resizableWidth = Math.min(Math.max(panel.resizableWidth, 0), app.width);
22252 $htmlEl[0].style.setProperty("--f7-panel-" + side + "-width", panel.resizableWidth + "px");
22253 }
22254
22255 if (panel.$el.find('.panel-resize-handler').length === 0) {
22256 panel.$el.append('<div class="panel-resize-handler"></div>');
22257 }
22258
22259 panel.$resizeHandlerEl = panel.$el.children('.panel-resize-handler');
22260 $el.addClass('panel-resizable'); // Add Events
22261
22262 var passive = support.passiveListener ? {
22263 passive: true
22264 } : false;
22265 panel.$el.on(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
22266 app.on('touchmove:active', handleTouchMove);
22267 app.on('touchend:passive', handleTouchEnd);
22268 app.on('resize', handleResize);
22269 panel.on('beforeOpen', handleResize);
22270 panel.once('panelDestroy', function () {
22271 $el.removeClass('panel-resizable');
22272 panel.$resizeHandlerEl.remove();
22273 panel.$el.off(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
22274 app.off('touchmove:active', handleTouchMove);
22275 app.off('touchend:passive', handleTouchEnd);
22276 app.off('resize', handleResize);
22277 panel.off('beforeOpen', handleResize);
22278 });
22279 }
22280
22281 var Panel$1 = /*#__PURE__*/function (_Framework7Class) {
22282 _inheritsLoose(Panel, _Framework7Class);
22283
22284 function Panel(app, params) {
22285 var _this;
22286
22287 if (params === void 0) {
22288 params = {};
22289 }
22290
22291 var extendedParams = extend$1({
22292 on: {}
22293 }, app.params.panel, params);
22294 _this = _Framework7Class.call(this, extendedParams, [app]) || this;
22295
22296 var panel = _assertThisInitialized(_this);
22297
22298 panel.params = extendedParams;
22299 panel.$containerEl = panel.params.containerEl ? $(panel.params.containerEl).eq(0) : app.$el;
22300 panel.containerEl = panel.$containerEl[0];
22301
22302 if (!panel.containerEl) {
22303 panel.$containerEl = app.$el;
22304 panel.containerEl = app.$el[0];
22305 }
22306
22307 var $el;
22308
22309 if (panel.params.el) {
22310 $el = $(panel.params.el).eq(0);
22311 } else if (panel.params.content) {
22312 $el = $(panel.params.content).filter(function (node) {
22313 return node.nodeType === 1;
22314 }).eq(0);
22315 }
22316
22317 if ($el.length === 0) return panel || _assertThisInitialized(_this);
22318 if ($el[0].f7Panel) return $el[0].f7Panel || _assertThisInitialized(_this);
22319 $el[0].f7Panel = panel;
22320 var _panel$params = panel.params,
22321 side = _panel$params.side,
22322 effect = _panel$params.effect,
22323 resizable = _panel$params.resizable;
22324 if (typeof side === 'undefined') side = $el.hasClass('panel-left') ? 'left' : 'right';
22325 if (typeof effect === 'undefined') effect = $el.hasClass('panel-cover') ? 'cover' : 'reveal';
22326 if (typeof resizable === 'undefined') resizable = $el.hasClass('panel-resizable');
22327 var $backdropEl;
22328
22329 if (panel.params.backdrop && panel.params.backdropEl) {
22330 $backdropEl = $(panel.params.backdropEl);
22331 } else if (panel.params.backdrop) {
22332 $backdropEl = panel.$containerEl.children('.panel-backdrop');
22333
22334 if ($backdropEl.length === 0) {
22335 $backdropEl = $('<div class="panel-backdrop"></div>');
22336 panel.$containerEl.prepend($backdropEl);
22337 }
22338 }
22339
22340 extend$1(panel, {
22341 app: app,
22342 side: side,
22343 effect: effect,
22344 resizable: resizable,
22345 $el: $el,
22346 el: $el[0],
22347 opened: false,
22348 $backdropEl: $backdropEl,
22349 backdropEl: $backdropEl && $backdropEl[0]
22350 }); // Install Modules
22351
22352 panel.useModules(); // Init
22353
22354 panel.init();
22355 return panel || _assertThisInitialized(_this);
22356 }
22357
22358 var _proto = Panel.prototype;
22359
22360 _proto.getViewEl = function getViewEl() {
22361 var panel = this;
22362 var viewEl;
22363
22364 if (panel.$containerEl.children('.views').length > 0) {
22365 viewEl = panel.$containerEl.children('.views')[0];
22366 } else {
22367 viewEl = panel.$containerEl.children('.view')[0];
22368 }
22369
22370 return viewEl;
22371 };
22372
22373 _proto.setStateClasses = function setStateClasses(state) {
22374 var panel = this;
22375 var side = panel.side,
22376 el = panel.el;
22377 var viewEl = panel.getViewEl();
22378 var panelInView = viewEl && viewEl.contains(el);
22379 var $targetEl = !viewEl || panelInView ? panel.$containerEl : $('html');
22380
22381 if (state === 'open') {
22382 $targetEl.addClass("with-panel with-panel-" + panel.side + "-" + panel.effect);
22383 }
22384
22385 if (state === 'before-closing') {
22386 $targetEl.addClass('with-panel-closing');
22387 }
22388
22389 if (state === 'closing') {
22390 $targetEl.addClass('with-panel-closing');
22391 $targetEl.removeClass("with-panel with-panel-" + panel.side + "-" + panel.effect);
22392 }
22393
22394 if (state === 'after-closing') {
22395 $targetEl.removeClass('with-panel-closing');
22396 }
22397
22398 if (state === 'closed') {
22399 $targetEl.removeClass("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel");
22400 }
22401 };
22402
22403 _proto.enableVisibleBreakpoint = function enableVisibleBreakpoint() {
22404 var panel = this;
22405 panel.visibleBreakpointDisabled = false;
22406 panel.setVisibleBreakpoint();
22407 return panel;
22408 };
22409
22410 _proto.disableVisibleBreakpoint = function disableVisibleBreakpoint() {
22411 var panel = this;
22412 panel.visibleBreakpointDisabled = true;
22413 panel.setVisibleBreakpoint();
22414 return panel;
22415 };
22416
22417 _proto.toggleVisibleBreakpoint = function toggleVisibleBreakpoint() {
22418 var panel = this;
22419 panel.visibleBreakpointDisabled = !panel.visibleBreakpointDisabled;
22420 panel.setVisibleBreakpoint();
22421 return panel;
22422 };
22423
22424 _proto.setVisibleBreakpoint = function setVisibleBreakpoint(emitEvents) {
22425 if (emitEvents === void 0) {
22426 emitEvents = true;
22427 }
22428
22429 var panel = this;
22430 var app = panel.app;
22431
22432 if (!panel.visibleBreakpointResizeHandler) {
22433 panel.visibleBreakpointResizeHandler = function visibleBreakpointResizeHandler() {
22434 panel.setVisibleBreakpoint();
22435 };
22436
22437 app.on('resize', panel.visibleBreakpointResizeHandler);
22438 }
22439
22440 var side = panel.side,
22441 $el = panel.$el,
22442 $containerEl = panel.$containerEl,
22443 params = panel.params,
22444 visibleBreakpointDisabled = panel.visibleBreakpointDisabled;
22445 var breakpoint = params.visibleBreakpoint;
22446 var $viewEl = $(panel.getViewEl());
22447 var wasVisible = $el.hasClass('panel-in-breakpoint');
22448
22449 if ($containerEl && $containerEl.hasClass('page')) {
22450 $viewEl.add($containerEl.children('.page-content, .tabs, .fab'));
22451 }
22452
22453 if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !visibleBreakpointDisabled) {
22454 if (!wasVisible) {
22455 var _$viewEl$css;
22456
22457 panel.setStateClasses('closed');
22458 $el.addClass('panel-in-breakpoint').removeClass('panel-in panel-in-collapsed');
22459 panel.onOpen(false);
22460 panel.onOpened();
22461 $viewEl.css((_$viewEl$css = {}, _$viewEl$css["margin-" + side] = $el.width() + "px", _$viewEl$css));
22462 app.allowPanelOpen = true;
22463
22464 if (emitEvents) {
22465 panel.emit('local::breakpoint panelBreakpoint', panel);
22466 panel.$el.trigger('panel:breakpoint');
22467 }
22468 } else {
22469 var _$viewEl$css2;
22470
22471 $viewEl.css((_$viewEl$css2 = {}, _$viewEl$css2["margin-" + side] = $el.width() + "px", _$viewEl$css2));
22472 }
22473 } else if (wasVisible) {
22474 var _$viewEl$css3;
22475
22476 $el.removeClass('panel-in-breakpoint panel-in');
22477 panel.onClose();
22478 panel.onClosed();
22479 $viewEl.css((_$viewEl$css3 = {}, _$viewEl$css3["margin-" + side] = '', _$viewEl$css3));
22480
22481 if (emitEvents) {
22482 panel.emit('local::breakpoint panelBreakpoint', panel);
22483 panel.$el.trigger('panel:breakpoint');
22484 }
22485 }
22486 };
22487
22488 _proto.enableCollapsedBreakpoint = function enableCollapsedBreakpoint() {
22489 var panel = this;
22490 panel.collapsedBreakpointDisabled = false;
22491 panel.setCollapsedBreakpoint();
22492 return panel;
22493 };
22494
22495 _proto.disableCollapsedBreakpoint = function disableCollapsedBreakpoint() {
22496 var panel = this;
22497 panel.collapsedBreakpointDisabled = true;
22498 panel.setCollapsedBreakpoint();
22499 return panel;
22500 };
22501
22502 _proto.toggleCollapsedBreakpoint = function toggleCollapsedBreakpoint() {
22503 var panel = this;
22504 panel.collapsedBreakpointDisabled = !panel.collapsedBreakpointDisabled;
22505 panel.setCollapsedBreakpoint();
22506 return panel;
22507 };
22508
22509 _proto.setCollapsedBreakpoint = function setCollapsedBreakpoint(emitEvents) {
22510 if (emitEvents === void 0) {
22511 emitEvents = true;
22512 }
22513
22514 var panel = this;
22515 var app = panel.app;
22516
22517 if (!panel.collapsedBreakpointResizeHandler) {
22518 panel.collapsedBreakpointResizeHandler = function collapsedBreakpointResizeHandler() {
22519 panel.setCollapsedBreakpoint();
22520 };
22521
22522 app.on('resize', panel.collapsedBreakpointResizeHandler);
22523 }
22524
22525 var $el = panel.$el,
22526 params = panel.params,
22527 collapsedBreakpointDisabled = panel.collapsedBreakpointDisabled;
22528 if ($el.hasClass('panel-in-breakpoint')) return;
22529 var breakpoint = params.collapsedBreakpoint;
22530 var wasVisible = $el.hasClass('panel-in-collapsed');
22531
22532 if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !collapsedBreakpointDisabled) {
22533 if (!wasVisible) {
22534 panel.setStateClasses('closed');
22535 $el.addClass('panel-in-collapsed').removeClass('panel-in');
22536 panel.collapsed = true;
22537 app.allowPanelOpen = true;
22538
22539 if (emitEvents) {
22540 panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);
22541 panel.$el.trigger('panel:collapsedbreakpoint');
22542 }
22543 }
22544 } else if (wasVisible) {
22545 $el.removeClass('panel-in-collapsed panel-in');
22546 panel.collapsed = false;
22547
22548 if (emitEvents) {
22549 panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);
22550 panel.$el.trigger('panel:collapsedbreakpoint');
22551 }
22552 }
22553 };
22554
22555 _proto.enableResizable = function enableResizable() {
22556 var panel = this;
22557
22558 if (panel.resizableInitialized) {
22559 panel.resizable = true;
22560 panel.$el.addClass('panel-resizable');
22561 } else {
22562 resizablePanel(panel);
22563 }
22564
22565 return panel;
22566 };
22567
22568 _proto.disableResizable = function disableResizable() {
22569 var panel = this;
22570 panel.resizable = false;
22571 panel.$el.removeClass('panel-resizable');
22572 return panel;
22573 };
22574
22575 _proto.enableSwipe = function enableSwipe() {
22576 var panel = this;
22577
22578 if (panel.swipeInitialized) {
22579 panel.swipeable = true;
22580 } else {
22581 swipePanel(panel);
22582 }
22583
22584 return panel;
22585 };
22586
22587 _proto.disableSwipe = function disableSwipe() {
22588 var panel = this;
22589 panel.swipeable = false;
22590 return panel;
22591 };
22592
22593 _proto.onOpen = function onOpen(modifyHtmlClasses) {
22594 if (modifyHtmlClasses === void 0) {
22595 modifyHtmlClasses = true;
22596 }
22597
22598 var panel = this;
22599 var app = panel.app;
22600 panel.opened = true;
22601 app.panel.allowOpen = false;
22602 panel.$el.trigger('panel:beforeopen');
22603 panel.emit('local::beforeOpen panelBeforeOpen', panel);
22604
22605 if (modifyHtmlClasses) {
22606 panel.setStateClasses('open');
22607 }
22608
22609 panel.$el.trigger('panel:open');
22610 panel.emit('local::open panelOpen', panel);
22611 };
22612
22613 _proto.onOpened = function onOpened() {
22614 var panel = this;
22615 var app = panel.app;
22616 app.panel.allowOpen = true;
22617 panel.$el.trigger('panel:opened');
22618 panel.emit('local::opened panelOpened', panel);
22619 };
22620
22621 _proto.onClose = function onClose() {
22622 var panel = this;
22623 var app = panel.app;
22624 panel.opened = false;
22625 app.panel.allowOpen = false;
22626 panel.$el.trigger('panel:beforeclose');
22627 panel.emit('local::beforeClose panelBeforeClose', panel);
22628 panel.setStateClasses('closing');
22629 panel.$el.trigger('panel:close');
22630 panel.emit('local::close panelClose', panel);
22631 };
22632
22633 _proto.onClosed = function onClosed() {
22634 var panel = this;
22635 var app = panel.app;
22636 app.panel.allowOpen = true;
22637 panel.setStateClasses('after-closing');
22638 panel.$el.removeClass('panel-out');
22639
22640 if (panel.$backdropEl) {
22641 var otherPanel = app.panel.get('.panel-in');
22642 var shouldHideBackdrop = !otherPanel || otherPanel && !otherPanel.$backdropEl;
22643
22644 if (shouldHideBackdrop) {
22645 panel.$backdropEl.removeClass('panel-backdrop-in');
22646 }
22647 }
22648
22649 panel.$el.trigger('panel:closed');
22650 panel.emit('local::closed panelClosed', panel);
22651 };
22652
22653 _proto.toggle = function toggle(animate) {
22654 if (animate === void 0) {
22655 animate = true;
22656 }
22657
22658 var panel = this;
22659 var breakpoint = panel.params.visibleBreakpoint;
22660 var app = panel.app;
22661
22662 if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null) {
22663 return panel.toggleVisibleBreakpoint();
22664 }
22665
22666 if (panel.opened) panel.close(animate);else panel.open(animate);
22667 return panel;
22668 };
22669
22670 _proto.insertToRoot = function insertToRoot() {
22671 var panel = this;
22672 var document = getDocument();
22673 var $el = panel.$el,
22674 $backdropEl = panel.$backdropEl,
22675 $containerEl = panel.$containerEl;
22676 var $panelParentEl = $el.parent();
22677 var wasInDom = $el.parents(document).length > 0;
22678
22679 if (!$panelParentEl.is($containerEl) || $el.prevAll('.views, .view').length) {
22680 var $insertBeforeEl = $containerEl.children('.panel, .views, .view').eq(0);
22681 var $insertAfterEl = $containerEl.children('.panel-backdrop').eq(0);
22682
22683 if ($insertBeforeEl.length) {
22684 $el.insertBefore($insertBeforeEl);
22685 } else if ($insertAfterEl) {
22686 $el.insertBefore($insertAfterEl);
22687 } else {
22688 $containerEl.prepend($el);
22689 }
22690
22691 if ($backdropEl && $backdropEl.length && (!$backdropEl.parent().is($containerEl) && $backdropEl.nextAll('.panel').length === 0 || $backdropEl.parent().is($containerEl) && $backdropEl.nextAll('.panel').length === 0)) {
22692 $backdropEl.insertBefore($el);
22693 }
22694
22695 panel.once('panelClosed', function () {
22696 if (wasInDom) {
22697 $panelParentEl.append($el);
22698 } else {
22699 $el.remove();
22700 }
22701 });
22702 }
22703 };
22704
22705 _proto.open = function open(animate) {
22706 if (animate === void 0) {
22707 animate = true;
22708 }
22709
22710 var panel = this;
22711 var app = panel.app;
22712 if (!app.panel.allowOpen) return false;
22713 var effect = panel.effect,
22714 $el = panel.$el,
22715 $backdropEl = panel.$backdropEl,
22716 opened = panel.opened,
22717 $containerEl = panel.$containerEl;
22718
22719 if (!$el || $el.hasClass('panel-in')) {
22720 return panel;
22721 }
22722
22723 panel.insertToRoot(); // Ignore if opened
22724
22725 if (opened || $el.hasClass('panel-in-breakpoint') || $el.hasClass('panel-in')) return false; // Close if some panel is opened
22726
22727 var otherOpenedPanel = app.panel.get('.panel-in');
22728
22729 if (otherOpenedPanel && otherOpenedPanel !== panel) {
22730 otherOpenedPanel.close(animate);
22731 }
22732
22733 $el[animate ? 'removeClass' : 'addClass']('not-animated');
22734 $el.addClass('panel-in');
22735
22736 if ($backdropEl) {
22737 $backdropEl.addClass('panel-backdrop-in');
22738 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
22739 }
22740
22741 if (panel.effect === 'cover') {
22742 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
22743 panel._clientLeft = $el[0].clientLeft;
22744 } // Transitionend
22745
22746
22747 var $viewEl = $(panel.getViewEl());
22748
22749 if ($containerEl && $containerEl.hasClass('page')) {
22750 $viewEl.add($containerEl.children('.page-content, .tabs'));
22751 }
22752
22753 var transitionEndTarget = effect === 'reveal' ? $viewEl : $el;
22754
22755 function panelTransitionEnd() {
22756 transitionEndTarget.transitionEnd(function (e) {
22757 if ($(e.target).is(transitionEndTarget)) {
22758 if ($el.hasClass('panel-out')) {
22759 panel.onClosed();
22760 } else {
22761 panel.onOpened();
22762 }
22763 } else panelTransitionEnd();
22764 });
22765 }
22766
22767 if (animate) {
22768 if ($backdropEl) {
22769 $backdropEl.removeClass('not-animated');
22770 }
22771
22772 panelTransitionEnd();
22773 $el.removeClass('panel-out not-animated').addClass('panel-in');
22774 panel.onOpen();
22775 } else {
22776 if ($backdropEl) {
22777 $backdropEl.addClass('not-animated');
22778 }
22779
22780 $el.removeClass('panel-out').addClass('panel-in not-animated');
22781 panel.onOpen();
22782 panel.onOpened();
22783 }
22784
22785 return true;
22786 };
22787
22788 _proto.close = function close(animate) {
22789 if (animate === void 0) {
22790 animate = true;
22791 }
22792
22793 var panel = this;
22794 var effect = panel.effect,
22795 $el = panel.$el,
22796 $backdropEl = panel.$backdropEl,
22797 opened = panel.opened,
22798 $containerEl = panel.$containerEl;
22799 if (!opened || $el.hasClass('panel-in-breakpoint') || !$el.hasClass('panel-in')) return panel;
22800 $el[animate ? 'removeClass' : 'addClass']('not-animated');
22801
22802 if ($backdropEl) {
22803 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
22804 }
22805
22806 var $viewEl = $(panel.getViewEl());
22807
22808 if ($containerEl && $containerEl.hasClass('page')) {
22809 $viewEl.add($containerEl.children('.page-content, .tabs'));
22810 }
22811
22812 var transitionEndTarget = effect === 'reveal' ? $viewEl : $el;
22813
22814 function transitionEnd() {
22815 if ($el.hasClass('panel-out')) {
22816 panel.onClosed();
22817 } else if ($el.hasClass('panel-in')) {
22818 panel.onOpened();
22819 }
22820
22821 panel.setStateClasses('after-closing');
22822 }
22823
22824 if (animate) {
22825 transitionEndTarget.transitionEnd(function () {
22826 transitionEnd();
22827 });
22828 $el.removeClass('panel-in').addClass('panel-out'); // Emit close
22829
22830 panel.onClose();
22831 } else {
22832 $el.addClass('not-animated').removeClass('panel-in').addClass('panel-out'); // Emit close
22833
22834 panel.onClose();
22835 panel.onClosed();
22836 }
22837
22838 return panel;
22839 };
22840
22841 _proto.init = function init() {
22842 var panel = this; // const app = panel.app;
22843
22844 if (typeof panel.params.visibleBreakpoint !== 'undefined') {
22845 panel.setVisibleBreakpoint();
22846 }
22847
22848 if (typeof panel.params.collapsedBreakpoint !== 'undefined') {
22849 panel.setCollapsedBreakpoint();
22850 }
22851
22852 if (panel.params.swipe) {
22853 panel.enableSwipe();
22854 }
22855
22856 if (panel.resizable) {
22857 panel.enableResizable();
22858 }
22859 };
22860
22861 _proto.destroy = function destroy() {
22862 var panel = this;
22863 var app = panel.app;
22864 var _panel = panel,
22865 $containerEl = _panel.$containerEl;
22866
22867 if (!panel.$el) {
22868 // Panel already destroyed
22869 return;
22870 }
22871
22872 panel.emit('local::beforeDestroy panelBeforeDestroy', panel);
22873 panel.$el.trigger('panel:beforedestroy');
22874
22875 if (panel.visibleBreakpointResizeHandler) {
22876 app.off('resize', panel.visibleBreakpointResizeHandler);
22877 }
22878
22879 if (panel.collapsedBreakpointResizeHandler) {
22880 app.off('resize', panel.collapsedBreakpointResizeHandler);
22881 }
22882
22883 if (panel.$el.hasClass('panel-in-breakpoint') || panel.$el.hasClass('panel-in-collapsed')) {
22884 var _$viewEl$css4;
22885
22886 var $viewEl = $(panel.getViewEl());
22887
22888 if ($containerEl && $containerEl.hasClass('page')) {
22889 $viewEl.add($containerEl.children('.page-content, .tabs'));
22890 }
22891
22892 panel.$el.removeClass('panel-in-breakpoint panel-in-collapsed panel-in');
22893 $viewEl.css((_$viewEl$css4 = {}, _$viewEl$css4["margin-" + panel.side] = '', _$viewEl$css4));
22894 panel.emit('local::breakpoint panelBreakpoint', panel);
22895 panel.$el.trigger('panel:breakpoint');
22896 }
22897
22898 panel.$el.trigger('panel:destroy');
22899 panel.emit('local::destroy panelDestroy', panel);
22900
22901 if (panel.el) {
22902 panel.el.f7Panel = null;
22903 delete panel.el.f7Panel;
22904 }
22905
22906 deleteProps$1(panel);
22907 panel = null;
22908 };
22909
22910 return Panel;
22911 }(Framework7Class);
22912
22913 var Panel = {
22914 name: 'panel',
22915 params: {
22916 panel: {
22917 opened: undefined,
22918 // default based on panel-in class
22919 side: undefined,
22920 // default based on panel class
22921 effect: undefined,
22922 // default based on panel class
22923 resizable: undefined,
22924 // default based on panel-resizable class
22925 backdrop: true,
22926 backdropEl: undefined,
22927 visibleBreakpoint: undefined,
22928 collapsedBreakpoint: undefined,
22929 swipe: false,
22930 // or true
22931 swipeNoFollow: false,
22932 // or true
22933 swipeOnlyClose: false,
22934 swipeActiveArea: 0,
22935 swipeThreshold: 0,
22936 closeByBackdropClick: true,
22937 containerEl: undefined
22938 }
22939 },
22940 static: {
22941 Panel: Panel$1
22942 },
22943 create: function create() {
22944 var app = this;
22945 extend$1(app, {
22946 panel: {
22947 allowOpen: true,
22948 create: function create(params) {
22949 return new Panel$1(app, params);
22950 },
22951 get: function get(el) {
22952 if (el === void 0) {
22953 el = '.panel';
22954 }
22955
22956 if (el instanceof Panel$1) return el;
22957 if (el === 'left' || el === 'right') el = ".panel-" + el; // eslint-disable-line
22958
22959 var $el = $(el);
22960 if ($el.length === 0 || $el.length > 1) return undefined;
22961 return $el[0].f7Panel;
22962 },
22963 destroy: function destroy(el) {
22964 if (el === void 0) {
22965 el = '.panel';
22966 }
22967
22968 var panel = app.panel.get(el);
22969 if (panel && panel.destroy) return panel.destroy();
22970 return undefined;
22971 },
22972 open: function open(el, animate) {
22973 if (el === void 0) {
22974 el = '.panel';
22975 }
22976
22977 if (el === 'left' || el === 'right') el = ".panel-" + el; // eslint-disable-line
22978
22979 var panel = app.panel.get(el);
22980 if (panel && panel.open) return panel.open(animate);
22981
22982 if (!panel) {
22983 panel = app.panel.create({
22984 el: el
22985 });
22986 return panel.open(animate);
22987 }
22988
22989 return undefined;
22990 },
22991 close: function close(el, animate) {
22992 if (el === void 0) {
22993 el = '.panel-in';
22994 }
22995
22996 if (el === 'left' || el === 'right') el = ".panel-" + el; // eslint-disable-line
22997
22998 var panel = app.panel.get(el);
22999 if (panel && panel.open) return panel.close(animate);
23000
23001 if (!panel) {
23002 panel = app.panel.create({
23003 el: el
23004 });
23005 return panel.close(animate);
23006 }
23007
23008 return undefined;
23009 },
23010 toggle: function toggle(el, animate) {
23011 if (el === void 0) {
23012 el = '.panel';
23013 }
23014
23015 if (el === 'left' || el === 'right') el = ".panel-" + el; // eslint-disable-line
23016
23017 var panel = app.panel.get(el);
23018 if (panel && panel.toggle) return panel.toggle(animate);
23019
23020 if (!panel) {
23021 panel = app.panel.create({
23022 el: el
23023 });
23024 return panel.toggle(animate);
23025 }
23026
23027 return undefined;
23028 }
23029 }
23030 });
23031 },
23032 on: {
23033 init: function init() {
23034 var app = this;
23035 $('.panel-init').each(function (panelEl) {
23036 var params = Object.assign({
23037 el: panelEl
23038 }, $(panelEl).dataset() || {});
23039 app.panel.create(params);
23040 });
23041 },
23042 pageInit: function pageInit(page) {
23043 var app = this;
23044 page.$el.find('.panel-init').each(function (panelEl) {
23045 var params = Object.assign({
23046 el: panelEl
23047 }, $(panelEl).dataset() || {});
23048 app.panel.create(params);
23049 });
23050 },
23051 pageBeforeRemove: function pageBeforeRemove(page) {
23052 var app = this;
23053 page.$el.find('.panel-init').each(function (panelEl) {
23054 var panel = app.panel.get(panelEl);
23055 if (panel && panel.destroy) panel.destroy();
23056 });
23057 }
23058 },
23059 vnode: {
23060 'panel-init': {
23061 insert: function insert(vnode) {
23062 var app = this;
23063 var panelEl = vnode.elm;
23064 var params = Object.assign({
23065 el: panelEl
23066 }, $(panelEl).dataset() || {});
23067 app.panel.create(params);
23068 },
23069 destroy: function destroy(vnode) {
23070 var app = this;
23071 var panelEl = vnode.elm;
23072 var panel = app.panel.get(panelEl);
23073 if (panel && panel.destroy) panel.destroy();
23074 }
23075 }
23076 },
23077 clicks: {
23078 '.panel-open': function open(clickedEl, data) {
23079 if (data === void 0) {
23080 data = {};
23081 }
23082
23083 var app = this;
23084 app.panel.open(data.panel, data.animate);
23085 },
23086 '.panel-close': function close(clickedEl, data) {
23087 if (data === void 0) {
23088 data = {};
23089 }
23090
23091 var app = this;
23092 app.panel.close(data.panel, data.animate);
23093 },
23094 '.panel-toggle': function close(clickedEl, data) {
23095 if (data === void 0) {
23096 data = {};
23097 }
23098
23099 var app = this;
23100 app.panel.toggle(data.panel, data.animate);
23101 },
23102 '.panel-backdrop': function close() {
23103 var app = this;
23104 var $panelEl = $('.panel-in:not(.panel-out)');
23105 if (!$panelEl.length) return;
23106 var instance = $panelEl[0] && $panelEl[0].f7Panel;
23107 $panelEl.trigger('panel:backdrop-click');
23108
23109 if (instance) {
23110 instance.emit('backdropClick', instance);
23111 }
23112
23113 app.emit('panelBackdropClick', instance || $panelEl[0]);
23114 if (app.params.panel.closeByBackdropClick) app.panel.close();
23115 }
23116 }
23117 };
23118
23119 /* eslint no-param-reassign: "off" */
23120 var CardExpandable = {
23121 open: function open(cardEl, animate) {
23122 if (cardEl === void 0) {
23123 cardEl = '.card-expandable';
23124 }
23125
23126 if (animate === void 0) {
23127 animate = true;
23128 }
23129
23130 var app = this;
23131 var device = getDevice$1();
23132 var document = getDocument();
23133 var support = getSupport$1();
23134 var $cardEl = $(cardEl).eq(0);
23135 if (!$cardEl || !$cardEl.length) return;
23136 if ($cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) return;
23137 var $pageEl = $cardEl.parents('.page').eq(0);
23138 if (!$pageEl.length) return;
23139
23140 if ($pageEl.find('.card-opened').length) {
23141 return;
23142 }
23143
23144 var prevented;
23145
23146 function prevent() {
23147 prevented = true;
23148 }
23149
23150 $cardEl.trigger('card:beforeopen', {
23151 prevent: prevent
23152 });
23153 app.emit('cardBeforeOpen', $cardEl[0], prevent);
23154 if (prevented) return;
23155 var cardParams = Object.assign({
23156 animate: animate
23157 }, app.params.card, $cardEl.dataset());
23158 var $pageContentEl = $cardEl.parents('.page-content');
23159 var $backdropEl;
23160
23161 if ($cardEl.attr('data-backdrop-el')) {
23162 $backdropEl = $($cardEl.attr('data-backdrop-el'));
23163 }
23164
23165 if (!$backdropEl && cardParams.backdrop) {
23166 $backdropEl = $pageContentEl.find('.card-backdrop');
23167
23168 if (!$backdropEl.length) {
23169 $backdropEl = $('<div class="card-backdrop"></div>');
23170 $pageContentEl.append($backdropEl);
23171 }
23172 }
23173
23174 var $navbarEl;
23175 var $toolbarEl;
23176
23177 if (cardParams.hideNavbarOnOpen) {
23178 $navbarEl = $pageEl.children('.navbar');
23179
23180 if (!$navbarEl.length) {
23181 if ($pageEl[0].f7Page) $navbarEl = $pageEl[0].f7Page.$navbarEl;
23182 }
23183 }
23184
23185 if (cardParams.hideToolbarOnOpen) {
23186 $toolbarEl = $pageEl.children('.toolbar');
23187
23188 if (!$toolbarEl.length) {
23189 $toolbarEl = $pageEl.parents('.view').children('.toolbar');
23190 }
23191
23192 if (!$toolbarEl.length) {
23193 $toolbarEl = $pageEl.parents('.views').children('.toolbar');
23194 }
23195 }
23196
23197 var currTransform = $cardEl.css('transform');
23198 var hasTransform;
23199
23200 if (currTransform && currTransform.match(/[2-9]/)) {
23201 hasTransform = true;
23202 }
23203
23204 var $cardContentEl = $cardEl.children('.card-content');
23205 var $cardSizeEl = $(document.createElement('div')).addClass('card-expandable-size');
23206 $cardEl.append($cardSizeEl);
23207 var cardWidth = $cardEl[0].offsetWidth;
23208 var cardHeight = $cardEl[0].offsetHeight;
23209 var pageWidth = $pageEl[0].offsetWidth;
23210 var pageHeight = $pageEl[0].offsetHeight;
23211 var maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
23212 var maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
23213 var statusbarHeight;
23214
23215 if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {
23216 statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);
23217 if (Number.isNaN(statusbarHeight)) statusbarHeight = 0;
23218 }
23219
23220 if (statusbarHeight) {
23221 maxHeight -= statusbarHeight;
23222 }
23223
23224 var scaleX = maxWidth / cardWidth;
23225 var scaleY = maxHeight / cardHeight;
23226 var offset = $cardEl.offset();
23227 var pageOffset = $pageEl.offset();
23228
23229 if (statusbarHeight) {
23230 pageOffset.top += statusbarHeight / 2;
23231 }
23232
23233 offset.left -= pageOffset.left;
23234 var cardLeftOffset;
23235 var cardTopOffset;
23236
23237 if (hasTransform) {
23238 var transformValues = currTransform.replace(/matrix\(|\)/g, '').split(',').map(function (el) {
23239 return el.trim();
23240 });
23241
23242 if (transformValues && transformValues.length > 1) {
23243 var scale = parseFloat(transformValues[0]);
23244 cardLeftOffset = offset.left - cardWidth * (1 - scale) / 2;
23245 cardTopOffset = offset.top - pageOffset.top - cardHeight * (1 - scale) / 2;
23246 if (app.rtl) cardLeftOffset -= $cardEl[0].scrollLeft;
23247 } else {
23248 cardLeftOffset = $cardEl[0].offsetLeft;
23249 cardTopOffset = $cardEl[0].offsetTop - ($pageContentEl.length ? $pageContentEl[0].scrollTop : 0);
23250 }
23251 } else {
23252 cardLeftOffset = offset.left;
23253 cardTopOffset = offset.top - pageOffset.top;
23254 if (app.rtl) cardLeftOffset -= $cardEl[0].scrollLeft;
23255 }
23256
23257 cardLeftOffset -= (pageWidth - maxWidth) / 2;
23258 cardTopOffset -= (pageHeight - maxHeight) / 2;
23259 var cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
23260
23261 if (app.rtl) {
23262 var _ref = [cardRightOffset, cardLeftOffset];
23263 cardLeftOffset = _ref[0];
23264 cardRightOffset = _ref[1];
23265 }
23266
23267 var cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
23268 var translateX = (cardRightOffset - cardLeftOffset) / 2;
23269 var translateY = (cardBottomOffset - cardTopOffset) / 2;
23270
23271 if (cardParams.hideNavbarOnOpen && $navbarEl && $navbarEl.length) {
23272 if ($navbarEl.closest('.navbar-hidden').length) {
23273 // Was hidden
23274 $cardEl[0].f7KeepNavbarOnClose = true;
23275 } else {
23276 delete $cardEl[0].f7KeepNavbarOnClose;
23277 app.navbar.hide($navbarEl, cardParams.animate, cardParams.hideStatusbarOnOpen, true);
23278 }
23279 }
23280
23281 if (cardParams.hideToolbarOnOpen && $toolbarEl && $toolbarEl.length) {
23282 if ($toolbarEl.closest('.toolbar-hidden').length) {
23283 // Was hidden
23284 $cardEl[0].f7KeepToolbarOnClose = true;
23285 } else {
23286 delete $cardEl[0].f7KeepToolbarOnClose;
23287 app.toolbar.hide($toolbarEl, cardParams.animate);
23288 }
23289 }
23290
23291 if ($backdropEl) {
23292 $backdropEl.removeClass('card-backdrop-out').addClass('card-backdrop-in');
23293 }
23294
23295 $cardEl.removeClass('card-transitioning');
23296
23297 if (cardParams.animate) {
23298 $cardEl.addClass('card-opening');
23299 }
23300
23301 $cardEl.trigger('card:open');
23302 app.emit('cardOpen', $cardEl[0]);
23303
23304 function transitionEnd() {
23305 $pageEl.addClass('page-with-card-opened');
23306
23307 if (device.ios && $pageContentEl.length) {
23308 $pageContentEl.css('height', $pageContentEl[0].offsetHeight + 1 + "px");
23309 setTimeout(function () {
23310 $pageContentEl.css('height', '');
23311 });
23312 }
23313
23314 $cardEl.addClass('card-opened');
23315 $cardEl.removeClass('card-opening');
23316 $cardEl.trigger('card:opened');
23317 app.emit('cardOpened', $cardEl[0], $pageEl[0]);
23318 }
23319
23320 $cardContentEl.css({
23321 width: maxWidth + "px",
23322 height: maxHeight + "px"
23323 }).transform("translate3d(" + (app.rtl ? cardLeftOffset + translateX : -cardLeftOffset - translateX) + "px, 0px, 0) scale(" + 1 / scaleX + ", " + 1 / scaleY + ")");
23324 $cardEl.transform("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")");
23325
23326 if (cardParams.animate) {
23327 $cardEl.transitionEnd(function () {
23328 transitionEnd();
23329 });
23330 } else {
23331 transitionEnd();
23332 }
23333
23334 function onResize() {
23335 $cardEl.removeClass('card-transitioning');
23336 cardWidth = $cardEl[0].offsetWidth;
23337 cardHeight = $cardEl[0].offsetHeight;
23338 pageWidth = $pageEl[0].offsetWidth;
23339 pageHeight = $pageEl[0].offsetHeight;
23340 maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
23341 maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
23342 statusbarHeight = 0;
23343
23344 if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {
23345 statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);
23346 if (Number.isNaN(statusbarHeight)) statusbarHeight = 0;
23347 }
23348
23349 if (statusbarHeight) {
23350 maxHeight -= statusbarHeight;
23351 }
23352
23353 scaleX = maxWidth / cardWidth;
23354 scaleY = maxHeight / cardHeight;
23355 $cardEl.transform('translate3d(0px, 0px, 0) scale(1)');
23356 offset = $cardEl.offset();
23357 pageOffset = $pageEl.offset();
23358
23359 if (statusbarHeight) {
23360 pageOffset.top += statusbarHeight / 2;
23361 }
23362
23363 offset.left -= pageOffset.left;
23364 offset.top -= pageOffset.top;
23365 cardLeftOffset = offset.left - (pageWidth - maxWidth) / 2;
23366 if (app.rtl) cardLeftOffset -= $cardEl[0].scrollLeft;
23367 cardTopOffset = offset.top - (pageHeight - maxHeight) / 2;
23368 cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
23369 cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
23370
23371 if (app.rtl) {
23372 var _ref2 = [cardRightOffset, cardLeftOffset];
23373 cardLeftOffset = _ref2[0];
23374 cardRightOffset = _ref2[1];
23375 }
23376
23377 translateX = (cardRightOffset - cardLeftOffset) / 2;
23378 translateY = (cardBottomOffset - cardTopOffset) / 2;
23379 $cardEl.transform("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")");
23380 $cardContentEl.css({
23381 width: maxWidth + "px",
23382 height: maxHeight + "px"
23383 }).transform("translate3d(" + (app.rtl ? cardLeftOffset + translateX : -cardLeftOffset - translateX) + "px, 0px, 0) scale(" + 1 / scaleX + ", " + 1 / scaleY + ")");
23384 }
23385
23386 var cardScrollTop;
23387 var isTouched;
23388 var isMoved;
23389 var touchStartX;
23390 var touchStartY;
23391 var touchEndX;
23392 var touchEndY;
23393 var isScrolling;
23394 var progress;
23395 var isV;
23396 var isH;
23397 var $cardScrollableEl;
23398
23399 function onTouchStart(e) {
23400 if (!$(e.target).closest($cardEl).length) return;
23401 if (!$cardEl.hasClass('card-opened')) return;
23402 $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);
23403
23404 if ($cardScrollableEl[0] && $cardScrollableEl[0] !== $cardContentEl[0] && !$cardScrollableEl[0].contains(e.target)) {
23405 cardScrollTop = 0;
23406 } else {
23407 cardScrollTop = $cardScrollableEl.scrollTop();
23408 }
23409
23410 isTouched = true;
23411 touchStartX = e.targetTouches[0].pageX;
23412 touchStartY = e.targetTouches[0].pageY;
23413 isScrolling = undefined;
23414 isV = false;
23415 isH = false;
23416 }
23417
23418 function onTouchMove(e) {
23419 if (!isTouched) return;
23420 touchEndX = e.targetTouches[0].pageX;
23421 touchEndY = e.targetTouches[0].pageY;
23422
23423 if (typeof isScrolling === 'undefined') {
23424 isScrolling = !!(isScrolling || Math.abs(touchEndY - touchStartY) > Math.abs(touchEndX - touchStartX));
23425 }
23426
23427 if (!isH && !isV) {
23428 if (!isScrolling && e.targetTouches[0].clientX <= 50) {
23429 isH = true;
23430 } else {
23431 isV = true;
23432 }
23433 }
23434
23435 if (!(isH || isV) || isV && cardScrollTop !== 0) {
23436 isTouched = true;
23437 isMoved = true;
23438 return;
23439 }
23440
23441 if (!isMoved) {
23442 $cardEl.removeClass('card-transitioning');
23443 }
23444
23445 isMoved = true;
23446 progress = isV ? Math.max((touchEndY - touchStartY) / 150, 0) : Math.max((touchEndX - touchStartX) / (cardWidth / 2), 0);
23447
23448 if (progress > 0 && isV || isH) {
23449 if (isV && device.ios && $cardScrollableEl[0] === $cardContentEl[0]) {
23450 $cardScrollableEl.css('-webkit-overflow-scrolling', 'auto');
23451 $cardScrollableEl.scrollTop(0);
23452 }
23453
23454 e.preventDefault();
23455 }
23456
23457 if (progress > 1) progress = Math.pow(progress, 0.3);
23458
23459 if (progress > (isV ? 1.3 : 1.1)) {
23460 isTouched = false;
23461 isMoved = false;
23462 app.card.close($cardEl);
23463 } else {
23464 $cardEl.transform("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX * (1 - progress * 0.2) + ", " + scaleY * (1 - progress * 0.2) + ")");
23465 }
23466 }
23467
23468 function onTouchEnd() {
23469 if (!isTouched || !isMoved) return;
23470 isTouched = false;
23471 isMoved = false;
23472
23473 if (device.ios) {
23474 $cardScrollableEl.css('-webkit-overflow-scrolling', '');
23475 }
23476
23477 if (progress >= 0.8) {
23478 app.card.close($cardEl);
23479 } else {
23480 $cardEl.addClass('card-transitioning').transform("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")");
23481 }
23482 }
23483
23484 $cardEl[0].detachEventHandlers = function detachEventHandlers() {
23485 app.off('resize', onResize);
23486
23487 if (support.touch && cardParams.swipeToClose) {
23488 app.off('touchstart:passive', onTouchStart);
23489 app.off('touchmove:active', onTouchMove);
23490 app.off('touchend:passive', onTouchEnd);
23491 }
23492 };
23493
23494 app.on('resize', onResize);
23495
23496 if (support.touch && cardParams.swipeToClose) {
23497 app.on('touchstart:passive', onTouchStart);
23498 app.on('touchmove:active', onTouchMove);
23499 app.on('touchend:passive', onTouchEnd);
23500 }
23501 },
23502 close: function close(cardEl, animate) {
23503 if (cardEl === void 0) {
23504 cardEl = '.card-expandable.card-opened';
23505 }
23506
23507 if (animate === void 0) {
23508 animate = true;
23509 }
23510
23511 var app = this;
23512 var device = getDevice$1();
23513 var $cardEl = $(cardEl).eq(0);
23514 if (!$cardEl || !$cardEl.length) return;
23515 if (!$cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) return;
23516 var $cardContentEl = $cardEl.children('.card-content');
23517 var $pageContentEl = $cardEl.parents('.page-content');
23518 var $pageEl = $cardEl.parents('.page').eq(0);
23519 if (!$pageEl.length) return;
23520 var cardParams = Object.assign({
23521 animate: animate
23522 }, app.params.card, $cardEl.dataset());
23523 var $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);
23524 var $navbarEl;
23525 var $toolbarEl;
23526 var $backdropEl;
23527
23528 if ($cardEl.attr('data-backdrop-el')) {
23529 $backdropEl = $($cardEl.attr('data-backdrop-el'));
23530 }
23531
23532 if (cardParams.backdrop) {
23533 $backdropEl = $cardEl.parents('.page-content').find('.card-backdrop');
23534 }
23535
23536 if (cardParams.hideNavbarOnOpen) {
23537 $navbarEl = $pageEl.children('.navbar');
23538
23539 if (!$navbarEl.length) {
23540 if ($pageEl[0].f7Page) $navbarEl = $pageEl[0].f7Page.$navbarEl;
23541 }
23542
23543 if ($navbarEl && $navbarEl.length && !$cardEl[0].f7KeepNavbarOnClose) {
23544 app.navbar.show($navbarEl, cardParams.animate, true);
23545 }
23546 }
23547
23548 if (cardParams.hideToolbarOnOpen) {
23549 $toolbarEl = $pageEl.children('.toolbar');
23550
23551 if (!$toolbarEl.length) {
23552 $toolbarEl = $pageEl.parents('.view').children('.toolbar');
23553 }
23554
23555 if (!$toolbarEl.length) {
23556 $toolbarEl = $pageEl.parents('.views').children('.toolbar');
23557 }
23558
23559 if ($toolbarEl && $toolbarEl.length && !$cardEl[0].f7KeepToolbarOnClose) {
23560 app.toolbar.show($toolbarEl, cardParams.animate);
23561 }
23562 }
23563
23564 $pageEl.removeClass('page-with-card-opened');
23565
23566 if (device.ios && $pageContentEl.length) {
23567 $pageContentEl.css('height', $pageContentEl[0].offsetHeight + 1 + "px");
23568 setTimeout(function () {
23569 $pageContentEl.css('height', '');
23570 });
23571 }
23572
23573 if ($backdropEl && $backdropEl.length) {
23574 $backdropEl.removeClass('card-backdrop-in').addClass('card-backdrop-out');
23575 }
23576
23577 $cardEl.removeClass('card-opened card-transitioning');
23578
23579 if (cardParams.animate) {
23580 $cardEl.addClass('card-closing');
23581 } else {
23582 $cardEl.addClass('card-no-transition');
23583 }
23584
23585 $cardEl.transform('');
23586 $cardEl.trigger('card:close');
23587 app.emit('cardClose', $cardEl[0], $pageEl[0]);
23588 var animateWidth = $cardEl.hasClass('card-expandable-animate-width');
23589
23590 function transitionEnd() {
23591 if (!animateWidth) {
23592 $cardContentEl.css({
23593 width: '',
23594 height: ''
23595 });
23596 }
23597
23598 if ($backdropEl && $backdropEl.length) {
23599 $backdropEl.removeClass('card-backdrop-in card-backdrop-out');
23600 }
23601
23602 $cardEl.removeClass('card-closing card-no-transition');
23603 $cardEl.trigger('card:closed');
23604 $cardEl.find('.card-expandable-size').remove();
23605 app.emit('cardClosed', $cardEl[0], $pageEl[0]);
23606 }
23607
23608 if (animateWidth) {
23609 $cardContentEl.css({
23610 width: '',
23611 height: ''
23612 });
23613 }
23614
23615 $cardContentEl.transform('').scrollTop(0, animate ? 300 : 0);
23616
23617 if ($cardScrollableEl.length && $cardScrollableEl[0] !== $cardContentEl[0]) {
23618 $cardScrollableEl.scrollTop(0, animate ? 300 : 0);
23619 }
23620
23621 if (animate) {
23622 $cardContentEl.transitionEnd(function () {
23623 transitionEnd();
23624 });
23625 } else {
23626 transitionEnd();
23627 }
23628
23629 if ($cardEl[0].detachEventHandlers) {
23630 $cardEl[0].detachEventHandlers();
23631 delete $cardEl[0].detachEventHandlers;
23632 }
23633 },
23634 toggle: function toggle(cardEl, animate) {
23635 if (cardEl === void 0) {
23636 cardEl = '.card-expandable';
23637 }
23638
23639 var app = this;
23640 var $cardEl = $(cardEl).eq(0);
23641 if (!$cardEl.length) return;
23642
23643 if ($cardEl.hasClass('card-opened')) {
23644 app.card.close($cardEl, animate);
23645 } else {
23646 app.card.open($cardEl, animate);
23647 }
23648 }
23649 };
23650 var Card = {
23651 name: 'card',
23652 params: {
23653 card: {
23654 hideNavbarOnOpen: true,
23655 hideStatusbarOnOpen: true,
23656 hideToolbarOnOpen: true,
23657 scrollableEl: '.card-content',
23658 swipeToClose: true,
23659 closeByBackdropClick: true,
23660 backdrop: true
23661 }
23662 },
23663 create: function create() {
23664 var app = this;
23665 bindMethods(app, {
23666 card: CardExpandable
23667 });
23668 },
23669 on: {
23670 pageBeforeIn: function pageBeforeIn(page) {
23671 var app = this;
23672
23673 if (app.params.card.hideNavbarOnOpen && page.navbarEl && page.$el.find('.card-opened.card-expandable').length) {
23674 app.navbar.hide(page.navbarEl, true, app.params.card.hideStatusbarOnOpen, true);
23675 }
23676
23677 if (app.params.card.hideToolbarOnOpen && page.$el.find('.card-opened.card-expandable').length) {
23678 var $toolbarEl = page.$el.children('.toolbar');
23679
23680 if (!$toolbarEl.length) {
23681 $toolbarEl = page.$el.parents('.view').children('.toolbar');
23682 }
23683
23684 if (!$toolbarEl.length) {
23685 $toolbarEl = page.$el.parents('.views').children('.toolbar');
23686 }
23687
23688 if ($toolbarEl && $toolbarEl.length) {
23689 app.toolbar.hide($toolbarEl);
23690 }
23691 }
23692 }
23693 },
23694 clicks: {
23695 '.card-close': function closeCard($clickedEl, data) {
23696 var app = this;
23697 app.card.close(data.card, data.animate);
23698 },
23699 '.card-open': function closeCard($clickedEl, data) {
23700 var app = this;
23701 app.card.open(data.card, data.animate);
23702 },
23703 '.card-expandable': function toggleExpandableCard($clickedEl, data, e) {
23704 var app = this;
23705 if ($clickedEl.hasClass('card-opened') || $clickedEl.hasClass('card-opening') || $clickedEl.hasClass('card-closing')) return;
23706 if ($(e.target).closest('.card-prevent-open, .card-close').length) return;
23707 app.card.open($clickedEl);
23708 },
23709 '.card-backdrop-in': function onBackdropClick() {
23710 var app = this;
23711 var needToClose = false;
23712 if (app.params.card.closeByBackdropClick) needToClose = true;
23713 var $openedCardEl = $('.card-opened');
23714 if (!$openedCardEl.length) return;
23715
23716 if ($openedCardEl.attr('data-close-by-backdrop-click') === 'true') {
23717 needToClose = true;
23718 } else if ($openedCardEl.attr('data-close-by-backdrop-click') === 'false') {
23719 needToClose = false;
23720 }
23721
23722 if (needToClose) app.card.close($openedCardEl);
23723 }
23724 }
23725 };
23726
23727 var Chip = {
23728 name: 'chip'
23729 };
23730
23731 var FormData$1 = {
23732 store: function store(form, data) {
23733 var app = this;
23734 var window = getWindow();
23735 var formId = form;
23736 var $formEl = $(form);
23737
23738 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
23739 formId = $formEl.attr('id');
23740 } // Store form data in app.formsData
23741
23742
23743 app.form.data["form-" + formId] = data; // Store form data in local storage also
23744
23745 window.localStorage["f7form-" + formId] = JSON.stringify(data);
23746 },
23747 get: function get(form) {
23748 var app = this;
23749 var window = getWindow();
23750 var formId = form;
23751 var $formEl = $(form);
23752
23753 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
23754 formId = $formEl.attr('id');
23755 }
23756
23757 if (window.localStorage["f7form-" + formId]) {
23758 return JSON.parse(window.localStorage["f7form-" + formId]);
23759 }
23760
23761 if (app.form.data["form-" + formId]) {
23762 return app.form.data["form-" + formId];
23763 }
23764
23765 return undefined;
23766 },
23767 remove: function remove(form) {
23768 var app = this;
23769 var window = getWindow();
23770 var formId = form;
23771 var $formEl = $(form);
23772
23773 if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
23774 formId = $formEl.attr('id');
23775 } // Delete form data from app.formsData
23776
23777
23778 if (app.form.data["form-" + formId]) {
23779 app.form.data["form-" + formId] = '';
23780 delete app.form.data["form-" + formId];
23781 } // Delete form data from local storage also
23782
23783
23784 if (window.localStorage["f7form-" + formId]) {
23785 window.localStorage["f7form-" + formId] = '';
23786 window.localStorage.removeItem("f7form-" + formId);
23787 }
23788 }
23789 }; // Form Storage
23790
23791 var FormStorage = {
23792 init: function init(formEl) {
23793 var app = this;
23794 var $formEl = $(formEl);
23795 var formId = $formEl.attr('id');
23796 if (!formId) return;
23797 var initialData = app.form.getFormData(formId);
23798
23799 if (initialData) {
23800 app.form.fillFromData($formEl, initialData);
23801 }
23802
23803 function store() {
23804 var data = app.form.convertToData($formEl);
23805 if (!data) return;
23806 app.form.storeFormData(formId, data);
23807 $formEl.trigger('form:storedata', data);
23808 app.emit('formStoreData', $formEl[0], data);
23809 }
23810
23811 $formEl.on('change submit', store);
23812 },
23813 destroy: function destroy(formEl) {
23814 var $formEl = $(formEl);
23815 $formEl.off('change submit');
23816 }
23817 }; // Form To/From Data
23818
23819 function formToData(formEl) {
23820 var app = this;
23821 var $formEl = $(formEl).eq(0);
23822 if ($formEl.length === 0) return undefined; // Form data
23823
23824 var data = {}; // Skip input types
23825
23826 var skipTypes = ['submit', 'image', 'button', 'file'];
23827 var skipNames = [];
23828 $formEl.find('input, select, textarea').each(function (inputEl) {
23829 var $inputEl = $(inputEl);
23830
23831 if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
23832 return;
23833 }
23834
23835 var name = $inputEl.attr('name');
23836 var type = $inputEl.attr('type');
23837 var tag = inputEl.nodeName.toLowerCase();
23838 if (skipTypes.indexOf(type) >= 0) return;
23839 if (skipNames.indexOf(name) >= 0 || !name) return;
23840
23841 if (tag === 'select' && $inputEl.prop('multiple')) {
23842 skipNames.push(name);
23843 data[name] = [];
23844 $formEl.find("select[name=\"" + name + "\"] option").each(function (el) {
23845 if (el.selected) data[name].push(el.value);
23846 });
23847 } else {
23848 switch (type) {
23849 case 'checkbox':
23850 skipNames.push(name);
23851 data[name] = [];
23852 $formEl.find("input[name=\"" + name + "\"]").each(function (el) {
23853 if (el.checked) data[name].push(el.value);
23854 });
23855 break;
23856
23857 case 'radio':
23858 skipNames.push(name);
23859 $formEl.find("input[name=\"" + name + "\"]").each(function (el) {
23860 if (el.checked) data[name] = el.value;
23861 });
23862 break;
23863
23864 default:
23865 data[name] = $inputEl.val();
23866 break;
23867 }
23868 }
23869 });
23870 $formEl.trigger('form:todata', data);
23871 app.emit('formToData', $formEl[0], data);
23872 return data;
23873 }
23874
23875 function formFromData(formEl, formData) {
23876 var app = this;
23877 var $formEl = $(formEl).eq(0);
23878 if (!$formEl.length) return;
23879 var data = formData;
23880 var formId = $formEl.attr('id');
23881
23882 if (!data && formId) {
23883 data = app.form.getFormData(formId);
23884 }
23885
23886 if (!data) return; // Skip input types
23887
23888 var skipTypes = ['submit', 'image', 'button', 'file'];
23889 var skipNames = [];
23890 $formEl.find('input, select, textarea').each(function (inputEl) {
23891 var $inputEl = $(inputEl);
23892
23893 if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
23894 return;
23895 }
23896
23897 var name = $inputEl.attr('name');
23898 var type = $inputEl.attr('type');
23899 var tag = inputEl.nodeName.toLowerCase();
23900 if (typeof data[name] === 'undefined' || data[name] === null) return;
23901 if (skipTypes.indexOf(type) >= 0) return;
23902 if (skipNames.indexOf(name) >= 0 || !name) return;
23903
23904 if (tag === 'select' && $inputEl.prop('multiple')) {
23905 skipNames.push(name);
23906 $formEl.find("select[name=\"" + name + "\"] option").each(function (el) {
23907 var selectEl = el;
23908 if (data[name].indexOf(el.value) >= 0) selectEl.selected = true;else selectEl.selected = false;
23909 });
23910 } else {
23911 switch (type) {
23912 case 'checkbox':
23913 skipNames.push(name);
23914 $formEl.find("input[name=\"" + name + "\"]").each(function (el) {
23915 var checkboxEl = el;
23916 if (data[name].indexOf(el.value) >= 0) checkboxEl.checked = true;else checkboxEl.checked = false;
23917 });
23918 break;
23919
23920 case 'radio':
23921 skipNames.push(name);
23922 $formEl.find("input[name=\"" + name + "\"]").each(function (el) {
23923 var radioEl = el;
23924 if (data[name] === el.value) radioEl.checked = true;else radioEl.checked = false;
23925 });
23926 break;
23927
23928 default:
23929 $inputEl.val(data[name]);
23930 break;
23931 }
23932 }
23933
23934 if (tag === 'select' || tag === 'input' || tag === 'textarea') {
23935 $inputEl.trigger('change', 'fromdata');
23936 }
23937 });
23938 $formEl.trigger('form:fromdata', data);
23939 app.emit('formFromData', $formEl[0], data);
23940 }
23941
23942 function initAjaxForm() {
23943 var app = this;
23944 var window = getWindow();
23945 var document = getDocument();
23946
23947 function onSubmitChange(e, fromData) {
23948 var $formEl = $(this);
23949 if (e.type === 'change' && !$formEl.hasClass('form-ajax-submit-onchange')) return;
23950 if (e.type === 'submit') e.preventDefault();
23951 if (e.type === 'change' && fromData === 'fromdata') return;
23952 var method = ($formEl.attr('method') || 'GET').toUpperCase();
23953 var contentType = $formEl.prop('enctype') || $formEl.attr('enctype');
23954 var url = $formEl.attr('action');
23955 if (!url) return;
23956 var data;
23957
23958 if (method === 'POST') {
23959 if (contentType === 'application/x-www-form-urlencoded') {
23960 data = app.form.convertToData($formEl[0]);
23961 } else {
23962 data = new window.FormData($formEl[0]);
23963 }
23964 } else {
23965 data = serializeObject(app.form.convertToData($formEl[0]));
23966 }
23967
23968 app.request({
23969 method: method,
23970 url: url,
23971 contentType: contentType,
23972 data: data,
23973 beforeSend: function beforeSend(xhr) {
23974 $formEl.trigger('formajax:beforesend', {
23975 data: data,
23976 xhr: xhr
23977 });
23978 app.emit('formAjaxBeforeSend', $formEl[0], data, xhr);
23979 },
23980 error: function error(xhr) {
23981 $formEl.trigger('formajax:error', {
23982 data: data,
23983 xhr: xhr
23984 });
23985 app.emit('formAjaxError', $formEl[0], data, xhr);
23986 },
23987 complete: function complete(xhr) {
23988 $formEl.trigger('formajax:complete', {
23989 data: data,
23990 xhr: xhr
23991 });
23992 app.emit('formAjaxComplete', $formEl[0], data, xhr);
23993 },
23994 success: function success(response, status, xhr) {
23995 $formEl.trigger('formajax:success', {
23996 data: data,
23997 xhr: xhr
23998 });
23999 app.emit('formAjaxSuccess', $formEl[0], data, xhr);
24000 }
24001 });
24002 }
24003
24004 $(document).on('submit change', 'form.form-ajax-submit, form.form-ajax-submit-onchange', onSubmitChange);
24005 }
24006
24007 var Form = {
24008 name: 'form',
24009 create: function create() {
24010 var app = this;
24011 extend$1(app, {
24012 form: {
24013 data: {},
24014 storeFormData: FormData$1.store.bind(app),
24015 getFormData: FormData$1.get.bind(app),
24016 removeFormData: FormData$1.remove.bind(app),
24017 convertToData: formToData.bind(app),
24018 fillFromData: formFromData.bind(app),
24019 storage: {
24020 init: FormStorage.init.bind(app),
24021 destroy: FormStorage.destroy.bind(app)
24022 }
24023 }
24024 });
24025 },
24026 on: {
24027 init: function init() {
24028 var app = this;
24029 initAjaxForm.call(app);
24030 },
24031 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24032 var app = this;
24033 $(tabEl).find('.form-store-data').each(function (formEl) {
24034 app.form.storage.destroy(formEl);
24035 });
24036 },
24037 tabMounted: function tabMounted(tabEl) {
24038 var app = this;
24039 $(tabEl).find('.form-store-data').each(function (formEl) {
24040 app.form.storage.init(formEl);
24041 });
24042 },
24043 pageBeforeRemove: function pageBeforeRemove(page) {
24044 var app = this;
24045 page.$el.find('.form-store-data').each(function (formEl) {
24046 app.form.storage.destroy(formEl);
24047 });
24048 },
24049 pageInit: function pageInit(page) {
24050 var app = this;
24051 page.$el.find('.form-store-data').each(function (formEl) {
24052 app.form.storage.init(formEl);
24053 });
24054 }
24055 }
24056 };
24057
24058 var Input = {
24059 ignoreTypes: ['checkbox', 'button', 'submit', 'range', 'radio', 'image'],
24060 createTextareaResizableShadow: function createTextareaResizableShadow() {
24061 var document = getDocument();
24062 var $shadowEl = $(document.createElement('textarea'));
24063 $shadowEl.addClass('textarea-resizable-shadow');
24064 $shadowEl.prop({
24065 disabled: true,
24066 readonly: true
24067 });
24068 Input.textareaResizableShadow = $shadowEl;
24069 },
24070 textareaResizableShadow: undefined,
24071 resizeTextarea: function resizeTextarea(textareaEl) {
24072 var app = this;
24073 var window = getWindow();
24074 var $textareaEl = $(textareaEl);
24075
24076 if (!Input.textareaResizableShadow) {
24077 Input.createTextareaResizableShadow();
24078 }
24079
24080 var $shadowEl = Input.textareaResizableShadow;
24081 if (!$textareaEl.length) return;
24082 if (!$textareaEl.hasClass('resizable')) return;
24083
24084 if (Input.textareaResizableShadow.parents().length === 0) {
24085 app.$el.append($shadowEl);
24086 }
24087
24088 var styles = window.getComputedStyle($textareaEl[0]);
24089 'padding-top padding-bottom padding-left padding-right margin-left margin-right margin-top margin-bottom width font-size font-family font-style font-weight line-height font-variant text-transform letter-spacing border box-sizing display'.split(' ').forEach(function (style) {
24090 var styleValue = styles[style];
24091
24092 if ('font-size line-height letter-spacing width'.split(' ').indexOf(style) >= 0) {
24093 styleValue = styleValue.replace(',', '.');
24094 }
24095
24096 $shadowEl.css(style, styleValue);
24097 });
24098 var currentHeight = $textareaEl[0].clientHeight;
24099 $shadowEl.val('');
24100 var initialHeight = $shadowEl[0].scrollHeight;
24101 $shadowEl.val($textareaEl.val());
24102 $shadowEl.css('height', 0);
24103 var scrollHeight = $shadowEl[0].scrollHeight;
24104
24105 if (currentHeight !== scrollHeight) {
24106 if (scrollHeight > initialHeight) {
24107 $textareaEl.css('height', scrollHeight + "px");
24108 } else if (scrollHeight < currentHeight) {
24109 $textareaEl.css('height', '');
24110 }
24111
24112 if (scrollHeight > initialHeight || scrollHeight < currentHeight) {
24113 $textareaEl.trigger('textarea:resize', {
24114 initialHeight: initialHeight,
24115 currentHeight: currentHeight,
24116 scrollHeight: scrollHeight
24117 });
24118 app.emit('textareaResize', {
24119 initialHeight: initialHeight,
24120 currentHeight: currentHeight,
24121 scrollHeight: scrollHeight
24122 });
24123 }
24124 }
24125 },
24126 validate: function validate(inputEl) {
24127 var $inputEl = $(inputEl);
24128 if (!$inputEl.length) return true;
24129 var $itemInputEl = $inputEl.parents('.item-input');
24130 var $inputWrapEl = $inputEl.parents('.input');
24131
24132 function unsetReadonly() {
24133 if ($inputEl[0].f7ValidateReadonly) {
24134 $inputEl[0].readOnly = false;
24135 }
24136 }
24137
24138 function setReadonly() {
24139 if ($inputEl[0].f7ValidateReadonly) {
24140 $inputEl[0].readOnly = true;
24141 }
24142 }
24143
24144 unsetReadonly();
24145 var validity = $inputEl[0].validity;
24146 var validationMessage = $inputEl.dataset().errorMessage || $inputEl[0].validationMessage || '';
24147
24148 if (!validity) {
24149 setReadonly();
24150 return true;
24151 }
24152
24153 if (!validity.valid) {
24154 var $errorEl = $inputEl.nextAll('.item-input-error-message, .input-error-message');
24155
24156 if (validationMessage) {
24157 if ($errorEl.length === 0) {
24158 $errorEl = $("<div class=\"" + ($inputWrapEl.length ? 'input-error-message' : 'item-input-error-message') + "\"></div>");
24159 $errorEl.insertAfter($inputEl);
24160 }
24161
24162 $errorEl.text(validationMessage);
24163 }
24164
24165 if ($errorEl.length > 0) {
24166 $itemInputEl.addClass('item-input-with-error-message');
24167 $inputWrapEl.addClass('input-with-error-message');
24168 }
24169
24170 $itemInputEl.addClass('item-input-invalid');
24171 $inputWrapEl.addClass('input-invalid');
24172 $inputEl.addClass('input-invalid');
24173 setReadonly();
24174 return false;
24175 }
24176
24177 $itemInputEl.removeClass('item-input-invalid item-input-with-error-message');
24178 $inputWrapEl.removeClass('input-invalid input-with-error-message');
24179 $inputEl.removeClass('input-invalid');
24180 setReadonly();
24181 return true;
24182 },
24183 validateInputs: function validateInputs(el) {
24184 var app = this;
24185 var validates = $(el).find('input, textarea, select').map(function (inputEl) {
24186 return app.input.validate(inputEl);
24187 });
24188 return validates.indexOf(false) < 0;
24189 },
24190 focus: function focus(inputEl) {
24191 var $inputEl = $(inputEl);
24192 var type = $inputEl.attr('type');
24193 if (Input.ignoreTypes.indexOf(type) >= 0) return;
24194 $inputEl.parents('.item-input').addClass('item-input-focused');
24195 $inputEl.parents('.input').addClass('input-focused');
24196 $inputEl.addClass('input-focused');
24197 },
24198 blur: function blur(inputEl) {
24199 var $inputEl = $(inputEl);
24200 $inputEl.parents('.item-input').removeClass('item-input-focused');
24201 $inputEl.parents('.input').removeClass('input-focused');
24202 $inputEl.removeClass('input-focused');
24203 },
24204 checkEmptyState: function checkEmptyState(inputEl) {
24205 var app = this;
24206 var $inputEl = $(inputEl);
24207
24208 if (!$inputEl.is('input, select, textarea, .item-input [contenteditable]')) {
24209 $inputEl = $inputEl.find('input, select, textarea, .item-input [contenteditable]').eq(0);
24210 }
24211
24212 if (!$inputEl.length) return;
24213 var isContentEditable = $inputEl[0].hasAttribute('contenteditable');
24214 var value;
24215
24216 if (isContentEditable) {
24217 if ($inputEl.find('.text-editor-placeholder').length) value = '';else value = $inputEl.html();
24218 } else {
24219 value = $inputEl.val();
24220 }
24221
24222 var $itemInputEl = $inputEl.parents('.item-input');
24223 var $inputWrapEl = $inputEl.parents('.input');
24224
24225 if (value && typeof value === 'string' && value.trim() !== '' || Array.isArray(value) && value.length > 0) {
24226 $itemInputEl.addClass('item-input-with-value');
24227 $inputWrapEl.addClass('input-with-value');
24228 $inputEl.addClass('input-with-value');
24229 $inputEl.trigger('input:notempty');
24230 app.emit('inputNotEmpty', $inputEl[0]);
24231 } else {
24232 $itemInputEl.removeClass('item-input-with-value');
24233 $inputWrapEl.removeClass('input-with-value');
24234 $inputEl.removeClass('input-with-value');
24235 $inputEl.trigger('input:empty');
24236 app.emit('inputEmpty', $inputEl[0]);
24237 }
24238 },
24239 scrollIntoView: function scrollIntoView(inputEl, duration, centered, force) {
24240 if (duration === void 0) {
24241 duration = 0;
24242 }
24243
24244 var $inputEl = $(inputEl);
24245 var $scrollableEl = $inputEl.parents('.page-content, .panel, .card-expandable .card-content').eq(0);
24246
24247 if (!$scrollableEl.length) {
24248 return false;
24249 }
24250
24251 var contentHeight = $scrollableEl[0].offsetHeight;
24252 var contentScrollTop = $scrollableEl[0].scrollTop;
24253 var contentPaddingTop = parseInt($scrollableEl.css('padding-top'), 10);
24254 var contentPaddingBottom = parseInt($scrollableEl.css('padding-bottom'), 10);
24255 var contentOffsetTop = $scrollableEl.offset().top - contentScrollTop;
24256 var inputOffsetTop = $inputEl.offset().top - contentOffsetTop;
24257 var inputHeight = $inputEl[0].offsetHeight;
24258 var min = inputOffsetTop + contentScrollTop - contentPaddingTop;
24259 var max = inputOffsetTop + contentScrollTop - contentHeight + contentPaddingBottom + inputHeight;
24260 var centeredPosition = min + (max - min) / 2;
24261
24262 if (contentScrollTop > min) {
24263 $scrollableEl.scrollTop(centered ? centeredPosition : min, duration);
24264 return true;
24265 }
24266
24267 if (contentScrollTop < max) {
24268 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
24269 return true;
24270 }
24271
24272 if (force) {
24273 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
24274 }
24275
24276 return false;
24277 },
24278 init: function init() {
24279 var app = this;
24280 var device = getDevice$1();
24281 var window = getWindow();
24282 var document = getDocument();
24283 Input.createTextareaResizableShadow();
24284
24285 function onFocus() {
24286 var inputEl = this;
24287
24288 if (app.params.input.scrollIntoViewOnFocus) {
24289 if (device.android) {
24290 $(window).once('resize', function () {
24291 if (document && document.activeElement === inputEl) {
24292 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
24293 }
24294 });
24295 } else {
24296 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
24297 }
24298 }
24299
24300 app.input.focus(inputEl);
24301 }
24302
24303 function onBlur() {
24304 var $inputEl = $(this);
24305 var tag = $inputEl[0].nodeName.toLowerCase();
24306 app.input.blur($inputEl);
24307
24308 if ($inputEl.dataset().validate || $inputEl.attr('validate') !== null || $inputEl.attr('data-validate-on-blur') !== null) {
24309 app.input.validate($inputEl);
24310 } // Resize textarea
24311
24312
24313 if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
24314 if (Input.textareaResizableShadow) Input.textareaResizableShadow.remove();
24315 }
24316 }
24317
24318 function onChange() {
24319 var $inputEl = $(this);
24320 var type = $inputEl.attr('type');
24321 var tag = $inputEl[0].nodeName.toLowerCase();
24322 var isContentEditable = $inputEl[0].hasAttribute('contenteditable');
24323 if (Input.ignoreTypes.indexOf(type) >= 0) return; // Check Empty State
24324
24325 app.input.checkEmptyState($inputEl);
24326 if (isContentEditable) return; // Check validation
24327
24328 if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
24329 app.input.validate($inputEl);
24330 } // Resize textarea
24331
24332
24333 if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
24334 app.input.resizeTextarea($inputEl);
24335 }
24336 }
24337
24338 function onInvalid(e) {
24339 var $inputEl = $(this);
24340
24341 if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
24342 e.preventDefault();
24343 app.input.validate($inputEl);
24344 }
24345 }
24346
24347 function clearInput() {
24348 var $clicked = $(this);
24349 var $inputEl = $clicked.siblings('input, textarea').eq(0);
24350 var previousValue = $inputEl.val();
24351 $inputEl.val('').trigger('input change').focus().trigger('input:clear', previousValue);
24352 app.emit('inputClear', previousValue);
24353 }
24354
24355 function preventDefault(e) {
24356 e.preventDefault();
24357 }
24358
24359 $(document).on('click', '.input-clear-button', clearInput);
24360 $(document).on('mousedown', '.input-clear-button', preventDefault);
24361 $(document).on('change input', 'input, textarea, select, .item-input [contenteditable]', onChange, true);
24362 $(document).on('focus', 'input, textarea, select, .item-input [contenteditable]', onFocus, true);
24363 $(document).on('blur', 'input, textarea, select, .item-input [contenteditable]', onBlur, true);
24364 $(document).on('invalid', 'input, textarea, select', onInvalid, true);
24365 }
24366 };
24367 var Input$1 = {
24368 name: 'input',
24369 params: {
24370 input: {
24371 scrollIntoViewOnFocus: undefined,
24372 scrollIntoViewCentered: false,
24373 scrollIntoViewDuration: 0,
24374 scrollIntoViewAlways: false
24375 }
24376 },
24377 create: function create() {
24378 var app = this;
24379
24380 if (typeof app.params.input.scrollIntoViewOnFocus === 'undefined') {
24381 app.params.input.scrollIntoViewOnFocus = getDevice$1().android;
24382 }
24383
24384 bindMethods(app, {
24385 input: Input
24386 });
24387 },
24388 on: {
24389 init: function init() {
24390 var app = this;
24391 app.input.init();
24392 },
24393 tabMounted: function tabMounted(tabEl) {
24394 var app = this;
24395 var $tabEl = $(tabEl);
24396 $tabEl.find('.item-input, .input').each(function (itemInputEl) {
24397 var $itemInputEl = $(itemInputEl);
24398 $itemInputEl.find('input, select, textarea, [contenteditable]').each(function (inputEl) {
24399 var $inputEl = $(inputEl);
24400 if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) return;
24401 app.input.checkEmptyState($inputEl);
24402 });
24403 });
24404 $tabEl.find('textarea.resizable').each(function (textareaEl) {
24405 app.input.resizeTextarea(textareaEl);
24406 });
24407 },
24408 pageInit: function pageInit(page) {
24409 var app = this;
24410 var $pageEl = page.$el;
24411 $pageEl.find('.item-input, .input').each(function (itemInputEl) {
24412 var $itemInputEl = $(itemInputEl);
24413 $itemInputEl.find('input, select, textarea, [contenteditable]').each(function (inputEl) {
24414 var $inputEl = $(inputEl);
24415 if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) return;
24416 app.input.checkEmptyState($inputEl);
24417 });
24418 });
24419 $pageEl.find('textarea.resizable').each(function (textareaEl) {
24420 app.input.resizeTextarea(textareaEl);
24421 });
24422 },
24423 'panelBreakpoint panelCollapsedBreakpoint panelResize panelOpen panelSwipeOpen resize viewMasterDetailBreakpoint': function onPanelOpen(instance) {
24424 var app = this;
24425
24426 if (instance && instance.$el) {
24427 instance.$el.find('textarea.resizable').each(function (textareaEl) {
24428 app.input.resizeTextarea(textareaEl);
24429 });
24430 } else {
24431 $('textarea.resizable').each(function (textareaEl) {
24432 app.input.resizeTextarea(textareaEl);
24433 });
24434 }
24435 }
24436 }
24437 };
24438
24439 var Checkbox = {
24440 name: 'checkbox'
24441 };
24442
24443 var Radio = {
24444 name: 'radio'
24445 };
24446
24447 var Toggle$1 = /*#__PURE__*/function (_Framework7Class) {
24448 _inheritsLoose(Toggle, _Framework7Class);
24449
24450 function Toggle(app, params) {
24451 var _this;
24452
24453 if (params === void 0) {
24454 params = {};
24455 }
24456
24457 _this = _Framework7Class.call(this, params, [app]) || this;
24458
24459 var toggle = _assertThisInitialized(_this);
24460
24461 var support = getSupport$1();
24462 var defaults = {}; // Extend defaults with modules params
24463
24464 toggle.useModulesParams(defaults);
24465 toggle.params = extend$1(defaults, params);
24466 var el = toggle.params.el;
24467 if (!el) return toggle || _assertThisInitialized(_this);
24468 var $el = $(el);
24469 if ($el.length === 0) return toggle || _assertThisInitialized(_this);
24470 if ($el[0].f7Toggle) return $el[0].f7Toggle || _assertThisInitialized(_this);
24471 var $inputEl = $el.children('input[type="checkbox"]');
24472 extend$1(toggle, {
24473 app: app,
24474 $el: $el,
24475 el: $el[0],
24476 $inputEl: $inputEl,
24477 inputEl: $inputEl[0],
24478 disabled: $el.hasClass('disabled') || $inputEl.hasClass('disabled') || $inputEl.attr('disabled') || $inputEl[0].disabled
24479 });
24480 Object.defineProperty(toggle, 'checked', {
24481 enumerable: true,
24482 configurable: true,
24483 set: function set(checked) {
24484 if (!toggle || typeof toggle.$inputEl === 'undefined') return;
24485 if (toggle.checked === checked) return;
24486 $inputEl[0].checked = checked;
24487 toggle.$inputEl.trigger('change');
24488 },
24489 get: function get() {
24490 return $inputEl[0].checked;
24491 }
24492 });
24493 $el[0].f7Toggle = toggle;
24494 var isTouched;
24495 var touchesStart = {};
24496 var isScrolling;
24497 var touchesDiff;
24498 var toggleWidth;
24499 var touchStartTime;
24500 var touchStartChecked;
24501
24502 function handleTouchStart(e) {
24503 if (isTouched || toggle.disabled) return;
24504 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
24505 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
24506 touchesDiff = 0;
24507 isTouched = true;
24508 isScrolling = undefined;
24509 touchStartTime = now$1();
24510 touchStartChecked = toggle.checked;
24511 toggleWidth = $el[0].offsetWidth;
24512 nextTick$1(function () {
24513 if (isTouched) {
24514 $el.addClass('toggle-active-state');
24515 }
24516 });
24517 }
24518
24519 function handleTouchMove(e) {
24520 if (!isTouched || toggle.disabled) return;
24521 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
24522 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
24523 var inverter = app.rtl ? -1 : 1;
24524
24525 if (typeof isScrolling === 'undefined') {
24526 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
24527 }
24528
24529 if (isScrolling) {
24530 isTouched = false;
24531 return;
24532 }
24533
24534 e.preventDefault();
24535 touchesDiff = pageX - touchesStart.x;
24536 var changed;
24537
24538 if (touchesDiff * inverter < 0 && Math.abs(touchesDiff) > toggleWidth / 3 && touchStartChecked) {
24539 changed = true;
24540 }
24541
24542 if (touchesDiff * inverter > 0 && Math.abs(touchesDiff) > toggleWidth / 3 && !touchStartChecked) {
24543 changed = true;
24544 }
24545
24546 if (changed) {
24547 touchesStart.x = pageX;
24548 toggle.checked = !touchStartChecked;
24549 touchStartChecked = !touchStartChecked;
24550 }
24551 }
24552
24553 function handleTouchEnd() {
24554 if (!isTouched || toggle.disabled) {
24555 if (isScrolling) $el.removeClass('toggle-active-state');
24556 isTouched = false;
24557 return;
24558 }
24559
24560 var inverter = app.rtl ? -1 : 1;
24561 isTouched = false;
24562 $el.removeClass('toggle-active-state');
24563 var changed;
24564
24565 if (now$1() - touchStartTime < 300) {
24566 if (touchesDiff * inverter < 0 && touchStartChecked) {
24567 changed = true;
24568 }
24569
24570 if (touchesDiff * inverter > 0 && !touchStartChecked) {
24571 changed = true;
24572 }
24573
24574 if (changed) {
24575 toggle.checked = !touchStartChecked;
24576 }
24577 }
24578 }
24579
24580 function handleInputChange() {
24581 toggle.$el.trigger('toggle:change');
24582 toggle.emit('local::change toggleChange', toggle);
24583 }
24584
24585 toggle.attachEvents = function attachEvents() {
24586 var passive = support.passiveListener ? {
24587 passive: true
24588 } : false;
24589 $el.on(app.touchEvents.start, handleTouchStart, passive);
24590 app.on('touchmove', handleTouchMove);
24591 app.on('touchend:passive', handleTouchEnd);
24592 toggle.$inputEl.on('change', handleInputChange);
24593 };
24594
24595 toggle.detachEvents = function detachEvents() {
24596 var passive = support.passiveListener ? {
24597 passive: true
24598 } : false;
24599 $el.off(app.touchEvents.start, handleTouchStart, passive);
24600 app.off('touchmove', handleTouchMove);
24601 app.off('touchend:passive', handleTouchEnd);
24602 toggle.$inputEl.off('change', handleInputChange);
24603 }; // Install Modules
24604
24605
24606 toggle.useModules(); // Init
24607
24608 toggle.init();
24609 return _this;
24610 }
24611
24612 var _proto = Toggle.prototype;
24613
24614 _proto.toggle = function toggle() {
24615 var toggle = this;
24616 toggle.checked = !toggle.checked;
24617 };
24618
24619 _proto.init = function init() {
24620 var toggle = this;
24621 toggle.attachEvents();
24622 };
24623
24624 _proto.destroy = function destroy() {
24625 var toggle = this;
24626 toggle.$el.trigger('toggle:beforedestroy');
24627 toggle.emit('local::beforeDestroy toggleBeforeDestroy', toggle);
24628 delete toggle.$el[0].f7Toggle;
24629 toggle.detachEvents();
24630 deleteProps$1(toggle);
24631 toggle = null;
24632 };
24633
24634 return Toggle;
24635 }(Framework7Class);
24636
24637 var Toggle = {
24638 name: 'toggle',
24639 create: function create() {
24640 var app = this;
24641 app.toggle = ConstructorMethods({
24642 defaultSelector: '.toggle',
24643 constructor: Toggle$1,
24644 app: app,
24645 domProp: 'f7Toggle'
24646 });
24647 },
24648 static: {
24649 Toggle: Toggle$1
24650 },
24651 on: {
24652 tabMounted: function tabMounted(tabEl) {
24653 var app = this;
24654 $(tabEl).find('.toggle-init').each(function (toggleEl) {
24655 return app.toggle.create({
24656 el: toggleEl
24657 });
24658 });
24659 },
24660 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24661 $(tabEl).find('.toggle-init').each(function (toggleEl) {
24662 if (toggleEl.f7Toggle) toggleEl.f7Toggle.destroy();
24663 });
24664 },
24665 pageInit: function pageInit(page) {
24666 var app = this;
24667 page.$el.find('.toggle-init').each(function (toggleEl) {
24668 return app.toggle.create({
24669 el: toggleEl
24670 });
24671 });
24672 },
24673 pageBeforeRemove: function pageBeforeRemove(page) {
24674 page.$el.find('.toggle-init').each(function (toggleEl) {
24675 if (toggleEl.f7Toggle) toggleEl.f7Toggle.destroy();
24676 });
24677 }
24678 },
24679 vnode: {
24680 'toggle-init': {
24681 insert: function insert(vnode) {
24682 var app = this;
24683 var toggleEl = vnode.elm;
24684 app.toggle.create({
24685 el: toggleEl
24686 });
24687 },
24688 destroy: function destroy(vnode) {
24689 var toggleEl = vnode.elm;
24690 if (toggleEl.f7Toggle) toggleEl.f7Toggle.destroy();
24691 }
24692 }
24693 }
24694 };
24695
24696 var Range$1 = /*#__PURE__*/function (_Framework7Class) {
24697 _inheritsLoose(Range, _Framework7Class);
24698
24699 function Range(app, params) {
24700 var _this;
24701
24702 _this = _Framework7Class.call(this, params, [app]) || this;
24703
24704 var range = _assertThisInitialized(_this);
24705
24706 var support = getSupport$1();
24707 var defaults = {
24708 el: null,
24709 inputEl: null,
24710 dual: false,
24711 step: 1,
24712 label: false,
24713 min: 0,
24714 max: 100,
24715 value: 0,
24716 draggableBar: true,
24717 vertical: false,
24718 verticalReversed: false,
24719 formatLabel: null,
24720 scale: false,
24721 scaleSteps: 5,
24722 scaleSubSteps: 0,
24723 formatScaleLabel: null,
24724 limitKnobPosition: app.theme === 'ios'
24725 }; // Extend defaults with modules params
24726
24727 range.useModulesParams(defaults);
24728 range.params = extend$1(defaults, params);
24729 var el = range.params.el;
24730 if (!el) return range || _assertThisInitialized(_this);
24731 var $el = $(el);
24732 if ($el.length === 0) return range || _assertThisInitialized(_this);
24733 if ($el[0].f7Range) return $el[0].f7Range || _assertThisInitialized(_this);
24734 var dataset = $el.dataset();
24735 'step min max value scaleSteps scaleSubSteps'.split(' ').forEach(function (paramName) {
24736 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
24737 range.params[paramName] = parseFloat(dataset[paramName]);
24738 }
24739 });
24740 'dual label vertical verticalReversed scale'.split(' ').forEach(function (paramName) {
24741 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
24742 range.params[paramName] = dataset[paramName];
24743 }
24744 });
24745
24746 if (!range.params.value) {
24747 if (typeof dataset.value !== 'undefined') range.params.value = dataset.value;
24748
24749 if (typeof dataset.valueLeft !== 'undefined' && typeof dataset.valueRight !== 'undefined') {
24750 range.params.value = [parseFloat(dataset.valueLeft), parseFloat(dataset.valueRight)];
24751 }
24752 }
24753
24754 var $inputEl;
24755
24756 if (!range.params.dual) {
24757 if (range.params.inputEl) {
24758 $inputEl = $(range.params.inputEl);
24759 } else if ($el.find('input[type="range"]').length) {
24760 $inputEl = $el.find('input[type="range"]').eq(0);
24761 }
24762 }
24763
24764 var _range$params = range.params,
24765 dual = _range$params.dual,
24766 step = _range$params.step,
24767 label = _range$params.label,
24768 min = _range$params.min,
24769 max = _range$params.max,
24770 value = _range$params.value,
24771 vertical = _range$params.vertical,
24772 verticalReversed = _range$params.verticalReversed,
24773 scale = _range$params.scale,
24774 scaleSteps = _range$params.scaleSteps,
24775 scaleSubSteps = _range$params.scaleSubSteps,
24776 limitKnobPosition = _range$params.limitKnobPosition;
24777 extend$1(range, {
24778 app: app,
24779 $el: $el,
24780 el: $el[0],
24781 $inputEl: $inputEl,
24782 inputEl: $inputEl ? $inputEl[0] : undefined,
24783 dual: dual,
24784 step: step,
24785 label: label,
24786 min: min,
24787 max: max,
24788 value: value,
24789 previousValue: value,
24790 vertical: vertical,
24791 verticalReversed: verticalReversed,
24792 scale: scale,
24793 scaleSteps: scaleSteps,
24794 scaleSubSteps: scaleSubSteps,
24795 limitKnobPosition: limitKnobPosition
24796 });
24797
24798 if ($inputEl) {
24799 'step min max'.split(' ').forEach(function (paramName) {
24800 if (!params[paramName] && $inputEl.attr(paramName)) {
24801 range.params[paramName] = parseFloat($inputEl.attr(paramName));
24802 range[paramName] = parseFloat($inputEl.attr(paramName));
24803 }
24804 });
24805
24806 if (typeof $inputEl.val() !== 'undefined') {
24807 range.params.value = parseFloat($inputEl.val());
24808 range.value = parseFloat($inputEl.val());
24809 }
24810 } // Dual
24811
24812
24813 if (range.dual) {
24814 $el.addClass('range-slider-dual');
24815 }
24816
24817 if (range.label) {
24818 $el.addClass('range-slider-label');
24819 } // Vertical
24820
24821
24822 if (range.vertical) {
24823 $el.addClass('range-slider-vertical');
24824
24825 if (range.verticalReversed) {
24826 $el.addClass('range-slider-vertical-reversed');
24827 }
24828 } else {
24829 $el.addClass('range-slider-horizontal');
24830 } // Check for layout
24831
24832
24833 var $barEl = $('<div class="range-bar"></div>');
24834 var $barActiveEl = $('<div class="range-bar-active"></div>');
24835 $barEl.append($barActiveEl); // Create Knobs
24836 // prettier-ignore
24837
24838 var knobHTML = "\n <div class=\"range-knob-wrap\">\n <div class=\"range-knob\"></div>\n " + (range.label ? '<div class="range-knob-label"></div>' : '') + "\n </div>\n ";
24839 var knobs = [$(knobHTML)];
24840
24841 if (range.dual) {
24842 knobs.push($(knobHTML));
24843 }
24844
24845 $el.append($barEl);
24846 knobs.forEach(function ($knobEl) {
24847 $el.append($knobEl);
24848 }); // Labels
24849
24850 var labels = [];
24851
24852 if (range.label) {
24853 labels.push(knobs[0].find('.range-knob-label'));
24854
24855 if (range.dual) {
24856 labels.push(knobs[1].find('.range-knob-label'));
24857 }
24858 } // Scale
24859
24860
24861 var $scaleEl;
24862
24863 if (range.scale && range.scaleSteps >= 1) {
24864 $scaleEl = $("\n <div class=\"range-scale\">\n " + range.renderScale() + "\n </div>\n ");
24865 $el.append($scaleEl);
24866 }
24867
24868 extend$1(range, {
24869 knobs: knobs,
24870 labels: labels,
24871 $barEl: $barEl,
24872 $barActiveEl: $barActiveEl,
24873 $scaleEl: $scaleEl
24874 });
24875 $el[0].f7Range = range; // Touch Events
24876
24877 var isTouched;
24878 var touchesStart = {};
24879 var isScrolling;
24880 var rangeOffset;
24881 var rangeOffsetLeft;
24882 var rangeOffsetTop;
24883 var $touchedKnobEl;
24884 var dualValueIndex;
24885 var valueChangedByTouch;
24886 var targetTouchIdentifier;
24887
24888 function onTouchChange() {
24889 valueChangedByTouch = true;
24890 }
24891
24892 function handleTouchStart(e) {
24893 if (isTouched) return;
24894
24895 if (!range.params.draggableBar) {
24896 if ($(e.target).closest('.range-knob').length === 0) {
24897 return;
24898 }
24899 }
24900
24901 valueChangedByTouch = false;
24902 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
24903 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
24904
24905 if (e.type === 'touchstart') {
24906 targetTouchIdentifier = e.targetTouches[0].identifier;
24907 }
24908
24909 isTouched = true;
24910 isScrolling = undefined;
24911 rangeOffset = $el.offset();
24912 rangeOffsetLeft = rangeOffset.left;
24913 rangeOffsetTop = rangeOffset.top;
24914 var progress;
24915
24916 if (range.vertical) {
24917 progress = (touchesStart.y - rangeOffsetTop) / range.rangeHeight;
24918 if (!range.verticalReversed) progress = 1 - progress;
24919 } else if (range.app.rtl) {
24920 progress = (rangeOffsetLeft + range.rangeWidth - touchesStart.x) / range.rangeWidth;
24921 } else {
24922 progress = (touchesStart.x - rangeOffsetLeft) / range.rangeWidth;
24923 }
24924
24925 var newValue = progress * (range.max - range.min) + range.min;
24926
24927 if (range.dual) {
24928 if (Math.abs(range.value[0] - newValue) < Math.abs(range.value[1] - newValue)) {
24929 dualValueIndex = 0;
24930 $touchedKnobEl = range.knobs[0];
24931 newValue = [newValue, range.value[1]];
24932 } else {
24933 dualValueIndex = 1;
24934 $touchedKnobEl = range.knobs[1];
24935 newValue = [range.value[0], newValue];
24936 }
24937 } else {
24938 $touchedKnobEl = range.knobs[0];
24939 newValue = progress * (range.max - range.min) + range.min;
24940 }
24941
24942 nextTick$1(function () {
24943 if (isTouched) $touchedKnobEl.addClass('range-knob-active-state');
24944 }, 70);
24945 range.on('change', onTouchChange);
24946 range.setValue(newValue, true);
24947 }
24948
24949 function handleTouchMove(e) {
24950 if (!isTouched) return;
24951 var pageX;
24952 var pageY;
24953
24954 if (e.type === 'touchmove') {
24955 for (var i = 0; i < e.targetTouches.length; i += 1) {
24956 if (e.targetTouches[i].identifier === targetTouchIdentifier) {
24957 pageX = e.targetTouches[i].pageX;
24958 pageY = e.targetTouches[i].pageY;
24959 }
24960 }
24961 } else {
24962 pageX = e.pageX;
24963 pageY = e.pageY;
24964 }
24965
24966 if (typeof pageX === 'undefined' && typeof pageY === 'undefined') return;
24967
24968 if (typeof isScrolling === 'undefined' && !range.vertical) {
24969 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
24970 }
24971
24972 if (isScrolling) {
24973 isTouched = false;
24974 return;
24975 }
24976
24977 e.preventDefault();
24978 var progress;
24979
24980 if (range.vertical) {
24981 progress = (pageY - rangeOffsetTop) / range.rangeHeight;
24982 if (!range.verticalReversed) progress = 1 - progress;
24983 } else if (range.app.rtl) {
24984 progress = (rangeOffsetLeft + range.rangeWidth - pageX) / range.rangeWidth;
24985 } else {
24986 progress = (pageX - rangeOffsetLeft) / range.rangeWidth;
24987 }
24988
24989 var newValue = progress * (range.max - range.min) + range.min;
24990
24991 if (range.dual) {
24992 var leftValue;
24993 var rightValue;
24994
24995 if (dualValueIndex === 0) {
24996 leftValue = newValue;
24997 rightValue = range.value[1];
24998
24999 if (leftValue > rightValue) {
25000 rightValue = leftValue;
25001 }
25002 } else {
25003 leftValue = range.value[0];
25004 rightValue = newValue;
25005
25006 if (rightValue < leftValue) {
25007 leftValue = rightValue;
25008 }
25009 }
25010
25011 newValue = [leftValue, rightValue];
25012 }
25013
25014 range.setValue(newValue, true);
25015 }
25016
25017 function handleTouchEnd(e) {
25018 if (e.type === 'touchend') {
25019 var touchEnded;
25020
25021 for (var i = 0; i < e.changedTouches.length; i += 1) {
25022 if (e.changedTouches[i].identifier === targetTouchIdentifier) touchEnded = true;
25023 }
25024
25025 if (!touchEnded) return;
25026 }
25027
25028 if (!isTouched) {
25029 if (isScrolling) $touchedKnobEl.removeClass('range-knob-active-state');
25030 isTouched = false;
25031 return;
25032 }
25033
25034 range.off('change', onTouchChange);
25035 isTouched = false;
25036 $touchedKnobEl.removeClass('range-knob-active-state');
25037
25038 if (valueChangedByTouch && range.$inputEl && !range.dual) {
25039 range.$inputEl.trigger('change');
25040 }
25041
25042 valueChangedByTouch = false;
25043
25044 if (typeof range.previousValue !== 'undefined') {
25045 if (range.dual && (range.previousValue[0] !== range.value[0] || range.previousValue[1] !== range.value[1]) || !range.dual && range.previousValue !== range.value) {
25046 range.$el.trigger('range:changed', range.value);
25047 range.emit('local::changed rangeChanged', range, range.value);
25048 }
25049 }
25050 }
25051
25052 function handleResize() {
25053 range.calcSize();
25054 range.layout();
25055 }
25056
25057 var parentModals;
25058 var parentPanel;
25059 var parentPage;
25060
25061 range.attachEvents = function attachEvents() {
25062 var passive = support.passiveListener ? {
25063 passive: true
25064 } : false;
25065 range.$el.on(app.touchEvents.start, handleTouchStart, passive);
25066 app.on('touchmove', handleTouchMove);
25067 app.on('touchend:passive', handleTouchEnd);
25068 app.on('tabShow', handleResize);
25069 app.on('resize', handleResize);
25070 parentModals = range.$el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast');
25071 parentModals.on('modal:open', handleResize);
25072 parentPanel = range.$el.parents('.panel');
25073 parentPanel.on('panel:open panel:resize', handleResize);
25074 parentPage = range.$el.parents('.page').eq(0);
25075 parentPage.on('page:reinit', handleResize);
25076 };
25077
25078 range.detachEvents = function detachEvents() {
25079 var passive = support.passiveListener ? {
25080 passive: true
25081 } : false;
25082 range.$el.off(app.touchEvents.start, handleTouchStart, passive);
25083 app.off('touchmove', handleTouchMove);
25084 app.off('touchend:passive', handleTouchEnd);
25085 app.off('tabShow', handleResize);
25086 app.off('resize', handleResize);
25087
25088 if (parentModals) {
25089 parentModals.off('modal:open', handleResize);
25090 }
25091
25092 if (parentPanel) {
25093 parentPanel.off('panel:open panel:resize', handleResize);
25094 }
25095
25096 if (parentPage) {
25097 parentPage.off('page:reinit', handleResize);
25098 }
25099
25100 parentModals = null;
25101 parentPanel = null;
25102 parentPage = null;
25103 }; // Install Modules
25104
25105
25106 range.useModules(); // Init
25107
25108 range.init();
25109 return range || _assertThisInitialized(_this);
25110 }
25111
25112 var _proto = Range.prototype;
25113
25114 _proto.calcSize = function calcSize() {
25115 var range = this;
25116
25117 if (range.vertical) {
25118 var height = range.$el.outerHeight();
25119 if (height === 0) return;
25120 range.rangeHeight = height;
25121 range.knobHeight = range.knobs[0].outerHeight();
25122 } else {
25123 var width = range.$el.outerWidth();
25124 if (width === 0) return;
25125 range.rangeWidth = width;
25126 range.knobWidth = range.knobs[0].outerWidth();
25127 }
25128 };
25129
25130 _proto.layout = function layout() {
25131 var range = this;
25132 var app = range.app,
25133 knobWidth = range.knobWidth,
25134 knobHeight = range.knobHeight,
25135 rangeWidth = range.rangeWidth,
25136 rangeHeight = range.rangeHeight,
25137 min = range.min,
25138 max = range.max,
25139 knobs = range.knobs,
25140 $barActiveEl = range.$barActiveEl,
25141 value = range.value,
25142 label = range.label,
25143 labels = range.labels,
25144 vertical = range.vertical,
25145 verticalReversed = range.verticalReversed,
25146 limitKnobPosition = range.limitKnobPosition;
25147 var knobSize = vertical ? knobHeight : knobWidth;
25148 var rangeSize = vertical ? rangeHeight : rangeWidth; // eslint-disable-next-line
25149
25150 var positionProperty = vertical ? verticalReversed ? 'top' : 'bottom' : app.rtl ? 'right' : 'left';
25151
25152 if (range.dual) {
25153 var _$barActiveEl$css;
25154
25155 var progress = [(value[0] - min) / (max - min), (value[1] - min) / (max - min)];
25156 $barActiveEl.css((_$barActiveEl$css = {}, _$barActiveEl$css[positionProperty] = progress[0] * 100 + "%", _$barActiveEl$css[vertical ? 'height' : 'width'] = (progress[1] - progress[0]) * 100 + "%", _$barActiveEl$css));
25157 knobs.forEach(function ($knobEl, knobIndex) {
25158 var startPos = rangeSize * progress[knobIndex];
25159
25160 if (limitKnobPosition) {
25161 var realStartPos = rangeSize * progress[knobIndex] - knobSize / 2;
25162 if (realStartPos < 0) startPos = knobSize / 2;
25163 if (realStartPos + knobSize > rangeSize) startPos = rangeSize - knobSize / 2;
25164 }
25165
25166 $knobEl.css(positionProperty, startPos + "px");
25167 if (label) labels[knobIndex].text(range.formatLabel(value[knobIndex], labels[knobIndex][0]));
25168 });
25169 } else {
25170 var _progress = (value - min) / (max - min);
25171
25172 $barActiveEl.css(vertical ? 'height' : 'width', _progress * 100 + "%");
25173 var startPos = rangeSize * _progress;
25174
25175 if (limitKnobPosition) {
25176 var realStartPos = rangeSize * _progress - knobSize / 2;
25177 if (realStartPos < 0) startPos = knobSize / 2;
25178 if (realStartPos + knobSize > rangeSize) startPos = rangeSize - knobSize / 2;
25179 }
25180
25181 knobs[0].css(positionProperty, startPos + "px");
25182 if (label) labels[0].text(range.formatLabel(value, labels[0][0]));
25183 }
25184
25185 if (range.dual && value.indexOf(min) >= 0 || !range.dual && value === min) {
25186 range.$el.addClass('range-slider-min');
25187 } else {
25188 range.$el.removeClass('range-slider-min');
25189 }
25190
25191 if (range.dual && value.indexOf(max) >= 0 || !range.dual && value === max) {
25192 range.$el.addClass('range-slider-max');
25193 } else {
25194 range.$el.removeClass('range-slider-max');
25195 }
25196 };
25197
25198 _proto.setValue = function setValue(newValue, byTouchMove) {
25199 var range = this;
25200 var step = range.step,
25201 min = range.min,
25202 max = range.max;
25203 var valueChanged;
25204 var oldValue;
25205
25206 if (range.dual) {
25207 oldValue = [range.value[0], range.value[1]];
25208 var newValues = newValue;
25209 if (!Array.isArray(newValues)) newValues = [newValue, newValue];
25210
25211 if (newValue[0] > newValue[1]) {
25212 newValues = [newValues[0], newValues[0]];
25213 }
25214
25215 newValues = newValues.map(function (value) {
25216 return Math.max(Math.min(Math.round(value / step) * step, max), min);
25217 });
25218
25219 if (newValues[0] === range.value[0] && newValues[1] === range.value[1]) {
25220 return range;
25221 }
25222
25223 newValues.forEach(function (value, valueIndex) {
25224 range.value[valueIndex] = value;
25225 });
25226 valueChanged = oldValue[0] !== newValues[0] || oldValue[1] !== newValues[1];
25227 range.layout();
25228 } else {
25229 oldValue = range.value;
25230 var value = Math.max(Math.min(Math.round(newValue / step) * step, max), min);
25231 range.value = value;
25232 range.layout();
25233 valueChanged = oldValue !== value;
25234 }
25235
25236 if (valueChanged) {
25237 range.previousValue = oldValue;
25238 } // Events
25239
25240
25241 if (!valueChanged) return range;
25242 range.$el.trigger('range:change', range.value);
25243
25244 if (range.$inputEl && !range.dual) {
25245 range.$inputEl.val(range.value);
25246
25247 if (!byTouchMove) {
25248 range.$inputEl.trigger('input change');
25249 } else {
25250 range.$inputEl.trigger('input');
25251 }
25252 }
25253
25254 if (!byTouchMove) {
25255 range.$el.trigger('range:changed', range.value);
25256 range.emit('local::changed rangeChanged', range, range.value);
25257 }
25258
25259 range.emit('local::change rangeChange', range, range.value);
25260 return range;
25261 };
25262
25263 _proto.getValue = function getValue() {
25264 return this.value;
25265 };
25266
25267 _proto.formatLabel = function formatLabel(value, labelEl) {
25268 var range = this;
25269 if (range.params.formatLabel) return range.params.formatLabel.call(range, value, labelEl);
25270 return value;
25271 };
25272
25273 _proto.formatScaleLabel = function formatScaleLabel(value) {
25274 var range = this;
25275 if (range.params.formatScaleLabel) return range.params.formatScaleLabel.call(range, value);
25276 return value;
25277 };
25278
25279 _proto.renderScale = function renderScale() {
25280 var range = this;
25281 var app = range.app,
25282 verticalReversed = range.verticalReversed,
25283 vertical = range.vertical; // eslint-disable-next-line
25284
25285 var positionProperty = vertical ? verticalReversed ? 'top' : 'bottom' : app.rtl ? 'right' : 'left';
25286 var html = '';
25287 Array.from({
25288 length: range.scaleSteps + 1
25289 }).forEach(function (scaleEl, index) {
25290 var scaleStepValue = (range.max - range.min) / range.scaleSteps;
25291 var scaleValue = range.min + scaleStepValue * index;
25292 var progress = (scaleValue - range.min) / (range.max - range.min);
25293 html += "<div class=\"range-scale-step\" style=\"" + positionProperty + ": " + progress * 100 + "%\">" + range.formatScaleLabel(scaleValue) + "</div>";
25294
25295 if (range.scaleSubSteps && range.scaleSubSteps > 1 && index < range.scaleSteps) {
25296 Array.from({
25297 length: range.scaleSubSteps - 1
25298 }).forEach(function (subStepEl, subIndex) {
25299 var subStep = scaleStepValue / range.scaleSubSteps;
25300 var scaleSubValue = scaleValue + subStep * (subIndex + 1);
25301 var subProgress = (scaleSubValue - range.min) / (range.max - range.min);
25302 html += "<div class=\"range-scale-step range-scale-substep\" style=\"" + positionProperty + ": " + subProgress * 100 + "%\"></div>";
25303 });
25304 }
25305 });
25306 return html;
25307 };
25308
25309 _proto.updateScale = function updateScale() {
25310 var range = this;
25311
25312 if (!range.scale || range.scaleSteps < 1) {
25313 if (range.$scaleEl) range.$scaleEl.remove();
25314 delete range.$scaleEl;
25315 return;
25316 }
25317
25318 if (!range.$scaleEl) {
25319 range.$scaleEl = $('<div class="range-scale"></div>');
25320 range.$el.append(range.$scaleEl);
25321 }
25322
25323 range.$scaleEl.html(range.renderScale());
25324 };
25325
25326 _proto.init = function init() {
25327 var range = this;
25328 range.calcSize();
25329 range.layout();
25330 range.attachEvents();
25331 return range;
25332 };
25333
25334 _proto.destroy = function destroy() {
25335 var range = this;
25336 range.$el.trigger('range:beforedestroy');
25337 range.emit('local::beforeDestroy rangeBeforeDestroy', range);
25338 delete range.$el[0].f7Range;
25339 range.detachEvents();
25340 deleteProps$1(range);
25341 range = null;
25342 };
25343
25344 return Range;
25345 }(Framework7Class);
25346
25347 var Range = {
25348 name: 'range',
25349 create: function create() {
25350 var app = this;
25351 app.range = extend$1(ConstructorMethods({
25352 defaultSelector: '.range-slider',
25353 constructor: Range$1,
25354 app: app,
25355 domProp: 'f7Range'
25356 }), {
25357 getValue: function getValue(el) {
25358 if (el === void 0) {
25359 el = '.range-slider';
25360 }
25361
25362 var range = app.range.get(el);
25363 if (range) return range.getValue();
25364 return undefined;
25365 },
25366 setValue: function setValue(el, value) {
25367 if (el === void 0) {
25368 el = '.range-slider';
25369 }
25370
25371 var range = app.range.get(el);
25372 if (range) return range.setValue(value);
25373 return undefined;
25374 }
25375 });
25376 },
25377 static: {
25378 Range: Range$1
25379 },
25380 on: {
25381 tabMounted: function tabMounted(tabEl) {
25382 var app = this;
25383 $(tabEl).find('.range-slider-init').each(function (rangeEl) {
25384 return new Range$1(app, {
25385 el: rangeEl
25386 });
25387 });
25388 },
25389 tabBeforeRemove: function tabBeforeRemove(tabEl) {
25390 $(tabEl).find('.range-slider-init').each(function (rangeEl) {
25391 if (rangeEl.f7Range) rangeEl.f7Range.destroy();
25392 });
25393 },
25394 pageInit: function pageInit(page) {
25395 var app = this;
25396 page.$el.find('.range-slider-init').each(function (rangeEl) {
25397 return new Range$1(app, {
25398 el: rangeEl
25399 });
25400 });
25401 },
25402 pageBeforeRemove: function pageBeforeRemove(page) {
25403 page.$el.find('.range-slider-init').each(function (rangeEl) {
25404 if (rangeEl.f7Range) rangeEl.f7Range.destroy();
25405 });
25406 }
25407 },
25408 vnode: {
25409 'range-slider-init': {
25410 insert: function insert(vnode) {
25411 var rangeEl = vnode.elm;
25412 var app = this;
25413 app.range.create({
25414 el: rangeEl
25415 });
25416 },
25417 destroy: function destroy(vnode) {
25418 var rangeEl = vnode.elm;
25419 if (rangeEl.f7Range) rangeEl.f7Range.destroy();
25420 }
25421 }
25422 }
25423 };
25424
25425 var Stepper$1 = /*#__PURE__*/function (_Framework7Class) {
25426 _inheritsLoose(Stepper, _Framework7Class);
25427
25428 function Stepper(app, params) {
25429 var _this;
25430
25431 _this = _Framework7Class.call(this, params, [app]) || this;
25432
25433 var stepper = _assertThisInitialized(_this);
25434
25435 var defaults = {
25436 el: null,
25437 inputEl: null,
25438 valueEl: null,
25439 value: 0,
25440 formatValue: null,
25441 step: 1,
25442 min: 0,
25443 max: 100,
25444 watchInput: true,
25445 autorepeat: false,
25446 autorepeatDynamic: false,
25447 wraps: false,
25448 manualInputMode: false,
25449 decimalPoint: 4,
25450 buttonsEndInputMode: true
25451 }; // Extend defaults with modules params
25452
25453 stepper.useModulesParams(defaults);
25454 stepper.params = extend$1(defaults, params);
25455
25456 if (stepper.params.value < stepper.params.min) {
25457 stepper.params.value = stepper.params.min;
25458 }
25459
25460 if (stepper.params.value > stepper.params.max) {
25461 stepper.params.value = stepper.params.max;
25462 }
25463
25464 var el = stepper.params.el;
25465 if (!el) return stepper || _assertThisInitialized(_this);
25466 var $el = $(el);
25467 if ($el.length === 0) return stepper || _assertThisInitialized(_this);
25468 if ($el[0].f7Stepper) return $el[0].f7Stepper || _assertThisInitialized(_this);
25469 var $inputEl;
25470
25471 if (stepper.params.inputEl) {
25472 $inputEl = $(stepper.params.inputEl);
25473 } else if ($el.find('.stepper-input-wrap').find('input, textarea').length) {
25474 $inputEl = $el.find('.stepper-input-wrap').find('input, textarea').eq(0);
25475 }
25476
25477 if ($inputEl && $inputEl.length) {
25478 'step min max'.split(' ').forEach(function (paramName) {
25479 if (!params[paramName] && $inputEl.attr(paramName)) {
25480 stepper.params[paramName] = parseFloat($inputEl.attr(paramName));
25481 }
25482 });
25483
25484 var _decimalPoint = parseInt(stepper.params.decimalPoint, 10);
25485
25486 if (Number.isNaN(_decimalPoint)) {
25487 stepper.params.decimalPoint = 0;
25488 } else {
25489 stepper.params.decimalPoint = _decimalPoint;
25490 }
25491
25492 var inputValue = parseFloat($inputEl.val());
25493
25494 if (typeof params.value === 'undefined' && !Number.isNaN(inputValue) && (inputValue || inputValue === 0)) {
25495 stepper.params.value = inputValue;
25496 }
25497 }
25498
25499 var $valueEl;
25500
25501 if (stepper.params.valueEl) {
25502 $valueEl = $(stepper.params.valueEl);
25503 } else if ($el.find('.stepper-value').length) {
25504 $valueEl = $el.find('.stepper-value').eq(0);
25505 }
25506
25507 var $buttonPlusEl = $el.find('.stepper-button-plus');
25508 var $buttonMinusEl = $el.find('.stepper-button-minus');
25509 var _stepper$params = stepper.params,
25510 step = _stepper$params.step,
25511 min = _stepper$params.min,
25512 max = _stepper$params.max,
25513 value = _stepper$params.value,
25514 decimalPoint = _stepper$params.decimalPoint;
25515 extend$1(stepper, {
25516 app: app,
25517 $el: $el,
25518 el: $el[0],
25519 $buttonPlusEl: $buttonPlusEl,
25520 buttonPlusEl: $buttonPlusEl[0],
25521 $buttonMinusEl: $buttonMinusEl,
25522 buttonMinusEl: $buttonMinusEl[0],
25523 $inputEl: $inputEl,
25524 inputEl: $inputEl ? $inputEl[0] : undefined,
25525 $valueEl: $valueEl,
25526 valueEl: $valueEl ? $valueEl[0] : undefined,
25527 step: step,
25528 min: min,
25529 max: max,
25530 value: value,
25531 decimalPoint: decimalPoint,
25532 typeModeChanged: false
25533 });
25534 $el[0].f7Stepper = stepper; // Handle Events
25535
25536 var touchesStart = {};
25537 var isTouched;
25538 var isScrolling;
25539 var preventButtonClick;
25540 var intervalId;
25541 var timeoutId;
25542 var autorepeatAction = null;
25543 var autorepeatInAction = false;
25544 var manualInput = false;
25545
25546 function dynamicRepeat(current, progressions, startsIn, progressionStep, repeatEvery, action) {
25547 clearTimeout(timeoutId);
25548 timeoutId = setTimeout(function () {
25549 if (current === 1) {
25550 preventButtonClick = true;
25551 autorepeatInAction = true;
25552 }
25553
25554 clearInterval(intervalId);
25555 action();
25556 intervalId = setInterval(function () {
25557 action();
25558 }, repeatEvery);
25559
25560 if (current < progressions) {
25561 dynamicRepeat(current + 1, progressions, startsIn, progressionStep, repeatEvery / 2, action);
25562 }
25563 }, current === 1 ? startsIn : progressionStep);
25564 }
25565
25566 function onTouchStart(e) {
25567 if (isTouched) return;
25568
25569 if (manualInput) {
25570 return;
25571 }
25572
25573 if ($(e.target).closest($buttonPlusEl).length) {
25574 autorepeatAction = 'increment';
25575 } else if ($(e.target).closest($buttonMinusEl).length) {
25576 autorepeatAction = 'decrement';
25577 }
25578
25579 if (!autorepeatAction) return;
25580 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
25581 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
25582 isTouched = true;
25583 isScrolling = undefined;
25584 var progressions = stepper.params.autorepeatDynamic ? 4 : 1;
25585 dynamicRepeat(1, progressions, 500, 1000, 300, function () {
25586 stepper[autorepeatAction]();
25587 });
25588 }
25589
25590 function onTouchMove(e) {
25591 if (!isTouched) return;
25592
25593 if (manualInput) {
25594 return;
25595 }
25596
25597 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
25598 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
25599
25600 if (typeof isScrolling === 'undefined' && !autorepeatInAction) {
25601 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
25602 }
25603
25604 var distance = Math.pow(Math.pow(pageX - touchesStart.x, 2) + Math.pow(pageY - touchesStart.y, 2), 0.5);
25605
25606 if (isScrolling || distance > 20) {
25607 isTouched = false;
25608 clearTimeout(timeoutId);
25609 clearInterval(intervalId);
25610 }
25611 }
25612
25613 function onTouchEnd() {
25614 clearTimeout(timeoutId);
25615 clearInterval(intervalId);
25616 autorepeatAction = null;
25617 autorepeatInAction = false;
25618 isTouched = false;
25619 }
25620
25621 function onMinusClick() {
25622 if (manualInput) {
25623 if (stepper.params.buttonsEndInputMode) {
25624 manualInput = false;
25625 stepper.endTypeMode(true);
25626 }
25627
25628 return;
25629 }
25630
25631 if (preventButtonClick) {
25632 preventButtonClick = false;
25633 return;
25634 }
25635
25636 stepper.decrement(true);
25637 }
25638
25639 function onPlusClick() {
25640 if (manualInput) {
25641 if (stepper.params.buttonsEndInputMode) {
25642 manualInput = false;
25643 stepper.endTypeMode(true);
25644 }
25645
25646 return;
25647 }
25648
25649 if (preventButtonClick) {
25650 preventButtonClick = false;
25651 return;
25652 }
25653
25654 stepper.increment(true);
25655 }
25656
25657 function onInputClick(e) {
25658 if (!e.target.readOnly && stepper.params.manualInputMode) {
25659 manualInput = true;
25660
25661 if (typeof e.target.selectionStart === 'number') {
25662 e.target.selectionStart = e.target.value.length;
25663 e.target.selectionEnd = e.target.value.length;
25664 }
25665 }
25666 }
25667
25668 function onInputKey(e) {
25669 if (e.keyCode === 13 || e.which === 13) {
25670 e.preventDefault();
25671 manualInput = false;
25672 stepper.endTypeMode();
25673 }
25674 }
25675
25676 function onInputBlur() {
25677 manualInput = false;
25678 stepper.endTypeMode(true);
25679 }
25680
25681 function onInput(e) {
25682 if (manualInput) {
25683 stepper.typeValue(e.target.value);
25684 return;
25685 }
25686
25687 if (e.detail && e.detail.sentByF7Stepper) return;
25688 stepper.setValue(e.target.value, true);
25689 }
25690
25691 stepper.attachEvents = function attachEvents() {
25692 $buttonMinusEl.on('click', onMinusClick);
25693 $buttonPlusEl.on('click', onPlusClick);
25694
25695 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
25696 $inputEl.on('input', onInput);
25697 $inputEl.on('click', onInputClick);
25698 $inputEl.on('blur', onInputBlur);
25699 $inputEl.on('keyup', onInputKey);
25700 }
25701
25702 if (stepper.params.autorepeat) {
25703 app.on('touchstart:passive', onTouchStart);
25704 app.on('touchmove:active', onTouchMove);
25705 app.on('touchend:passive', onTouchEnd);
25706 }
25707 };
25708
25709 stepper.detachEvents = function detachEvents() {
25710 $buttonMinusEl.off('click', onMinusClick);
25711 $buttonPlusEl.off('click', onPlusClick);
25712
25713 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
25714 $inputEl.off('input', onInput);
25715 $inputEl.off('click', onInputClick);
25716 $inputEl.off('blur', onInputBlur);
25717 $inputEl.off('keyup', onInputKey);
25718 }
25719 }; // Install Modules
25720
25721
25722 stepper.useModules(); // Init
25723
25724 stepper.init();
25725 return stepper || _assertThisInitialized(_this);
25726 }
25727
25728 var _proto = Stepper.prototype;
25729
25730 _proto.minus = function minus() {
25731 return this.decrement();
25732 };
25733
25734 _proto.plus = function plus() {
25735 return this.increment();
25736 };
25737
25738 _proto.decrement = function decrement() {
25739 var stepper = this;
25740 return stepper.setValue(stepper.value - stepper.step, false, true);
25741 };
25742
25743 _proto.increment = function increment() {
25744 var stepper = this;
25745 return stepper.setValue(stepper.value + stepper.step, false, true);
25746 };
25747
25748 _proto.setValue = function setValue(newValue, forceUpdate, withWraps) {
25749 var stepper = this;
25750 var step = stepper.step,
25751 min = stepper.min,
25752 max = stepper.max;
25753 var oldValue = stepper.value;
25754 var value = Math.round(newValue / step) * step;
25755
25756 if (stepper.params.wraps && withWraps) {
25757 if (value > max) value = min;
25758 if (value < min) value = max;
25759 } else {
25760 value = Math.max(Math.min(value, max), min);
25761 }
25762
25763 if (Number.isNaN(value)) {
25764 value = oldValue;
25765 }
25766
25767 stepper.value = value;
25768 var valueChanged = oldValue !== value; // Events
25769
25770 if (!valueChanged && !forceUpdate) return stepper;
25771 stepper.$el.trigger('stepper:change', stepper.value);
25772 var formattedValue = stepper.formatValue(stepper.value);
25773
25774 if (stepper.$inputEl && stepper.$inputEl.length) {
25775 stepper.$inputEl.val(formattedValue);
25776 stepper.$inputEl.trigger('input change', {
25777 sentByF7Stepper: true
25778 });
25779 }
25780
25781 if (stepper.$valueEl && stepper.$valueEl.length) {
25782 stepper.$valueEl.html(formattedValue);
25783 }
25784
25785 stepper.emit('local::change stepperChange', stepper, stepper.value);
25786 return stepper;
25787 };
25788
25789 _proto.endTypeMode = function endTypeMode(noBlur) {
25790 var stepper = this;
25791 var min = stepper.min,
25792 max = stepper.max;
25793 var value = parseFloat(stepper.value);
25794 if (Number.isNaN(value)) value = 0;
25795 value = Math.max(Math.min(value, max), min);
25796 stepper.value = value;
25797
25798 if (!stepper.typeModeChanged) {
25799 if (stepper.$inputEl && stepper.$inputEl.length && !noBlur) {
25800 stepper.$inputEl.blur();
25801 }
25802
25803 return stepper;
25804 }
25805
25806 stepper.typeModeChanged = false;
25807 stepper.$el.trigger('stepper:change', stepper.value);
25808 var formattedValue = stepper.formatValue(stepper.value);
25809
25810 if (stepper.$inputEl && stepper.$inputEl.length) {
25811 stepper.$inputEl.val(formattedValue);
25812 stepper.$inputEl.trigger('input change', {
25813 sentByF7Stepper: true
25814 });
25815 if (!noBlur) stepper.$inputEl.blur();
25816 }
25817
25818 if (stepper.$valueEl && stepper.$valueEl.length) {
25819 stepper.$valueEl.html(formattedValue);
25820 }
25821
25822 stepper.emit('local::change stepperChange', stepper, stepper.value);
25823 return stepper;
25824 };
25825
25826 _proto.typeValue = function typeValue(value) {
25827 var stepper = this;
25828 stepper.typeModeChanged = true;
25829 var inputTxt = String(value);
25830
25831 if (inputTxt.lastIndexOf('.') + 1 === inputTxt.length || inputTxt.lastIndexOf(',') + 1 === inputTxt.length) {
25832 if (inputTxt.lastIndexOf('.') !== inputTxt.indexOf('.') || inputTxt.lastIndexOf(',') !== inputTxt.indexOf(',')) {
25833 inputTxt = inputTxt.slice(0, -1);
25834 stepper.value = inputTxt;
25835 stepper.$inputEl.val(stepper.value);
25836 return stepper;
25837 }
25838 } else {
25839 var newValue = parseFloat(inputTxt.replace(',', '.'));
25840
25841 if (newValue === 0) {
25842 stepper.value = inputTxt.replace(',', '.');
25843 stepper.$inputEl.val(stepper.value);
25844 return stepper;
25845 }
25846
25847 if (Number.isNaN(newValue)) {
25848 stepper.value = 0;
25849 stepper.$inputEl.val(stepper.value);
25850 return stepper;
25851 }
25852
25853 var powVal = Math.pow(10, stepper.params.decimalPoint);
25854 newValue = Math.round(newValue * powVal).toFixed(stepper.params.decimalPoint + 1) / powVal;
25855 stepper.value = parseFloat(String(newValue).replace(',', '.'));
25856 stepper.$inputEl.val(stepper.value);
25857 return stepper;
25858 }
25859
25860 stepper.value = inputTxt;
25861 stepper.$inputEl.val(inputTxt);
25862 return stepper;
25863 };
25864
25865 _proto.getValue = function getValue() {
25866 return this.value;
25867 };
25868
25869 _proto.formatValue = function formatValue(value) {
25870 var stepper = this;
25871 if (!stepper.params.formatValue) return value;
25872 return stepper.params.formatValue.call(stepper, value);
25873 };
25874
25875 _proto.init = function init() {
25876 var stepper = this;
25877 stepper.attachEvents();
25878
25879 if (stepper.$valueEl && stepper.$valueEl.length) {
25880 var formattedValue = stepper.formatValue(stepper.value);
25881 stepper.$valueEl.html(formattedValue);
25882 }
25883
25884 return stepper;
25885 };
25886
25887 _proto.destroy = function destroy() {
25888 var stepper = this;
25889 stepper.$el.trigger('stepper:beforedestroy');
25890 stepper.emit('local::beforeDestroy stepperBeforeDestroy', stepper);
25891 delete stepper.$el[0].f7Stepper;
25892 stepper.detachEvents();
25893 deleteProps$1(stepper);
25894 stepper = null;
25895 };
25896
25897 return Stepper;
25898 }(Framework7Class);
25899
25900 var Stepper = {
25901 name: 'stepper',
25902 create: function create() {
25903 var app = this;
25904 app.stepper = extend$1(ConstructorMethods({
25905 defaultSelector: '.stepper',
25906 constructor: Stepper$1,
25907 app: app,
25908 domProp: 'f7Stepper'
25909 }), {
25910 getValue: function getValue(el) {
25911 if (el === void 0) {
25912 el = '.stepper';
25913 }
25914
25915 var stepper = app.stepper.get(el);
25916 if (stepper) return stepper.getValue();
25917 return undefined;
25918 },
25919 setValue: function setValue(el, value) {
25920 if (el === void 0) {
25921 el = '.stepper';
25922 }
25923
25924 var stepper = app.stepper.get(el);
25925 if (stepper) return stepper.setValue(value);
25926 return undefined;
25927 }
25928 });
25929 },
25930 static: {
25931 Stepper: Stepper$1
25932 },
25933 on: {
25934 tabMounted: function tabMounted(tabEl) {
25935 var app = this;
25936 $(tabEl).find('.stepper-init').each(function (stepperEl) {
25937 var dataset = $(stepperEl).dataset();
25938 app.stepper.create(extend$1({
25939 el: stepperEl
25940 }, dataset || {}));
25941 });
25942 },
25943 tabBeforeRemove: function tabBeforeRemove(tabEl) {
25944 $(tabEl).find('.stepper-init').each(function (stepperEl) {
25945 if (stepperEl.f7Stepper) stepperEl.f7Stepper.destroy();
25946 });
25947 },
25948 pageInit: function pageInit(page) {
25949 var app = this;
25950 page.$el.find('.stepper-init').each(function (stepperEl) {
25951 var dataset = $(stepperEl).dataset();
25952 app.stepper.create(extend$1({
25953 el: stepperEl
25954 }, dataset || {}));
25955 });
25956 },
25957 pageBeforeRemove: function pageBeforeRemove(page) {
25958 page.$el.find('.stepper-init').each(function (stepperEl) {
25959 if (stepperEl.f7Stepper) stepperEl.f7Stepper.destroy();
25960 });
25961 }
25962 },
25963 vnode: {
25964 'stepper-init': {
25965 insert: function insert(vnode) {
25966 var app = this;
25967 var stepperEl = vnode.elm;
25968 var dataset = $(stepperEl).dataset();
25969 app.stepper.create(extend$1({
25970 el: stepperEl
25971 }, dataset || {}));
25972 },
25973 destroy: function destroy(vnode) {
25974 var stepperEl = vnode.elm;
25975 if (stepperEl.f7Stepper) stepperEl.f7Stepper.destroy();
25976 }
25977 }
25978 }
25979 };
25980
25981 var SmartSelect$1 = /*#__PURE__*/function (_Framework7Class) {
25982 _inheritsLoose(SmartSelect, _Framework7Class);
25983
25984 function SmartSelect(app, params) {
25985 var _this;
25986
25987 if (params === void 0) {
25988 params = {};
25989 }
25990
25991 _this = _Framework7Class.call(this, params, [app]) || this;
25992
25993 var ss = _assertThisInitialized(_this);
25994
25995 var defaults = extend$1({
25996 on: {}
25997 }, app.params.smartSelect);
25998
25999 if (typeof defaults.searchbarDisableButton === 'undefined') {
26000 defaults.searchbarDisableButton = app.theme !== 'aurora';
26001 } // Extend defaults with modules params
26002
26003
26004 ss.useModulesParams(defaults);
26005 ss.params = extend$1({}, defaults, params);
26006 ss.app = app;
26007 var $el = $(ss.params.el).eq(0);
26008 if ($el.length === 0) return ss || _assertThisInitialized(_this);
26009 if ($el[0].f7SmartSelect) return $el[0].f7SmartSelect || _assertThisInitialized(_this);
26010 var $selectEl = $el.find('select').eq(0);
26011 if ($selectEl.length === 0) return ss || _assertThisInitialized(_this);
26012 var $valueEl;
26013
26014 if (ss.params.setValueText) {
26015 $valueEl = $(ss.params.valueEl);
26016
26017 if ($valueEl.length === 0) {
26018 $valueEl = $el.find('.item-after');
26019 }
26020
26021 if ($valueEl.length === 0) {
26022 $valueEl = $('<div class="item-after"></div>');
26023 $valueEl.insertAfter($el.find('.item-title'));
26024 }
26025 } // Url
26026
26027
26028 var url = params.url;
26029
26030 if (!url) {
26031 if ($el.attr('href') && $el.attr('href') !== '#') url = $el.attr('href');else if ($selectEl.attr('name')) url = $selectEl.attr('name').toLowerCase() + "-select/";
26032 }
26033
26034 if (!url) url = ss.params.url;
26035 var multiple = $selectEl[0].multiple;
26036 var inputType = multiple ? 'checkbox' : 'radio';
26037 var selectId = id();
26038 extend$1(ss, {
26039 $el: $el,
26040 el: $el[0],
26041 $selectEl: $selectEl,
26042 selectEl: $selectEl[0],
26043 $valueEl: $valueEl,
26044 valueEl: $valueEl && $valueEl[0],
26045 url: url,
26046 multiple: multiple,
26047 inputType: inputType,
26048 id: selectId,
26049 inputName: inputType + "-" + selectId,
26050 selectName: $selectEl.attr('name'),
26051 maxLength: $selectEl.attr('maxlength') || params.maxLength
26052 });
26053 $el[0].f7SmartSelect = ss; // Events
26054
26055 function onClick() {
26056 ss.open();
26057 }
26058
26059 function onChange() {
26060 var value = ss.$selectEl.val();
26061 ss.$el.trigger('smartselect:change', value);
26062 ss.emit('local::change smartSelectChange', ss, value);
26063
26064 if (ss.vl) {
26065 ss.vl.clearCache();
26066 }
26067
26068 ss.setValueText();
26069 }
26070
26071 ss.attachEvents = function attachEvents() {
26072 $el.on('click', onClick);
26073 $el.on('change', 'select', onChange);
26074 };
26075
26076 ss.detachEvents = function detachEvents() {
26077 $el.off('click', onClick);
26078 $el.off('change', 'select', onChange);
26079 };
26080
26081 function handleInputChange() {
26082 var optionEl;
26083 var text;
26084 var inputEl = this;
26085 var value = inputEl.value;
26086 var optionText = [];
26087 var displayAs;
26088
26089 if (inputEl.type === 'checkbox') {
26090 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
26091 optionEl = ss.selectEl.options[i];
26092
26093 if (optionEl.value === value) {
26094 optionEl.selected = inputEl.checked;
26095 }
26096
26097 if (optionEl.selected) {
26098 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
26099 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
26100 optionText.push(text.trim());
26101 }
26102 }
26103
26104 if (ss.maxLength) {
26105 ss.checkMaxLength();
26106 }
26107 } else {
26108 optionEl = ss.$selectEl.find("option[value=\"" + value + "\"]")[0];
26109
26110 if (!optionEl) {
26111 optionEl = ss.$selectEl.find('option').filter(function (optEl) {
26112 return optEl.value === value;
26113 })[0];
26114 }
26115
26116 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
26117 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
26118 optionText = [text];
26119 ss.selectEl.value = value;
26120 }
26121
26122 ss.$selectEl.trigger('change');
26123
26124 if (ss.params.setValueText) {
26125 ss.$valueEl.text(ss.formatValueText(optionText));
26126 }
26127
26128 if (ss.params.closeOnSelect && ss.inputType === 'radio') {
26129 ss.close();
26130 }
26131 }
26132
26133 ss.attachInputsEvents = function attachInputsEvents() {
26134 ss.$containerEl.on('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
26135 };
26136
26137 ss.detachInputsEvents = function detachInputsEvents() {
26138 ss.$containerEl.off('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
26139 }; // Install Modules
26140
26141
26142 ss.useModules(); // Init
26143
26144 ss.init();
26145 return ss || _assertThisInitialized(_this);
26146 }
26147
26148 var _proto = SmartSelect.prototype;
26149
26150 _proto.setValue = function setValue(value) {
26151 var ss = this;
26152 var newValue = value;
26153 var optionText = [];
26154 var optionEl;
26155 var displayAs;
26156 var text;
26157
26158 if (ss.multiple) {
26159 if (!Array.isArray(newValue)) newValue = [newValue];
26160
26161 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
26162 optionEl = ss.selectEl.options[i];
26163
26164 if (newValue.indexOf(optionEl.value) >= 0) {
26165 optionEl.selected = true;
26166 } else {
26167 optionEl.selected = false;
26168 }
26169
26170 if (optionEl.selected) {
26171 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
26172 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
26173 optionText.push(text.trim());
26174 }
26175 }
26176 } else {
26177 optionEl = ss.$selectEl.find("option[value=\"" + newValue + "\"]")[0];
26178
26179 if (optionEl) {
26180 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
26181 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
26182 optionText = [text];
26183 }
26184
26185 ss.selectEl.value = newValue;
26186 }
26187
26188 if (ss.params.setValueText) {
26189 ss.$valueEl.text(ss.formatValueText(optionText));
26190 }
26191
26192 ss.$selectEl.trigger('change');
26193 return ss;
26194 };
26195
26196 _proto.unsetValue = function unsetValue() {
26197 var ss = this;
26198
26199 if (ss.params.setValueText) {
26200 ss.$valueEl.text(ss.formatValueText([]));
26201 }
26202
26203 ss.$selectEl.find('option').each(function (optionEl) {
26204 optionEl.selected = false;
26205 optionEl.checked = false;
26206 });
26207 ss.$selectEl[0].value = null;
26208
26209 if (ss.$containerEl) {
26210 ss.$containerEl.find("input[name=\"" + ss.inputName + "\"][type=\"checkbox\"], input[name=\"" + ss.inputName + "\"][type=\"radio\"]").prop('checked', false);
26211 }
26212
26213 ss.$selectEl.trigger('change');
26214 };
26215
26216 _proto.getValue = function getValue() {
26217 var ss = this;
26218 return ss.$selectEl.val();
26219 };
26220
26221 _proto.checkMaxLength = function checkMaxLength() {
26222 var ss = this;
26223 var $containerEl = ss.$containerEl;
26224
26225 if (ss.selectEl.selectedOptions.length >= ss.maxLength) {
26226 $containerEl.find('input[type="checkbox"]').each(function (inputEl) {
26227 if (!inputEl.checked) {
26228 $(inputEl).parents('li').addClass('disabled');
26229 } else {
26230 $(inputEl).parents('li').removeClass('disabled');
26231 }
26232 });
26233 } else {
26234 $containerEl.find('.disabled').removeClass('disabled');
26235 }
26236 };
26237
26238 _proto.formatValueText = function formatValueText(values) {
26239 var ss = this;
26240 var textValue;
26241
26242 if (ss.params.formatValueText) {
26243 textValue = ss.params.formatValueText.call(ss, values, ss);
26244 } else {
26245 textValue = values.join(', ');
26246 }
26247
26248 return textValue;
26249 };
26250
26251 _proto.setValueText = function setValueText(value) {
26252 var ss = this;
26253 var valueArray = [];
26254
26255 if (typeof value !== 'undefined') {
26256 if (Array.isArray(value)) {
26257 valueArray = value;
26258 } else {
26259 valueArray = [value];
26260 }
26261 } else {
26262 ss.$selectEl.find('option').each(function (optionEl) {
26263 var $optionEl = $(optionEl);
26264
26265 if (optionEl.selected) {
26266 var displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $optionEl.data('display-value-as');
26267
26268 if (displayAs && typeof displayAs !== 'undefined') {
26269 valueArray.push(displayAs);
26270 } else {
26271 valueArray.push(optionEl.textContent.trim());
26272 }
26273 }
26274 });
26275 }
26276
26277 if (ss.params.setValueText) {
26278 ss.$valueEl.text(ss.formatValueText(valueArray));
26279 }
26280 };
26281
26282 _proto.getItemsData = function getItemsData() {
26283 var ss = this;
26284 var theme = ss.app.theme;
26285 var items = [];
26286 var previousGroupEl;
26287 ss.$selectEl.find('option').each(function (optionEl) {
26288 var $optionEl = $(optionEl);
26289 var optionData = $optionEl.dataset();
26290 var optionImage = optionData.optionImage || ss.params.optionImage;
26291 var optionIcon = optionData.optionIcon || ss.params.optionIcon;
26292 var optionIconIos = theme === 'ios' && (optionData.optionIconIos || ss.params.optionIconIos);
26293 var optionIconMd = theme === 'md' && (optionData.optionIconMd || ss.params.optionIconMd);
26294 var optionIconAurora = theme === 'aurora' && (optionData.optionIconAurora || ss.params.optionIconAurora);
26295 var optionHasMedia = optionImage || optionIcon || optionIconIos || optionIconMd || optionIconAurora;
26296 var optionColor = optionData.optionColor;
26297 var optionClassName = optionData.optionClass || '';
26298 if ($optionEl[0].disabled) optionClassName += ' disabled';
26299 var optionGroupEl = $optionEl.parent('optgroup')[0];
26300 var optionGroupLabel = optionGroupEl && optionGroupEl.label;
26301 var optionIsLabel = false;
26302
26303 if (optionGroupEl && optionGroupEl !== previousGroupEl) {
26304 optionIsLabel = true;
26305 previousGroupEl = optionGroupEl;
26306 items.push({
26307 groupLabel: optionGroupLabel,
26308 isLabel: optionIsLabel
26309 });
26310 }
26311
26312 items.push({
26313 value: $optionEl[0].value,
26314 text: $optionEl[0].textContent.trim(),
26315 selected: $optionEl[0].selected,
26316 groupEl: optionGroupEl,
26317 groupLabel: optionGroupLabel,
26318 image: optionImage,
26319 icon: optionIcon,
26320 iconIos: optionIconIos,
26321 iconMd: optionIconMd,
26322 iconAurora: optionIconAurora,
26323 color: optionColor,
26324 className: optionClassName,
26325 disabled: $optionEl[0].disabled,
26326 id: ss.id,
26327 hasMedia: optionHasMedia,
26328 checkbox: ss.inputType === 'checkbox',
26329 radio: ss.inputType === 'radio',
26330 inputName: ss.inputName,
26331 inputType: ss.inputType
26332 });
26333 });
26334 ss.items = items;
26335 return items;
26336 };
26337
26338 _proto.renderSearchbar = function renderSearchbar() {
26339 var ss = this;
26340 if (ss.params.renderSearchbar) return ss.params.renderSearchbar.call(ss);
26341 return $jsx("form", {
26342 class: "searchbar"
26343 }, $jsx("div", {
26344 class: "searchbar-inner"
26345 }, $jsx("div", {
26346 class: "searchbar-input-wrap"
26347 }, $jsx("input", {
26348 type: "search",
26349 spellcheck: ss.params.searchbarSpellcheck || 'false',
26350 placeholder: ss.params.searchbarPlaceholder
26351 }), $jsx("i", {
26352 class: "searchbar-icon"
26353 }), $jsx("span", {
26354 class: "input-clear-button"
26355 })), ss.params.searchbarDisableButton && $jsx("span", {
26356 class: "searchbar-disable-button"
26357 }, ss.params.searchbarDisableText)));
26358 };
26359
26360 _proto.renderItem = function renderItem(item, index) {
26361 var ss = this;
26362 if (ss.params.renderItem) return ss.params.renderItem.call(ss, item, index);
26363
26364 function getIconContent(iconValue) {
26365 if (iconValue === void 0) {
26366 iconValue = '';
26367 }
26368
26369 if (iconValue.indexOf(':') >= 0) {
26370 return iconValue.split(':')[1];
26371 }
26372
26373 return '';
26374 }
26375
26376 function getIconClass(iconValue) {
26377 if (iconValue === void 0) {
26378 iconValue = '';
26379 }
26380
26381 if (iconValue.indexOf(':') >= 0) {
26382 var className = iconValue.split(':')[0];
26383 if (className === 'f7') className = 'f7-icons';
26384 if (className === 'material') className = 'material-icons';
26385 return className;
26386 }
26387
26388 return iconValue;
26389 }
26390
26391 var itemHtml;
26392
26393 if (item.isLabel) {
26394 itemHtml = "<li class=\"item-divider\">" + item.groupLabel + "</li>";
26395 } else {
26396 var selected = item.selected;
26397 var disabled;
26398
26399 if (ss.params.virtualList) {
26400 var ssValue = ss.getValue();
26401 selected = ss.multiple ? ssValue.indexOf(item.value) >= 0 : ssValue === item.value;
26402
26403 if (ss.multiple) {
26404 disabled = ss.multiple && !selected && ssValue.length === parseInt(ss.maxLength, 10);
26405 }
26406 }
26407
26408 var icon = item.icon,
26409 iconIos = item.iconIos,
26410 iconMd = item.iconMd,
26411 iconAurora = item.iconAurora;
26412 var hasIcon = icon || iconIos || iconMd || iconAurora;
26413 var iconContent = getIconContent(icon || iconIos || iconMd || iconAurora || '');
26414 var iconClass = getIconClass(icon || iconIos || iconMd || iconAurora || '');
26415 itemHtml = $jsx("li", {
26416 class: "" + (item.className || '') + (disabled ? ' disabled' : '')
26417 }, $jsx("label", {
26418 class: "item-" + item.inputType + " item-content"
26419 }, $jsx("input", {
26420 type: item.inputType,
26421 name: item.inputName,
26422 value: item.value,
26423 _checked: selected
26424 }), $jsx("i", {
26425 class: "icon icon-" + item.inputType
26426 }), item.hasMedia && $jsx("div", {
26427 class: "item-media"
26428 }, hasIcon && $jsx("i", {
26429 class: "icon " + iconClass
26430 }, iconContent), item.image && $jsx("img", {
26431 src: item.image
26432 })), $jsx("div", {
26433 class: "item-inner"
26434 }, $jsx("div", {
26435 class: "item-title" + (item.color ? " text-color-" + item.color : '')
26436 }, item.text))));
26437 }
26438
26439 return itemHtml;
26440 };
26441
26442 _proto.renderItems = function renderItems() {
26443 var ss = this;
26444 if (ss.params.renderItems) return ss.params.renderItems.call(ss, ss.items);
26445 var itemsHtml = "\n " + ss.items.map(function (item, index) {
26446 return "" + ss.renderItem(item, index);
26447 }).join('') + "\n ";
26448 return itemsHtml;
26449 };
26450
26451 _proto.renderPage = function renderPage() {
26452 var ss = this;
26453 if (ss.params.renderPage) return ss.params.renderPage.call(ss, ss.items);
26454 var pageTitle = ss.params.pageTitle;
26455
26456 if (typeof pageTitle === 'undefined') {
26457 var $itemTitleEl = ss.$el.find('.item-title');
26458 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
26459 }
26460
26461 var cssClass = ss.params.cssClass;
26462 return $jsx("div", {
26463 class: "page smart-select-page " + cssClass,
26464 "data-name": "smart-select-page",
26465 "data-select-name": ss.selectName
26466 }, $jsx("div", {
26467 class: "navbar " + (ss.params.navbarColorTheme ? "color-" + ss.params.navbarColorTheme : '')
26468 }, $jsx("div", {
26469 class: "navbar-bg"
26470 }), $jsx("div", {
26471 class: "navbar-inner sliding " + (ss.params.navbarColorTheme ? "color-" + ss.params.navbarColorTheme : '')
26472 }, $jsx("div", {
26473 class: "left"
26474 }, $jsx("a", {
26475 class: "link back"
26476 }, $jsx("i", {
26477 class: "icon icon-back"
26478 }), $jsx("span", {
26479 class: "if-not-md"
26480 }, ss.params.pageBackLinkText))), pageTitle && $jsx("div", {
26481 class: "title"
26482 }, pageTitle), ss.params.searchbar && $jsx("div", {
26483 class: "subnavbar"
26484 }, ss.renderSearchbar()))), ss.params.searchbar && $jsx("div", {
26485 class: "searchbar-backdrop"
26486 }), $jsx("div", {
26487 class: "page-content"
26488 }, $jsx("div", {
26489 class: "list smart-select-list-" + ss.id + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? "color-" + ss.params.formColorTheme : '')
26490 }, $jsx("ul", null, !ss.params.virtualList && ss.renderItems(ss.items)))));
26491 };
26492
26493 _proto.renderPopup = function renderPopup() {
26494 var ss = this;
26495 if (ss.params.renderPopup) return ss.params.renderPopup.call(ss, ss.items);
26496 var pageTitle = ss.params.pageTitle;
26497
26498 if (typeof pageTitle === 'undefined') {
26499 var $itemTitleEl = ss.$el.find('.item-title');
26500 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
26501 }
26502
26503 var cssClass = ss.params.cssClass || '';
26504 return $jsx("div", {
26505 class: "popup smart-select-popup " + cssClass + " " + (ss.params.popupTabletFullscreen ? 'popup-tablet-fullscreen' : ''),
26506 "data-select-name": ss.selectName
26507 }, $jsx("div", {
26508 class: "view"
26509 }, $jsx("div", {
26510 class: "page smart-select-page " + (ss.params.searchbar ? 'page-with-subnavbar' : ''),
26511 "data-name": "smart-select-page"
26512 }, $jsx("div", {
26513 class: "navbar " + (ss.params.navbarColorTheme ? "color-" + ss.params.navbarColorTheme : '')
26514 }, $jsx("div", {
26515 class: "navbar-bg"
26516 }), $jsx("div", {
26517 class: "navbar-inner sliding"
26518 }, pageTitle && $jsx("div", {
26519 class: "title"
26520 }, pageTitle), $jsx("div", {
26521 class: "right"
26522 }, $jsx("a", {
26523 class: "link popup-close",
26524 "data-popup": ".smart-select-popup[data-select-name='" + ss.selectName + "']"
26525 }, ss.params.popupCloseLinkText)), ss.params.searchbar && $jsx("div", {
26526 class: "subnavbar"
26527 }, ss.renderSearchbar()))), ss.params.searchbar && $jsx("div", {
26528 class: "searchbar-backdrop"
26529 }), $jsx("div", {
26530 class: "page-content"
26531 }, $jsx("div", {
26532 class: "list smart-select-list-" + ss.id + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? "color-" + ss.params.formColorTheme : '')
26533 }, $jsx("ul", null, !ss.params.virtualList && ss.renderItems(ss.items)))))));
26534 };
26535
26536 _proto.renderSheet = function renderSheet() {
26537 var ss = this;
26538 if (ss.params.renderSheet) return ss.params.renderSheet.call(ss, ss.items);
26539 var cssClass = ss.params.cssClass; // prettier-ignore
26540
26541 return $jsx("div", {
26542 class: "sheet-modal smart-select-sheet " + cssClass,
26543 "data-select-name": ss.selectName
26544 }, $jsx("div", {
26545 class: "toolbar toolbar-top " + (ss.params.toolbarColorTheme ? "color-" + ss.params.toolbarColorTheme : '')
26546 }, $jsx("div", {
26547 class: "toolbar-inner"
26548 }, $jsx("div", {
26549 class: "left"
26550 }), $jsx("div", {
26551 class: "right"
26552 }, $jsx("a", {
26553 class: "link sheet-close"
26554 }, ss.params.sheetCloseLinkText)))), $jsx("div", {
26555 class: "sheet-modal-inner"
26556 }, $jsx("div", {
26557 class: "page-content"
26558 }, $jsx("div", {
26559 class: "list smart-select-list-" + ss.id + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? "color-" + ss.params.formColorTheme : '')
26560 }, $jsx("ul", null, !ss.params.virtualList && ss.renderItems(ss.items))))));
26561 };
26562
26563 _proto.renderPopover = function renderPopover() {
26564 var ss = this;
26565 if (ss.params.renderPopover) return ss.params.renderPopover.call(ss, ss.items);
26566 var cssClass = ss.params.cssClass; // prettier-ignore
26567
26568 return $jsx("div", {
26569 class: "popover smart-select-popover " + cssClass,
26570 "data-select-name": ss.selectName
26571 }, $jsx("div", {
26572 class: "popover-inner"
26573 }, $jsx("div", {
26574 class: "list smart-select-list-" + ss.id + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? "color-" + ss.params.formColorTheme : '')
26575 }, $jsx("ul", null, !ss.params.virtualList && ss.renderItems(ss.items)))));
26576 };
26577
26578 _proto.scrollToSelectedItem = function scrollToSelectedItem() {
26579 var ss = this;
26580 var params = ss.params,
26581 $containerEl = ss.$containerEl;
26582 if (!ss.opened) return ss;
26583
26584 if (params.virtualList) {
26585 var selectedIndex;
26586 ss.vl.items.forEach(function (item, index) {
26587 if (typeof selectedIndex === 'undefined' && item.selected) {
26588 selectedIndex = index;
26589 }
26590 });
26591
26592 if (typeof selectedIndex !== 'undefined') {
26593 ss.vl.scrollToItem(selectedIndex);
26594 }
26595 } else {
26596 var $selectedItemEl = $containerEl.find('input:checked').parents('li');
26597 if (!$selectedItemEl.length) return ss;
26598 var $pageContentEl = $containerEl.find('.page-content');
26599 $pageContentEl.scrollTop($selectedItemEl.offset().top - $pageContentEl.offset().top - parseInt($pageContentEl.css('padding-top'), 10));
26600 }
26601
26602 return ss;
26603 };
26604
26605 _proto.onOpen = function onOpen(type, containerEl) {
26606 var ss = this;
26607 var app = ss.app;
26608 var $containerEl = $(containerEl);
26609 ss.$containerEl = $containerEl;
26610 ss.openedIn = type;
26611 ss.opened = true; // Init VL
26612
26613 if (ss.params.virtualList) {
26614 ss.vl = app.virtualList.create({
26615 el: $containerEl.find('.virtual-list'),
26616 items: ss.items,
26617 renderItem: ss.renderItem.bind(ss),
26618 height: ss.params.virtualListHeight,
26619 searchByItem: function searchByItem(query, item) {
26620 if (item.text && item.text.toLowerCase().indexOf(query.trim().toLowerCase()) >= 0) return true;
26621 return false;
26622 }
26623 });
26624 }
26625
26626 if (ss.params.scrollToSelectedItem) {
26627 ss.scrollToSelectedItem();
26628 } // Init SB
26629
26630
26631 if (ss.params.searchbar) {
26632 var $searchbarEl = $containerEl.find('.searchbar');
26633
26634 if (type === 'page' && app.theme === 'ios') {
26635 $searchbarEl = $(app.navbar.getElByPage($containerEl)).find('.searchbar');
26636 }
26637
26638 if (ss.params.appendSearchbarNotFound && (type === 'page' || type === 'popup')) {
26639 var $notFoundEl = null;
26640
26641 if (typeof ss.params.appendSearchbarNotFound === 'string') {
26642 $notFoundEl = $("<div class=\"block searchbar-not-found\">" + ss.params.appendSearchbarNotFound + "</div>");
26643 } else if (typeof ss.params.appendSearchbarNotFound === 'boolean') {
26644 $notFoundEl = $('<div class="block searchbar-not-found">Nothing found</div>');
26645 } else {
26646 $notFoundEl = ss.params.appendSearchbarNotFound;
26647 }
26648
26649 if ($notFoundEl) {
26650 $containerEl.find('.page-content').append($notFoundEl[0]);
26651 }
26652 }
26653
26654 var searchbarParams = extend$1({
26655 el: $searchbarEl,
26656 backdropEl: $containerEl.find('.searchbar-backdrop'),
26657 searchContainer: ".smart-select-list-" + ss.id,
26658 searchIn: '.item-title'
26659 }, typeof ss.params.searchbar === 'object' ? ss.params.searchbar : {});
26660 ss.searchbar = app.searchbar.create(searchbarParams);
26661 } // Check for max length
26662
26663
26664 if (ss.maxLength) {
26665 ss.checkMaxLength();
26666 } // Close on select
26667
26668
26669 if (ss.params.closeOnSelect) {
26670 ss.$containerEl.find("input[type=\"radio\"][name=\"" + ss.inputName + "\"]:checked").parents('label').once('click', function () {
26671 ss.close();
26672 });
26673 } // Attach input events
26674
26675
26676 ss.attachInputsEvents();
26677 ss.$el.trigger('smartselect:open');
26678 ss.emit('local::open smartSelectOpen', ss);
26679 };
26680
26681 _proto.onOpened = function onOpened() {
26682 var ss = this;
26683 ss.$el.trigger('smartselect:opened');
26684 ss.emit('local::opened smartSelectOpened', ss);
26685 };
26686
26687 _proto.onClose = function onClose() {
26688 var ss = this;
26689 if (ss.destroyed) return; // Destroy VL
26690
26691 if (ss.vl && ss.vl.destroy) {
26692 ss.vl.destroy();
26693 ss.vl = null;
26694 delete ss.vl;
26695 } // Destroy SB
26696
26697
26698 if (ss.searchbar && ss.searchbar.destroy) {
26699 ss.searchbar.destroy();
26700 ss.searchbar = null;
26701 delete ss.searchbar;
26702 } // Detach events
26703
26704
26705 ss.detachInputsEvents();
26706 ss.$el.trigger('smartselect:close');
26707 ss.emit('local::close smartSelectClose', ss);
26708 };
26709
26710 _proto.onClosed = function onClosed() {
26711 var ss = this;
26712 if (ss.destroyed) return;
26713 ss.opened = false;
26714 ss.$containerEl = null;
26715 delete ss.$containerEl;
26716 ss.$el.trigger('smartselect:closed');
26717 ss.emit('local::closed smartSelectClosed', ss);
26718 };
26719
26720 _proto.openPage = function openPage() {
26721 var ss = this;
26722 if (ss.opened) return ss;
26723 ss.getItemsData();
26724 var pageHtml = ss.renderPage(ss.items);
26725 ss.view.router.navigate({
26726 url: ss.url,
26727 route: {
26728 content: pageHtml,
26729 path: ss.url,
26730 on: {
26731 pageBeforeIn: function pageBeforeIn(e, page) {
26732 ss.onOpen('page', page.el);
26733 },
26734 pageAfterIn: function pageAfterIn(e, page) {
26735 ss.onOpened('page', page.el);
26736 },
26737 pageBeforeOut: function pageBeforeOut(e, page) {
26738 ss.onClose('page', page.el);
26739 },
26740 pageAfterOut: function pageAfterOut(e, page) {
26741 ss.onClosed('page', page.el);
26742 }
26743 }
26744 }
26745 });
26746 return ss;
26747 };
26748
26749 _proto.openPopup = function openPopup() {
26750 var ss = this;
26751 if (ss.opened) return ss;
26752 ss.getItemsData();
26753 var popupHtml = ss.renderPopup(ss.items);
26754 var popupParams = {
26755 content: popupHtml,
26756 push: ss.params.popupPush,
26757 swipeToClose: ss.params.popupSwipeToClose,
26758 on: {
26759 popupOpen: function popupOpen(popup) {
26760 ss.onOpen('popup', popup.el);
26761 },
26762 popupOpened: function popupOpened(popup) {
26763 ss.onOpened('popup', popup.el);
26764 },
26765 popupClose: function popupClose(popup) {
26766 ss.onClose('popup', popup.el);
26767 },
26768 popupClosed: function popupClosed(popup) {
26769 ss.onClosed('popup', popup.el);
26770 }
26771 }
26772 };
26773
26774 if (ss.params.routableModals && ss.view) {
26775 ss.view.router.navigate({
26776 url: ss.url,
26777 route: {
26778 path: ss.url,
26779 popup: popupParams
26780 }
26781 });
26782 } else {
26783 ss.modal = ss.app.popup.create(popupParams).open();
26784 }
26785
26786 return ss;
26787 };
26788
26789 _proto.openSheet = function openSheet() {
26790 var ss = this;
26791 if (ss.opened) return ss;
26792 ss.getItemsData();
26793 var sheetHtml = ss.renderSheet(ss.items);
26794 var sheetParams = {
26795 content: sheetHtml,
26796 backdrop: ss.params.sheetBackdrop,
26797 scrollToEl: ss.$el,
26798 closeByOutsideClick: true,
26799 push: ss.params.sheetPush,
26800 swipeToClose: ss.params.sheetSwipeToClose,
26801 on: {
26802 sheetOpen: function sheetOpen(sheet) {
26803 ss.onOpen('sheet', sheet.el);
26804 },
26805 sheetOpened: function sheetOpened(sheet) {
26806 ss.onOpened('sheet', sheet.el);
26807 },
26808 sheetClose: function sheetClose(sheet) {
26809 ss.onClose('sheet', sheet.el);
26810 },
26811 sheetClosed: function sheetClosed(sheet) {
26812 ss.onClosed('sheet', sheet.el);
26813 }
26814 }
26815 };
26816
26817 if (ss.params.routableModals && ss.view) {
26818 ss.view.router.navigate({
26819 url: ss.url,
26820 route: {
26821 path: ss.url,
26822 sheet: sheetParams
26823 }
26824 });
26825 } else {
26826 ss.modal = ss.app.sheet.create(sheetParams).open();
26827 }
26828
26829 return ss;
26830 };
26831
26832 _proto.openPopover = function openPopover() {
26833 var ss = this;
26834 if (ss.opened) return ss;
26835 ss.getItemsData();
26836 var popoverHtml = ss.renderPopover(ss.items);
26837 var popoverParams = {
26838 content: popoverHtml,
26839 targetEl: ss.$el,
26840 on: {
26841 popoverOpen: function popoverOpen(popover) {
26842 ss.onOpen('popover', popover.el);
26843 },
26844 popoverOpened: function popoverOpened(popover) {
26845 ss.onOpened('popover', popover.el);
26846 },
26847 popoverClose: function popoverClose(popover) {
26848 ss.onClose('popover', popover.el);
26849 },
26850 popoverClosed: function popoverClosed(popover) {
26851 ss.onClosed('popover', popover.el);
26852 }
26853 }
26854 };
26855
26856 if (ss.params.routableModals && ss.view) {
26857 ss.view.router.navigate({
26858 url: ss.url,
26859 route: {
26860 path: ss.url,
26861 popover: popoverParams
26862 }
26863 });
26864 } else {
26865 ss.modal = ss.app.popover.create(popoverParams).open();
26866 }
26867
26868 return ss;
26869 };
26870
26871 _proto.open = function open(type) {
26872 var ss = this;
26873 if (ss.opened) return ss;
26874 var prevented = false;
26875
26876 function prevent() {
26877 prevented = true;
26878 }
26879
26880 if (ss.$el) {
26881 ss.$el.trigger('smartselect:beforeopen', {
26882 prevent: prevent
26883 });
26884 }
26885
26886 ss.emit('local::beforeOpen smartSelectBeforeOpen', ss, prevent);
26887 if (prevented) return ss;
26888 var openIn = type || ss.params.openIn;
26889 ss["open" + openIn.split('').map(function (el, index) {
26890 if (index === 0) return el.toUpperCase();
26891 return el;
26892 }).join('')]();
26893 return ss;
26894 };
26895
26896 _proto.close = function close() {
26897 var ss = this;
26898 if (!ss.opened) return ss;
26899
26900 if (ss.params.routableModals && ss.view || ss.openedIn === 'page') {
26901 ss.view.router.back();
26902 } else {
26903 ss.modal.once('modalClosed', function () {
26904 nextTick$1(function () {
26905 if (ss.destroyed) return;
26906 ss.modal.destroy();
26907 delete ss.modal;
26908 });
26909 });
26910 ss.modal.close();
26911 }
26912
26913 return ss;
26914 };
26915
26916 _proto.init = function init() {
26917 var ss = this;
26918 ss.attachEvents();
26919 ss.setValueText();
26920 };
26921
26922 _proto.destroy = function destroy() {
26923 var ss = this;
26924 ss.emit('local::beforeDestroy smartSelectBeforeDestroy', ss);
26925 ss.$el.trigger('smartselect:beforedestroy');
26926 ss.detachEvents();
26927 delete ss.$el[0].f7SmartSelect;
26928 deleteProps$1(ss);
26929 ss.destroyed = true;
26930 };
26931
26932 _createClass$1(SmartSelect, [{
26933 key: "view",
26934 get: function get() {
26935 var params = this.params,
26936 $el = this.$el;
26937 var view;
26938
26939 if (params.view) {
26940 view = params.view;
26941 }
26942
26943 if (!view) {
26944 view = $el.parents('.view').length && $el.parents('.view')[0].f7View;
26945 }
26946
26947 if (!view && params.openIn === 'page') {
26948 throw Error('Smart Select requires initialized View');
26949 }
26950
26951 return view;
26952 }
26953 }]);
26954
26955 return SmartSelect;
26956 }(Framework7Class);
26957
26958 var SmartSelect = {
26959 name: 'smartSelect',
26960 params: {
26961 smartSelect: {
26962 el: undefined,
26963 valueEl: undefined,
26964 setValueText: true,
26965 formatValueText: null,
26966 openIn: 'page',
26967 // or 'popup' or 'sheet' or 'popover'
26968 popupPush: false,
26969 popupSwipeToClose: undefined,
26970 // defaults to app
26971 sheetPush: false,
26972 sheetSwipeToClose: undefined,
26973 // defaults to app
26974 sheetBackdrop: false,
26975 pageTitle: undefined,
26976 pageBackLinkText: 'Back',
26977 popupCloseLinkText: 'Close',
26978 popupTabletFullscreen: false,
26979 sheetCloseLinkText: 'Done',
26980 searchbar: false,
26981 searchbarPlaceholder: 'Search',
26982 searchbarDisableText: 'Cancel',
26983 searchbarDisableButton: undefined,
26984 searchbarSpellcheck: false,
26985 closeOnSelect: false,
26986 virtualList: false,
26987 virtualListHeight: undefined,
26988 scrollToSelectedItem: false,
26989 formColorTheme: undefined,
26990 navbarColorTheme: undefined,
26991 routableModals: false,
26992 url: 'select/',
26993 cssClass: '',
26994
26995 /*
26996 Custom render functions
26997 */
26998 renderPage: undefined,
26999 renderPopup: undefined,
27000 renderSheet: undefined,
27001 renderPopover: undefined,
27002 renderItems: undefined,
27003 renderItem: undefined,
27004 renderSearchbar: undefined
27005 }
27006 },
27007 static: {
27008 SmartSelect: SmartSelect$1
27009 },
27010 create: function create() {
27011 var app = this;
27012 app.smartSelect = extend$1(ConstructorMethods({
27013 defaultSelector: '.smart-select',
27014 constructor: SmartSelect$1,
27015 app: app,
27016 domProp: 'f7SmartSelect'
27017 }), {
27018 open: function open(smartSelectEl) {
27019 var ss = app.smartSelect.get(smartSelectEl);
27020 if (ss && ss.open) return ss.open();
27021 return undefined;
27022 },
27023 close: function close(smartSelectEl) {
27024 var ss = app.smartSelect.get(smartSelectEl);
27025 if (ss && ss.close) return ss.close();
27026 return undefined;
27027 }
27028 });
27029 },
27030 on: {
27031 tabMounted: function tabMounted(tabEl) {
27032 var app = this;
27033 $(tabEl).find('.smart-select-init').each(function (smartSelectEl) {
27034 app.smartSelect.create(extend$1({
27035 el: smartSelectEl
27036 }, $(smartSelectEl).dataset()));
27037 });
27038 },
27039 tabBeforeRemove: function tabBeforeRemove(tabEl) {
27040 $(tabEl).find('.smart-select-init').each(function (smartSelectEl) {
27041 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
27042 smartSelectEl.f7SmartSelect.destroy();
27043 }
27044 });
27045 },
27046 pageInit: function pageInit(page) {
27047 var app = this;
27048 page.$el.find('.smart-select-init').each(function (smartSelectEl) {
27049 app.smartSelect.create(extend$1({
27050 el: smartSelectEl
27051 }, $(smartSelectEl).dataset()));
27052 });
27053 },
27054 pageBeforeRemove: function pageBeforeRemove(page) {
27055 page.$el.find('.smart-select-init').each(function (smartSelectEl) {
27056 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
27057 smartSelectEl.f7SmartSelect.destroy();
27058 }
27059 });
27060 }
27061 },
27062 clicks: {
27063 '.smart-select': function open($clickedEl, data) {
27064 var app = this;
27065
27066 if (!$clickedEl[0].f7SmartSelect) {
27067 var ss = app.smartSelect.create(extend$1({
27068 el: $clickedEl
27069 }, data));
27070 ss.open();
27071 }
27072 }
27073 },
27074 vnode: {
27075 'smart-select-init': {
27076 insert: function insert(vnode) {
27077 var app = this;
27078 var smartSelectEl = vnode.elm;
27079 app.smartSelect.create(extend$1({
27080 el: smartSelectEl
27081 }, $(smartSelectEl).dataset()));
27082 },
27083 destroy: function destroy(vnode) {
27084 var smartSelectEl = vnode.elm;
27085
27086 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
27087 smartSelectEl.f7SmartSelect.destroy();
27088 }
27089 }
27090 }
27091 }
27092 };
27093
27094 function getElMinSize(dimension, $el) {
27095 var minSize = $el.css("min-" + dimension);
27096
27097 if (minSize === 'auto' || minSize === 'none') {
27098 minSize = 0;
27099 } else if (minSize.indexOf('px') >= 0) {
27100 minSize = parseFloat(minSize);
27101 } else if (minSize.indexOf('%') >= 0) {
27102 minSize = $el.parent()[0][dimension === 'height' ? 'offsetHeight' : 'offsetWidth'] * parseFloat(minSize) / 100;
27103 }
27104
27105 return minSize;
27106 }
27107
27108 function getElMaxSize(dimension, $el) {
27109 var maxSize = $el.css("max-" + dimension);
27110
27111 if (maxSize === 'auto' || maxSize === 'none') {
27112 maxSize = null;
27113 } else if (maxSize.indexOf('px') >= 0) {
27114 maxSize = parseFloat(maxSize);
27115 } else if (maxSize.indexOf('%') >= 0) {
27116 maxSize = $el.parent()[0][dimension === 'height' ? 'offsetHeight' : 'offsetWidth'] * parseFloat(maxSize) / 100;
27117 }
27118
27119 return maxSize;
27120 }
27121
27122 var Grid = {
27123 init: function init() {
27124 var app = this;
27125 var isTouched;
27126 var isMoved;
27127 var touchStartX;
27128 var touchStartY;
27129 var $resizeHandlerEl;
27130 var $prevResizableEl;
27131 var $nextResizableEl;
27132 var prevElSize;
27133 var prevElMinSize;
27134 var prevElMaxSize;
27135 var nextElSize;
27136 var nextElMinSize;
27137 var nextElMaxSize;
27138 var parentSize;
27139 var itemsInFlow;
27140 var gapSize;
27141 var isScrolling;
27142
27143 function handleTouchStart(e) {
27144 if (isTouched || isMoved) return;
27145 $resizeHandlerEl = $(e.target).closest('.resize-handler');
27146 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
27147 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
27148 isTouched = true;
27149 $prevResizableEl = undefined;
27150 $nextResizableEl = undefined;
27151 isScrolling = undefined;
27152 }
27153
27154 function handleTouchMove(e) {
27155 if (!isTouched) return;
27156 var isRow = $resizeHandlerEl.parent('.row').length === 1;
27157 var sizeProp = isRow ? 'height' : 'width';
27158 var getSizeProp = isRow ? 'offsetHeight' : 'offsetWidth';
27159
27160 if (!isMoved) {
27161 $prevResizableEl = $resizeHandlerEl.parent(isRow ? '.row' : '.col');
27162
27163 if ($prevResizableEl.length && (!$prevResizableEl.hasClass('resizable') || $prevResizableEl.hasClass('resizable-fixed'))) {
27164 $prevResizableEl = $prevResizableEl.prevAll('.resizable:not(.resizable-fixed)').eq(0);
27165 }
27166
27167 $nextResizableEl = $prevResizableEl.next(isRow ? '.row' : '.col');
27168
27169 if ($nextResizableEl.length && (!$nextResizableEl.hasClass('resizable') || $nextResizableEl.hasClass('resizable-fixed'))) {
27170 $nextResizableEl = $nextResizableEl.nextAll('.resizable:not(.resizable-fixed)').eq(0);
27171 }
27172
27173 if ($prevResizableEl.length) {
27174 prevElSize = $prevResizableEl[0][getSizeProp];
27175 prevElMinSize = getElMinSize(sizeProp, $prevResizableEl);
27176 prevElMaxSize = getElMaxSize(sizeProp, $prevResizableEl);
27177 parentSize = $prevResizableEl.parent()[0][getSizeProp];
27178 itemsInFlow = $prevResizableEl.parent().children(isRow ? '.row' : '[class*="col-"], .col').length;
27179 gapSize = parseFloat($prevResizableEl.css(isRow ? '--f7-grid-row-gap' : '--f7-grid-gap'));
27180 }
27181
27182 if ($nextResizableEl.length) {
27183 nextElSize = $nextResizableEl[0][getSizeProp];
27184 nextElMinSize = getElMinSize(sizeProp, $nextResizableEl);
27185 nextElMaxSize = getElMaxSize(sizeProp, $nextResizableEl);
27186
27187 if (!$prevResizableEl.length) {
27188 parentSize = $nextResizableEl.parent()[0][getSizeProp];
27189 itemsInFlow = $nextResizableEl.parent().children(isRow ? '.row' : '[class*="col-"], .col').length;
27190 gapSize = parseFloat($nextResizableEl.css(isRow ? '--f7-grid-row-gap' : '--f7-grid-gap'));
27191 }
27192 }
27193 }
27194
27195 isMoved = true;
27196 var touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
27197 var touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
27198
27199 if (typeof isScrolling === 'undefined' && !isRow) {
27200 isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
27201 }
27202
27203 if (isScrolling) {
27204 isTouched = false;
27205 isMoved = false;
27206 return;
27207 }
27208
27209 var isAbsolute = $prevResizableEl.hasClass('resizable-absolute') || $nextResizableEl.hasClass('resizable-absolute');
27210 var resizeNextEl = !isRow || isRow && !isAbsolute;
27211
27212 if (resizeNextEl && !$nextResizableEl.length || !$prevResizableEl.length) {
27213 isTouched = false;
27214 isMoved = false;
27215 return;
27216 }
27217
27218 e.preventDefault();
27219 var diff = isRow ? touchCurrentY - touchStartY : touchCurrentX - touchStartX;
27220 var prevElNewSize;
27221 var nextElNewSize;
27222
27223 if ($prevResizableEl.length) {
27224 prevElNewSize = prevElSize + diff;
27225
27226 if (prevElNewSize < prevElMinSize) {
27227 prevElNewSize = prevElMinSize;
27228 diff = prevElNewSize - prevElSize;
27229 }
27230
27231 if (prevElMaxSize && prevElNewSize > prevElMaxSize) {
27232 prevElNewSize = prevElMaxSize;
27233 diff = prevElNewSize - prevElSize;
27234 }
27235 }
27236
27237 if ($nextResizableEl.length && resizeNextEl) {
27238 nextElNewSize = nextElSize - diff;
27239
27240 if (nextElNewSize < nextElMinSize) {
27241 nextElNewSize = nextElMinSize;
27242 diff = nextElSize - nextElNewSize;
27243 prevElNewSize = prevElSize + diff;
27244 }
27245
27246 if (nextElMaxSize && nextElNewSize > nextElMaxSize) {
27247 nextElNewSize = nextElMaxSize;
27248 diff = nextElSize - nextElNewSize;
27249 prevElNewSize = prevElSize + diff;
27250 }
27251 }
27252
27253 if (isAbsolute) {
27254 $prevResizableEl[0].style[sizeProp] = prevElNewSize + "px";
27255
27256 if (resizeNextEl) {
27257 $nextResizableEl[0].style[sizeProp] = nextElNewSize + "px";
27258 }
27259
27260 $prevResizableEl.trigger('grid:resize');
27261 $nextResizableEl.trigger('grid:resize');
27262 app.emit('gridResize', $prevResizableEl[0]);
27263 app.emit('gridResize', $nextResizableEl[0]);
27264 return;
27265 }
27266
27267 var gapAddSize = (itemsInFlow - 1) * gapSize / itemsInFlow;
27268 var gapAddSizeCSS = isRow ? itemsInFlow - 1 + " * var(--f7-grid-row-gap) / " + itemsInFlow : '(var(--f7-cols-per-row) - 1) * var(--f7-grid-gap) / var(--f7-cols-per-row)';
27269 var prevElNewSizeNormalized = prevElNewSize + gapAddSize;
27270 var nextElNewSizeNormalized = nextElNewSize + gapAddSize;
27271 $prevResizableEl[0].style[sizeProp] = "calc(" + prevElNewSizeNormalized / parentSize * 100 + "% - " + gapAddSizeCSS + ")";
27272 $nextResizableEl[0].style[sizeProp] = "calc(" + nextElNewSizeNormalized / parentSize * 100 + "% - " + gapAddSizeCSS + ")";
27273 $prevResizableEl.trigger('grid:resize');
27274 $nextResizableEl.trigger('grid:resize');
27275 app.emit('gridResize', $prevResizableEl[0]);
27276 app.emit('gridResize', $nextResizableEl[0]);
27277 }
27278
27279 function handleTouchEnd() {
27280 if (!isTouched) return;
27281
27282 if (!isMoved) {
27283 isTouched = false;
27284 }
27285
27286 isTouched = false;
27287 isMoved = false;
27288 }
27289
27290 var document = getDocument();
27291 $(document).on(app.touchEvents.start, '.col > .resize-handler, .row > .resize-handler', handleTouchStart);
27292 app.on('touchmove', handleTouchMove);
27293 app.on('touchend', handleTouchEnd);
27294 }
27295 };
27296 var Grid$1 = {
27297 name: 'grid',
27298 create: function create() {
27299 var app = this;
27300 extend$1(app, {
27301 grid: {
27302 init: Grid.init.bind(app)
27303 }
27304 });
27305 },
27306 on: {
27307 init: function init() {
27308 var app = this;
27309 app.grid.init();
27310 }
27311 }
27312 };
27313
27314 var Calendar$1 = /*#__PURE__*/function (_Framework7Class) {
27315 _inheritsLoose(Calendar, _Framework7Class);
27316
27317 function Calendar(app, params) {
27318 var _this;
27319
27320 if (params === void 0) {
27321 params = {};
27322 }
27323
27324 _this = _Framework7Class.call(this, params, [app]) || this;
27325
27326 var calendar = _assertThisInitialized(_this);
27327
27328 calendar.params = extend$1({}, app.params.calendar, params);
27329 var $containerEl;
27330
27331 if (calendar.params.containerEl) {
27332 $containerEl = $(calendar.params.containerEl);
27333 if ($containerEl.length === 0) return calendar || _assertThisInitialized(_this);
27334 }
27335
27336 var $inputEl;
27337
27338 if (calendar.params.inputEl) {
27339 $inputEl = $(calendar.params.inputEl);
27340 }
27341
27342 var isHorizontal = calendar.params.direction === 'horizontal';
27343 var inverter = 1;
27344
27345 if (isHorizontal) {
27346 inverter = app.rtl ? -1 : 1;
27347 }
27348
27349 extend$1(calendar, {
27350 app: app,
27351 $containerEl: $containerEl,
27352 containerEl: $containerEl && $containerEl[0],
27353 inline: $containerEl && $containerEl.length > 0,
27354 $inputEl: $inputEl,
27355 inputEl: $inputEl && $inputEl[0],
27356 initialized: false,
27357 opened: false,
27358 url: calendar.params.url,
27359 isHorizontal: isHorizontal,
27360 inverter: inverter,
27361 animating: false,
27362 allowTouchMove: true,
27363 hasTimePicker: calendar.params.timePicker && !calendar.params.rangePicker && !calendar.params.multiple
27364 });
27365 calendar.dayFormatter = new Intl.DateTimeFormat(calendar.params.locale, {
27366 day: 'numeric'
27367 });
27368 calendar.monthFormatter = new Intl.DateTimeFormat(calendar.params.locale, {
27369 month: 'long'
27370 });
27371 calendar.yearFormatter = new Intl.DateTimeFormat(calendar.params.locale, {
27372 year: 'numeric'
27373 });
27374 calendar.timeSelectorFormatter = new Intl.DateTimeFormat(calendar.params.locale, calendar.params.timePickerFormat);
27375 var timeFormatCheckDate = calendar.timeSelectorFormatter.format(new Date()).toLowerCase();
27376 calendar.is12HoursFormat = timeFormatCheckDate.indexOf('pm') >= 0 || timeFormatCheckDate.indexOf('am') >= 0; // Auto names
27377
27378 var _calendar$params = calendar.params,
27379 monthNames = _calendar$params.monthNames,
27380 monthNamesShort = _calendar$params.monthNamesShort,
27381 dayNames = _calendar$params.dayNames,
27382 dayNamesShort = _calendar$params.dayNamesShort;
27383
27384 var _calendar$getIntlName = calendar.getIntlNames(),
27385 monthNamesIntl = _calendar$getIntlName.monthNamesIntl,
27386 monthNamesShortIntl = _calendar$getIntlName.monthNamesShortIntl,
27387 dayNamesIntl = _calendar$getIntlName.dayNamesIntl,
27388 dayNamesShortIntl = _calendar$getIntlName.dayNamesShortIntl;
27389
27390 if (monthNames === 'auto') monthNames = monthNamesIntl;
27391 if (monthNamesShort === 'auto') monthNamesShort = monthNamesShortIntl;
27392 if (dayNames === 'auto') dayNames = dayNamesIntl;
27393 if (dayNamesShort === 'auto') dayNamesShort = dayNamesShortIntl;
27394 extend$1(calendar, {
27395 monthNames: monthNames,
27396 monthNamesShort: monthNamesShort,
27397 dayNames: dayNames,
27398 dayNamesShort: dayNamesShort
27399 });
27400
27401 function onInputClick() {
27402 calendar.open();
27403 }
27404
27405 function onInputFocus(e) {
27406 e.preventDefault();
27407 }
27408
27409 function onInputClear() {
27410 calendar.setValue([]);
27411
27412 if (calendar.opened) {
27413 calendar.update();
27414 }
27415 }
27416
27417 function onHtmlClick(e) {
27418 var $targetEl = $(e.target);
27419 if (calendar.destroyed || !calendar.params) return;
27420 if (calendar.isPopover()) return;
27421 if (!calendar.opened || calendar.closing) return;
27422 if ($targetEl.closest('[class*="backdrop"]').length) return;
27423
27424 if ($inputEl && $inputEl.length > 0) {
27425 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal, .calendar-modal').length === 0) {
27426 calendar.close();
27427 }
27428 } else if ($(e.target).closest('.sheet-modal, .calendar-modal').length === 0) {
27429 calendar.close();
27430 }
27431 } // Events
27432
27433
27434 extend$1(calendar, {
27435 attachInputEvents: function attachInputEvents() {
27436 calendar.$inputEl.on('click', onInputClick);
27437 calendar.$inputEl.on('input:clear', onInputClear);
27438
27439 if (calendar.params.inputReadOnly) {
27440 calendar.$inputEl.on('focus mousedown', onInputFocus);
27441
27442 if (calendar.$inputEl[0]) {
27443 calendar.$inputEl[0].f7ValidateReadonly = true;
27444 }
27445 }
27446 },
27447 detachInputEvents: function detachInputEvents() {
27448 calendar.$inputEl.off('click', onInputClick);
27449 calendar.$inputEl.off('input:clear', onInputClear);
27450
27451 if (calendar.params.inputReadOnly) {
27452 calendar.$inputEl.off('focus mousedown', onInputFocus);
27453
27454 if (calendar.$inputEl[0]) {
27455 delete calendar.$inputEl[0].f7ValidateReadonly;
27456 }
27457 }
27458 },
27459 attachHtmlEvents: function attachHtmlEvents() {
27460 app.on('click', onHtmlClick);
27461 },
27462 detachHtmlEvents: function detachHtmlEvents() {
27463 app.off('click', onHtmlClick);
27464 }
27465 });
27466
27467 calendar.attachCalendarEvents = function attachCalendarEvents() {
27468 var allowItemClick = true;
27469 var isTouched;
27470 var isMoved;
27471 var touchStartX;
27472 var touchStartY;
27473 var touchCurrentX;
27474 var touchCurrentY;
27475 var touchStartTime;
27476 var touchEndTime;
27477 var currentTranslate;
27478 var wrapperWidth;
27479 var wrapperHeight;
27480 var percentage;
27481 var touchesDiff;
27482 var isScrolling;
27483 var $el = calendar.$el,
27484 $wrapperEl = calendar.$wrapperEl;
27485
27486 function handleTouchStart(e) {
27487 if (isMoved || isTouched) return;
27488 isTouched = true;
27489 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
27490 touchCurrentX = touchStartX;
27491 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
27492 touchCurrentY = touchStartY;
27493 touchStartTime = new Date().getTime();
27494 percentage = 0;
27495 allowItemClick = true;
27496 isScrolling = undefined;
27497 currentTranslate = calendar.monthsTranslate;
27498 }
27499
27500 function handleTouchMove(e) {
27501 if (!isTouched) return;
27502 var isH = calendar.isHorizontal;
27503 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
27504 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
27505
27506 if (typeof isScrolling === 'undefined') {
27507 isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
27508 }
27509
27510 if (isH && isScrolling || !calendar.allowTouchMove) {
27511 isTouched = false;
27512 return;
27513 }
27514
27515 e.preventDefault();
27516
27517 if (calendar.animating) {
27518 isTouched = false;
27519 return;
27520 }
27521
27522 allowItemClick = false;
27523
27524 if (!isMoved) {
27525 // First move
27526 isMoved = true;
27527 wrapperWidth = $wrapperEl[0].offsetWidth;
27528 wrapperHeight = $wrapperEl[0].offsetHeight;
27529 $wrapperEl.transition(0);
27530 }
27531
27532 touchesDiff = isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;
27533 percentage = touchesDiff / (isH ? wrapperWidth : wrapperHeight);
27534 currentTranslate = (calendar.monthsTranslate * calendar.inverter + percentage) * 100; // Transform wrapper
27535
27536 $wrapperEl.transform("translate3d(" + (isH ? currentTranslate : 0) + "%, " + (isH ? 0 : currentTranslate) + "%, 0)");
27537 }
27538
27539 function handleTouchEnd() {
27540 if (!isTouched || !isMoved) {
27541 isTouched = false;
27542 isMoved = false;
27543 return;
27544 }
27545
27546 isTouched = false;
27547 isMoved = false;
27548 touchEndTime = new Date().getTime();
27549
27550 if (touchEndTime - touchStartTime < 300) {
27551 if (Math.abs(touchesDiff) < 10) {
27552 calendar.resetMonth();
27553 } else if (touchesDiff >= 10) {
27554 if (app.rtl) calendar.nextMonth();else calendar.prevMonth();
27555 } else if (app.rtl) calendar.prevMonth();else calendar.nextMonth();
27556 } else if (percentage <= -0.5) {
27557 if (app.rtl) calendar.prevMonth();else calendar.nextMonth();
27558 } else if (percentage >= 0.5) {
27559 if (app.rtl) calendar.nextMonth();else calendar.prevMonth();
27560 } else {
27561 calendar.resetMonth();
27562 } // Allow click
27563
27564
27565 setTimeout(function () {
27566 allowItemClick = true;
27567 }, 100);
27568 }
27569
27570 function handleDayClick(e) {
27571 if (!allowItemClick) return;
27572 var $dayEl = $(e.target).parents('.calendar-day');
27573
27574 if ($dayEl.length === 0 && $(e.target).hasClass('calendar-day')) {
27575 $dayEl = $(e.target);
27576 }
27577
27578 if ($dayEl.length === 0) return;
27579 if ($dayEl.hasClass('calendar-day-disabled')) return;
27580
27581 if (!calendar.params.rangePicker) {
27582 if ($dayEl.hasClass('calendar-day-next')) calendar.nextMonth();
27583 if ($dayEl.hasClass('calendar-day-prev')) calendar.prevMonth();
27584 }
27585
27586 var dateYear = parseInt($dayEl.attr('data-year'), 10);
27587 var dateMonth = parseInt($dayEl.attr('data-month'), 10);
27588 var dateDay = parseInt($dayEl.attr('data-day'), 10);
27589 calendar.emit('local::dayClick calendarDayClick', calendar, $dayEl[0], dateYear, dateMonth, dateDay);
27590
27591 if (!$dayEl.hasClass('calendar-day-selected') || calendar.params.multiple || calendar.params.rangePicker) {
27592 var valueToAdd = new Date(dateYear, dateMonth, dateDay, 0, 0, 0);
27593
27594 if (calendar.hasTimePicker) {
27595 if (calendar.value && calendar.value[0]) {
27596 valueToAdd.setHours(calendar.value[0].getHours(), calendar.value[0].getMinutes());
27597 } else {
27598 valueToAdd.setHours(new Date().getHours(), new Date().getMinutes());
27599 }
27600 }
27601
27602 calendar.addValue(valueToAdd);
27603 }
27604
27605 if (calendar.params.closeOnSelect) {
27606 if (calendar.params.rangePicker && calendar.value.length === 2 || !calendar.params.rangePicker) {
27607 calendar.close();
27608 }
27609 }
27610 }
27611
27612 function onNextMonthClick() {
27613 calendar.nextMonth();
27614 }
27615
27616 function onPrevMonthClick() {
27617 calendar.prevMonth();
27618 }
27619
27620 function onNextYearClick() {
27621 calendar.nextYear();
27622 }
27623
27624 function onPrevYearClick() {
27625 calendar.prevYear();
27626 }
27627
27628 function onMonthSelectorClick() {
27629 $el.append(calendar.renderMonthPicker());
27630 }
27631
27632 function onMonthSelectorItemClick() {
27633 var $clickedEl = $(this);
27634
27635 if ($clickedEl.hasClass('calendar-month-picker-item-current')) {
27636 $el.find('.calendar-month-picker').remove();
27637 return;
27638 }
27639
27640 $el.find('.calendar-month-picker-item-current').add($clickedEl).toggleClass('calendar-month-picker-item-current');
27641 var index = $clickedEl.index();
27642 var localeMonthIndex = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);
27643 var monthIndex = calendar.currentMonth;
27644 var diff = localeMonthIndex - monthIndex;
27645 var diffIndex = index - diff;
27646 calendar.setYearMonth(calendar.currentYear, diffIndex, 0);
27647 setTimeout(function () {
27648 $el.find('.calendar-month-picker').remove();
27649 }, 200);
27650 }
27651
27652 function onYearSelectorClick() {
27653 $el.append(calendar.renderYearPicker());
27654 var $currentEl = $el.find('.calendar-year-picker-item-current');
27655 var $yearPickerEl = $el.find('.calendar-year-picker');
27656 if (!$currentEl || !$currentEl.length) return;
27657 $yearPickerEl.scrollTop($currentEl[0].offsetTop - $yearPickerEl[0].offsetHeight / 2 + $currentEl[0].offsetHeight / 2);
27658 }
27659
27660 function onYearSelectorItemClick() {
27661 var $clickedEl = $(this);
27662
27663 if ($clickedEl.hasClass('calendar-year-picker-item-current')) {
27664 $el.find('.calendar-year-picker').remove();
27665 return;
27666 }
27667
27668 $el.find('.calendar-year-picker-item-current').add($clickedEl).toggleClass('calendar-year-picker-item-current');
27669 var year = parseInt($clickedEl.attr('data-year'), 10);
27670 calendar.setYearMonth(year, undefined, 0);
27671 setTimeout(function () {
27672 $el.find('.calendar-year-picker').remove();
27673 }, 200);
27674 }
27675
27676 function onTimeSelectorClick() {
27677 calendar.openTimePicker();
27678 }
27679
27680 function onTimePickerCloseClick() {
27681 calendar.closeTimePicker();
27682 }
27683
27684 var passiveListener = app.touchEvents.start === 'touchstart' && getSupport$1().passiveListener ? {
27685 passive: true,
27686 capture: false
27687 } : false; // Selectors clicks
27688
27689 $el.find('.calendar-prev-month-button').on('click', onPrevMonthClick);
27690 $el.find('.calendar-next-month-button').on('click', onNextMonthClick);
27691 $el.find('.calendar-prev-year-button').on('click', onPrevYearClick);
27692 $el.find('.calendar-next-year-button').on('click', onNextYearClick);
27693
27694 if (calendar.params.monthPicker) {
27695 $el.find('.current-month-value').on('click', onMonthSelectorClick);
27696 $el.on('click', '.calendar-month-picker-item', onMonthSelectorItemClick);
27697 }
27698
27699 if (calendar.params.yearPicker) {
27700 $el.find('.current-year-value').on('click', onYearSelectorClick);
27701 $el.on('click', '.calendar-year-picker-item', onYearSelectorItemClick);
27702 }
27703
27704 if (calendar.hasTimePicker) {
27705 $el.find('.calendar-time-selector a').on('click', onTimeSelectorClick);
27706 $el.on('click', '.calendar-time-picker-close', onTimePickerCloseClick);
27707 } // Day clicks
27708
27709
27710 $wrapperEl.on('click', handleDayClick); // Touch events
27711
27712 if (calendar.params.touchMove) {
27713 $wrapperEl.on(app.touchEvents.start, handleTouchStart, passiveListener);
27714 app.on('touchmove:active', handleTouchMove);
27715 app.on('touchend:passive', handleTouchEnd);
27716 }
27717
27718 calendar.detachCalendarEvents = function detachCalendarEvents() {
27719 $el.find('.calendar-prev-month-button').off('click', onPrevMonthClick);
27720 $el.find('.calendar-next-month-button').off('click', onNextMonthClick);
27721 $el.find('.calendar-prev-year-button').off('click', onPrevYearClick);
27722 $el.find('.calendar-next-year-button').off('click', onNextYearClick);
27723
27724 if (calendar.params.monthPicker) {
27725 $el.find('.current-month-value').off('click', onMonthSelectorClick);
27726 $el.off('click', '.calendar-month-picker-item', onMonthSelectorItemClick);
27727 }
27728
27729 if (calendar.params.yearPicker) {
27730 $el.find('.current-year-value').off('click', onYearSelectorClick);
27731 $el.off('click', '.calendar-year-picker-item', onYearSelectorItemClick);
27732 }
27733
27734 if (calendar.hasTimePicker) {
27735 $el.find('.calendar-time-selector a').off('click', onTimeSelectorClick);
27736 $el.off('click', '.calendar-time-picker-close', onTimePickerCloseClick);
27737 }
27738
27739 $wrapperEl.off('click', handleDayClick);
27740
27741 if (calendar.params.touchMove) {
27742 $wrapperEl.off(app.touchEvents.start, handleTouchStart, passiveListener);
27743 app.off('touchmove:active', handleTouchMove);
27744 app.off('touchend:passive', handleTouchEnd);
27745 }
27746 };
27747 };
27748
27749 calendar.init();
27750 return calendar || _assertThisInitialized(_this);
27751 }
27752
27753 var _proto = Calendar.prototype;
27754
27755 _proto.getIntlNames = function getIntlNames() {
27756 var calendar = this;
27757 var locale = calendar.params.locale;
27758 var monthNamesIntl = [];
27759 var monthNamesShortIntl = [];
27760 var dayNamesIntl = [];
27761 var dayNamesShortIntl = [];
27762 var formatterMonthNames = new Intl.DateTimeFormat(locale, {
27763 month: 'long'
27764 });
27765 var formatterMonthNamesShort = new Intl.DateTimeFormat(locale, {
27766 month: 'short'
27767 });
27768 var formatterDayNames = new Intl.DateTimeFormat(locale, {
27769 weekday: 'long'
27770 });
27771 var formatterDayNamesShort = new Intl.DateTimeFormat(locale, {
27772 weekday: 'short'
27773 });
27774 var year;
27775 var yearStarted;
27776 var yearEnded;
27777
27778 for (var i = 0; i < 24; i += 1) {
27779 var date = new Date().setMonth(i, 1);
27780 var currentYear = calendar.yearFormatter.format(date);
27781
27782 if (year && currentYear !== year) {
27783 if (yearStarted) yearEnded = true;
27784 yearStarted = true;
27785 year = currentYear;
27786 }
27787
27788 if (!year) {
27789 year = currentYear;
27790 }
27791
27792 if (yearStarted && year === currentYear && !yearEnded) {
27793 monthNamesIntl.push(formatterMonthNames.format(date));
27794 monthNamesShortIntl.push(formatterMonthNamesShort.format(date));
27795 }
27796 }
27797
27798 var weekDay = new Date().getDay();
27799
27800 for (var _i = 0; _i < 7; _i += 1) {
27801 var _date = new Date().getTime() + (_i - weekDay) * 24 * 60 * 60 * 1000;
27802
27803 dayNamesIntl.push(formatterDayNames.format(_date));
27804 dayNamesShortIntl.push(formatterDayNamesShort.format(_date));
27805 }
27806
27807 return {
27808 monthNamesIntl: monthNamesIntl,
27809 monthNamesShortIntl: monthNamesShortIntl,
27810 dayNamesIntl: dayNamesIntl,
27811 dayNamesShortIntl: dayNamesShortIntl
27812 };
27813 };
27814
27815 _proto.normalizeDate = function normalizeDate(date) {
27816 var calendar = this;
27817 var d = new Date(date);
27818
27819 if (calendar.hasTimePicker) {
27820 return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());
27821 }
27822
27823 return new Date(d.getFullYear(), d.getMonth(), d.getDate());
27824 };
27825
27826 _proto.normalizeValues = function normalizeValues(values) {
27827 var calendar = this;
27828 var newValues = [];
27829
27830 if (values && Array.isArray(values)) {
27831 newValues = values.map(function (val) {
27832 return calendar.normalizeDate(val);
27833 });
27834 }
27835
27836 return newValues;
27837 };
27838
27839 _proto.initInput = function initInput() {
27840 var calendar = this;
27841 if (!calendar.$inputEl) return;
27842 if (calendar.params.inputReadOnly) calendar.$inputEl.prop('readOnly', true);
27843 };
27844
27845 _proto.isPopover = function isPopover() {
27846 var calendar = this;
27847 var app = calendar.app,
27848 modal = calendar.modal,
27849 params = calendar.params;
27850 var device = getDevice$1();
27851 if (params.openIn === 'sheet') return false;
27852 if (modal && modal.type !== 'popover') return false;
27853
27854 if (!calendar.inline && calendar.inputEl) {
27855 if (params.openIn === 'popover') return true;
27856
27857 if (device.ios) {
27858 return !!device.ipad;
27859 }
27860
27861 if (app.width >= 768) {
27862 return true;
27863 }
27864
27865 if (device.desktop && app.theme === 'aurora') {
27866 return true;
27867 }
27868 }
27869
27870 return false;
27871 };
27872
27873 _proto.formatDate = function formatDate(d) {
27874 var calendar = this;
27875 var date = new Date(d);
27876 var year = date.getFullYear();
27877 var month = date.getMonth();
27878 var month1 = month + 1;
27879 var day = date.getDate();
27880 var weekDay = date.getDay();
27881 var monthNames = calendar.monthNames,
27882 monthNamesShort = calendar.monthNamesShort,
27883 dayNames = calendar.dayNames,
27884 dayNamesShort = calendar.dayNamesShort;
27885 var _calendar$params2 = calendar.params,
27886 dateFormat = _calendar$params2.dateFormat,
27887 locale = _calendar$params2.locale;
27888
27889 function twoDigits(number) {
27890 return number < 10 ? "0" + number : number;
27891 }
27892
27893 if (typeof dateFormat === 'string') {
27894 var tokens = {
27895 yyyy: year,
27896 yy: String(year).substring(2),
27897 mm: twoDigits(month1),
27898 m: month1,
27899 MM: monthNames[month],
27900 M: monthNamesShort[month],
27901 dd: twoDigits(day),
27902 d: day,
27903 DD: dayNames[weekDay],
27904 D: dayNamesShort[weekDay]
27905 };
27906
27907 if (calendar.params.timePicker) {
27908 var hours = date.getHours();
27909 var minutes = date.getMinutes();
27910 var seconds = date.getSeconds();
27911 var hours12 = hours;
27912 if (hours > 12) hours12 = hours - 12;
27913 if (hours === 0) hours12 = 12;
27914 var a = hours >= 12 && hours !== 0 ? 'pm' : 'am';
27915 Object.assign(tokens, {
27916 HH: twoDigits(hours),
27917 H: hours,
27918 hh: twoDigits(hours12),
27919 h: hours12,
27920 ss: twoDigits(seconds),
27921 s: seconds,
27922 ':mm': twoDigits(minutes),
27923 ':m': minutes,
27924 a: a,
27925 A: a.toUpperCase()
27926 });
27927 }
27928
27929 var regexp = new RegExp(Object.keys(tokens).map(function (t) {
27930 return "(" + t + ")";
27931 }).join('|'), 'g');
27932 return dateFormat.replace(regexp, function (token) {
27933 if (token in tokens) return tokens[token];
27934 return token;
27935 });
27936 }
27937
27938 if (typeof dateFormat === 'function') {
27939 return dateFormat(date);
27940 } // Intl Object
27941
27942
27943 var formatter = new Intl.DateTimeFormat(locale, dateFormat);
27944 return formatter.format(date);
27945 };
27946
27947 _proto.formatValue = function formatValue() {
27948 var calendar = this;
27949 var value = calendar.value;
27950
27951 if (calendar.params.formatValue) {
27952 return calendar.params.formatValue.call(calendar, value);
27953 }
27954
27955 return value.map(function (v) {
27956 return calendar.formatDate(v);
27957 }).join(calendar.params.rangePicker ? ' - ' : ', ');
27958 };
27959
27960 _proto.addValue = function addValue(newValue) {
27961 var calendar = this;
27962 var _calendar$params3 = calendar.params,
27963 multiple = _calendar$params3.multiple,
27964 rangePicker = _calendar$params3.rangePicker,
27965 rangePickerMinDays = _calendar$params3.rangePickerMinDays,
27966 rangePickerMaxDays = _calendar$params3.rangePickerMaxDays;
27967
27968 if (multiple) {
27969 if (!calendar.value) calendar.value = [];
27970 var inValuesIndex;
27971
27972 for (var i = 0; i < calendar.value.length; i += 1) {
27973 if (new Date(newValue).getTime() === new Date(calendar.value[i]).getTime()) {
27974 inValuesIndex = i;
27975 }
27976 }
27977
27978 if (typeof inValuesIndex === 'undefined') {
27979 calendar.value.push(newValue);
27980 } else {
27981 calendar.value.splice(inValuesIndex, 1);
27982 }
27983
27984 calendar.updateValue();
27985 } else if (rangePicker) {
27986 if (!calendar.value) calendar.value = [];
27987
27988 if (calendar.value.length === 2 || calendar.value.length === 0) {
27989 calendar.value = [];
27990 }
27991
27992 if (calendar.value.length === 0 || Math.abs(calendar.value[0].getTime() - newValue.getTime()) >= (rangePickerMinDays - 1) * 60 * 60 * 24 * 1000 && (rangePickerMaxDays === 0 || Math.abs(calendar.value[0].getTime() - newValue.getTime()) <= (rangePickerMaxDays - 1) * 60 * 60 * 24 * 1000)) calendar.value.push(newValue);else calendar.value = [];
27993 calendar.value.sort(function (a, b) {
27994 return a - b;
27995 });
27996 calendar.updateValue();
27997 } else {
27998 calendar.value = [newValue];
27999 calendar.updateValue();
28000 }
28001 };
28002
28003 _proto.setValue = function setValue(values) {
28004 var calendar = this;
28005 var currentValue = calendar.value;
28006
28007 if (Array.isArray(currentValue) && Array.isArray(values) && currentValue.length === values.length) {
28008 var equal = true;
28009 currentValue.forEach(function (v, index) {
28010 if (v !== values[index]) equal = false;
28011 });
28012 if (equal) return;
28013 }
28014
28015 calendar.value = values;
28016 calendar.updateValue();
28017 };
28018
28019 _proto.getValue = function getValue() {
28020 var calendar = this;
28021 return calendar.value;
28022 };
28023
28024 _proto.updateValue = function updateValue(onlyHeader) {
28025 var calendar = this;
28026 var $el = calendar.$el,
28027 $wrapperEl = calendar.$wrapperEl,
28028 $inputEl = calendar.$inputEl,
28029 value = calendar.value,
28030 params = calendar.params;
28031 var i;
28032
28033 if ($el && $el.length > 0) {
28034 $wrapperEl.find('.calendar-day-selected').removeClass('calendar-day-selected calendar-day-selected-range calendar-day-selected-left calendar-day-selected-right');
28035 var valueDate;
28036
28037 if (params.rangePicker && value.length === 2) {
28038 var leftDate = new Date(value[0]).getTime();
28039 var rightDate = new Date(value[1]).getTime();
28040
28041 for (i = leftDate; i <= rightDate; i += 24 * 60 * 60 * 1000) {
28042 valueDate = new Date(i);
28043 var addClass = 'calendar-day-selected';
28044
28045 if (leftDate !== rightDate) {
28046 if (i !== leftDate && i !== rightDate) {
28047 addClass += ' calendar-day-selected-range';
28048 }
28049
28050 if (i === leftDate) {
28051 addClass += ' calendar-day-selected-left';
28052 }
28053
28054 if (i === rightDate) {
28055 addClass += ' calendar-day-selected-right';
28056 }
28057 }
28058
28059 $wrapperEl.find(".calendar-day[data-date=\"" + valueDate.getFullYear() + "-" + valueDate.getMonth() + "-" + valueDate.getDate() + "\"]").addClass(addClass);
28060 }
28061
28062 valueDate = new Date(leftDate);
28063 $wrapperEl.find(".calendar-day[data-date=\"" + valueDate.getFullYear() + "-" + valueDate.getMonth() + "-" + valueDate.getDate() + "\"]").removeClass('calendar-day-selected-range').addClass('calendar-day-selected calendar-day-selected-left');
28064 valueDate = new Date(rightDate);
28065 $wrapperEl.find(".calendar-day[data-date=\"" + valueDate.getFullYear() + "-" + valueDate.getMonth() + "-" + valueDate.getDate() + "\"]").removeClass('calendar-day-selected-range').addClass('calendar-day-selected calendar-day-selected-right');
28066 } else {
28067 for (i = 0; i < calendar.value.length; i += 1) {
28068 valueDate = new Date(value[i]);
28069 $wrapperEl.find(".calendar-day[data-date=\"" + valueDate.getFullYear() + "-" + valueDate.getMonth() + "-" + valueDate.getDate() + "\"]").addClass('calendar-day-selected');
28070 }
28071 }
28072 }
28073
28074 if (!onlyHeader) {
28075 calendar.emit('local::change calendarChange', calendar, value);
28076 }
28077
28078 if ($el && $el.length > 0 && calendar.hasTimePicker) {
28079 $el.find('.calendar-time-selector a').text(value && value.length ? calendar.timeSelectorFormatter.format(value[0]) : calendar.params.timePickerPlaceholder);
28080 }
28081
28082 if ($inputEl && $inputEl.length || params.header) {
28083 var inputValue = calendar.formatValue(value);
28084
28085 if (params.header && $el && $el.length) {
28086 $el.find('.calendar-selected-date').text(inputValue);
28087 }
28088
28089 if ($inputEl && $inputEl.length && !onlyHeader) {
28090 $inputEl.val(inputValue);
28091 $inputEl.trigger('change');
28092 }
28093 }
28094 };
28095
28096 _proto.updateCurrentMonthYear = function updateCurrentMonthYear(dir) {
28097 var calendar = this;
28098 var $months = calendar.$months,
28099 $el = calendar.$el,
28100 monthNames = calendar.monthNames;
28101 var currentLocaleMonth;
28102 var currentLocaleYear;
28103
28104 if (typeof dir === 'undefined') {
28105 calendar.currentMonth = parseInt($months.eq(1).attr('data-month'), 10);
28106 calendar.currentYear = parseInt($months.eq(1).attr('data-year'), 10);
28107 currentLocaleMonth = $months.eq(1).attr('data-locale-month');
28108 currentLocaleYear = $months.eq(1).attr('data-locale-year');
28109 } else {
28110 calendar.currentMonth = parseInt($months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-month'), 10);
28111 calendar.currentYear = parseInt($months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-year'), 10);
28112 currentLocaleMonth = $months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-locale-month');
28113 currentLocaleYear = $months.eq(dir === 'next' ? $months.length - 1 : 0).attr('data-locale-year');
28114 }
28115
28116 $el.find('.current-month-value').text(monthNames[currentLocaleMonth]);
28117 $el.find('.current-year-value').text(currentLocaleYear);
28118 };
28119
28120 _proto.update = function update() {
28121 var calendar = this;
28122 var currentYear = calendar.currentYear,
28123 currentMonth = calendar.currentMonth,
28124 $wrapperEl = calendar.$wrapperEl;
28125 var currentDate = new Date(currentYear, currentMonth);
28126 var prevMonthHtml = calendar.renderMonth(currentDate, 'prev');
28127 var currentMonthHtml = calendar.renderMonth(currentDate);
28128 var nextMonthHtml = calendar.renderMonth(currentDate, 'next');
28129 $wrapperEl.transition(0).html("" + prevMonthHtml + currentMonthHtml + nextMonthHtml).transform('translate3d(0,0,0)');
28130 calendar.$months = $wrapperEl.find('.calendar-month');
28131 calendar.monthsTranslate = 0;
28132 calendar.setMonthsTranslate();
28133 calendar.$months.each(function (monthEl) {
28134 calendar.emit('local::monthAdd calendarMonthAdd', monthEl);
28135 });
28136 };
28137
28138 _proto.onMonthChangeStart = function onMonthChangeStart(dir) {
28139 var calendar = this;
28140 var $months = calendar.$months,
28141 currentYear = calendar.currentYear,
28142 currentMonth = calendar.currentMonth;
28143 calendar.updateCurrentMonthYear(dir);
28144 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
28145 var currentIndex = dir === 'next' ? $months.length - 1 : 0;
28146 $months.eq(currentIndex).addClass('calendar-month-current');
28147 $months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'calendar-month-prev' : 'calendar-month-next');
28148 calendar.emit('local::monthYearChangeStart calendarMonthYearChangeStart', calendar, currentYear, currentMonth);
28149 };
28150
28151 _proto.onMonthChangeEnd = function onMonthChangeEnd(dir, rebuildBoth) {
28152 var calendar = this;
28153 var currentYear = calendar.currentYear,
28154 currentMonth = calendar.currentMonth,
28155 $wrapperEl = calendar.$wrapperEl,
28156 monthsTranslate = calendar.monthsTranslate;
28157 calendar.animating = false;
28158 var nextMonthHtml;
28159 var prevMonthHtml;
28160 var currentMonthHtml;
28161 $wrapperEl.find('.calendar-month:not(.calendar-month-prev):not(.calendar-month-current):not(.calendar-month-next)').remove();
28162
28163 if (typeof dir === 'undefined') {
28164 dir = 'next'; // eslint-disable-line
28165
28166 rebuildBoth = true; // eslint-disable-line
28167 }
28168
28169 if (!rebuildBoth) {
28170 currentMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), dir);
28171 } else {
28172 $wrapperEl.find('.calendar-month-next, .calendar-month-prev').remove();
28173 prevMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'prev');
28174 nextMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'next');
28175 }
28176
28177 if (dir === 'next' || rebuildBoth) {
28178 $wrapperEl.append(currentMonthHtml || nextMonthHtml);
28179 }
28180
28181 if (dir === 'prev' || rebuildBoth) {
28182 $wrapperEl.prepend(currentMonthHtml || prevMonthHtml);
28183 }
28184
28185 var $months = $wrapperEl.find('.calendar-month');
28186 calendar.$months = $months;
28187 calendar.setMonthsTranslate(monthsTranslate);
28188 calendar.emit('local::monthAdd calendarMonthAdd', calendar, dir === 'next' ? $months.eq($months.length - 1)[0] : $months.eq(0)[0]);
28189 calendar.emit('local::monthYearChangeEnd calendarMonthYearChangeEnd', calendar, currentYear, currentMonth);
28190 };
28191
28192 _proto.setMonthsTranslate = function setMonthsTranslate(translate) {
28193 var calendar = this;
28194 var $months = calendar.$months,
28195 isH = calendar.isHorizontal,
28196 inverter = calendar.inverter; // eslint-disable-next-line
28197
28198 translate = translate || calendar.monthsTranslate || 0;
28199
28200 if (typeof calendar.monthsTranslate === 'undefined') {
28201 calendar.monthsTranslate = translate;
28202 }
28203
28204 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
28205 var prevMonthTranslate = -(translate + 1) * 100 * inverter;
28206 var currentMonthTranslate = -translate * 100 * inverter;
28207 var nextMonthTranslate = -(translate - 1) * 100 * inverter;
28208 $months.eq(0).transform("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)").addClass('calendar-month-prev');
28209 $months.eq(1).transform("translate3d(" + (isH ? currentMonthTranslate : 0) + "%, " + (isH ? 0 : currentMonthTranslate) + "%, 0)").addClass('calendar-month-current');
28210 $months.eq(2).transform("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)").addClass('calendar-month-next');
28211 };
28212
28213 _proto.nextMonth = function nextMonth(transition) {
28214 var calendar = this;
28215 var params = calendar.params,
28216 $wrapperEl = calendar.$wrapperEl,
28217 inverter = calendar.inverter,
28218 isH = calendar.isHorizontal;
28219
28220 if (typeof transition === 'undefined' || typeof transition === 'object') {
28221 transition = ''; // eslint-disable-line
28222
28223 if (!params.animate) transition = 0; // eslint-disable-line
28224 }
28225
28226 var nextMonth = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-month'), 10);
28227 var nextYear = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-year'), 10);
28228 var nextDate = new Date(nextYear, nextMonth);
28229 var nextDateTime = nextDate.getTime();
28230 var transitionEndCallback = !calendar.animating;
28231
28232 if (params.maxDate) {
28233 if (nextDateTime > new Date(params.maxDate).getTime()) {
28234 calendar.resetMonth();
28235 return;
28236 }
28237 }
28238
28239 calendar.monthsTranslate -= 1;
28240
28241 if (nextMonth === calendar.currentMonth) {
28242 var nextMonthTranslate = -calendar.monthsTranslate * 100 * inverter;
28243 var nextMonthHtml = $(calendar.renderMonth(nextDateTime, 'next')).transform("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)").addClass('calendar-month-next');
28244 $wrapperEl.append(nextMonthHtml[0]);
28245 calendar.$months = $wrapperEl.find('.calendar-month');
28246 calendar.emit('local::monthAdd calendarMonthAdd', calendar.$months.eq(calendar.$months.length - 1)[0]);
28247 }
28248
28249 calendar.animating = true;
28250 calendar.onMonthChangeStart('next');
28251 var translate = calendar.monthsTranslate * 100 * inverter;
28252 $wrapperEl.transition(transition).transform("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)");
28253
28254 if (transitionEndCallback) {
28255 $wrapperEl.transitionEnd(function () {
28256 calendar.onMonthChangeEnd('next');
28257 });
28258 }
28259
28260 if (!params.animate) {
28261 calendar.onMonthChangeEnd('next');
28262 }
28263 };
28264
28265 _proto.prevMonth = function prevMonth(transition) {
28266 var calendar = this;
28267 var params = calendar.params,
28268 $wrapperEl = calendar.$wrapperEl,
28269 inverter = calendar.inverter,
28270 isH = calendar.isHorizontal;
28271
28272 if (typeof transition === 'undefined' || typeof transition === 'object') {
28273 transition = ''; // eslint-disable-line
28274
28275 if (!params.animate) transition = 0; // eslint-disable-line
28276 }
28277
28278 var prevMonth = parseInt(calendar.$months.eq(0).attr('data-month'), 10);
28279 var prevYear = parseInt(calendar.$months.eq(0).attr('data-year'), 10);
28280 var prevDate = new Date(prevYear, prevMonth + 1, -1);
28281 var prevDateTime = prevDate.getTime();
28282 var transitionEndCallback = !calendar.animating;
28283
28284 if (params.minDate) {
28285 var minDate = new Date(params.minDate);
28286 minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);
28287
28288 if (prevDateTime < minDate.getTime()) {
28289 calendar.resetMonth();
28290 return;
28291 }
28292 }
28293
28294 calendar.monthsTranslate += 1;
28295
28296 if (prevMonth === calendar.currentMonth) {
28297 var prevMonthTranslate = -calendar.monthsTranslate * 100 * inverter;
28298 var prevMonthHtml = $(calendar.renderMonth(prevDateTime, 'prev')).transform("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)").addClass('calendar-month-prev');
28299 $wrapperEl.prepend(prevMonthHtml[0]);
28300 calendar.$months = $wrapperEl.find('.calendar-month');
28301 calendar.emit('local::monthAdd calendarMonthAdd', calendar.$months.eq(0)[0]);
28302 }
28303
28304 calendar.animating = true;
28305 calendar.onMonthChangeStart('prev');
28306 var translate = calendar.monthsTranslate * 100 * inverter;
28307 $wrapperEl.transition(transition).transform("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)");
28308
28309 if (transitionEndCallback) {
28310 $wrapperEl.transitionEnd(function () {
28311 calendar.onMonthChangeEnd('prev');
28312 });
28313 }
28314
28315 if (!params.animate) {
28316 calendar.onMonthChangeEnd('prev');
28317 }
28318 };
28319
28320 _proto.resetMonth = function resetMonth(transition) {
28321 if (transition === void 0) {
28322 transition = '';
28323 }
28324
28325 var calendar = this;
28326 var $wrapperEl = calendar.$wrapperEl,
28327 inverter = calendar.inverter,
28328 isH = calendar.isHorizontal,
28329 monthsTranslate = calendar.monthsTranslate;
28330 var translate = monthsTranslate * 100 * inverter;
28331 $wrapperEl.transition(transition).transform("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)");
28332 } // eslint-disable-next-line
28333 ;
28334
28335 _proto.setYearMonth = function setYearMonth(year, month, transition) {
28336 var calendar = this;
28337 var params = calendar.params,
28338 isH = calendar.isHorizontal,
28339 $wrapperEl = calendar.$wrapperEl,
28340 inverter = calendar.inverter; // eslint-disable-next-line
28341
28342 if (typeof year === 'undefined') year = calendar.currentYear; // eslint-disable-next-line
28343
28344 if (typeof month === 'undefined') month = calendar.currentMonth;
28345
28346 if (typeof transition === 'undefined' || typeof transition === 'object') {
28347 // eslint-disable-next-line
28348 transition = ''; // eslint-disable-next-line
28349
28350 if (!params.animate) transition = 0;
28351 }
28352
28353 var targetDate;
28354
28355 if (year < calendar.currentYear) {
28356 targetDate = new Date(year, month + 1, -1).getTime();
28357 } else {
28358 targetDate = new Date(year, month).getTime();
28359 }
28360
28361 if (params.maxDate && targetDate > new Date(params.maxDate).getTime()) {
28362 return false;
28363 }
28364
28365 if (params.minDate) {
28366 var minDate = new Date(params.minDate);
28367 minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);
28368
28369 if (targetDate < minDate.getTime()) {
28370 return false;
28371 }
28372 }
28373
28374 var currentDate = new Date(calendar.currentYear, calendar.currentMonth).getTime();
28375 var dir = targetDate > currentDate ? 'next' : 'prev';
28376 var newMonthHTML = calendar.renderMonth(new Date(year, month));
28377 calendar.monthsTranslate = calendar.monthsTranslate || 0;
28378 var prevTranslate = calendar.monthsTranslate;
28379 var monthTranslate;
28380 var transitionEndCallback = !calendar.animating && transition !== 0;
28381
28382 if (targetDate > currentDate) {
28383 // To next
28384 calendar.monthsTranslate -= 1;
28385 if (!calendar.animating) calendar.$months.eq(calendar.$months.length - 1).remove();
28386 $wrapperEl.append(newMonthHTML);
28387 calendar.$months = $wrapperEl.find('.calendar-month');
28388 monthTranslate = -(prevTranslate - 1) * 100 * inverter;
28389 calendar.$months.eq(calendar.$months.length - 1).transform("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)").addClass('calendar-month-next');
28390 } else {
28391 // To prev
28392 calendar.monthsTranslate += 1;
28393 if (!calendar.animating) calendar.$months.eq(0).remove();
28394 $wrapperEl.prepend(newMonthHTML);
28395 calendar.$months = $wrapperEl.find('.calendar-month');
28396 monthTranslate = -(prevTranslate + 1) * 100 * inverter;
28397 calendar.$months.eq(0).transform("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)").addClass('calendar-month-prev');
28398 }
28399
28400 calendar.emit('local::monthAdd calendarMonthAdd', dir === 'next' ? calendar.$months.eq(calendar.$months.length - 1)[0] : calendar.$months.eq(0)[0]);
28401 calendar.animating = true;
28402 calendar.onMonthChangeStart(dir);
28403 var wrapperTranslate = calendar.monthsTranslate * 100 * inverter;
28404 $wrapperEl.transition(transition).transform("translate3d(" + (isH ? wrapperTranslate : 0) + "%, " + (isH ? 0 : wrapperTranslate) + "%, 0)");
28405
28406 if (transitionEndCallback) {
28407 $wrapperEl.transitionEnd(function () {
28408 calendar.onMonthChangeEnd(dir, true);
28409 });
28410 }
28411
28412 if (!params.animate || transition === 0) {
28413 calendar.onMonthChangeEnd(dir, true);
28414 }
28415 };
28416
28417 _proto.nextYear = function nextYear() {
28418 var calendar = this;
28419 calendar.setYearMonth(calendar.currentYear + 1);
28420 };
28421
28422 _proto.prevYear = function prevYear() {
28423 var calendar = this;
28424 calendar.setYearMonth(calendar.currentYear - 1);
28425 } // eslint-disable-next-line
28426 ;
28427
28428 _proto.dateInRange = function dateInRange(dayDate, range) {
28429 var match = false;
28430 var i;
28431 if (!range) return false;
28432
28433 if (Array.isArray(range)) {
28434 for (i = 0; i < range.length; i += 1) {
28435 if (range[i].from || range[i].to) {
28436 if (range[i].from && range[i].to) {
28437 if (dayDate <= new Date(range[i].to).getTime() && dayDate >= new Date(range[i].from).getTime()) {
28438 match = true;
28439 }
28440 } else if (range[i].from) {
28441 if (dayDate >= new Date(range[i].from).getTime()) {
28442 match = true;
28443 }
28444 } else if (range[i].to) {
28445 if (dayDate <= new Date(range[i].to).getTime()) {
28446 match = true;
28447 }
28448 }
28449 } else if (range[i].date) {
28450 if (dayDate === new Date(range[i].date).getTime()) {
28451 match = true;
28452 }
28453 } else if (dayDate === new Date(range[i]).getTime()) {
28454 match = true;
28455 }
28456 }
28457 } else if (range.from || range.to) {
28458 if (range.from && range.to) {
28459 if (dayDate <= new Date(range.to).getTime() && dayDate >= new Date(range.from).getTime()) {
28460 match = true;
28461 }
28462 } else if (range.from) {
28463 if (dayDate >= new Date(range.from).getTime()) {
28464 match = true;
28465 }
28466 } else if (range.to) {
28467 if (dayDate <= new Date(range.to).getTime()) {
28468 match = true;
28469 }
28470 }
28471 } else if (range.date) {
28472 match = dayDate === new Date(range.date).getTime();
28473 } else if (typeof range === 'function') {
28474 match = range(new Date(dayDate));
28475 }
28476
28477 return match;
28478 } // eslint-disable-next-line
28479 ;
28480
28481 _proto.daysInMonth = function daysInMonth(date) {
28482 var d = new Date(date);
28483 return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();
28484 };
28485
28486 _proto.renderMonths = function renderMonths(date) {
28487 var calendar = this;
28488
28489 if (calendar.params.renderMonths) {
28490 return calendar.params.renderMonths.call(calendar, date);
28491 }
28492
28493 return $jsx("div", {
28494 class: "calendar-months-wrapper"
28495 }, calendar.renderMonth(date, 'prev'), calendar.renderMonth(date), calendar.renderMonth(date, 'next'));
28496 };
28497
28498 _proto.renderMonth = function renderMonth(d, offset) {
28499 var calendar = this;
28500 var params = calendar.params,
28501 value = calendar.value;
28502
28503 if (params.renderMonth) {
28504 return params.renderMonth.call(calendar, d, offset);
28505 }
28506
28507 var date = new Date(d);
28508 var year = date.getFullYear();
28509 var month = date.getMonth();
28510 var localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter.format(date));
28511 if (localeMonth < 0) localeMonth = month;
28512 var localeYear = calendar.yearFormatter.format(date);
28513
28514 if (offset === 'next') {
28515 if (month === 11) date = new Date(year + 1, 0);else date = new Date(year, month + 1, 1);
28516 }
28517
28518 if (offset === 'prev') {
28519 if (month === 0) date = new Date(year - 1, 11);else date = new Date(year, month - 1, 1);
28520 }
28521
28522 if (offset === 'next' || offset === 'prev') {
28523 month = date.getMonth();
28524 year = date.getFullYear();
28525 localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter.format(date));
28526 if (localeMonth < 0) localeMonth = month;
28527 localeYear = calendar.yearFormatter.format(date);
28528 }
28529
28530 var currentValues = [];
28531 var today = new Date().setHours(0, 0, 0, 0);
28532 var minDate = params.minDate ? new Date(params.minDate).getTime() : null;
28533 var maxDate = params.maxDate ? new Date(params.maxDate).getTime() : null;
28534 var rows = 6;
28535 var cols = 7;
28536 var daysInPrevMonth = calendar.daysInMonth(new Date(date.getFullYear(), date.getMonth()).getTime() - 10 * 24 * 60 * 60 * 1000);
28537 var daysInMonth = calendar.daysInMonth(date);
28538 var minDayNumber = params.firstDay === 6 ? 0 : 1;
28539 var monthHtml = '';
28540 var dayIndex = 0 + (params.firstDay - 1);
28541 var disabled;
28542 var hasEvents;
28543 var firstDayOfMonthIndex = new Date(date.getFullYear(), date.getMonth()).getDay();
28544 if (firstDayOfMonthIndex === 0) firstDayOfMonthIndex = 7;
28545
28546 if (value && value.length) {
28547 for (var i = 0; i < value.length; i += 1) {
28548 currentValues.push(new Date(value[i]).setHours(0, 0, 0, 0));
28549 }
28550 }
28551
28552 for (var row = 1; row <= rows; row += 1) {
28553 var rowHtml = '';
28554
28555 var _loop = function _loop(col) {
28556 dayIndex += 1;
28557 var dayDate = void 0;
28558 var dayNumber = dayIndex - firstDayOfMonthIndex;
28559 var addClass = '';
28560
28561 if (row === 1 && col === 1 && dayNumber > minDayNumber && params.firstDay !== 1) {
28562 dayIndex -= 7;
28563 dayNumber = dayIndex - firstDayOfMonthIndex;
28564 }
28565
28566 var weekDayIndex = col - 1 + params.firstDay > 6 ? col - 1 - 7 + params.firstDay : col - 1 + params.firstDay;
28567
28568 if (dayNumber < 0) {
28569 dayNumber = daysInPrevMonth + dayNumber + 1;
28570 addClass += ' calendar-day-prev';
28571 dayDate = new Date(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();
28572 } else {
28573 dayNumber += 1;
28574
28575 if (dayNumber > daysInMonth) {
28576 dayNumber -= daysInMonth;
28577 addClass += ' calendar-day-next';
28578 dayDate = new Date(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();
28579 } else {
28580 dayDate = new Date(year, month, dayNumber).getTime();
28581 }
28582 } // Today
28583
28584
28585 if (dayDate === today) addClass += ' calendar-day-today'; // Selected
28586
28587 if (params.rangePicker && currentValues.length === 2) {
28588 if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) {
28589 addClass += ' calendar-day-selected';
28590 }
28591
28592 if (currentValues[0] !== currentValues[1]) {
28593 if (dayDate > currentValues[0] && dayDate < currentValues[1]) {
28594 addClass += ' calendar-day-selected-range';
28595 }
28596
28597 if (dayDate === currentValues[0]) {
28598 addClass += ' calendar-day-selected-left';
28599 }
28600
28601 if (dayDate === currentValues[1]) {
28602 addClass += ' calendar-day-selected-right';
28603 }
28604 }
28605 } else if (currentValues.indexOf(dayDate) >= 0) addClass += ' calendar-day-selected'; // Weekend
28606
28607
28608 if (params.weekendDays.indexOf(weekDayIndex) >= 0) {
28609 addClass += ' calendar-day-weekend';
28610 } // Events
28611
28612
28613 var eventsHtml = '';
28614 hasEvents = false;
28615
28616 if (params.events) {
28617 if (calendar.dateInRange(dayDate, params.events)) {
28618 hasEvents = true;
28619 }
28620 }
28621
28622 if (hasEvents) {
28623 addClass += ' calendar-day-has-events'; // prettier-ignore
28624
28625 eventsHtml = "\n <span class=\"calendar-day-events\">\n <span class=\"calendar-day-event\"></span>\n </span>\n ";
28626
28627 if (Array.isArray(params.events)) {
28628 var eventDots = [];
28629 params.events.forEach(function (ev) {
28630 var color = ev.color || '';
28631
28632 if (eventDots.indexOf(color) < 0 && calendar.dateInRange(dayDate, ev)) {
28633 eventDots.push(color);
28634 }
28635 }); // prettier-ignore
28636
28637 eventsHtml = "\n <span class=\"calendar-day-events\">\n " + eventDots.map(function (color) {
28638 return ("\n <span class=\"calendar-day-event\" style=\"" + (color ? "background-color: " + color : '') + "\"></span>\n ").trim();
28639 }).join('') + "\n </span>\n ";
28640 }
28641 } // Custom Ranges
28642
28643
28644 if (params.rangesClasses) {
28645 for (var k = 0; k < params.rangesClasses.length; k += 1) {
28646 if (calendar.dateInRange(dayDate, params.rangesClasses[k].range)) {
28647 addClass += " " + params.rangesClasses[k].cssClass;
28648 }
28649 }
28650 } // Disabled
28651
28652
28653 disabled = false;
28654
28655 if (minDate && dayDate < minDate || maxDate && dayDate > maxDate) {
28656 disabled = true;
28657 }
28658
28659 if (params.disabled) {
28660 if (calendar.dateInRange(dayDate, params.disabled)) {
28661 disabled = true;
28662 }
28663 }
28664
28665 if (disabled) {
28666 addClass += ' calendar-day-disabled';
28667 }
28668
28669 dayDate = new Date(dayDate);
28670 var dayYear = dayDate.getFullYear();
28671 var dayMonth = dayDate.getMonth();
28672 var dayNumberDisplay = calendar.dayFormatter.format(dayDate); // prettier-ignore
28673
28674 rowHtml += ("\n <div data-year=\"" + dayYear + "\" data-month=\"" + dayMonth + "\" data-day=\"" + dayNumber + "\" class=\"calendar-day" + addClass + "\" data-date=\"" + dayYear + "-" + dayMonth + "-" + dayNumber + "\">\n <span class=\"calendar-day-number\">" + dayNumberDisplay + eventsHtml + "</span>\n </div>").trim();
28675 };
28676
28677 for (var col = 1; col <= cols; col += 1) {
28678 _loop(col);
28679 }
28680
28681 monthHtml += "<div class=\"calendar-row\">" + rowHtml + "</div>";
28682 }
28683
28684 monthHtml = "<div class=\"calendar-month\" data-year=\"" + year + "\" data-month=\"" + month + "\" data-locale-year=\"" + localeYear + "\" data-locale-month=\"" + localeMonth + "\">" + monthHtml + "</div>";
28685 return monthHtml;
28686 };
28687
28688 _proto.renderWeekHeader = function renderWeekHeader() {
28689 var calendar = this;
28690
28691 if (calendar.params.renderWeekHeader) {
28692 return calendar.params.renderWeekHeader.call(calendar);
28693 }
28694
28695 var params = calendar.params;
28696 var weekDaysHtml = '';
28697
28698 for (var i = 0; i < 7; i += 1) {
28699 var dayIndex = i + params.firstDay > 6 ? i - 7 + params.firstDay : i + params.firstDay;
28700 var dayName = calendar.dayNamesShort[dayIndex];
28701 weekDaysHtml += "<div class=\"calendar-week-day\">" + dayName + "</div>";
28702 }
28703
28704 return $jsx("div", {
28705 class: "calendar-week-header"
28706 }, weekDaysHtml);
28707 };
28708
28709 _proto.renderMonthSelector = function renderMonthSelector() {
28710 var calendar = this;
28711
28712 if (calendar.params.renderMonthSelector) {
28713 return calendar.params.renderMonthSelector.call(calendar);
28714 }
28715
28716 return $jsx("div", {
28717 class: "calendar-month-selector"
28718 }, $jsx("a", {
28719 class: "link icon-only calendar-prev-month-button"
28720 }, $jsx("i", {
28721 class: "icon icon-prev"
28722 })), calendar.params.monthPicker ? $jsx("a", {
28723 class: "current-month-value link"
28724 }) : $jsx("span", {
28725 class: "current-month-value"
28726 }), $jsx("a", {
28727 class: "link icon-only calendar-next-month-button"
28728 }, $jsx("i", {
28729 class: "icon icon-next"
28730 })));
28731 };
28732
28733 _proto.renderMonthPicker = function renderMonthPicker() {
28734 var calendar = this;
28735 var localeMonth = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);
28736 return $jsx("div", {
28737 class: "calendar-month-picker"
28738 }, calendar.monthNames.map(function (m, index) {
28739 return $jsx("div", {
28740 class: "calendar-month-picker-item " + (localeMonth === index ? 'calendar-month-picker-item-current' : '')
28741 }, $jsx("span", null, m));
28742 }));
28743 };
28744
28745 _proto.renderYearSelector = function renderYearSelector() {
28746 var calendar = this;
28747
28748 if (calendar.params.renderYearSelector) {
28749 return calendar.params.renderYearSelector.call(calendar);
28750 }
28751
28752 return $jsx("div", {
28753 class: "calendar-year-selector"
28754 }, $jsx("a", {
28755 class: "link icon-only calendar-prev-year-button"
28756 }, $jsx("i", {
28757 class: "icon icon-prev"
28758 })), calendar.params.yearPicker ? $jsx("a", {
28759 class: "current-year-value link"
28760 }) : $jsx("span", {
28761 class: "current-year-value"
28762 }), $jsx("a", {
28763 class: "link icon-only calendar-next-year-button"
28764 }, $jsx("i", {
28765 class: "icon icon-next"
28766 })));
28767 };
28768
28769 _proto.renderYearPicker = function renderYearPicker() {
28770 var calendar = this;
28771 var currentYear = calendar.currentYear;
28772 var yearMin = calendar.params.yearPickerMin || new Date().getFullYear() - 100;
28773
28774 if (calendar.params.minDate) {
28775 yearMin = Math.max(yearMin, new Date(calendar.params.minDate).getFullYear());
28776 }
28777
28778 var yearMax = calendar.params.yearPickerMax || new Date().getFullYear() + 100;
28779
28780 if (calendar.params.maxDate) {
28781 yearMax = Math.min(yearMax, new Date(calendar.params.maxDate).getFullYear());
28782 }
28783
28784 var years = [];
28785
28786 for (var i = yearMin; i <= yearMax; i += 1) {
28787 years.push(i);
28788 }
28789
28790 return $jsx("div", {
28791 class: "calendar-year-picker"
28792 }, years.map(function (year) {
28793 return $jsx("div", {
28794 "data-year": year,
28795 class: "calendar-year-picker-item " + (year === currentYear ? 'calendar-year-picker-item-current' : '')
28796 }, $jsx("span", null, calendar.yearFormatter.format(new Date().setFullYear(year))));
28797 }));
28798 } // eslint-disable-next-line
28799 ;
28800
28801 _proto.renderTimeSelector = function renderTimeSelector() {
28802 var calendar = this;
28803 var value = calendar.value && calendar.value[0];
28804 var timeString;
28805 if (value) timeString = calendar.timeSelectorFormatter.format(value);
28806 return $jsx("div", {
28807 class: "calendar-time-selector"
28808 }, $jsx("a", {
28809 class: "link"
28810 }, timeString || calendar.params.timePickerPlaceholder));
28811 };
28812
28813 _proto.renderHeader = function renderHeader() {
28814 var calendar = this;
28815
28816 if (calendar.params.renderHeader) {
28817 return calendar.params.renderHeader.call(calendar);
28818 }
28819
28820 return $jsx("div", {
28821 class: "calendar-header"
28822 }, $jsx("div", {
28823 class: "calendar-selected-date"
28824 }, calendar.params.headerPlaceholder));
28825 };
28826
28827 _proto.renderFooter = function renderFooter() {
28828 var calendar = this;
28829 var app = calendar.app;
28830
28831 if (calendar.params.renderFooter) {
28832 return calendar.params.renderFooter.call(calendar);
28833 }
28834
28835 return $jsx("div", {
28836 class: "calendar-footer"
28837 }, $jsx("a", {
28838 class: (app.theme === 'md' ? 'button' : 'link') + " calendar-close sheet-close popover-close"
28839 }, calendar.params.toolbarCloseText));
28840 };
28841
28842 _proto.renderToolbar = function renderToolbar() {
28843 var calendar = this;
28844
28845 if (calendar.params.renderToolbar) {
28846 return calendar.params.renderToolbar.call(calendar, calendar);
28847 } // prettier-ignore
28848
28849
28850 return $jsx("div", {
28851 class: "toolbar toolbar-top no-shadow"
28852 }, $jsx("div", {
28853 class: "toolbar-inner"
28854 }, calendar.params.monthSelector ? calendar.renderMonthSelector() : '', calendar.params.yearSelector ? calendar.renderYearSelector() : ''));
28855 } // eslint-disable-next-line
28856 ;
28857
28858 _proto.renderInline = function renderInline() {
28859 var calendar = this;
28860 var _calendar$params4 = calendar.params,
28861 cssClass = _calendar$params4.cssClass,
28862 toolbar = _calendar$params4.toolbar,
28863 header = _calendar$params4.header,
28864 footer = _calendar$params4.footer,
28865 rangePicker = _calendar$params4.rangePicker,
28866 weekHeader = _calendar$params4.weekHeader;
28867 var value = calendar.value,
28868 hasTimePicker = calendar.hasTimePicker;
28869 var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
28870 return $jsx("div", {
28871 class: "calendar calendar-inline " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '')
28872 }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx("div", {
28873 class: "calendar-months"
28874 }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter());
28875 };
28876
28877 _proto.renderCustomModal = function renderCustomModal() {
28878 var calendar = this;
28879 var _calendar$params5 = calendar.params,
28880 cssClass = _calendar$params5.cssClass,
28881 toolbar = _calendar$params5.toolbar,
28882 header = _calendar$params5.header,
28883 footer = _calendar$params5.footer,
28884 rangePicker = _calendar$params5.rangePicker,
28885 weekHeader = _calendar$params5.weekHeader;
28886 var value = calendar.value,
28887 hasTimePicker = calendar.hasTimePicker;
28888 var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
28889 return $jsx("div", {
28890 class: "calendar calendar-modal " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '')
28891 }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx("div", {
28892 class: "calendar-months"
28893 }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter());
28894 };
28895
28896 _proto.renderSheet = function renderSheet() {
28897 var calendar = this;
28898 var _calendar$params6 = calendar.params,
28899 cssClass = _calendar$params6.cssClass,
28900 toolbar = _calendar$params6.toolbar,
28901 header = _calendar$params6.header,
28902 footer = _calendar$params6.footer,
28903 rangePicker = _calendar$params6.rangePicker,
28904 weekHeader = _calendar$params6.weekHeader;
28905 var value = calendar.value,
28906 hasTimePicker = calendar.hasTimePicker;
28907 var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
28908 return $jsx("div", {
28909 class: "sheet-modal calendar calendar-sheet " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '')
28910 }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx("div", {
28911 class: "sheet-modal-inner calendar-months"
28912 }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter());
28913 };
28914
28915 _proto.renderPopover = function renderPopover() {
28916 var calendar = this;
28917 var _calendar$params7 = calendar.params,
28918 cssClass = _calendar$params7.cssClass,
28919 toolbar = _calendar$params7.toolbar,
28920 header = _calendar$params7.header,
28921 footer = _calendar$params7.footer,
28922 rangePicker = _calendar$params7.rangePicker,
28923 weekHeader = _calendar$params7.weekHeader;
28924 var value = calendar.value,
28925 hasTimePicker = calendar.hasTimePicker;
28926 var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
28927 return $jsx("div", {
28928 class: "popover calendar-popover"
28929 }, $jsx("div", {
28930 class: "popover-inner"
28931 }, $jsx("div", {
28932 class: "calendar " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '')
28933 }, header && calendar.renderHeader(), toolbar && calendar.renderToolbar(), weekHeader && calendar.renderWeekHeader(), $jsx("div", {
28934 class: "calendar-months"
28935 }, calendar.renderMonths(date)), hasTimePicker && calendar.renderTimeSelector(), footer && calendar.renderFooter())));
28936 };
28937
28938 _proto.render = function render() {
28939 var calendar = this;
28940 var params = calendar.params;
28941 if (params.render) return params.render.call(calendar);
28942
28943 if (!calendar.inline) {
28944 var modalType = params.openIn;
28945 if (modalType === 'auto') modalType = calendar.isPopover() ? 'popover' : 'sheet';
28946 if (modalType === 'popover') return calendar.renderPopover();
28947 if (modalType === 'sheet') return calendar.renderSheet();
28948 return calendar.renderCustomModal();
28949 }
28950
28951 return calendar.renderInline();
28952 };
28953
28954 _proto.openTimePicker = function openTimePicker() {
28955 var calendar = this;
28956 var $el = calendar.$el,
28957 app = calendar.app,
28958 is12HoursFormat = calendar.is12HoursFormat;
28959 if (!$el || !$el.length) return;
28960 $el.append('<div class="calendar-time-picker"></div>');
28961 var hoursArr = [];
28962 var minutesArr = [];
28963 var hoursMin = is12HoursFormat ? 1 : 0;
28964 var hoursMax = is12HoursFormat ? 12 : 23;
28965
28966 for (var i = hoursMin; i <= hoursMax; i += 1) {
28967 hoursArr.push(i);
28968 }
28969
28970 for (var _i2 = 0; _i2 <= 59; _i2 += 1) {
28971 minutesArr.push(_i2);
28972 }
28973
28974 var value;
28975
28976 if (calendar.value && calendar.value.length) {
28977 value = [calendar.value[0].getHours(), calendar.value[0].getMinutes()];
28978 } else {
28979 value = [new Date().getHours(), new Date().getMinutes()];
28980 }
28981
28982 if (is12HoursFormat) {
28983 value.push(value[0] < 12 ? 'AM' : 'PM');
28984 if (value[0] > 12) value[0] -= 12;
28985 if (value[0] === 0) value[0] = 12;
28986 }
28987
28988 calendar.timePickerInstance = app.picker.create({
28989 containerEl: $el.find('.calendar-time-picker'),
28990 value: value,
28991 toolbar: true,
28992 rotateEffect: false,
28993 toolbarCloseText: calendar.params.toolbarCloseText,
28994 cols: [{
28995 values: hoursArr
28996 }, {
28997 divider: true,
28998 content: ':'
28999 }, {
29000 values: minutesArr,
29001 displayValues: minutesArr.map(function (m) {
29002 return m < 10 ? "0" + m : m;
29003 })
29004 }].concat(is12HoursFormat ? [{
29005 values: ['AM', 'PM']
29006 }] : [])
29007 });
29008 calendar.timePickerInstance.$el.find('.toolbar a').removeClass('sheet-close popover-close').addClass('calendar-time-picker-close');
29009 };
29010
29011 _proto.closeTimePicker = function closeTimePicker() {
29012 var calendar = this;
29013 var is12HoursFormat = calendar.is12HoursFormat;
29014
29015 if (calendar.timePickerInstance) {
29016 var timePickerValue = calendar.timePickerInstance.value;
29017 var hours = parseInt(timePickerValue[0], 10);
29018 var minutes = parseInt(timePickerValue[1], 10);
29019 var period = calendar.timePickerInstance.value[2];
29020
29021 if (is12HoursFormat) {
29022 if (period === 'AM' && hours === 12) {
29023 hours = 0;
29024 } else if (period === 'PM' && hours !== 12) {
29025 hours += 12;
29026 }
29027 }
29028
29029 var value = calendar.value && calendar.value.length && calendar.value[0];
29030
29031 if (!value) {
29032 value = new Date();
29033 value.setHours(hours, minutes, 0, 0);
29034 } else {
29035 value = new Date(value);
29036 value.setHours(hours, minutes);
29037 }
29038
29039 calendar.setValue([value]);
29040 calendar.timePickerInstance.close();
29041 calendar.timePickerInstance.destroy();
29042 delete calendar.timePickerInstance;
29043 }
29044
29045 if (calendar.$el && calendar.$el.length) {
29046 calendar.$el.find('.calendar-time-picker').remove();
29047 }
29048 };
29049
29050 _proto.onOpen = function onOpen() {
29051 var calendar = this;
29052 var initialized = calendar.initialized,
29053 $el = calendar.$el,
29054 app = calendar.app,
29055 $inputEl = calendar.$inputEl,
29056 inline = calendar.inline,
29057 value = calendar.value,
29058 params = calendar.params;
29059 calendar.closing = false;
29060 calendar.opened = true;
29061 calendar.opening = true; // Init main events
29062
29063 calendar.attachCalendarEvents();
29064 var updateValue = !value && params.value; // Set value
29065
29066 if (!initialized) {
29067 if (value) calendar.setValue(value, 0);else if (params.value) {
29068 calendar.setValue(calendar.normalizeValues(params.value), 0);
29069 }
29070 } else if (value) {
29071 calendar.setValue(value, 0);
29072 } // Update current month and year
29073
29074
29075 calendar.updateCurrentMonthYear(); // Set initial translate
29076
29077 calendar.monthsTranslate = 0;
29078 calendar.setMonthsTranslate(); // Update input value
29079
29080 if (updateValue) calendar.updateValue();else if (params.header && value) {
29081 calendar.updateValue(true);
29082 } // Extra focus
29083
29084 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
29085 $inputEl.trigger('focus');
29086 }
29087
29088 calendar.initialized = true;
29089 calendar.$months.each(function (monthEl) {
29090 calendar.emit('local::monthAdd calendarMonthAdd', monthEl);
29091 }); // Trigger events
29092
29093 if ($el) {
29094 $el.trigger('calendar:open');
29095 }
29096
29097 if ($inputEl) {
29098 $inputEl.trigger('calendar:open');
29099 }
29100
29101 calendar.emit('local::open calendarOpen', calendar);
29102 };
29103
29104 _proto.onOpened = function onOpened() {
29105 var calendar = this;
29106 calendar.opening = false;
29107
29108 if (calendar.$el) {
29109 calendar.$el.trigger('calendar:opened');
29110 }
29111
29112 if (calendar.$inputEl) {
29113 calendar.$inputEl.trigger('calendar:opened');
29114 }
29115
29116 calendar.emit('local::opened calendarOpened', calendar);
29117 };
29118
29119 _proto.onClose = function onClose() {
29120 var calendar = this;
29121 var app = calendar.app;
29122 calendar.opening = false;
29123 calendar.closing = true;
29124
29125 if (calendar.$inputEl) {
29126 if (app.theme === 'md') {
29127 calendar.$inputEl.trigger('blur');
29128 } else {
29129 var validate = calendar.$inputEl.attr('validate');
29130 var required = calendar.$inputEl.attr('required');
29131
29132 if (validate && required) {
29133 app.input.validate(calendar.$inputEl);
29134 }
29135 }
29136 }
29137
29138 if (calendar.detachCalendarEvents) {
29139 calendar.detachCalendarEvents();
29140 }
29141
29142 if (calendar.$el) {
29143 calendar.$el.trigger('calendar:close');
29144 }
29145
29146 if (calendar.$inputEl) {
29147 calendar.$inputEl.trigger('calendar:close');
29148 }
29149
29150 calendar.emit('local::close calendarClose', calendar);
29151 };
29152
29153 _proto.onClosed = function onClosed() {
29154 var calendar = this;
29155 calendar.opened = false;
29156 calendar.closing = false;
29157
29158 if (!calendar.inline) {
29159 nextTick$1(function () {
29160 if (calendar.modal && calendar.modal.el && calendar.modal.destroy) {
29161 if (!calendar.params.routableModals) {
29162 calendar.modal.destroy();
29163 }
29164 }
29165
29166 delete calendar.modal;
29167 });
29168 }
29169
29170 if (calendar.timePickerInstance) {
29171 if (calendar.timePickerInstance.destroy) calendar.timePickerInstance.destroy();
29172 delete calendar.timePickerInstance;
29173 }
29174
29175 if (calendar.$el) {
29176 calendar.$el.trigger('calendar:closed');
29177 }
29178
29179 if (calendar.$inputEl) {
29180 calendar.$inputEl.trigger('calendar:closed');
29181 }
29182
29183 calendar.emit('local::closed calendarClosed', calendar);
29184 };
29185
29186 _proto.open = function open() {
29187 var calendar = this;
29188 var app = calendar.app,
29189 opened = calendar.opened,
29190 inline = calendar.inline,
29191 $inputEl = calendar.$inputEl,
29192 params = calendar.params;
29193 if (opened) return;
29194
29195 if (inline) {
29196 calendar.$el = $(calendar.render());
29197 calendar.$el[0].f7Calendar = calendar;
29198 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
29199 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
29200 calendar.$containerEl.append(calendar.$el);
29201 calendar.onOpen();
29202 calendar.onOpened();
29203 return;
29204 }
29205
29206 var modalType = params.openIn;
29207
29208 if (modalType === 'auto') {
29209 modalType = calendar.isPopover() ? 'popover' : 'sheet';
29210 }
29211
29212 var modalContent = calendar.render();
29213 var modalParams = {
29214 targetEl: $inputEl,
29215 scrollToEl: params.scrollToInput ? $inputEl : undefined,
29216 content: modalContent,
29217 backdrop: params.backdrop === true || modalType === 'popover' && app.params.popover.backdrop !== false && params.backdrop !== false,
29218 closeByBackdropClick: params.closeByBackdropClick,
29219 on: {
29220 open: function open() {
29221 var modal = this;
29222 calendar.modal = modal;
29223 calendar.$el = modalType === 'popover' ? modal.$el.find('.calendar') : modal.$el;
29224 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
29225 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
29226 calendar.$el[0].f7Calendar = calendar;
29227
29228 if (modalType === 'customModal') {
29229 $(calendar.$el).find('.calendar-close').once('click', function () {
29230 calendar.close();
29231 });
29232 }
29233
29234 calendar.onOpen();
29235 },
29236 opened: function opened() {
29237 calendar.onOpened();
29238 },
29239 close: function close() {
29240 calendar.onClose();
29241 },
29242 closed: function closed() {
29243 calendar.onClosed();
29244 }
29245 }
29246 };
29247
29248 if (modalType === 'sheet') {
29249 modalParams.push = params.sheetPush;
29250 modalParams.swipeToClose = params.sheetSwipeToClose;
29251 }
29252
29253 if (params.routableModals && calendar.view) {
29254 var _route;
29255
29256 calendar.view.router.navigate({
29257 url: calendar.url,
29258 route: (_route = {
29259 path: calendar.url
29260 }, _route[modalType] = modalParams, _route)
29261 });
29262 } else {
29263 calendar.modal = app[modalType].create(modalParams);
29264 calendar.modal.open();
29265 }
29266 };
29267
29268 _proto.close = function close() {
29269 var calendar = this;
29270 var opened = calendar.opened,
29271 inline = calendar.inline;
29272 if (!opened) return;
29273
29274 if (inline) {
29275 calendar.onClose();
29276 calendar.onClosed();
29277 return;
29278 }
29279
29280 if (calendar.params.routableModals && calendar.view) {
29281 calendar.view.router.back();
29282 } else {
29283 calendar.modal.close();
29284 }
29285 };
29286
29287 _proto.init = function init() {
29288 var calendar = this;
29289 calendar.initInput();
29290
29291 if (calendar.inline) {
29292 calendar.open();
29293 calendar.emit('local::init calendarInit', calendar);
29294 return;
29295 }
29296
29297 if (!calendar.initialized && calendar.params.value) {
29298 calendar.setValue(calendar.normalizeValues(calendar.params.value));
29299 } // Attach input Events
29300
29301
29302 if (calendar.$inputEl) {
29303 calendar.attachInputEvents();
29304 }
29305
29306 if (calendar.params.closeByOutsideClick) {
29307 calendar.attachHtmlEvents();
29308 }
29309
29310 calendar.emit('local::init calendarInit', calendar);
29311 };
29312
29313 _proto.destroy = function destroy() {
29314 var calendar = this;
29315 if (calendar.destroyed) return;
29316 var $el = calendar.$el;
29317 calendar.emit('local::beforeDestroy calendarBeforeDestroy', calendar);
29318 if ($el) $el.trigger('calendar:beforedestroy');
29319 calendar.close(); // Detach Events
29320
29321 if (calendar.$inputEl) {
29322 calendar.detachInputEvents();
29323 }
29324
29325 if (calendar.params.closeByOutsideClick) {
29326 calendar.detachHtmlEvents();
29327 }
29328
29329 if (calendar.timePickerInstance) {
29330 if (calendar.timePickerInstance.destroy) calendar.timePickerInstance.destroy();
29331 delete calendar.timePickerInstance;
29332 }
29333
29334 if ($el && $el.length) delete calendar.$el[0].f7Calendar;
29335 deleteProps$1(calendar);
29336 calendar.destroyed = true;
29337 };
29338
29339 _createClass$1(Calendar, [{
29340 key: "view",
29341 get: function get() {
29342 var $inputEl = this.$inputEl,
29343 app = this.app,
29344 params = this.params;
29345 var view;
29346
29347 if (params.view) {
29348 view = params.view;
29349 } else if ($inputEl) {
29350 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
29351 }
29352
29353 if (!view) view = app.views.main;
29354 return view;
29355 }
29356 }]);
29357
29358 return Calendar;
29359 }(Framework7Class);
29360
29361 var Calendar = {
29362 name: 'calendar',
29363 static: {
29364 Calendar: Calendar$1
29365 },
29366 create: function create() {
29367 var app = this;
29368 app.calendar = ConstructorMethods({
29369 defaultSelector: '.calendar',
29370 constructor: Calendar$1,
29371 app: app,
29372 domProp: 'f7Calendar'
29373 });
29374
29375 app.calendar.close = function close(el) {
29376 if (el === void 0) {
29377 el = '.calendar';
29378 }
29379
29380 var $el = $(el);
29381 if ($el.length === 0) return;
29382 var calendar = $el[0].f7Calendar;
29383 if (!calendar || calendar && !calendar.opened) return;
29384 calendar.close();
29385 };
29386 },
29387 params: {
29388 calendar: {
29389 // Calendar settings
29390 dateFormat: undefined,
29391 monthNames: 'auto',
29392 monthNamesShort: 'auto',
29393 dayNames: 'auto',
29394 dayNamesShort: 'auto',
29395 locale: undefined,
29396 firstDay: 1,
29397 // First day of the week, Monday
29398 weekendDays: [0, 6],
29399 // Sunday and Saturday
29400 multiple: false,
29401 rangePicker: false,
29402 rangePickerMinDays: 1,
29403 // when calendar is used as rangePicker
29404 rangePickerMaxDays: 0,
29405 // when calendar is used as rangePicker, 0 means unlimited
29406 direction: 'horizontal',
29407 // or 'vertical'
29408 minDate: null,
29409 maxDate: null,
29410 disabled: null,
29411 // dates range of disabled days
29412 events: null,
29413 // dates range of days with events
29414 rangesClasses: null,
29415 // array with custom classes date ranges
29416 touchMove: true,
29417 animate: true,
29418 closeOnSelect: false,
29419 monthSelector: true,
29420 monthPicker: true,
29421 yearSelector: true,
29422 yearPicker: true,
29423 yearPickerMin: undefined,
29424 yearPickerMax: undefined,
29425 timePicker: false,
29426 timePickerFormat: {
29427 hour: 'numeric',
29428 minute: 'numeric'
29429 },
29430 timePickerPlaceholder: 'Select time',
29431 weekHeader: true,
29432 value: null,
29433 // Common opener settings
29434 containerEl: null,
29435 openIn: 'auto',
29436 // or 'popover' or 'sheet' or 'customModal'
29437 sheetPush: false,
29438 sheetSwipeToClose: undefined,
29439 formatValue: null,
29440 inputEl: null,
29441 inputReadOnly: true,
29442 closeByOutsideClick: true,
29443 scrollToInput: true,
29444 header: false,
29445 headerPlaceholder: 'Select date',
29446 toolbar: true,
29447 toolbarCloseText: 'Done',
29448 footer: false,
29449 cssClass: null,
29450 routableModals: false,
29451 view: null,
29452 url: 'date/',
29453 backdrop: null,
29454 closeByBackdropClick: true,
29455 // Render functions
29456 renderWeekHeader: null,
29457 renderMonths: null,
29458 renderMonth: null,
29459 renderMonthSelector: null,
29460 renderYearSelector: null,
29461 renderHeader: null,
29462 renderFooter: null,
29463 renderToolbar: null,
29464 renderInline: null,
29465 renderPopover: null,
29466 renderSheet: null,
29467 render: null
29468 }
29469 }
29470 };
29471
29472 function pickerColumn(colEl, updateItems) {
29473 var picker = this;
29474 var app = picker.app;
29475 var $colEl = $(colEl);
29476 var colIndex = $colEl.index();
29477 var col = picker.cols[colIndex];
29478 if (col.divider) return;
29479 col.$el = $colEl;
29480 col.el = $colEl[0];
29481 col.$itemsEl = col.$el.find('.picker-items');
29482 col.items = col.$itemsEl.find('.picker-item');
29483 var itemHeight;
29484 var itemsHeight;
29485 var minTranslate;
29486 var maxTranslate;
29487 var animationFrameId;
29488
29489 function updateDuringScroll() {
29490 animationFrameId = requestAnimationFrame(function () {
29491 col.updateItems(undefined, undefined, 0);
29492 updateDuringScroll();
29493 });
29494 }
29495
29496 col.replaceValues = function replaceColValues(values, displayValues) {
29497 col.detachEvents();
29498 col.values = values;
29499 col.displayValues = displayValues;
29500 col.$itemsEl.html(picker.renderColumn(col, true));
29501 col.items = col.$itemsEl.find('.picker-item');
29502 col.calcSize();
29503 col.setValue(col.values[0], 0, true);
29504 col.attachEvents();
29505 };
29506
29507 col.calcSize = function calcColSize() {
29508 if (picker.params.rotateEffect) {
29509 col.$el.removeClass('picker-column-absolute');
29510 if (!col.width) col.$el.css({
29511 width: ''
29512 });
29513 }
29514
29515 var colWidth = 0;
29516 var colHeight = col.$el[0].offsetHeight;
29517 itemHeight = col.items[0].offsetHeight;
29518 itemsHeight = itemHeight * col.items.length;
29519 minTranslate = colHeight / 2 - itemsHeight + itemHeight / 2;
29520 maxTranslate = colHeight / 2 - itemHeight / 2;
29521
29522 if (col.width) {
29523 colWidth = col.width;
29524 if (parseInt(colWidth, 10) === colWidth) colWidth += 'px';
29525 col.$el.css({
29526 width: colWidth
29527 });
29528 }
29529
29530 if (picker.params.rotateEffect) {
29531 if (!col.width) {
29532 col.items.each(function (itemEl) {
29533 var item = $(itemEl).children('span');
29534 colWidth = Math.max(colWidth, item[0].offsetWidth);
29535 });
29536 col.$el.css({
29537 width: colWidth + 2 + "px"
29538 });
29539 }
29540
29541 col.$el.addClass('picker-column-absolute');
29542 }
29543 };
29544
29545 col.setValue = function setColValue(newValue, transition, valueCallbacks) {
29546 if (transition === void 0) {
29547 transition = '';
29548 }
29549
29550 var newActiveIndex = col.$itemsEl.find(".picker-item[data-picker-value=\"" + newValue + "\"]").index();
29551
29552 if (typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {
29553 return;
29554 }
29555
29556 var newTranslate = -newActiveIndex * itemHeight + maxTranslate; // Update wrapper
29557
29558 col.$itemsEl.transition(transition);
29559 col.$itemsEl.transform("translate3d(0," + newTranslate + "px,0)"); // Watch items
29560
29561 if (picker.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex) {
29562 cancelAnimationFrame(animationFrameId);
29563 col.$itemsEl.transitionEnd(function () {
29564 cancelAnimationFrame(animationFrameId);
29565 });
29566 updateDuringScroll();
29567 } // Update items
29568
29569
29570 col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);
29571 };
29572
29573 col.updateItems = function updateColItems(activeIndex, translate, transition, valueCallbacks) {
29574 if (typeof translate === 'undefined') {
29575 // eslint-disable-next-line
29576 translate = getTranslate$1(col.$itemsEl[0], 'y');
29577 }
29578
29579 if (typeof activeIndex === 'undefined') // eslint-disable-next-line
29580 activeIndex = -Math.round((translate - maxTranslate) / itemHeight); // eslint-disable-next-line
29581
29582 if (activeIndex < 0) activeIndex = 0; // eslint-disable-next-line
29583
29584 if (activeIndex >= col.items.length) activeIndex = col.items.length - 1;
29585 var previousActiveIndex = col.activeIndex;
29586 col.activeIndex = activeIndex;
29587 col.$itemsEl.find('.picker-item-selected').removeClass('picker-item-selected');
29588 col.items.transition(transition);
29589 var selectedItem = col.items.eq(activeIndex).addClass('picker-item-selected').transform(''); // Set 3D rotate effect
29590
29591 if (picker.params.rotateEffect) {
29592 col.items.each(function (itemEl) {
29593 var $itemEl = $(itemEl);
29594 var itemOffsetTop = $itemEl.index() * itemHeight;
29595 var translateOffset = maxTranslate - translate;
29596 var itemOffset = itemOffsetTop - translateOffset;
29597 var percentage = itemOffset / itemHeight;
29598 var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;
29599 var angle = -18 * percentage;
29600 if (angle > 180) angle = 180;
29601 if (angle < -180) angle = -180;
29602
29603 if (Math.abs(percentage) > itemsFit) {
29604 $itemEl.addClass('picker-item-far');
29605 } else {
29606 $itemEl.removeClass('picker-item-far');
29607 }
29608
29609 $itemEl.transform("translate3d(0, " + (-translate + maxTranslate) + "px, " + (picker.needsOriginFix ? -110 : 0) + "px) rotateX(" + angle + "deg)");
29610 });
29611 }
29612
29613 if (valueCallbacks || typeof valueCallbacks === 'undefined') {
29614 // Update values
29615 col.value = selectedItem.attr('data-picker-value');
29616 col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value; // On change callback
29617
29618 if (previousActiveIndex !== activeIndex) {
29619 if (col.onChange) {
29620 col.onChange(picker, col.value, col.displayValue);
29621 }
29622
29623 picker.updateValue();
29624 }
29625 }
29626 };
29627
29628 var allowItemClick = true;
29629 var isTouched;
29630 var isMoved;
29631 var touchStartY;
29632 var touchCurrentY;
29633 var touchStartTime;
29634 var touchEndTime;
29635 var startTranslate;
29636 var returnTo;
29637 var currentTranslate;
29638 var prevTranslate;
29639 var velocityTranslate;
29640
29641 function handleTouchStart(e) {
29642 if (isMoved || isTouched) return;
29643 e.preventDefault();
29644 isTouched = true;
29645 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
29646 touchCurrentY = touchStartY;
29647 touchStartTime = new Date().getTime();
29648 allowItemClick = true;
29649 startTranslate = getTranslate$1(col.$itemsEl[0], 'y');
29650 currentTranslate = startTranslate;
29651 }
29652
29653 function handleTouchMove(e) {
29654 if (!isTouched) return;
29655 e.preventDefault();
29656 allowItemClick = false;
29657 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
29658
29659 if (!isMoved) {
29660 // First move
29661 cancelAnimationFrame(animationFrameId);
29662 isMoved = true;
29663 startTranslate = getTranslate$1(col.$itemsEl[0], 'y');
29664 currentTranslate = startTranslate;
29665 col.$itemsEl.transition(0);
29666 }
29667
29668 var diff = touchCurrentY - touchStartY;
29669 currentTranslate = startTranslate + diff;
29670 returnTo = undefined; // Normalize translate
29671
29672 if (currentTranslate < minTranslate) {
29673 currentTranslate = minTranslate - Math.pow(minTranslate - currentTranslate, 0.8);
29674 returnTo = 'min';
29675 }
29676
29677 if (currentTranslate > maxTranslate) {
29678 currentTranslate = maxTranslate + Math.pow(currentTranslate - maxTranslate, 0.8);
29679 returnTo = 'max';
29680 } // Transform wrapper
29681
29682
29683 col.$itemsEl.transform("translate3d(0," + currentTranslate + "px,0)"); // Update items
29684
29685 col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnTouchmove); // Calc velocity
29686
29687 velocityTranslate = currentTranslate - prevTranslate || currentTranslate;
29688 prevTranslate = currentTranslate;
29689 }
29690
29691 function handleTouchEnd() {
29692 if (!isTouched || !isMoved) {
29693 isTouched = false;
29694 isMoved = false;
29695 return;
29696 }
29697
29698 isTouched = false;
29699 isMoved = false;
29700 col.$itemsEl.transition('');
29701
29702 if (returnTo) {
29703 if (returnTo === 'min') {
29704 col.$itemsEl.transform("translate3d(0," + minTranslate + "px,0)");
29705 } else {
29706 col.$itemsEl.transform("translate3d(0," + maxTranslate + "px,0)");
29707 }
29708 }
29709
29710 touchEndTime = new Date().getTime();
29711 var newTranslate;
29712
29713 if (touchEndTime - touchStartTime > 300) {
29714 newTranslate = currentTranslate;
29715 } else {
29716 newTranslate = currentTranslate + velocityTranslate * picker.params.momentumRatio;
29717 }
29718
29719 newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate); // Active Index
29720
29721 var activeIndex = Math.round(Math.abs((newTranslate - maxTranslate) / itemHeight)); // Normalize translate
29722
29723 if (!picker.params.freeMode) newTranslate = -activeIndex * itemHeight + maxTranslate; // Transform wrapper
29724
29725 col.$itemsEl.transform("translate3d(0," + parseInt(newTranslate, 10) + "px,0)"); // Update items
29726
29727 col.updateItems(activeIndex, newTranslate, '', true); // Watch items
29728
29729 if (picker.params.updateValuesOnMomentum) {
29730 updateDuringScroll();
29731 col.$itemsEl.transitionEnd(function () {
29732 cancelAnimationFrame(animationFrameId);
29733 });
29734 } // Allow click
29735
29736
29737 setTimeout(function () {
29738 allowItemClick = true;
29739 }, 100);
29740 }
29741
29742 var mousewheelTimeout;
29743
29744 function handleMouseWheel(e) {
29745 var deltaX = e.deltaX,
29746 deltaY = e.deltaY;
29747 if (Math.abs(deltaX) > Math.abs(deltaY)) return;
29748 clearTimeout(mousewheelTimeout);
29749 e.preventDefault();
29750 cancelAnimationFrame(animationFrameId);
29751 startTranslate = getTranslate$1(col.$itemsEl[0], 'y');
29752 col.$itemsEl.transition(0);
29753 currentTranslate = startTranslate - deltaY;
29754 returnTo = undefined; // Normalize translate
29755
29756 if (currentTranslate < minTranslate) {
29757 currentTranslate = minTranslate;
29758 returnTo = 'min';
29759 }
29760
29761 if (currentTranslate > maxTranslate) {
29762 currentTranslate = maxTranslate;
29763 returnTo = 'max';
29764 } // Transform wrapper
29765
29766
29767 col.$itemsEl.transform("translate3d(0," + currentTranslate + "px,0)"); // Update items
29768
29769 col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnMousewheel); // On end
29770
29771 mousewheelTimeout = setTimeout(function () {
29772 col.$itemsEl.transition('');
29773
29774 if (returnTo) {
29775 if (returnTo === 'min') {
29776 col.$itemsEl.transform("translate3d(0," + minTranslate + "px,0)");
29777 } else {
29778 col.$itemsEl.transform("translate3d(0," + maxTranslate + "px,0)");
29779 }
29780 }
29781
29782 touchEndTime = new Date().getTime();
29783 var newTranslate = currentTranslate;
29784 newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate); // Active Index
29785
29786 var activeIndex = Math.round(Math.abs((newTranslate - maxTranslate) / itemHeight)); // Normalize translate
29787
29788 if (!picker.params.freeMode) newTranslate = -activeIndex * itemHeight + maxTranslate; // Transform wrapper
29789
29790 col.$itemsEl.transform("translate3d(0," + parseInt(newTranslate, 10) + "px,0)"); // Update items
29791
29792 col.updateItems(activeIndex, newTranslate, '', true);
29793 }, 200);
29794 }
29795
29796 function handleClick() {
29797 if (!allowItemClick) return;
29798 cancelAnimationFrame(animationFrameId);
29799 var value = $(this).attr('data-picker-value');
29800 col.setValue(value);
29801 }
29802
29803 var activeListener = getSupport$1().passiveListener ? {
29804 passive: false,
29805 capture: false
29806 } : false;
29807
29808 col.attachEvents = function attachColEvents() {
29809 col.$el.on(app.touchEvents.start, handleTouchStart, activeListener);
29810 app.on('touchmove:active', handleTouchMove);
29811 app.on('touchend:passive', handleTouchEnd);
29812
29813 if (picker.params.mousewheel) {
29814 col.$el.on('wheel', handleMouseWheel);
29815 }
29816
29817 col.items.on('click', handleClick);
29818 };
29819
29820 col.detachEvents = function detachColEvents() {
29821 col.$el.off(app.touchEvents.start, handleTouchStart, activeListener);
29822 app.off('touchmove:active', handleTouchMove);
29823 app.off('touchend:passive', handleTouchEnd);
29824
29825 if (picker.params.mousewheel) {
29826 col.$el.off('wheel', handleMouseWheel);
29827 }
29828
29829 col.items.off('click', handleClick);
29830 };
29831
29832 col.init = function initCol() {
29833 col.calcSize();
29834 col.$itemsEl.transform("translate3d(0," + maxTranslate + "px,0)").transition(0);
29835 if (colIndex === 0) col.$el.addClass('picker-column-first');
29836 if (colIndex === picker.cols.length - 1) col.$el.addClass('picker-column-last'); // Update items on init
29837
29838 if (updateItems) col.updateItems(0, maxTranslate, 0);
29839 col.attachEvents();
29840 };
29841
29842 col.destroy = function destroyCol() {
29843 col.detachEvents();
29844 };
29845
29846 col.init();
29847 }
29848
29849 var Picker$1 = /*#__PURE__*/function (_Framework7Class) {
29850 _inheritsLoose(Picker, _Framework7Class);
29851
29852 function Picker(app, params) {
29853 var _this;
29854
29855 if (params === void 0) {
29856 params = {};
29857 }
29858
29859 _this = _Framework7Class.call(this, params, [app]) || this;
29860
29861 var picker = _assertThisInitialized(_this);
29862
29863 var device = getDevice$1();
29864 var window = getWindow();
29865 picker.params = extend$1({}, app.params.picker, params);
29866 var $containerEl;
29867
29868 if (picker.params.containerEl) {
29869 $containerEl = $(picker.params.containerEl);
29870 if ($containerEl.length === 0) return picker || _assertThisInitialized(_this);
29871 }
29872
29873 var $inputEl;
29874
29875 if (picker.params.inputEl) {
29876 $inputEl = $(picker.params.inputEl);
29877 }
29878
29879 var $scrollToEl = picker.params.scrollToInput ? $inputEl : undefined;
29880
29881 if (picker.params.scrollToEl) {
29882 var scrollToEl = $(picker.params.scrollToEl);
29883
29884 if (scrollToEl.length > 0) {
29885 $scrollToEl = scrollToEl;
29886 }
29887 }
29888
29889 extend$1(picker, {
29890 app: app,
29891 $containerEl: $containerEl,
29892 containerEl: $containerEl && $containerEl[0],
29893 inline: $containerEl && $containerEl.length > 0,
29894 needsOriginFix: device.ios || window.navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && window.navigator.userAgent.toLowerCase().indexOf('chrome') < 0 && !device.android,
29895 cols: [],
29896 $inputEl: $inputEl,
29897 inputEl: $inputEl && $inputEl[0],
29898 $scrollToEl: $scrollToEl,
29899 initialized: false,
29900 opened: false,
29901 url: picker.params.url
29902 });
29903
29904 function onResize() {
29905 picker.resizeCols();
29906 }
29907
29908 function onInputClick() {
29909 picker.open();
29910 }
29911
29912 function onInputFocus(e) {
29913 e.preventDefault();
29914 }
29915
29916 function onHtmlClick(e) {
29917 if (picker.destroyed || !picker.params) return;
29918 var $targetEl = $(e.target);
29919 if (picker.isPopover()) return;
29920 if (!picker.opened || picker.closing) return;
29921 if ($targetEl.closest('[class*="backdrop"]').length) return;
29922
29923 if ($inputEl && $inputEl.length > 0) {
29924 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal').length === 0) {
29925 picker.close();
29926 }
29927 } else if ($(e.target).closest('.sheet-modal').length === 0) {
29928 picker.close();
29929 }
29930 } // Events
29931
29932
29933 extend$1(picker, {
29934 attachResizeEvent: function attachResizeEvent() {
29935 app.on('resize', onResize);
29936 },
29937 detachResizeEvent: function detachResizeEvent() {
29938 app.off('resize', onResize);
29939 },
29940 attachInputEvents: function attachInputEvents() {
29941 picker.$inputEl.on('click', onInputClick);
29942
29943 if (picker.params.inputReadOnly) {
29944 picker.$inputEl.on('focus mousedown', onInputFocus);
29945
29946 if (picker.$inputEl[0]) {
29947 picker.$inputEl[0].f7ValidateReadonly = true;
29948 }
29949 }
29950 },
29951 detachInputEvents: function detachInputEvents() {
29952 picker.$inputEl.off('click', onInputClick);
29953
29954 if (picker.params.inputReadOnly) {
29955 picker.$inputEl.off('focus mousedown', onInputFocus);
29956
29957 if (picker.$inputEl[0]) {
29958 delete picker.$inputEl[0].f7ValidateReadonly;
29959 }
29960 }
29961 },
29962 attachHtmlEvents: function attachHtmlEvents() {
29963 app.on('click', onHtmlClick);
29964 },
29965 detachHtmlEvents: function detachHtmlEvents() {
29966 app.off('click', onHtmlClick);
29967 }
29968 });
29969 picker.init();
29970 return picker || _assertThisInitialized(_this);
29971 }
29972
29973 var _proto = Picker.prototype;
29974
29975 _proto.initInput = function initInput() {
29976 var picker = this;
29977 if (!picker.$inputEl) return;
29978 if (picker.params.inputReadOnly) picker.$inputEl.prop('readOnly', true);
29979 };
29980
29981 _proto.resizeCols = function resizeCols() {
29982 var picker = this;
29983 if (!picker.opened) return;
29984
29985 for (var i = 0; i < picker.cols.length; i += 1) {
29986 if (!picker.cols[i].divider) {
29987 picker.cols[i].calcSize();
29988 picker.cols[i].setValue(picker.cols[i].value, 0, false);
29989 }
29990 }
29991 };
29992
29993 _proto.isPopover = function isPopover() {
29994 var picker = this;
29995 var app = picker.app,
29996 modal = picker.modal,
29997 params = picker.params;
29998 var device = getDevice$1();
29999 if (params.openIn === 'sheet') return false;
30000 if (modal && modal.type !== 'popover') return false;
30001
30002 if (!picker.inline && picker.inputEl) {
30003 if (params.openIn === 'popover') return true;
30004
30005 if (device.ios) {
30006 return !!device.ipad;
30007 }
30008
30009 if (app.width >= 768) {
30010 return true;
30011 }
30012
30013 if (device.desktop && app.theme === 'aurora') {
30014 return true;
30015 }
30016 }
30017
30018 return false;
30019 };
30020
30021 _proto.formatValue = function formatValue() {
30022 var picker = this;
30023 var value = picker.value,
30024 displayValue = picker.displayValue;
30025
30026 if (picker.params.formatValue) {
30027 return picker.params.formatValue.call(picker, value, displayValue);
30028 }
30029
30030 return value.join(' ');
30031 };
30032
30033 _proto.setValue = function setValue(values, transition) {
30034 var picker = this;
30035 var valueIndex = 0;
30036
30037 if (picker.cols.length === 0) {
30038 picker.value = values;
30039 picker.updateValue(values);
30040 return;
30041 }
30042
30043 for (var i = 0; i < picker.cols.length; i += 1) {
30044 if (picker.cols[i] && !picker.cols[i].divider) {
30045 picker.cols[i].setValue(values[valueIndex], transition);
30046 valueIndex += 1;
30047 }
30048 }
30049 };
30050
30051 _proto.getValue = function getValue() {
30052 var picker = this;
30053 return picker.value;
30054 };
30055
30056 _proto.updateValue = function updateValue(forceValues) {
30057 var picker = this;
30058 var newValue = forceValues || [];
30059 var newDisplayValue = [];
30060 var column;
30061
30062 if (picker.cols.length === 0) {
30063 var noDividerColumns = picker.params.cols.filter(function (c) {
30064 return !c.divider;
30065 });
30066
30067 for (var i = 0; i < noDividerColumns.length; i += 1) {
30068 column = noDividerColumns[i];
30069
30070 if (column.displayValues !== undefined && column.values !== undefined && column.values.indexOf(newValue[i]) !== -1) {
30071 newDisplayValue.push(column.displayValues[column.values.indexOf(newValue[i])]);
30072 } else {
30073 newDisplayValue.push(newValue[i]);
30074 }
30075 }
30076 } else {
30077 for (var _i = 0; _i < picker.cols.length; _i += 1) {
30078 if (!picker.cols[_i].divider) {
30079 newValue.push(picker.cols[_i].value);
30080 newDisplayValue.push(picker.cols[_i].displayValue);
30081 }
30082 }
30083 }
30084
30085 if (newValue.indexOf(undefined) >= 0) {
30086 return;
30087 }
30088
30089 picker.value = newValue;
30090 picker.displayValue = newDisplayValue;
30091 picker.emit('local::change pickerChange', picker, picker.value, picker.displayValue);
30092
30093 if (picker.inputEl) {
30094 picker.$inputEl.val(picker.formatValue());
30095 picker.$inputEl.trigger('change');
30096 }
30097 };
30098
30099 _proto.initColumn = function initColumn(colEl, updateItems) {
30100 var picker = this;
30101 pickerColumn.call(picker, colEl, updateItems);
30102 } // eslint-disable-next-line
30103 ;
30104
30105 _proto.destroyColumn = function destroyColumn(colEl) {
30106 var picker = this;
30107 var $colEl = $(colEl);
30108 var index = $colEl.index();
30109
30110 if (picker.cols[index] && picker.cols[index].destroy) {
30111 picker.cols[index].destroy();
30112 }
30113 };
30114
30115 _proto.renderToolbar = function renderToolbar() {
30116 var picker = this;
30117 if (picker.params.renderToolbar) return picker.params.renderToolbar.call(picker, picker);
30118 return $jsx("div", {
30119 class: "toolbar toolbar-top no-shadow"
30120 }, $jsx("div", {
30121 class: "toolbar-inner"
30122 }, $jsx("div", {
30123 class: "left"
30124 }), $jsx("div", {
30125 class: "right"
30126 }, $jsx("a", {
30127 class: "link sheet-close popover-close"
30128 }, picker.params.toolbarCloseText))));
30129 } // eslint-disable-next-line
30130 ;
30131
30132 _proto.renderColumn = function renderColumn(col, onlyItems) {
30133 var colClasses = "picker-column " + (col.textAlign ? "picker-column-" + col.textAlign : '') + " " + (col.cssClass || '');
30134 var columnHtml;
30135 var columnItemsHtml;
30136
30137 if (col.divider) {
30138 // prettier-ignore
30139 columnHtml = "\n <div class=\"" + colClasses + " picker-column-divider\">" + col.content + "</div>\n ";
30140 } else {
30141 // prettier-ignore
30142 columnItemsHtml = col.values.map(function (value, index) {
30143 return "\n <div class=\"picker-item\" data-picker-value=\"" + value + "\">\n <span>" + (col.displayValues ? col.displayValues[index] : value) + "</span>\n </div>\n ";
30144 }).join(''); // prettier-ignore
30145
30146 columnHtml = "\n <div class=\"" + colClasses + "\">\n <div class=\"picker-items\">" + columnItemsHtml + "</div>\n </div>\n ";
30147 }
30148
30149 return onlyItems ? columnItemsHtml.trim() : columnHtml.trim();
30150 };
30151
30152 _proto.renderInline = function renderInline() {
30153 var picker = this;
30154 var _picker$params = picker.params,
30155 rotateEffect = _picker$params.rotateEffect,
30156 cssClass = _picker$params.cssClass,
30157 toolbar = _picker$params.toolbar;
30158 var inlineHtml = $jsx("div", {
30159 class: "picker picker-inline " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '')
30160 }, toolbar && picker.renderToolbar(), $jsx("div", {
30161 class: "picker-columns"
30162 }, picker.cols.map(function (col) {
30163 return picker.renderColumn(col);
30164 }), $jsx("div", {
30165 class: "picker-center-highlight"
30166 })));
30167 return inlineHtml;
30168 };
30169
30170 _proto.renderSheet = function renderSheet() {
30171 var picker = this;
30172 var _picker$params2 = picker.params,
30173 rotateEffect = _picker$params2.rotateEffect,
30174 cssClass = _picker$params2.cssClass,
30175 toolbar = _picker$params2.toolbar;
30176 var sheetHtml = $jsx("div", {
30177 class: "sheet-modal picker picker-sheet " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '')
30178 }, toolbar && picker.renderToolbar(), $jsx("div", {
30179 class: "sheet-modal-inner picker-columns"
30180 }, picker.cols.map(function (col) {
30181 return picker.renderColumn(col);
30182 }), $jsx("div", {
30183 class: "picker-center-highlight"
30184 })));
30185 return sheetHtml;
30186 };
30187
30188 _proto.renderPopover = function renderPopover() {
30189 var picker = this;
30190 var _picker$params3 = picker.params,
30191 rotateEffect = _picker$params3.rotateEffect,
30192 cssClass = _picker$params3.cssClass,
30193 toolbar = _picker$params3.toolbar;
30194 var popoverHtml = $jsx("div", {
30195 class: "popover picker-popover"
30196 }, $jsx("div", {
30197 class: "popover-inner"
30198 }, $jsx("div", {
30199 class: "picker " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '')
30200 }, toolbar && picker.renderToolbar(), $jsx("div", {
30201 class: "picker-columns"
30202 }, picker.cols.map(function (col) {
30203 return picker.renderColumn(col);
30204 }), $jsx("div", {
30205 class: "picker-center-highlight"
30206 })))));
30207 return popoverHtml;
30208 };
30209
30210 _proto.render = function render() {
30211 var picker = this;
30212 if (picker.params.render) return picker.params.render.call(picker);
30213
30214 if (!picker.inline) {
30215 if (picker.isPopover()) return picker.renderPopover();
30216 return picker.renderSheet();
30217 }
30218
30219 return picker.renderInline();
30220 };
30221
30222 _proto.onOpen = function onOpen() {
30223 var picker = this;
30224 var initialized = picker.initialized,
30225 $el = picker.$el,
30226 app = picker.app,
30227 $inputEl = picker.$inputEl,
30228 inline = picker.inline,
30229 value = picker.value,
30230 params = picker.params;
30231 picker.opened = true;
30232 picker.closing = false;
30233 picker.opening = true; // Init main events
30234
30235 picker.attachResizeEvent(); // Init cols
30236
30237 $el.find('.picker-column').each(function (colEl) {
30238 var updateItems = true;
30239
30240 if (!initialized && params.value || initialized && value) {
30241 updateItems = false;
30242 }
30243
30244 picker.initColumn(colEl, updateItems);
30245 }); // Set value
30246
30247 if (!initialized) {
30248 if (value) picker.setValue(value, 0);else if (params.value) {
30249 picker.setValue(params.value, 0);
30250 }
30251 } else if (value) {
30252 picker.setValue(value, 0);
30253 } // Extra focus
30254
30255
30256 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
30257 $inputEl.trigger('focus');
30258 }
30259
30260 picker.initialized = true; // Trigger events
30261
30262 if ($el) {
30263 $el.trigger('picker:open');
30264 }
30265
30266 if ($inputEl) {
30267 $inputEl.trigger('picker:open');
30268 }
30269
30270 picker.emit('local::open pickerOpen', picker);
30271 };
30272
30273 _proto.onOpened = function onOpened() {
30274 var picker = this;
30275 picker.opening = false;
30276
30277 if (picker.$el) {
30278 picker.$el.trigger('picker:opened');
30279 }
30280
30281 if (picker.$inputEl) {
30282 picker.$inputEl.trigger('picker:opened');
30283 }
30284
30285 picker.emit('local::opened pickerOpened', picker);
30286 };
30287
30288 _proto.onClose = function onClose() {
30289 var picker = this;
30290 var app = picker.app;
30291 picker.opening = false;
30292 picker.closing = true; // Detach events
30293
30294 picker.detachResizeEvent();
30295 picker.cols.forEach(function (col) {
30296 if (col.destroy) col.destroy();
30297 });
30298
30299 if (picker.$inputEl) {
30300 if (app.theme === 'md') {
30301 picker.$inputEl.trigger('blur');
30302 } else {
30303 var validate = picker.$inputEl.attr('validate');
30304 var required = picker.$inputEl.attr('required');
30305
30306 if (validate && required) {
30307 app.input.validate(picker.$inputEl);
30308 }
30309 }
30310 }
30311
30312 if (picker.$el) {
30313 picker.$el.trigger('picker:close');
30314 }
30315
30316 if (picker.$inputEl) {
30317 picker.$inputEl.trigger('picker:close');
30318 }
30319
30320 picker.emit('local::close pickerClose', picker);
30321 };
30322
30323 _proto.onClosed = function onClosed() {
30324 var picker = this;
30325 picker.opened = false;
30326 picker.closing = false;
30327
30328 if (!picker.inline) {
30329 nextTick$1(function () {
30330 if (picker.modal && picker.modal.el && picker.modal.destroy) {
30331 if (!picker.params.routableModals) {
30332 picker.modal.destroy();
30333 }
30334 }
30335
30336 delete picker.modal;
30337 });
30338 }
30339
30340 if (picker.$el) {
30341 picker.$el.trigger('picker:closed');
30342 }
30343
30344 if (picker.$inputEl) {
30345 picker.$inputEl.trigger('picker:closed');
30346 }
30347
30348 picker.emit('local::closed pickerClosed', picker);
30349 };
30350
30351 _proto.open = function open() {
30352 var picker = this;
30353 var app = picker.app,
30354 opened = picker.opened,
30355 inline = picker.inline,
30356 $inputEl = picker.$inputEl,
30357 $scrollToEl = picker.$scrollToEl,
30358 params = picker.params;
30359 if (opened) return;
30360
30361 if (picker.cols.length === 0 && params.cols.length) {
30362 params.cols.forEach(function (col) {
30363 picker.cols.push(col);
30364 });
30365 }
30366
30367 if (inline) {
30368 picker.$el = $(picker.render());
30369 picker.$el[0].f7Picker = picker;
30370 picker.$containerEl.append(picker.$el);
30371 picker.onOpen();
30372 picker.onOpened();
30373 return;
30374 }
30375
30376 var isPopover = picker.isPopover();
30377 var modalType = isPopover ? 'popover' : 'sheet';
30378 var modalParams = {
30379 targetEl: $inputEl,
30380 scrollToEl: $scrollToEl,
30381 content: picker.render(),
30382 backdrop: typeof params.backdrop !== 'undefined' ? params.backdrop : isPopover,
30383 on: {
30384 open: function open() {
30385 var modal = this;
30386 picker.modal = modal;
30387 picker.$el = isPopover ? modal.$el.find('.picker') : modal.$el;
30388 picker.$el[0].f7Picker = picker;
30389 picker.onOpen();
30390 },
30391 opened: function opened() {
30392 picker.onOpened();
30393 },
30394 close: function close() {
30395 picker.onClose();
30396 },
30397 closed: function closed() {
30398 picker.onClosed();
30399 }
30400 }
30401 };
30402
30403 if (modalType === 'sheet') {
30404 modalParams.push = params.sheetPush;
30405 modalParams.swipeToClose = params.sheetSwipeToClose;
30406 }
30407
30408 if (params.routableModals && picker.view) {
30409 var _route;
30410
30411 picker.view.router.navigate({
30412 url: picker.url,
30413 route: (_route = {
30414 path: picker.url
30415 }, _route[modalType] = modalParams, _route)
30416 });
30417 } else {
30418 picker.modal = app[modalType].create(modalParams);
30419 picker.modal.open();
30420 }
30421 };
30422
30423 _proto.close = function close() {
30424 var picker = this;
30425 var opened = picker.opened,
30426 inline = picker.inline;
30427 if (!opened) return;
30428
30429 if (inline) {
30430 picker.onClose();
30431 picker.onClosed();
30432 return;
30433 }
30434
30435 if (picker.params.routableModals && picker.view) {
30436 picker.view.router.back();
30437 } else {
30438 picker.modal.close();
30439 }
30440 };
30441
30442 _proto.init = function init() {
30443 var picker = this;
30444 picker.initInput();
30445
30446 if (picker.inline) {
30447 picker.open();
30448 picker.emit('local::init pickerInit', picker);
30449 return;
30450 }
30451
30452 if (!picker.initialized && picker.params.value) {
30453 picker.setValue(picker.params.value);
30454 } // Attach input Events
30455
30456
30457 if (picker.$inputEl) {
30458 picker.attachInputEvents();
30459 }
30460
30461 if (picker.params.closeByOutsideClick) {
30462 picker.attachHtmlEvents();
30463 }
30464
30465 picker.emit('local::init pickerInit', picker);
30466 };
30467
30468 _proto.destroy = function destroy() {
30469 var picker = this;
30470 if (picker.destroyed) return;
30471 var $el = picker.$el;
30472 picker.emit('local::beforeDestroy pickerBeforeDestroy', picker);
30473 if ($el) $el.trigger('picker:beforedestroy');
30474 picker.close(); // Detach Events
30475
30476 if (picker.$inputEl) {
30477 picker.detachInputEvents();
30478 }
30479
30480 if (picker.params.closeByOutsideClick) {
30481 picker.detachHtmlEvents();
30482 }
30483
30484 if ($el && $el.length) delete picker.$el[0].f7Picker;
30485 deleteProps$1(picker);
30486 picker.destroyed = true;
30487 };
30488
30489 _createClass$1(Picker, [{
30490 key: "view",
30491 get: function get() {
30492 var app = this.app,
30493 params = this.params,
30494 $inputEl = this.$inputEl;
30495 var view;
30496
30497 if (params.view) {
30498 view = params.view;
30499 } else if ($inputEl) {
30500 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
30501 }
30502
30503 if (!view) view = app.views.main;
30504 return view;
30505 }
30506 }]);
30507
30508 return Picker;
30509 }(Framework7Class);
30510
30511 var Picker = {
30512 name: 'picker',
30513 static: {
30514 Picker: Picker$1
30515 },
30516 create: function create() {
30517 var app = this;
30518 app.picker = ConstructorMethods({
30519 defaultSelector: '.picker',
30520 constructor: Picker$1,
30521 app: app,
30522 domProp: 'f7Picker'
30523 });
30524
30525 app.picker.close = function close(el) {
30526 if (el === void 0) {
30527 el = '.picker';
30528 }
30529
30530 var $el = $(el);
30531 if ($el.length === 0) return;
30532 var picker = $el[0].f7Picker;
30533 if (!picker || picker && !picker.opened) return;
30534 picker.close();
30535 };
30536 },
30537 params: {
30538 picker: {
30539 // Picker settings
30540 updateValuesOnMomentum: false,
30541 updateValuesOnTouchmove: true,
30542 updateValuesOnMousewheel: true,
30543 mousewheel: true,
30544 rotateEffect: false,
30545 momentumRatio: 7,
30546 freeMode: false,
30547 cols: [],
30548 // Common opener settings
30549 containerEl: null,
30550 openIn: 'auto',
30551 // or 'popover' or 'sheet'
30552 sheetPush: false,
30553 sheetSwipeToClose: undefined,
30554 backdrop: undefined,
30555 // uses Popover or Sheet defaults
30556 formatValue: null,
30557 inputEl: null,
30558 inputReadOnly: true,
30559 closeByOutsideClick: true,
30560 scrollToInput: true,
30561 scrollToEl: undefined,
30562 toolbar: true,
30563 toolbarCloseText: 'Done',
30564 cssClass: null,
30565 routableModals: false,
30566 view: null,
30567 url: 'select/',
30568 // Render functions
30569 renderToolbar: null,
30570 render: null
30571 }
30572 }
30573 };
30574
30575 var InfiniteScroll = {
30576 handle: function handle(el, e) {
30577 var app = this;
30578 var $el = $(el);
30579 var scrollTop = $el[0].scrollTop;
30580 var scrollHeight = $el[0].scrollHeight;
30581 var height = $el[0].offsetHeight;
30582 var distance = $el[0].getAttribute('data-infinite-distance');
30583 var virtualListContainer = $el.find('.virtual-list');
30584 var virtualList;
30585 var onTop = $el.hasClass('infinite-scroll-top');
30586 if (!distance) distance = 50;
30587
30588 if (typeof distance === 'string' && distance.indexOf('%') >= 0) {
30589 distance = parseInt(distance, 10) / 100 * height;
30590 }
30591
30592 if (distance > height) distance = height;
30593
30594 if (onTop) {
30595 if (scrollTop < distance) {
30596 $el.trigger('infinite', e);
30597 app.emit('infinite', $el[0], e);
30598 }
30599 } else if (scrollTop + height >= scrollHeight - distance) {
30600 if (virtualListContainer.length > 0) {
30601 virtualList = virtualListContainer.eq(-1)[0].f7VirtualList;
30602
30603 if (virtualList && !virtualList.reachEnd && !virtualList.params.updatableScroll) {
30604 return;
30605 }
30606 }
30607
30608 $el.trigger('infinite', e);
30609 app.emit('infinite', $el[0], e);
30610 }
30611 },
30612 create: function create(el) {
30613 var $el = $(el);
30614 var app = this;
30615
30616 function scrollHandler(e) {
30617 app.infiniteScroll.handle(this, e);
30618 }
30619
30620 $el.each(function (element) {
30621 element.f7InfiniteScrollHandler = scrollHandler;
30622 element.addEventListener('scroll', element.f7InfiniteScrollHandler);
30623 });
30624 },
30625 destroy: function destroy(el) {
30626 var $el = $(el);
30627 $el.each(function (element) {
30628 element.removeEventListener('scroll', element.f7InfiniteScrollHandler);
30629 delete element.f7InfiniteScrollHandler;
30630 });
30631 }
30632 };
30633 var InfiniteScroll$1 = {
30634 name: 'infiniteScroll',
30635 create: function create() {
30636 var app = this;
30637 bindMethods(app, {
30638 infiniteScroll: InfiniteScroll
30639 });
30640 },
30641 on: {
30642 tabMounted: function tabMounted(tabEl) {
30643 var app = this;
30644 var $tabEl = $(tabEl);
30645 var $isEls = $tabEl.find('.infinite-scroll-content');
30646 if ($tabEl.is('.infinite-scroll-content')) $isEls.add($tabEl);
30647 $isEls.each(function (el) {
30648 app.infiniteScroll.create(el);
30649 });
30650 },
30651 tabBeforeRemove: function tabBeforeRemove(tabEl) {
30652 var $tabEl = $(tabEl);
30653 var app = this;
30654 var $isEls = $tabEl.find('.infinite-scroll-content');
30655 if ($tabEl.is('.infinite-scroll-content')) $isEls.add($tabEl);
30656 $isEls.each(function (el) {
30657 app.infiniteScroll.destroy(el);
30658 });
30659 },
30660 pageInit: function pageInit(page) {
30661 var app = this;
30662 page.$el.find('.infinite-scroll-content').each(function (el) {
30663 app.infiniteScroll.create(el);
30664 });
30665 },
30666 pageBeforeRemove: function pageBeforeRemove(page) {
30667 var app = this;
30668 page.$el.find('.infinite-scroll-content').each(function (el) {
30669 app.infiniteScroll.destroy(el);
30670 });
30671 }
30672 }
30673 };
30674
30675 var PullToRefresh$1 = /*#__PURE__*/function (_Framework7Class) {
30676 _inheritsLoose(PullToRefresh, _Framework7Class);
30677
30678 function PullToRefresh(app, el) {
30679 var _this;
30680
30681 _this = _Framework7Class.call(this, {}, [app]) || this;
30682
30683 var ptr = _assertThisInitialized(_this);
30684
30685 var device = getDevice$1();
30686 var support = getSupport$1();
30687 var $el = $(el);
30688 var $preloaderEl = $el.find('.ptr-preloader');
30689 ptr.$el = $el;
30690 ptr.el = $el[0];
30691 ptr.app = app;
30692 ptr.bottom = ptr.$el.hasClass('ptr-bottom'); // Extend defaults with modules params
30693
30694 ptr.useModulesParams({});
30695 var isMaterial = app.theme === 'md';
30696 var isIos = app.theme === 'ios';
30697 var isAurora = app.theme === 'aurora'; // Done
30698
30699 ptr.done = function done() {
30700 var $transitionTarget = isMaterial ? $preloaderEl : $el;
30701 $transitionTarget.transitionEnd(function () {
30702 $el.removeClass('ptr-transitioning ptr-pull-up ptr-pull-down ptr-closing');
30703 $el.trigger('ptr:done');
30704 ptr.emit('local::done ptrDone', $el[0]);
30705 });
30706 $el.removeClass('ptr-refreshing').addClass('ptr-transitioning ptr-closing');
30707 return ptr;
30708 };
30709
30710 ptr.refresh = function refresh() {
30711 if ($el.hasClass('ptr-refreshing')) return ptr;
30712 $el.addClass('ptr-transitioning ptr-refreshing');
30713 $el.trigger('ptr:refresh', ptr.done);
30714 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
30715 return ptr;
30716 }; // Mousewheel
30717
30718
30719 ptr.mousewheel = $el.attr('data-ptr-mousewheel') === 'true'; // Events handling
30720
30721 var touchId;
30722 var isTouched;
30723 var isMoved;
30724 var touchesStart = {};
30725 var isScrolling;
30726 var touchesDiff;
30727 var refresh = false;
30728 var useTranslate = false;
30729 var forceUseTranslate = false;
30730 var startTranslate = 0;
30731 var translate;
30732 var scrollTop;
30733 var wasScrolled;
30734 var triggerDistance;
30735 var dynamicTriggerDistance;
30736 var pullStarted;
30737 var hasNavbar = false;
30738 var scrollHeight;
30739 var offsetHeight;
30740 var maxScrollTop;
30741 var $pageEl = $el.parents('.page');
30742 if ($pageEl.find('.navbar').length > 0 || $pageEl.parents('.view').children('.navbars').length > 0) hasNavbar = true;
30743 if ($pageEl.hasClass('no-navbar')) hasNavbar = false;
30744
30745 if (!ptr.bottom) {
30746 var pageNavbarEl = app.navbar.getElByPage($pageEl[0]);
30747
30748 if (pageNavbarEl) {
30749 var $pageNavbarEl = $(pageNavbarEl);
30750 var isLargeTransparent = $pageNavbarEl.hasClass('navbar-large-transparent') || $pageNavbarEl.hasClass('navbar-large') && $pageNavbarEl.hasClass('navbar-transparent');
30751 var isTransparent = $pageNavbarEl.hasClass('navbar-transparent') && !$pageNavbarEl.hasClass('navbar-large');
30752
30753 if (isLargeTransparent) {
30754 $el.addClass('ptr-with-navbar-large-transparent');
30755 } else if (isTransparent) {
30756 $el.addClass('ptr-with-navbar-transparent');
30757 }
30758 }
30759 }
30760
30761 if (!hasNavbar && !ptr.bottom) $el.addClass('ptr-no-navbar'); // Define trigger distance
30762
30763 if ($el.attr('data-ptr-distance')) {
30764 dynamicTriggerDistance = true;
30765 } else if (isMaterial) {
30766 triggerDistance = 66;
30767 } else if (isIos) {
30768 triggerDistance = 44;
30769 } else if (isAurora) {
30770 triggerDistance = 38;
30771 }
30772
30773 function handleTouchStart(e) {
30774 if (isTouched) {
30775 if (device.os === 'android') {
30776 if ('targetTouches' in e && e.targetTouches.length > 1) return;
30777 } else return;
30778 }
30779
30780 if ($el.hasClass('ptr-refreshing')) {
30781 return;
30782 }
30783
30784 if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) return;
30785 isMoved = false;
30786 pullStarted = false;
30787 isTouched = true;
30788 isScrolling = undefined;
30789 wasScrolled = undefined;
30790 if (e.type === 'touchstart') touchId = e.targetTouches[0].identifier;
30791 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
30792 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
30793 }
30794
30795 function handleTouchMove(e) {
30796 if (!isTouched) return;
30797 var pageX;
30798 var pageY;
30799 var touch;
30800
30801 if (e.type === 'touchmove') {
30802 if (touchId && e.touches) {
30803 for (var i = 0; i < e.touches.length; i += 1) {
30804 if (e.touches[i].identifier === touchId) {
30805 touch = e.touches[i];
30806 }
30807 }
30808 }
30809
30810 if (!touch) touch = e.targetTouches[0];
30811 pageX = touch.pageX;
30812 pageY = touch.pageY;
30813 } else {
30814 pageX = e.pageX;
30815 pageY = e.pageY;
30816 }
30817
30818 if (!pageX || !pageY) return;
30819
30820 if (typeof isScrolling === 'undefined') {
30821 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
30822 }
30823
30824 if (!isScrolling) {
30825 isTouched = false;
30826 return;
30827 }
30828
30829 scrollTop = $el[0].scrollTop;
30830
30831 if (!isMoved) {
30832 $el.removeClass('ptr-transitioning');
30833 var targetIsScrollable;
30834 scrollHeight = $el[0].scrollHeight;
30835 offsetHeight = $el[0].offsetHeight;
30836
30837 if (ptr.bottom) {
30838 maxScrollTop = scrollHeight - offsetHeight;
30839 }
30840
30841 if (scrollTop > scrollHeight) {
30842 isTouched = false;
30843 return;
30844 }
30845
30846 var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
30847
30848 if ($ptrWatchScrollable.length) {
30849 $ptrWatchScrollable.each(function (ptrScrollableEl) {
30850 if (ptrScrollableEl === el) return;
30851
30852 if (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight && $(ptrScrollableEl).css('overflow') === 'auto' && (!ptr.bottom && ptrScrollableEl.scrollTop > 0 || ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)) {
30853 targetIsScrollable = true;
30854 }
30855 });
30856 }
30857
30858 if (targetIsScrollable) {
30859 isTouched = false;
30860 return;
30861 }
30862
30863 if (dynamicTriggerDistance) {
30864 triggerDistance = $el.attr('data-ptr-distance');
30865 if (triggerDistance.indexOf('%') >= 0) triggerDistance = scrollHeight * parseInt(triggerDistance, 10) / 100;
30866 }
30867
30868 startTranslate = $el.hasClass('ptr-refreshing') ? triggerDistance : 0;
30869
30870 if (scrollHeight === offsetHeight || device.os !== 'ios' || isMaterial) {
30871 useTranslate = true;
30872 } else {
30873 useTranslate = false;
30874 }
30875
30876 forceUseTranslate = false;
30877 }
30878
30879 isMoved = true;
30880 touchesDiff = pageY - touchesStart.y;
30881 if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) wasScrolled = true;
30882 var ptrStarted = ptr.bottom ? touchesDiff < 0 && scrollTop >= maxScrollTop || scrollTop > maxScrollTop : touchesDiff > 0 && scrollTop <= 0 || scrollTop < 0;
30883
30884 if (ptrStarted) {
30885 // iOS 8 fix
30886 if (device.os === 'ios' && parseInt(device.osVersion.split('.')[0], 10) > 7) {
30887 if (!ptr.bottom && scrollTop === 0 && !wasScrolled) useTranslate = true;
30888 if (ptr.bottom && scrollTop === maxScrollTop && !wasScrolled) useTranslate = true;
30889 }
30890
30891 if (!useTranslate && ptr.bottom && !isMaterial) {
30892 $el.css('-webkit-overflow-scrolling', 'auto');
30893 $el.scrollTop(maxScrollTop);
30894 forceUseTranslate = true;
30895 }
30896
30897 if (useTranslate || forceUseTranslate) {
30898 if (e.cancelable) {
30899 e.preventDefault();
30900 }
30901
30902 translate = (ptr.bottom ? -1 * Math.pow(Math.abs(touchesDiff), 0.85) : Math.pow(touchesDiff, 0.85)) + startTranslate;
30903
30904 if (isMaterial) {
30905 $preloaderEl.transform("translate3d(0," + translate + "px,0)").find('.ptr-arrow').transform("rotate(" + (180 * (Math.abs(touchesDiff) / 66) + 100) + "deg)");
30906 } else {
30907 // eslint-disable-next-line
30908 if (ptr.bottom) {
30909 $el.children().transform("translate3d(0," + translate + "px,0)");
30910 } else {
30911 $el.transform("translate3d(0," + translate + "px,0)");
30912 }
30913 }
30914 }
30915
30916 if ((useTranslate || forceUseTranslate) && Math.pow(Math.abs(touchesDiff), 0.85) > triggerDistance || !useTranslate && Math.abs(touchesDiff) >= triggerDistance * 2) {
30917 refresh = true;
30918 $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
30919 } else {
30920 refresh = false;
30921 $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
30922 }
30923
30924 if (!pullStarted) {
30925 $el.trigger('ptr:pullstart');
30926 ptr.emit('local::pullStart ptrPullStart', $el[0]);
30927 pullStarted = true;
30928 }
30929
30930 $el.trigger('ptr:pullmove', {
30931 event: e,
30932 scrollTop: scrollTop,
30933 translate: translate,
30934 touchesDiff: touchesDiff
30935 });
30936 ptr.emit('local::pullMove ptrPullMove', $el[0], {
30937 event: e,
30938 scrollTop: scrollTop,
30939 translate: translate,
30940 touchesDiff: touchesDiff
30941 });
30942 } else {
30943 pullStarted = false;
30944 $el.removeClass('ptr-pull-up ptr-pull-down');
30945 refresh = false;
30946 }
30947 }
30948
30949 function handleTouchEnd(e) {
30950 if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {
30951 if (e.changedTouches[0].identifier !== touchId) {
30952 isTouched = false;
30953 isScrolling = false;
30954 isMoved = false;
30955 touchId = null;
30956 return;
30957 }
30958 }
30959
30960 if (!isTouched || !isMoved) {
30961 isTouched = false;
30962 isMoved = false;
30963 return;
30964 }
30965
30966 if (translate) {
30967 $el.addClass('ptr-transitioning');
30968 translate = 0;
30969 }
30970
30971 if (isMaterial) {
30972 $preloaderEl.transform('').find('.ptr-arrow').transform('');
30973 } else {
30974 // eslint-disable-next-line
30975 if (ptr.bottom) {
30976 $el.children().transform('');
30977 } else {
30978 $el.transform('');
30979 }
30980 }
30981
30982 if (!useTranslate && ptr.bottom && !isMaterial) {
30983 $el.css('-webkit-overflow-scrolling', '');
30984 }
30985
30986 if (refresh) {
30987 $el.addClass('ptr-refreshing');
30988 $el.trigger('ptr:refresh', ptr.done);
30989 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
30990 } else {
30991 $el.removeClass('ptr-pull-down');
30992 }
30993
30994 isTouched = false;
30995 isMoved = false;
30996
30997 if (pullStarted) {
30998 $el.trigger('ptr:pullend');
30999 ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
31000 }
31001 }
31002
31003 var mousewheelTimeout;
31004 var mousewheelMoved;
31005 var mousewheelAllow = true;
31006 var mousewheelTranslate = 0;
31007
31008 function handleMouseWheelRelease() {
31009 mousewheelAllow = true;
31010 mousewheelMoved = false;
31011 mousewheelTranslate = 0;
31012
31013 if (translate) {
31014 $el.addClass('ptr-transitioning');
31015 translate = 0;
31016 }
31017
31018 if (isMaterial) {
31019 $preloaderEl.transform('').find('.ptr-arrow').transform('');
31020 } else {
31021 // eslint-disable-next-line
31022 if (ptr.bottom) {
31023 $el.children().transform('');
31024 } else {
31025 $el.transform('');
31026 }
31027 }
31028
31029 if (refresh) {
31030 $el.addClass('ptr-refreshing');
31031 $el.trigger('ptr:refresh', ptr.done);
31032 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
31033 } else {
31034 $el.removeClass('ptr-pull-down');
31035 }
31036
31037 if (pullStarted) {
31038 $el.trigger('ptr:pullend');
31039 ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
31040 }
31041 }
31042
31043 function handleMouseWheel(e) {
31044 if (!mousewheelAllow) return;
31045 var deltaX = e.deltaX,
31046 deltaY = e.deltaY;
31047 if (Math.abs(deltaX) > Math.abs(deltaY)) return;
31048
31049 if ($el.hasClass('ptr-refreshing')) {
31050 return;
31051 }
31052
31053 if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) return;
31054 clearTimeout(mousewheelTimeout);
31055 scrollTop = $el[0].scrollTop;
31056
31057 if (!mousewheelMoved) {
31058 $el.removeClass('ptr-transitioning');
31059 var targetIsScrollable;
31060 scrollHeight = $el[0].scrollHeight;
31061 offsetHeight = $el[0].offsetHeight;
31062
31063 if (ptr.bottom) {
31064 maxScrollTop = scrollHeight - offsetHeight;
31065 }
31066
31067 if (scrollTop > scrollHeight) {
31068 mousewheelAllow = false;
31069 return;
31070 }
31071
31072 var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
31073
31074 if ($ptrWatchScrollable.length) {
31075 $ptrWatchScrollable.each(function (ptrScrollableEl) {
31076 if (ptrScrollableEl === el) return;
31077
31078 if (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight && $(ptrScrollableEl).css('overflow') === 'auto' && (!ptr.bottom && ptrScrollableEl.scrollTop > 0 || ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)) {
31079 targetIsScrollable = true;
31080 }
31081 });
31082 }
31083
31084 if (targetIsScrollable) {
31085 mousewheelAllow = false;
31086 return;
31087 }
31088
31089 if (dynamicTriggerDistance) {
31090 triggerDistance = $el.attr('data-ptr-distance');
31091 if (triggerDistance.indexOf('%') >= 0) triggerDistance = scrollHeight * parseInt(triggerDistance, 10) / 100;
31092 }
31093 }
31094
31095 isMoved = true;
31096 mousewheelTranslate -= deltaY;
31097 touchesDiff = mousewheelTranslate; // pageY - touchesStart.y;
31098
31099 if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) wasScrolled = true;
31100 var ptrStarted = ptr.bottom ? touchesDiff < 0 && scrollTop >= maxScrollTop || scrollTop > maxScrollTop : touchesDiff > 0 && scrollTop <= 0 || scrollTop < 0;
31101
31102 if (ptrStarted) {
31103 if (e.cancelable) {
31104 e.preventDefault();
31105 }
31106
31107 translate = touchesDiff;
31108
31109 if (Math.abs(translate) > triggerDistance) {
31110 translate = triggerDistance + Math.pow(Math.abs(translate) - triggerDistance, 0.7);
31111 if (ptr.bottom) translate = -translate;
31112 }
31113
31114 if (isMaterial) {
31115 $preloaderEl.transform("translate3d(0," + translate + "px,0)").find('.ptr-arrow').transform("rotate(" + (180 * (Math.abs(touchesDiff) / 66) + 100) + "deg)");
31116 } else {
31117 // eslint-disable-next-line
31118 if (ptr.bottom) {
31119 $el.children().transform("translate3d(0," + translate + "px,0)");
31120 } else {
31121 $el.transform("translate3d(0," + translate + "px,0)");
31122 }
31123 }
31124
31125 if (Math.abs(translate) > triggerDistance) {
31126 refresh = true;
31127 $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
31128 } else {
31129 refresh = false;
31130 $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
31131 }
31132
31133 if (!pullStarted) {
31134 $el.trigger('ptr:pullstart');
31135 ptr.emit('local::pullStart ptrPullStart', $el[0]);
31136 pullStarted = true;
31137 }
31138
31139 $el.trigger('ptr:pullmove', {
31140 event: e,
31141 scrollTop: scrollTop,
31142 translate: translate,
31143 touchesDiff: touchesDiff
31144 });
31145 ptr.emit('local::pullMove ptrPullMove', $el[0], {
31146 event: e,
31147 scrollTop: scrollTop,
31148 translate: translate,
31149 touchesDiff: touchesDiff
31150 });
31151 } else {
31152 pullStarted = false;
31153 $el.removeClass('ptr-pull-up ptr-pull-down');
31154 refresh = false;
31155 }
31156
31157 mousewheelTimeout = setTimeout(handleMouseWheelRelease, 300);
31158 }
31159
31160 if (!$pageEl.length || !$el.length) return ptr || _assertThisInitialized(_this);
31161 $el[0].f7PullToRefresh = ptr; // Events
31162
31163 ptr.attachEvents = function attachEvents() {
31164 var passive = support.passiveListener ? {
31165 passive: true
31166 } : false;
31167 $el.on(app.touchEvents.start, handleTouchStart, passive);
31168 app.on('touchmove:active', handleTouchMove);
31169 app.on('touchend:passive', handleTouchEnd);
31170
31171 if (ptr.mousewheel && !ptr.bottom) {
31172 $el.on('wheel', handleMouseWheel);
31173 }
31174 };
31175
31176 ptr.detachEvents = function detachEvents() {
31177 var passive = support.passiveListener ? {
31178 passive: true
31179 } : false;
31180 $el.off(app.touchEvents.start, handleTouchStart, passive);
31181 app.off('touchmove:active', handleTouchMove);
31182 app.off('touchend:passive', handleTouchEnd);
31183
31184 if (ptr.mousewheel && !ptr.bottom) {
31185 $el.off('wheel', handleMouseWheel);
31186 }
31187 }; // Install Modules
31188
31189
31190 ptr.useModules(); // Init
31191
31192 ptr.init();
31193 return ptr || _assertThisInitialized(_this);
31194 }
31195
31196 var _proto = PullToRefresh.prototype;
31197
31198 _proto.init = function init() {
31199 var ptr = this;
31200 ptr.attachEvents();
31201 };
31202
31203 _proto.destroy = function destroy() {
31204 var ptr = this;
31205 ptr.emit('local::beforeDestroy ptrBeforeDestroy', ptr);
31206 ptr.$el.trigger('ptr:beforedestroy');
31207 delete ptr.el.f7PullToRefresh;
31208 ptr.detachEvents();
31209 deleteProps$1(ptr);
31210 ptr = null;
31211 };
31212
31213 return PullToRefresh;
31214 }(Framework7Class);
31215
31216 var PullToRefresh = {
31217 name: 'pullToRefresh',
31218 create: function create() {
31219 var app = this;
31220 app.ptr = extend$1(ConstructorMethods({
31221 defaultSelector: '.ptr-content',
31222 constructor: PullToRefresh$1,
31223 app: app,
31224 domProp: 'f7PullToRefresh'
31225 }), {
31226 done: function done(el) {
31227 var ptr = app.ptr.get(el);
31228 if (ptr) return ptr.done();
31229 return undefined;
31230 },
31231 refresh: function refresh(el) {
31232 var ptr = app.ptr.get(el);
31233 if (ptr) return ptr.refresh();
31234 return undefined;
31235 }
31236 });
31237 },
31238 static: {
31239 PullToRefresh: PullToRefresh$1
31240 },
31241 on: {
31242 tabMounted: function tabMounted(tabEl) {
31243 var app = this;
31244 var $tabEl = $(tabEl);
31245 var $ptrEls = $tabEl.find('.ptr-content');
31246 if ($tabEl.is('.ptr-content')) $ptrEls.add($tabEl);
31247 $ptrEls.each(function (el) {
31248 app.ptr.create(el);
31249 });
31250 },
31251 tabBeforeRemove: function tabBeforeRemove(tabEl) {
31252 var $tabEl = $(tabEl);
31253 var app = this;
31254 var $ptrEls = $tabEl.find('.ptr-content');
31255 if ($tabEl.is('.ptr-content')) $ptrEls.add($tabEl);
31256 $ptrEls.each(function (el) {
31257 app.ptr.destroy(el);
31258 });
31259 },
31260 pageInit: function pageInit(page) {
31261 var app = this;
31262 page.$el.find('.ptr-content').each(function (el) {
31263 app.ptr.create(el);
31264 });
31265 },
31266 pageBeforeRemove: function pageBeforeRemove(page) {
31267 var app = this;
31268 page.$el.find('.ptr-content').each(function (el) {
31269 app.ptr.destroy(el);
31270 });
31271 }
31272 }
31273 };
31274
31275 var Lazy$2 = {
31276 destroy: function destroy(pageEl) {
31277 var $pageEl = $(pageEl).closest('.page');
31278 if (!$pageEl.length) return;
31279
31280 if ($pageEl[0].f7LazyDestroy) {
31281 $pageEl[0].f7LazyDestroy();
31282 }
31283 },
31284 create: function create(pageEl) {
31285 var app = this;
31286 var window = getWindow();
31287 var support = getSupport$1();
31288 var $pageEl = $(pageEl).closest('.page').eq(0); // Lazy images
31289
31290 var $lazyLoadImages = $pageEl.find('.lazy');
31291 if ($lazyLoadImages.length === 0 && !$pageEl.hasClass('lazy')) return; // Placeholder
31292
31293 var placeholderSrc = app.params.lazy.placeholder;
31294
31295 if (placeholderSrc !== false) {
31296 $lazyLoadImages.each(function (lazyEl) {
31297 if ($(lazyEl).attr('data-src') && !$(lazyEl).attr('src')) $(lazyEl).attr('src', placeholderSrc);
31298 });
31299 } // load image
31300
31301
31302 var imagesSequence = [];
31303 var imageIsLoading = false;
31304
31305 function onImageComplete(lazyEl) {
31306 if (imagesSequence.indexOf(lazyEl) >= 0) {
31307 imagesSequence.splice(imagesSequence.indexOf(lazyEl), 1);
31308 }
31309
31310 imageIsLoading = false;
31311
31312 if (app.params.lazy.sequential && imagesSequence.length > 0) {
31313 imageIsLoading = true;
31314 app.lazy.loadImage(imagesSequence[0], onImageComplete);
31315 }
31316 }
31317
31318 function observerCallback(entries, observer) {
31319 entries.forEach(function (entry) {
31320 if (entry.isIntersecting) {
31321 if (app.params.lazy.sequential && imageIsLoading) {
31322 if (imagesSequence.indexOf(entry.target) < 0) imagesSequence.push(entry.target);
31323 return;
31324 } // Load image
31325
31326
31327 imageIsLoading = true;
31328 app.lazy.loadImage(entry.target, onImageComplete); // Detach
31329
31330 observer.unobserve(entry.target);
31331 }
31332 });
31333 }
31334
31335 if (app.params.lazy.observer && support.intersectionObserver) {
31336 var observer = $pageEl[0].f7LazyObserver;
31337
31338 if (!observer) {
31339 observer = new window.IntersectionObserver(observerCallback, {
31340 root: $pageEl[0]
31341 });
31342 }
31343
31344 $lazyLoadImages.each(function (el) {
31345 if (el.f7LazyObserverAdded) return;
31346 el.f7LazyObserverAdded = true;
31347 observer.observe(el);
31348 });
31349
31350 if (!$pageEl[0].f7LazyDestroy) {
31351 $pageEl[0].f7LazyDestroy = function () {
31352 observer.disconnect();
31353 delete $pageEl[0].f7LazyDestroy;
31354 delete $pageEl[0].f7LazyObserver;
31355 };
31356 }
31357
31358 return;
31359 }
31360
31361 function lazyHandler() {
31362 app.lazy.load($pageEl, function (lazyEl) {
31363 if (app.params.lazy.sequential && imageIsLoading) {
31364 if (imagesSequence.indexOf(lazyEl) < 0) imagesSequence.push(lazyEl);
31365 return;
31366 }
31367
31368 imageIsLoading = true;
31369 app.lazy.loadImage(lazyEl, onImageComplete);
31370 });
31371 }
31372
31373 function attachEvents() {
31374 $pageEl[0].f7LazyAttached = true;
31375 $pageEl.on('lazy', lazyHandler);
31376 $pageEl.on('scroll', lazyHandler, true);
31377 $pageEl.find('.tab').on('tab:mounted tab:show', lazyHandler);
31378 app.on('resize', lazyHandler);
31379 }
31380
31381 function detachEvents() {
31382 $pageEl[0].f7LazyAttached = false;
31383 delete $pageEl[0].f7LazyAttached;
31384 $pageEl.off('lazy', lazyHandler);
31385 $pageEl.off('scroll', lazyHandler, true);
31386 $pageEl.find('.tab').off('tab:mounted tab:show', lazyHandler);
31387 app.off('resize', lazyHandler);
31388 } // Store detach function
31389
31390
31391 if (!$pageEl[0].f7LazyDestroy) {
31392 $pageEl[0].f7LazyDestroy = detachEvents;
31393 } // Attach events
31394
31395
31396 if (!$pageEl[0].f7LazyAttached) {
31397 attachEvents();
31398 } // Run loader on page load/init
31399
31400
31401 lazyHandler();
31402 },
31403 isInViewport: function isInViewport(lazyEl) {
31404 var app = this;
31405 var rect = lazyEl.getBoundingClientRect();
31406 var threshold = app.params.lazy.threshold || 0;
31407 return rect.top >= 0 - threshold && rect.left >= 0 - threshold && rect.top <= app.height + threshold && rect.left <= app.width + threshold;
31408 },
31409 loadImage: function loadImage(imageEl, callback) {
31410 var app = this;
31411 var window = getWindow();
31412 var $imageEl = $(imageEl);
31413 var bg = $imageEl.attr('data-background');
31414 var src = bg || $imageEl.attr('data-src');
31415
31416 function onLoad() {
31417 $imageEl.removeClass('lazy').addClass('lazy-loaded');
31418
31419 if (bg) {
31420 $imageEl.css('background-image', "url(" + src + ")");
31421 } else if (src) {
31422 $imageEl.attr('src', src);
31423 }
31424
31425 if (callback) callback(imageEl);
31426 $imageEl.trigger('lazy:loaded');
31427 app.emit('lazyLoaded', $imageEl[0]);
31428 }
31429
31430 if (!src) {
31431 $imageEl.trigger('lazy:load');
31432 app.emit('lazyLoad', $imageEl[0]);
31433 onLoad();
31434 return;
31435 }
31436
31437 function onError() {
31438 $imageEl.removeClass('lazy').addClass('lazy-loaded');
31439
31440 if (bg) {
31441 $imageEl.css('background-image', "url(" + (app.params.lazy.placeholder || '') + ")");
31442 } else {
31443 $imageEl.attr('src', app.params.lazy.placeholder || '');
31444 }
31445
31446 if (callback) callback(imageEl);
31447 $imageEl.trigger('lazy:error');
31448 app.emit('lazyError', $imageEl[0]);
31449 }
31450
31451 var image = new window.Image();
31452 image.onload = onLoad;
31453 image.onerror = onError;
31454 image.src = src;
31455 $imageEl.removeAttr('data-src').removeAttr('data-background'); // Add loaded callback and events
31456
31457 $imageEl.trigger('lazy:load');
31458 app.emit('lazyLoad', $imageEl[0]);
31459 },
31460 load: function load(pageEl, callback) {
31461 var app = this;
31462 var $pageEl = $(pageEl);
31463 if (!$pageEl.hasClass('page')) $pageEl = $pageEl.parents('.page').eq(0);
31464
31465 if ($pageEl.length === 0) {
31466 return;
31467 }
31468
31469 $pageEl.find('.lazy').each(function (lazyEl) {
31470 var $lazyEl = $(lazyEl);
31471
31472 if ($lazyEl.parents('.tab:not(.tab-active)').length > 0) {
31473 return;
31474 }
31475
31476 if (app.lazy.isInViewport(lazyEl)) {
31477 if (callback) callback(lazyEl);else app.lazy.loadImage(lazyEl);
31478 }
31479 });
31480 }
31481 };
31482 var Lazy$3 = {
31483 name: 'lazy',
31484 params: {
31485 lazy: {
31486 placeholder: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEXCwsK592mkAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==',
31487 threshold: 0,
31488 sequential: true,
31489 observer: true
31490 }
31491 },
31492 create: function create() {
31493 var app = this;
31494 bindMethods(app, {
31495 lazy: Lazy$2
31496 });
31497 },
31498 on: {
31499 pageInit: function pageInit(page) {
31500 var app = this;
31501
31502 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
31503 app.lazy.create(page.$el);
31504 }
31505 },
31506 pageAfterIn: function pageAfterIn(page) {
31507 var app = this;
31508 var support = getSupport$1();
31509 if (app.params.lazy.observer && support.intersectionObserver) return;
31510
31511 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
31512 app.lazy.create(page.$el);
31513 }
31514 },
31515 pageBeforeRemove: function pageBeforeRemove(page) {
31516 var app = this;
31517
31518 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
31519 app.lazy.destroy(page.$el);
31520 }
31521 },
31522 tabMounted: function tabMounted(tabEl) {
31523 var app = this;
31524 var $tabEl = $(tabEl);
31525
31526 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
31527 app.lazy.create($tabEl);
31528 }
31529 },
31530 tabBeforeRemove: function tabBeforeRemove(tabEl) {
31531 var app = this;
31532 var support = getSupport$1();
31533 if (app.params.lazy.observer && support.intersectionObserver) return;
31534 var $tabEl = $(tabEl);
31535
31536 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
31537 app.lazy.destroy($tabEl);
31538 }
31539 }
31540 }
31541 };
31542
31543 var DataTable$1 = /*#__PURE__*/function (_Framework7Class) {
31544 _inheritsLoose(DataTable, _Framework7Class);
31545
31546 function DataTable(app, params) {
31547 var _this;
31548
31549 if (params === void 0) {
31550 params = {};
31551 }
31552
31553 _this = _Framework7Class.call(this, params, [app]) || this;
31554
31555 var table = _assertThisInitialized(_this);
31556
31557 var defaults = {}; // Extend defaults with modules params
31558
31559 table.useModulesParams(defaults);
31560 table.params = extend$1(defaults, params); // El
31561
31562 var $el = $(table.params.el);
31563 if ($el.length === 0) return undefined || _assertThisInitialized(_this);
31564 table.$el = $el;
31565 table.el = $el[0];
31566
31567 if (table.$el[0].f7DataTable) {
31568 var instance = table.$el[0].f7DataTable;
31569 table.destroy();
31570 return instance || _assertThisInitialized(_this);
31571 }
31572
31573 table.$el[0].f7DataTable = table;
31574 extend$1(table, {
31575 collapsible: $el.hasClass('data-table-collapsible'),
31576 // Headers
31577 $headerEl: $el.find('.data-table-header'),
31578 $headerSelectedEl: $el.find('.data-table-header-selected')
31579 }); // Events
31580
31581 function handleChange(e) {
31582 if (e.detail && e.detail.sentByF7DataTable) {
31583 // Scripted event, don't do anything
31584 return;
31585 }
31586
31587 var $inputEl = $(this);
31588 var checked = $inputEl[0].checked;
31589 var columnIndex = $inputEl.parents('td,th').index();
31590
31591 if ($inputEl.parents('thead').length > 0) {
31592 if (columnIndex === 0) {
31593 $el.find('tbody tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
31594 }
31595
31596 $el.find("tbody tr td:nth-child(" + (columnIndex + 1) + ") input").prop('checked', checked).trigger('change', {
31597 sentByF7DataTable: true
31598 });
31599 $inputEl.prop('indeterminate', false);
31600 } else {
31601 if (columnIndex === 0) {
31602 $inputEl.parents('tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
31603 }
31604
31605 var checkedRows = $el.find("tbody .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]:checked").length;
31606 var totalRows = $el.find('tbody tr').length;
31607 var $headCheckboxEl = $el.find("thead .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]");
31608
31609 if (!checked) {
31610 $headCheckboxEl.prop('checked', false);
31611 } else if (checkedRows === totalRows) {
31612 $headCheckboxEl.prop('checked', true).trigger('change', {
31613 sentByF7DataTable: true
31614 });
31615 }
31616
31617 $headCheckboxEl.prop('indeterminate', checkedRows > 0 && checkedRows < totalRows);
31618 }
31619
31620 table.checkSelectedHeader();
31621 }
31622
31623 function handleSortableClick() {
31624 var $cellEl = $(this);
31625 var isActive = $cellEl.hasClass('sortable-cell-active');
31626 var currentSort = $cellEl.hasClass('sortable-desc') ? 'desc' : 'asc';
31627 var newSort;
31628
31629 if (isActive) {
31630 newSort = currentSort === 'desc' ? 'asc' : 'desc';
31631 $cellEl.removeClass('sortable-desc sortable-asc').addClass("sortable-" + newSort);
31632 } else {
31633 $el.find('thead .sortable-cell-active').removeClass('sortable-cell-active');
31634 $cellEl.addClass('sortable-cell-active');
31635 newSort = currentSort;
31636 }
31637
31638 $cellEl.trigger('datatable:sort', newSort);
31639 table.emit('local::sort dataTableSort', table, newSort);
31640 }
31641
31642 table.attachEvents = function attachEvents() {
31643 table.$el.on('change', '.checkbox-cell input[type="checkbox"]', handleChange);
31644 table.$el.find('thead .sortable-cell').on('click', handleSortableClick);
31645 };
31646
31647 table.detachEvents = function detachEvents() {
31648 table.$el.off('change', '.checkbox-cell input[type="checkbox"]', handleChange);
31649 table.$el.find('thead .sortable-cell').off('click', handleSortableClick);
31650 }; // Install Modules
31651
31652
31653 table.useModules(); // Init
31654
31655 table.init();
31656 return table || _assertThisInitialized(_this);
31657 }
31658
31659 var _proto = DataTable.prototype;
31660
31661 _proto.setCollapsibleLabels = function setCollapsibleLabels() {
31662 var table = this;
31663 if (!table.collapsible) return;
31664 table.$el.find('tbody td:not(.checkbox-cell)').each(function (el) {
31665 var $el = $(el);
31666 var elIndex = $el.index();
31667 var collpsibleTitle = $el.attr('data-collapsible-title');
31668
31669 if (!collpsibleTitle && collpsibleTitle !== '') {
31670 $el.attr('data-collapsible-title', table.$el.find('thead th').eq(elIndex).text());
31671 }
31672 });
31673 };
31674
31675 _proto.checkSelectedHeader = function checkSelectedHeader() {
31676 var table = this;
31677
31678 if (table.$headerEl.length > 0 && table.$headerSelectedEl.length > 0) {
31679 var checkedItems = table.$el.find('tbody .checkbox-cell input:checked').length;
31680 table.$el[checkedItems > 0 ? 'addClass' : 'removeClass']('data-table-has-checked');
31681 table.$headerSelectedEl.find('.data-table-selected-count').text(checkedItems);
31682 }
31683 };
31684
31685 _proto.init = function init() {
31686 var table = this;
31687 table.attachEvents();
31688 table.setCollapsibleLabels();
31689 table.checkSelectedHeader();
31690 };
31691
31692 _proto.destroy = function destroy() {
31693 var table = this;
31694 table.$el.trigger('datatable:beforedestroy');
31695 table.emit('local::beforeDestroy dataTableBeforeDestroy', table);
31696 table.attachEvents();
31697
31698 if (table.$el[0]) {
31699 table.$el[0].f7DataTable = null;
31700 delete table.$el[0].f7DataTable;
31701 }
31702
31703 deleteProps$1(table);
31704 table = null;
31705 };
31706
31707 return DataTable;
31708 }(Framework7Class);
31709
31710 var DataTable = {
31711 name: 'dataTable',
31712 static: {
31713 DataTable: DataTable$1
31714 },
31715 create: function create() {
31716 var app = this;
31717 app.dataTable = ConstructorMethods({
31718 defaultSelector: '.data-table',
31719 constructor: DataTable$1,
31720 app: app,
31721 domProp: 'f7DataTable'
31722 });
31723 },
31724 on: {
31725 tabBeforeRemove: function tabBeforeRemove(tabEl) {
31726 var app = this;
31727 $(tabEl).find('.data-table-init').each(function (tableEl) {
31728 app.dataTable.destroy(tableEl);
31729 });
31730 },
31731 tabMounted: function tabMounted(tabEl) {
31732 var app = this;
31733 $(tabEl).find('.data-table-init').each(function (tableEl) {
31734 app.dataTable.create({
31735 el: tableEl
31736 });
31737 });
31738 },
31739 pageBeforeRemove: function pageBeforeRemove(page) {
31740 var app = this;
31741 page.$el.find('.data-table-init').each(function (tableEl) {
31742 app.dataTable.destroy(tableEl);
31743 });
31744 },
31745 pageInit: function pageInit(page) {
31746 var app = this;
31747 page.$el.find('.data-table-init').each(function (tableEl) {
31748 app.dataTable.create({
31749 el: tableEl
31750 });
31751 });
31752 }
31753 },
31754 vnode: {
31755 'data-table-init': {
31756 insert: function insert(vnode) {
31757 var app = this;
31758 var tableEl = vnode.elm;
31759 app.dataTable.create({
31760 el: tableEl
31761 });
31762 },
31763 destroy: function destroy(vnode) {
31764 var app = this;
31765 var tableEl = vnode.elm;
31766 app.dataTable.destroy(tableEl);
31767 }
31768 }
31769 }
31770 };
31771
31772 var Fab = {
31773 morphOpen: function morphOpen(fabEl, targetEl) {
31774 var app = this;
31775 var $fabEl = $(fabEl);
31776 var $targetEl = $(targetEl);
31777 if ($targetEl.length === 0) return;
31778 $targetEl.transition(0).addClass('fab-morph-target-visible');
31779 var target = {
31780 width: $targetEl[0].offsetWidth,
31781 height: $targetEl[0].offsetHeight,
31782 offset: $targetEl.offset(),
31783 borderRadius: $targetEl.css('border-radius'),
31784 zIndex: $targetEl.css('z-index')
31785 };
31786 var fab = {
31787 width: $fabEl[0].offsetWidth,
31788 height: $fabEl[0].offsetHeight,
31789 offset: $fabEl.offset(),
31790 translateX: getTranslate$1($fabEl[0], 'x'),
31791 translateY: getTranslate$1($fabEl[0], 'y')
31792 };
31793 $fabEl[0].f7FabMorphData = {
31794 $targetEl: $targetEl,
31795 target: target,
31796 fab: fab
31797 };
31798 var diffX = fab.offset.left + fab.width / 2 - (target.offset.left + target.width / 2) - fab.translateX;
31799 var diffY = fab.offset.top + fab.height / 2 - (target.offset.top + target.height / 2) - fab.translateY;
31800 var scaleX = target.width / fab.width;
31801 var scaleY = target.height / fab.height;
31802 var borderRadius = Math.ceil(parseInt(target.borderRadius, 10) / Math.max(scaleX, scaleY));
31803 if (borderRadius > 0) borderRadius += 2;
31804
31805 $fabEl[0].f7FabMorphResizeHandler = function resizeHandler() {
31806 $fabEl.transition(0).transform('');
31807 $targetEl.transition(0);
31808 target.width = $targetEl[0].offsetWidth;
31809 target.height = $targetEl[0].offsetHeight;
31810 target.offset = $targetEl.offset();
31811 fab.offset = $fabEl.offset();
31812 var diffXNew = fab.offset.left + fab.width / 2 - (target.offset.left + target.width / 2) - fab.translateX;
31813 var diffYNew = fab.offset.top + fab.height / 2 - (target.offset.top + target.height / 2) - fab.translateY;
31814 var scaleXNew = target.width / fab.width;
31815 var scaleYNew = target.height / fab.height;
31816 $fabEl.transform("translate3d(" + -diffXNew + "px, " + -diffYNew + "px, 0) scale(" + scaleXNew + ", " + scaleYNew + ")");
31817 };
31818
31819 $targetEl.css('opacity', 0).transform("scale(" + 1 / scaleX + ", " + 1 / scaleY + ")");
31820 $fabEl.addClass('fab-opened').css('z-index', target.zIndex - 1).transform("translate3d(" + -diffX + "px, " + -diffY + "px, 0)");
31821 $fabEl.transitionEnd(function () {
31822 $targetEl.transition('');
31823 nextFrame$1(function () {
31824 $targetEl.css('opacity', 1).transform('scale(1,1)');
31825 $fabEl.transform("translate3d(" + -diffX + "px, " + -diffY + "px, 0) scale(" + scaleX + ", " + scaleY + ")").css('border-radius', borderRadius + "px").css('box-shadow', 'none').css('opacity', '0');
31826 });
31827 app.on('resize', $fabEl[0].f7FabMorphResizeHandler);
31828
31829 if ($targetEl.parents('.page-content').length > 0) {
31830 $targetEl.parents('.page-content').on('scroll', $fabEl[0].f7FabMorphResizeHandler);
31831 }
31832 });
31833 },
31834 morphClose: function morphClose(fabEl) {
31835 var app = this;
31836 var $fabEl = $(fabEl);
31837 var morphData = $fabEl[0].f7FabMorphData;
31838 if (!morphData) return;
31839 var $targetEl = morphData.$targetEl,
31840 target = morphData.target,
31841 fab = morphData.fab;
31842 if ($targetEl.length === 0) return;
31843 var diffX = fab.offset.left + fab.width / 2 - (target.offset.left + target.width / 2) - fab.translateX;
31844 var diffY = fab.offset.top + fab.height / 2 - (target.offset.top + target.height / 2) - fab.translateY;
31845 var scaleX = target.width / fab.width;
31846 var scaleY = target.height / fab.height;
31847 app.off('resize', $fabEl[0].f7FabMorphResizeHandler);
31848
31849 if ($targetEl.parents('.page-content').length > 0) {
31850 $targetEl.parents('.page-content').off('scroll', $fabEl[0].f7FabMorphResizeHandler);
31851 }
31852
31853 $targetEl.css('opacity', 0).transform("scale(" + 1 / scaleX + ", " + 1 / scaleY + ")");
31854 $fabEl.transition('').css('box-shadow', '').css('border-radius', '').css('opacity', '1').transform("translate3d(" + -diffX + "px, " + -diffY + "px, 0)");
31855 $fabEl.transitionEnd(function () {
31856 $fabEl.css('z-index', '').removeClass('fab-opened').transform('');
31857 nextFrame$1(function () {
31858 $fabEl.transitionEnd(function () {
31859 $targetEl.removeClass('fab-morph-target-visible').css('opacity', '').transform('').transition('');
31860 });
31861 });
31862 });
31863 },
31864 open: function open(fabEl, targetEl) {
31865 var app = this;
31866 var $fabEl = $(fabEl).eq(0);
31867 var $buttonsEl = $fabEl.find('.fab-buttons');
31868 if (!$fabEl.length) return;
31869 if ($fabEl.hasClass('fab-opened')) return;
31870 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) return;
31871
31872 if (app.fab.openedEl) {
31873 if (app.fab.openedEl === $fabEl[0]) return;
31874 app.fab.close(app.fab.openedEl);
31875 }
31876
31877 app.fab.openedEl = $fabEl[0];
31878
31879 if ($fabEl.hasClass('fab-morph')) {
31880 app.fab.morphOpen($fabEl, targetEl || $fabEl.attr('data-morph-to'));
31881 } else {
31882 $fabEl.addClass('fab-opened');
31883 }
31884
31885 $fabEl.siblings('.fab-backdrop').addClass('backdrop-in');
31886 $fabEl.trigger('fab:open');
31887 },
31888 close: function close(fabEl) {
31889 if (fabEl === void 0) {
31890 fabEl = '.fab-opened';
31891 }
31892
31893 var app = this;
31894 var $fabEl = $(fabEl).eq(0);
31895 var $buttonsEl = $fabEl.find('.fab-buttons');
31896 if (!$fabEl.length) return;
31897 if (!$fabEl.hasClass('fab-opened')) return;
31898 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) return;
31899 app.fab.openedEl = null;
31900
31901 if ($fabEl.hasClass('fab-morph')) {
31902 app.fab.morphClose($fabEl);
31903 } else {
31904 $fabEl.removeClass('fab-opened');
31905 }
31906
31907 $fabEl.siblings('.fab-backdrop').removeClass('backdrop-in');
31908 $fabEl.trigger('fab:close');
31909 },
31910 toggle: function toggle(fabEl) {
31911 var app = this;
31912 var $fabEl = $(fabEl);
31913 if (!$fabEl.hasClass('fab-opened')) app.fab.open(fabEl);else app.fab.close(fabEl);
31914 }
31915 };
31916 var Fab$1 = {
31917 name: 'fab',
31918 create: function create() {
31919 var app = this;
31920 bindMethods(app, {
31921 fab: _extends$j({
31922 openedEl: null
31923 }, Fab)
31924 });
31925 },
31926 clicks: {
31927 '.fab > a': function open($clickedEl) {
31928 var app = this;
31929 app.fab.toggle($clickedEl.parents('.fab'));
31930 },
31931 '.fab-open': function open($clickedEl, data) {
31932 if (data === void 0) {
31933 data = {};
31934 }
31935
31936 var app = this;
31937 app.fab.open(data.fab);
31938 },
31939 '.fab-close': function close($clickedEl, data) {
31940 if (data === void 0) {
31941 data = {};
31942 }
31943
31944 var app = this;
31945 app.fab.close(data.fab);
31946 },
31947 '.fab-backdrop': function close() {
31948 var app = this;
31949 app.fab.close();
31950 }
31951 }
31952 };
31953
31954 /* eslint no-control-regex: "off" */
31955 var defaultDiacriticsRemovalap = [{
31956 base: 'A',
31957 letters: "A\u24B6\uFF21\xC0\xC1\xC2\u1EA6\u1EA4\u1EAA\u1EA8\xC3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\xC4\u01DE\u1EA2\xC5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F"
31958 }, {
31959 base: 'AA',
31960 letters: "\uA732"
31961 }, {
31962 base: 'AE',
31963 letters: "\xC6\u01FC\u01E2"
31964 }, {
31965 base: 'AO',
31966 letters: "\uA734"
31967 }, {
31968 base: 'AU',
31969 letters: "\uA736"
31970 }, {
31971 base: 'AV',
31972 letters: "\uA738\uA73A"
31973 }, {
31974 base: 'AY',
31975 letters: "\uA73C"
31976 }, {
31977 base: 'B',
31978 letters: "B\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181"
31979 }, {
31980 base: 'C',
31981 letters: "C\u24B8\uFF23\u0106\u0108\u010A\u010C\xC7\u1E08\u0187\u023B\uA73E"
31982 }, {
31983 base: 'D',
31984 letters: "D\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779"
31985 }, {
31986 base: 'DZ',
31987 letters: "\u01F1\u01C4"
31988 }, {
31989 base: 'Dz',
31990 letters: "\u01F2\u01C5"
31991 }, {
31992 base: 'E',
31993 letters: "E\u24BA\uFF25\xC8\xC9\xCA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\xCB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E"
31994 }, {
31995 base: 'F',
31996 letters: "F\u24BB\uFF26\u1E1E\u0191\uA77B"
31997 }, {
31998 base: 'G',
31999 letters: "G\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E"
32000 }, {
32001 base: 'H',
32002 letters: "H\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D"
32003 }, {
32004 base: 'I',
32005 letters: "I\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197"
32006 }, {
32007 base: 'J',
32008 letters: "J\u24BF\uFF2A\u0134\u0248"
32009 }, {
32010 base: 'K',
32011 letters: "K\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2"
32012 }, {
32013 base: 'L',
32014 letters: "L\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780"
32015 }, {
32016 base: 'LJ',
32017 letters: "\u01C7"
32018 }, {
32019 base: 'Lj',
32020 letters: "\u01C8"
32021 }, {
32022 base: 'M',
32023 letters: "M\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C"
32024 }, {
32025 base: 'N',
32026 letters: "N\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4"
32027 }, {
32028 base: 'NJ',
32029 letters: "\u01CA"
32030 }, {
32031 base: 'Nj',
32032 letters: "\u01CB"
32033 }, {
32034 base: 'O',
32035 letters: "O\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C"
32036 }, {
32037 base: 'OI',
32038 letters: "\u01A2"
32039 }, {
32040 base: 'OO',
32041 letters: "\uA74E"
32042 }, {
32043 base: 'OU',
32044 letters: "\u0222"
32045 }, {
32046 base: 'OE',
32047 letters: "\x8C\u0152"
32048 }, {
32049 base: 'oe',
32050 letters: "\x9C\u0153"
32051 }, {
32052 base: 'P',
32053 letters: "P\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754"
32054 }, {
32055 base: 'Q',
32056 letters: "Q\u24C6\uFF31\uA756\uA758\u024A"
32057 }, {
32058 base: 'R',
32059 letters: "R\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782"
32060 }, {
32061 base: 'S',
32062 letters: "S\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784"
32063 }, {
32064 base: 'T',
32065 letters: "T\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786"
32066 }, {
32067 base: 'TZ',
32068 letters: "\uA728"
32069 }, {
32070 base: 'U',
32071 letters: "U\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244"
32072 }, {
32073 base: 'V',
32074 letters: "V\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245"
32075 }, {
32076 base: 'VY',
32077 letters: "\uA760"
32078 }, {
32079 base: 'W',
32080 letters: "W\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72"
32081 }, {
32082 base: 'X',
32083 letters: "X\u24CD\uFF38\u1E8A\u1E8C"
32084 }, {
32085 base: 'Y',
32086 letters: "Y\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE"
32087 }, {
32088 base: 'Z',
32089 letters: "Z\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762"
32090 }, {
32091 base: 'a',
32092 letters: "a\u24D0\uFF41\u1E9A\xE0\xE1\xE2\u1EA7\u1EA5\u1EAB\u1EA9\xE3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\xE4\u01DF\u1EA3\xE5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250"
32093 }, {
32094 base: 'aa',
32095 letters: "\uA733"
32096 }, {
32097 base: 'ae',
32098 letters: "\xE6\u01FD\u01E3"
32099 }, {
32100 base: 'ao',
32101 letters: "\uA735"
32102 }, {
32103 base: 'au',
32104 letters: "\uA737"
32105 }, {
32106 base: 'av',
32107 letters: "\uA739\uA73B"
32108 }, {
32109 base: 'ay',
32110 letters: "\uA73D"
32111 }, {
32112 base: 'b',
32113 letters: "b\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253"
32114 }, {
32115 base: 'c',
32116 letters: "c\u24D2\uFF43\u0107\u0109\u010B\u010D\xE7\u1E09\u0188\u023C\uA73F\u2184"
32117 }, {
32118 base: 'd',
32119 letters: "d\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A"
32120 }, {
32121 base: 'dz',
32122 letters: "\u01F3\u01C6"
32123 }, {
32124 base: 'e',
32125 letters: "e\u24D4\uFF45\xE8\xE9\xEA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\xEB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD"
32126 }, {
32127 base: 'f',
32128 letters: "f\u24D5\uFF46\u1E1F\u0192\uA77C"
32129 }, {
32130 base: 'g',
32131 letters: "g\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F"
32132 }, {
32133 base: 'h',
32134 letters: "h\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265"
32135 }, {
32136 base: 'hv',
32137 letters: "\u0195"
32138 }, {
32139 base: 'i',
32140 letters: "i\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131"
32141 }, {
32142 base: 'j',
32143 letters: "j\u24D9\uFF4A\u0135\u01F0\u0249"
32144 }, {
32145 base: 'k',
32146 letters: "k\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3"
32147 }, {
32148 base: 'l',
32149 letters: "l\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747"
32150 }, {
32151 base: 'lj',
32152 letters: "\u01C9"
32153 }, {
32154 base: 'm',
32155 letters: "m\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F"
32156 }, {
32157 base: 'n',
32158 letters: "n\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5"
32159 }, {
32160 base: 'nj',
32161 letters: "\u01CC"
32162 }, {
32163 base: 'o',
32164 letters: "o\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\u0254\uA74B\uA74D\u0275"
32165 }, {
32166 base: 'oi',
32167 letters: "\u01A3"
32168 }, {
32169 base: 'ou',
32170 letters: "\u0223"
32171 }, {
32172 base: 'oo',
32173 letters: "\uA74F"
32174 }, {
32175 base: 'p',
32176 letters: "p\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755"
32177 }, {
32178 base: 'q',
32179 letters: "q\u24E0\uFF51\u024B\uA757\uA759"
32180 }, {
32181 base: 'r',
32182 letters: "r\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783"
32183 }, {
32184 base: 's',
32185 letters: "s\u24E2\uFF53\xDF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B"
32186 }, {
32187 base: 't',
32188 letters: "t\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787"
32189 }, {
32190 base: 'tz',
32191 letters: "\uA729"
32192 }, {
32193 base: 'u',
32194 letters: "u\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289"
32195 }, {
32196 base: 'v',
32197 letters: "v\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C"
32198 }, {
32199 base: 'vy',
32200 letters: "\uA761"
32201 }, {
32202 base: 'w',
32203 letters: "w\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73"
32204 }, {
32205 base: 'x',
32206 letters: "x\u24E7\uFF58\u1E8B\u1E8D"
32207 }, {
32208 base: 'y',
32209 letters: "y\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF"
32210 }, {
32211 base: 'z',
32212 letters: "z\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763"
32213 }];
32214 var diacriticsMap = {};
32215
32216 for (var i = 0; i < defaultDiacriticsRemovalap.length; i += 1) {
32217 var letters = defaultDiacriticsRemovalap[i].letters;
32218
32219 for (var j = 0; j < letters.length; j += 1) {
32220 diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
32221 }
32222 }
32223
32224 function removeDiacritics(str) {
32225 return str.replace(/[^\u0000-\u007E]/g, function (a) {
32226 return diacriticsMap[a] || a;
32227 });
32228 }
32229
32230 var Searchbar$1 = /*#__PURE__*/function (_FrameworkClass) {
32231 _inheritsLoose(Searchbar, _FrameworkClass);
32232
32233 function Searchbar(app, params) {
32234 var _this;
32235
32236 if (params === void 0) {
32237 params = {};
32238 }
32239
32240 _this = _FrameworkClass.call(this, params, [app]) || this;
32241
32242 var sb = _assertThisInitialized(_this);
32243
32244 var defaults = {
32245 el: undefined,
32246 inputEl: undefined,
32247 inputEvents: 'change input compositionend',
32248 disableButton: true,
32249 disableButtonEl: undefined,
32250 backdropEl: undefined,
32251 searchContainer: undefined,
32252 // container to search, HTMLElement or CSS selector
32253 searchItem: 'li',
32254 // single item selector, CSS selector
32255 searchIn: undefined,
32256 // where to search in item, CSS selector
32257 searchGroup: '.list-group',
32258 searchGroupTitle: '.item-divider, .list-group-title',
32259 ignore: '.searchbar-ignore',
32260 foundEl: '.searchbar-found',
32261 notFoundEl: '.searchbar-not-found',
32262 hideOnEnableEl: '.searchbar-hide-on-enable',
32263 hideOnSearchEl: '.searchbar-hide-on-search',
32264 backdrop: undefined,
32265 removeDiacritics: true,
32266 customSearch: false,
32267 hideDividers: true,
32268 hideGroups: true,
32269 disableOnBackdropClick: true,
32270 expandable: false,
32271 inline: false
32272 }; // Extend defaults with modules params
32273
32274 sb.useModulesParams(defaults);
32275 sb.params = extend$1(defaults, params);
32276 var $el = $(sb.params.el);
32277 if ($el.length === 0) return sb || _assertThisInitialized(_this);
32278 if ($el[0].f7Searchbar) return $el[0].f7Searchbar || _assertThisInitialized(_this);
32279 $el[0].f7Searchbar = sb;
32280 var $pageEl;
32281 var $navbarEl = $el.parents('.navbar');
32282
32283 if ($el.parents('.page').length > 0) {
32284 $pageEl = $el.parents('.page');
32285 } else if ($navbarEl.length > 0) {
32286 $pageEl = $(app.navbar.getPageByEl($navbarEl[0]));
32287
32288 if (!$pageEl.length) {
32289 var $currentPageEl = $el.parents('.view').find('.page-current');
32290
32291 if ($currentPageEl[0] && $currentPageEl[0].f7Page && $currentPageEl[0].f7Page.navbarEl === $navbarEl[0]) {
32292 $pageEl = $currentPageEl;
32293 }
32294 }
32295 }
32296
32297 var $foundEl;
32298
32299 if (params.foundEl) {
32300 $foundEl = $(params.foundEl);
32301 } else if (typeof sb.params.foundEl === 'string' && $pageEl) {
32302 $foundEl = $pageEl.find(sb.params.foundEl);
32303 }
32304
32305 var $notFoundEl;
32306
32307 if (params.notFoundEl) {
32308 $notFoundEl = $(params.notFoundEl);
32309 } else if (typeof sb.params.notFoundEl === 'string' && $pageEl) {
32310 $notFoundEl = $pageEl.find(sb.params.notFoundEl);
32311 }
32312
32313 var $hideOnEnableEl;
32314
32315 if (params.hideOnEnableEl) {
32316 $hideOnEnableEl = $(params.hideOnEnableEl);
32317 } else if (typeof sb.params.hideOnEnableEl === 'string' && $pageEl) {
32318 $hideOnEnableEl = $pageEl.find(sb.params.hideOnEnableEl);
32319 }
32320
32321 var $hideOnSearchEl;
32322
32323 if (params.hideOnSearchEl) {
32324 $hideOnSearchEl = $(params.hideOnSearchEl);
32325 } else if (typeof sb.params.hideOnSearchEl === 'string' && $pageEl) {
32326 $hideOnSearchEl = $pageEl.find(sb.params.hideOnSearchEl);
32327 }
32328
32329 var expandable = sb.params.expandable || $el.hasClass('searchbar-expandable');
32330 var inline = sb.params.inline || $el.hasClass('searchbar-inline');
32331
32332 if (typeof sb.params.backdrop === 'undefined') {
32333 if (!inline) sb.params.backdrop = app.theme !== 'aurora';else sb.params.backdrop = false;
32334 }
32335
32336 var $backdropEl;
32337
32338 if (sb.params.backdrop) {
32339 if (sb.params.backdropEl) {
32340 $backdropEl = $(sb.params.backdropEl);
32341 } else if ($pageEl && $pageEl.length > 0) {
32342 $backdropEl = $pageEl.find('.searchbar-backdrop');
32343 } else {
32344 $backdropEl = $el.siblings('.searchbar-backdrop');
32345 }
32346
32347 if ($backdropEl.length === 0) {
32348 $backdropEl = $('<div class="searchbar-backdrop"></div>');
32349
32350 if ($pageEl && $pageEl.length) {
32351 if ($el.parents($pageEl).length > 0 && $navbarEl && $el.parents($navbarEl).length === 0) {
32352 $backdropEl.insertBefore($el);
32353 } else {
32354 $backdropEl.insertBefore($pageEl.find('.page-content').eq(0));
32355 }
32356 } else {
32357 $backdropEl.insertBefore($el);
32358 }
32359 }
32360 }
32361
32362 var $searchContainer;
32363
32364 if (sb.params.searchContainer) {
32365 $searchContainer = $(sb.params.searchContainer);
32366 }
32367
32368 var $inputEl;
32369
32370 if (sb.params.inputEl) {
32371 $inputEl = $(sb.params.inputEl);
32372 } else {
32373 $inputEl = $el.find('input[type="search"]').eq(0);
32374 }
32375
32376 var $disableButtonEl;
32377
32378 if (sb.params.disableButton) {
32379 if (sb.params.disableButtonEl) {
32380 $disableButtonEl = $(sb.params.disableButtonEl);
32381 } else {
32382 $disableButtonEl = $el.find('.searchbar-disable-button');
32383 }
32384 }
32385
32386 extend$1(sb, {
32387 app: app,
32388 view: app.views.get($el.parents('.view')),
32389 $el: $el,
32390 el: $el[0],
32391 $backdropEl: $backdropEl,
32392 backdropEl: $backdropEl && $backdropEl[0],
32393 $searchContainer: $searchContainer,
32394 searchContainer: $searchContainer && $searchContainer[0],
32395 $inputEl: $inputEl,
32396 inputEl: $inputEl[0],
32397 $disableButtonEl: $disableButtonEl,
32398 disableButtonEl: $disableButtonEl && $disableButtonEl[0],
32399 disableButtonHasMargin: false,
32400 $pageEl: $pageEl,
32401 pageEl: $pageEl && $pageEl[0],
32402 $navbarEl: $navbarEl,
32403 navbarEl: $navbarEl && $navbarEl[0],
32404 $foundEl: $foundEl,
32405 foundEl: $foundEl && $foundEl[0],
32406 $notFoundEl: $notFoundEl,
32407 notFoundEl: $notFoundEl && $notFoundEl[0],
32408 $hideOnEnableEl: $hideOnEnableEl,
32409 hideOnEnableEl: $hideOnEnableEl && $hideOnEnableEl[0],
32410 $hideOnSearchEl: $hideOnSearchEl,
32411 hideOnSearchEl: $hideOnSearchEl && $hideOnSearchEl[0],
32412 previousQuery: '',
32413 query: '',
32414 isVirtualList: $searchContainer && $searchContainer.hasClass('virtual-list'),
32415 virtualList: undefined,
32416 enabled: false,
32417 expandable: expandable,
32418 inline: inline
32419 }); // Events
32420
32421 function preventSubmit(e) {
32422 e.preventDefault();
32423 }
32424
32425 function onInputFocus(e) {
32426 sb.enable(e);
32427 sb.$el.addClass('searchbar-focused');
32428 }
32429
32430 function onInputBlur() {
32431 sb.$el.removeClass('searchbar-focused');
32432
32433 if (app.theme === 'aurora' && (!$disableButtonEl || !$disableButtonEl.length || !sb.params.disableButton) && !sb.query) {
32434 sb.disable();
32435 }
32436 }
32437
32438 function onInputChange() {
32439 var value = sb.$inputEl.val().trim();
32440
32441 if (sb.$searchContainer && sb.$searchContainer.length > 0 && (sb.params.searchIn || sb.isVirtualList || sb.params.searchIn === sb.params.searchItem) || sb.params.customSearch) {
32442 sb.search(value, true);
32443 }
32444 }
32445
32446 function onInputClear(e, previousValue) {
32447 sb.$el.trigger('searchbar:clear', previousValue);
32448 sb.emit('local::clear searchbarClear', sb, previousValue);
32449 }
32450
32451 function disableOnClick(e) {
32452 sb.disable(e);
32453 }
32454
32455 function onPageBeforeOut() {
32456 if (!sb || sb && !sb.$el) return;
32457
32458 if (sb.enabled) {
32459 sb.$el.removeClass('searchbar-enabled');
32460
32461 if (sb.expandable) {
32462 sb.$el.parents('.navbar').removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition');
32463 }
32464 }
32465 }
32466
32467 function onPageBeforeIn() {
32468 if (!sb || sb && !sb.$el) return;
32469
32470 if (sb.enabled) {
32471 sb.$el.addClass('searchbar-enabled');
32472
32473 if (sb.expandable) {
32474 sb.$el.parents('.navbar').addClass('with-searchbar-expandable-enabled-no-transition');
32475 }
32476 }
32477 }
32478
32479 sb.attachEvents = function attachEvents() {
32480 $el.on('submit', preventSubmit);
32481
32482 if (sb.params.disableButton) {
32483 sb.$disableButtonEl.on('click', disableOnClick);
32484 }
32485
32486 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
32487 sb.$backdropEl.on('click', disableOnClick);
32488 }
32489
32490 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
32491 sb.$pageEl.on('page:beforeout', onPageBeforeOut);
32492 sb.$pageEl.on('page:beforein', onPageBeforeIn);
32493 }
32494
32495 sb.$inputEl.on('focus', onInputFocus);
32496 sb.$inputEl.on('blur', onInputBlur);
32497 sb.$inputEl.on(sb.params.inputEvents, onInputChange);
32498 sb.$inputEl.on('input:clear', onInputClear);
32499 };
32500
32501 sb.detachEvents = function detachEvents() {
32502 $el.off('submit', preventSubmit);
32503
32504 if (sb.params.disableButton) {
32505 sb.$disableButtonEl.off('click', disableOnClick);
32506 }
32507
32508 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
32509 sb.$backdropEl.off('click', disableOnClick);
32510 }
32511
32512 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
32513 sb.$pageEl.off('page:beforeout', onPageBeforeOut);
32514 sb.$pageEl.off('page:beforein', onPageBeforeIn);
32515 }
32516
32517 sb.$inputEl.off('focus', onInputFocus);
32518 sb.$inputEl.off('blur', onInputBlur);
32519 sb.$inputEl.off(sb.params.inputEvents, onInputChange);
32520 sb.$inputEl.off('input:clear', onInputClear);
32521 }; // Install Modules
32522
32523
32524 sb.useModules(); // Init
32525
32526 sb.init();
32527 return sb || _assertThisInitialized(_this);
32528 }
32529
32530 var _proto = Searchbar.prototype;
32531
32532 _proto.clear = function clear(e) {
32533 var sb = this;
32534
32535 if (!sb.query && e && $(e.target).hasClass('searchbar-clear')) {
32536 sb.disable();
32537 return sb;
32538 }
32539
32540 var previousQuery = sb.value;
32541 sb.$inputEl.val('').trigger('change').focus();
32542 sb.$el.trigger('searchbar:clear', previousQuery);
32543 sb.emit('local::clear searchbarClear', sb, previousQuery);
32544 return sb;
32545 };
32546
32547 _proto.setDisableButtonMargin = function setDisableButtonMargin() {
32548 var sb = this;
32549 if (sb.expandable) return;
32550 var app = sb.app;
32551 sb.$disableButtonEl.transition(0).show();
32552 sb.$disableButtonEl.css("margin-" + (app.rtl ? 'left' : 'right'), -sb.disableButtonEl.offsetWidth + "px");
32553 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
32554
32555 sb._clientLeft = sb.$disableButtonEl[0].clientLeft;
32556 sb.$disableButtonEl.transition('');
32557 sb.disableButtonHasMargin = true;
32558 };
32559
32560 _proto.enable = function enable(setFocus) {
32561 var sb = this;
32562 if (sb.enabled) return sb;
32563 var app = sb.app;
32564 var document = getDocument();
32565 var device = getDevice$1();
32566 sb.enabled = true;
32567
32568 function enable() {
32569 if (sb.$backdropEl && (sb.$searchContainer && sb.$searchContainer.length || sb.params.customSearch) && !sb.$el.hasClass('searchbar-enabled') && !sb.query) {
32570 sb.backdropShow();
32571 }
32572
32573 sb.$el.addClass('searchbar-enabled');
32574
32575 if (!sb.$disableButtonEl || sb.$disableButtonEl && sb.$disableButtonEl.length === 0) {
32576 sb.$el.addClass('searchbar-enabled-no-disable-button');
32577 }
32578
32579 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
32580 if (!sb.disableButtonHasMargin) {
32581 sb.setDisableButtonMargin();
32582 }
32583
32584 sb.$disableButtonEl.css("margin-" + (app.rtl ? 'left' : 'right'), '0px');
32585 }
32586
32587 if (sb.expandable) {
32588 var $navbarEl = sb.$el.parents('.navbar');
32589
32590 if ($navbarEl.hasClass('navbar-large') && sb.$pageEl) {
32591 var $pageContentEl = sb.$pageEl.find('.page-content');
32592 var $titleLargeEl = $navbarEl.find('.title-large');
32593 $pageContentEl.addClass('with-searchbar-expandable-enabled');
32594
32595 if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length && $pageContentEl.length) {
32596 $pageContentEl.transition(0);
32597 $pageContentEl[0].scrollTop -= $titleLargeEl[0].offsetHeight;
32598 setTimeout(function () {
32599 $pageContentEl.transition('');
32600 }, 200);
32601 }
32602 }
32603
32604 if (app.theme === 'md' && $navbarEl.length) {
32605 $navbarEl.addClass('with-searchbar-expandable-enabled');
32606 } else {
32607 $navbarEl.addClass('with-searchbar-expandable-enabled');
32608
32609 if ($navbarEl.hasClass('navbar-large')) {
32610 $navbarEl.addClass('navbar-large-collapsed');
32611 }
32612 }
32613 }
32614
32615 if (sb.$hideOnEnableEl) sb.$hideOnEnableEl.addClass('hidden-by-searchbar');
32616 sb.$el.trigger('searchbar:enable');
32617 sb.emit('local::enable searchbarEnable', sb);
32618 }
32619
32620 var needsFocus = false;
32621
32622 if (setFocus === true) {
32623 if (document.activeElement !== sb.inputEl) {
32624 needsFocus = true;
32625 }
32626 }
32627
32628 var isIos = device.ios && app.theme === 'ios';
32629
32630 if (isIos) {
32631 if (sb.expandable) {
32632 if (needsFocus) sb.$inputEl.focus();
32633 enable();
32634 } else {
32635 if (needsFocus) sb.$inputEl.focus();
32636
32637 if (setFocus && (setFocus.type === 'focus' || setFocus === true)) {
32638 nextTick$1(function () {
32639 enable();
32640 }, 400);
32641 } else {
32642 enable();
32643 }
32644 }
32645 } else {
32646 if (needsFocus) sb.$inputEl.focus();
32647
32648 if (app.theme === 'md' && sb.expandable) {
32649 sb.$el.parents('.page, .view, .navbar-inner, .navbar').scrollLeft(app.rtl ? 100 : 0);
32650 }
32651
32652 enable();
32653 }
32654
32655 return sb;
32656 };
32657
32658 _proto.disable = function disable() {
32659 var sb = this;
32660 if (!sb.enabled) return sb;
32661 var app = sb.app;
32662 sb.$inputEl.val('').trigger('change');
32663 sb.$el.removeClass('searchbar-enabled searchbar-focused searchbar-enabled-no-disable-button');
32664
32665 if (sb.expandable) {
32666 var $navbarEl = sb.$el.parents('.navbar');
32667 var $pageContentEl = sb.$pageEl && sb.$pageEl.find('.page-content');
32668
32669 if ($navbarEl.hasClass('navbar-large') && $pageContentEl.length) {
32670 var $titleLargeEl = $navbarEl.find('.title-large');
32671 sb.$el.transitionEnd(function () {
32672 $pageContentEl.removeClass('with-searchbar-expandable-closing');
32673 });
32674
32675 if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length) {
32676 var scrollTop = $pageContentEl[0].scrollTop;
32677 var titleLargeHeight = $titleLargeEl[0].offsetHeight;
32678
32679 if (scrollTop > titleLargeHeight) {
32680 $pageContentEl.transition(0);
32681 $pageContentEl[0].scrollTop = scrollTop + titleLargeHeight;
32682 setTimeout(function () {
32683 $pageContentEl.transition('');
32684 }, 200);
32685 }
32686 }
32687
32688 $pageContentEl.removeClass('with-searchbar-expandable-enabled').addClass('with-searchbar-expandable-closing');
32689 }
32690
32691 if (app.theme === 'md' && $navbarEl.length) {
32692 $navbarEl.removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition').addClass('with-searchbar-expandable-closing');
32693 sb.$el.transitionEnd(function () {
32694 $navbarEl.removeClass('with-searchbar-expandable-closing');
32695 });
32696 } else {
32697 $navbarEl.removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition').addClass('with-searchbar-expandable-closing');
32698 sb.$el.transitionEnd(function () {
32699 $navbarEl.removeClass('with-searchbar-expandable-closing');
32700 });
32701
32702 if (sb.$pageEl) {
32703 sb.$pageEl.find('.page-content').trigger('scroll');
32704 }
32705 }
32706 }
32707
32708 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
32709 sb.$disableButtonEl.css("margin-" + (app.rtl ? 'left' : 'right'), -sb.disableButtonEl.offsetWidth + "px");
32710 }
32711
32712 if (sb.$backdropEl && (sb.$searchContainer && sb.$searchContainer.length || sb.params.customSearch)) {
32713 sb.backdropHide();
32714 }
32715
32716 sb.enabled = false;
32717 sb.$inputEl.blur();
32718 if (sb.$hideOnEnableEl) sb.$hideOnEnableEl.removeClass('hidden-by-searchbar');
32719 sb.$el.trigger('searchbar:disable');
32720 sb.emit('local::disable searchbarDisable', sb);
32721 return sb;
32722 };
32723
32724 _proto.toggle = function toggle() {
32725 var sb = this;
32726 if (sb.enabled) sb.disable();else sb.enable(true);
32727 return sb;
32728 };
32729
32730 _proto.backdropShow = function backdropShow() {
32731 var sb = this;
32732
32733 if (sb.$backdropEl) {
32734 sb.$backdropEl.addClass('searchbar-backdrop-in');
32735 }
32736
32737 return sb;
32738 };
32739
32740 _proto.backdropHide = function backdropHide() {
32741 var sb = this;
32742
32743 if (sb.$backdropEl) {
32744 sb.$backdropEl.removeClass('searchbar-backdrop-in');
32745 }
32746
32747 return sb;
32748 };
32749
32750 _proto.search = function search(query, internal) {
32751 var sb = this;
32752 sb.previousQuery = sb.query || '';
32753 if (query === sb.previousQuery) return sb;
32754
32755 if (!internal) {
32756 if (!sb.enabled) {
32757 sb.enable();
32758 }
32759
32760 sb.$inputEl.val(query);
32761 sb.$inputEl.trigger('input');
32762 }
32763
32764 sb.query = query;
32765 sb.value = query;
32766 var $searchContainer = sb.$searchContainer,
32767 $el = sb.$el,
32768 $foundEl = sb.$foundEl,
32769 $notFoundEl = sb.$notFoundEl,
32770 $hideOnSearchEl = sb.$hideOnSearchEl,
32771 isVirtualList = sb.isVirtualList; // Hide on search element
32772
32773 if (query.length > 0 && $hideOnSearchEl) {
32774 $hideOnSearchEl.addClass('hidden-by-searchbar');
32775 } else if ($hideOnSearchEl) {
32776 $hideOnSearchEl.removeClass('hidden-by-searchbar');
32777 } // Add active/inactive classes on overlay
32778
32779
32780 if ($searchContainer && $searchContainer.length && $el.hasClass('searchbar-enabled') || sb.params.customSearch && $el.hasClass('searchbar-enabled')) {
32781 if (query.length === 0) {
32782 sb.backdropShow();
32783 } else {
32784 sb.backdropHide();
32785 }
32786 }
32787
32788 if (sb.params.customSearch) {
32789 $el.trigger('searchbar:search', {
32790 query: query,
32791 previousQuery: sb.previousQuery
32792 });
32793 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
32794 return sb;
32795 }
32796
32797 var foundItems = [];
32798 var vlQuery;
32799
32800 if (isVirtualList) {
32801 sb.virtualList = $searchContainer[0].f7VirtualList;
32802
32803 if (query.trim() === '') {
32804 sb.virtualList.resetFilter();
32805 if ($notFoundEl) $notFoundEl.hide();
32806 if ($foundEl) $foundEl.show();
32807 $el.trigger('searchbar:search', {
32808 query: query,
32809 previousQuery: sb.previousQuery
32810 });
32811 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
32812 return sb;
32813 }
32814
32815 vlQuery = sb.params.removeDiacritics ? removeDiacritics(query) : query;
32816
32817 if (sb.virtualList.params.searchAll) {
32818 foundItems = sb.virtualList.params.searchAll(vlQuery, sb.virtualList.items) || [];
32819 } else if (sb.virtualList.params.searchByItem) {
32820 for (var i = 0; i < sb.virtualList.items.length; i += 1) {
32821 if (sb.virtualList.params.searchByItem(vlQuery, sb.virtualList.params.items[i], i)) {
32822 foundItems.push(i);
32823 }
32824 }
32825 }
32826 } else {
32827 var values;
32828 if (sb.params.removeDiacritics) values = removeDiacritics(query.trim().toLowerCase()).split(' ');else {
32829 values = query.trim().toLowerCase().split(' ');
32830 }
32831 $searchContainer.find(sb.params.searchItem).removeClass('hidden-by-searchbar').each(function (itemEl) {
32832 var $itemEl = $(itemEl);
32833 var compareWithText = [];
32834 var $searchIn = sb.params.searchIn ? $itemEl.find(sb.params.searchIn) : $itemEl;
32835
32836 if (sb.params.searchIn === sb.params.searchItem) {
32837 $searchIn = $itemEl;
32838 }
32839
32840 $searchIn.each(function (searchInEl) {
32841 var itemText = $(searchInEl).text().trim().toLowerCase();
32842 if (sb.params.removeDiacritics) itemText = removeDiacritics(itemText);
32843 compareWithText.push(itemText);
32844 });
32845 compareWithText = compareWithText.join(' ');
32846 var wordsMatch = 0;
32847
32848 for (var _i = 0; _i < values.length; _i += 1) {
32849 if (compareWithText.indexOf(values[_i]) >= 0) wordsMatch += 1;
32850 }
32851
32852 if (wordsMatch !== values.length && !(sb.params.ignore && $itemEl.is(sb.params.ignore))) {
32853 $itemEl.addClass('hidden-by-searchbar');
32854 } else {
32855 foundItems.push($itemEl[0]);
32856 }
32857 });
32858
32859 if (sb.params.hideDividers) {
32860 $searchContainer.find(sb.params.searchGroupTitle).each(function (titleEl) {
32861 var $titleEl = $(titleEl);
32862 var $nextElements = $titleEl.nextAll(sb.params.searchItem);
32863 var hide = true;
32864
32865 for (var _i2 = 0; _i2 < $nextElements.length; _i2 += 1) {
32866 var $nextEl = $nextElements.eq(_i2);
32867 if ($nextEl.is(sb.params.searchGroupTitle)) break;
32868
32869 if (!$nextEl.hasClass('hidden-by-searchbar')) {
32870 hide = false;
32871 }
32872 }
32873
32874 var ignore = sb.params.ignore && $titleEl.is(sb.params.ignore);
32875 if (hide && !ignore) $titleEl.addClass('hidden-by-searchbar');else $titleEl.removeClass('hidden-by-searchbar');
32876 });
32877 }
32878
32879 if (sb.params.hideGroups) {
32880 $searchContainer.find(sb.params.searchGroup).each(function (groupEl) {
32881 var $groupEl = $(groupEl);
32882 var ignore = sb.params.ignore && $groupEl.is(sb.params.ignore); // eslint-disable-next-line
32883
32884 var notHidden = $groupEl.find(sb.params.searchItem).filter(function (el) {
32885 return !$(el).hasClass('hidden-by-searchbar');
32886 });
32887
32888 if (notHidden.length === 0 && !ignore) {
32889 $groupEl.addClass('hidden-by-searchbar');
32890 } else {
32891 $groupEl.removeClass('hidden-by-searchbar');
32892 }
32893 });
32894 }
32895 }
32896
32897 if (foundItems.length === 0) {
32898 if ($notFoundEl) $notFoundEl.show();
32899 if ($foundEl) $foundEl.hide();
32900 } else {
32901 if ($notFoundEl) $notFoundEl.hide();
32902 if ($foundEl) $foundEl.show();
32903 }
32904
32905 if (isVirtualList && sb.virtualList) {
32906 sb.virtualList.filterItems(foundItems);
32907 }
32908
32909 $el.trigger('searchbar:search', {
32910 query: query,
32911 previousQuery: sb.previousQuery,
32912 foundItems: foundItems
32913 });
32914 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery, foundItems);
32915 return sb;
32916 };
32917
32918 _proto.init = function init() {
32919 var sb = this;
32920 if (sb.expandable && sb.$el) sb.$el.addClass('searchbar-expandable');
32921 if (sb.inline && sb.$el) sb.$el.addClass('searchbar-inline');
32922 sb.attachEvents();
32923 };
32924
32925 _proto.destroy = function destroy() {
32926 var sb = this;
32927 sb.emit('local::beforeDestroy searchbarBeforeDestroy', sb);
32928 sb.$el.trigger('searchbar:beforedestroy');
32929 sb.detachEvents();
32930
32931 if (sb.$el[0]) {
32932 sb.$el[0].f7Searchbar = null;
32933 delete sb.$el[0].f7Searchbar;
32934 }
32935
32936 deleteProps$1(sb);
32937 };
32938
32939 return Searchbar;
32940 }(Framework7Class);
32941
32942 var Searchbar = {
32943 name: 'searchbar',
32944 static: {
32945 Searchbar: Searchbar$1
32946 },
32947 create: function create() {
32948 var app = this;
32949 app.searchbar = ConstructorMethods({
32950 defaultSelector: '.searchbar',
32951 constructor: Searchbar$1,
32952 app: app,
32953 domProp: 'f7Searchbar',
32954 addMethods: 'clear enable disable toggle search'.split(' ')
32955 });
32956 },
32957 on: {
32958 tabMounted: function tabMounted(tabEl) {
32959 var app = this;
32960 $(tabEl).find('.searchbar-init').each(function (searchbarEl) {
32961 var $searchbarEl = $(searchbarEl);
32962 app.searchbar.create(extend$1($searchbarEl.dataset(), {
32963 el: searchbarEl
32964 }));
32965 });
32966 },
32967 tabBeforeRemove: function tabBeforeRemove(tabEl) {
32968 $(tabEl).find('.searchbar-init').each(function (searchbarEl) {
32969 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
32970 searchbarEl.f7Searchbar.destroy();
32971 }
32972 });
32973 },
32974 pageInit: function pageInit(page) {
32975 var app = this;
32976 page.$el.find('.searchbar-init').each(function (searchbarEl) {
32977 var $searchbarEl = $(searchbarEl);
32978 app.searchbar.create(extend$1($searchbarEl.dataset(), {
32979 el: searchbarEl
32980 }));
32981 });
32982
32983 if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
32984 page.$navbarEl.find('.searchbar-init').each(function (searchbarEl) {
32985 var $searchbarEl = $(searchbarEl);
32986 app.searchbar.create(extend$1($searchbarEl.dataset(), {
32987 el: searchbarEl
32988 }));
32989 });
32990 }
32991 },
32992 pageBeforeRemove: function pageBeforeRemove(page) {
32993 var app = this;
32994 page.$el.find('.searchbar-init').each(function (searchbarEl) {
32995 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
32996 searchbarEl.f7Searchbar.destroy();
32997 }
32998 });
32999
33000 if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
33001 page.$navbarEl.find('.searchbar-init').each(function (searchbarEl) {
33002 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
33003 searchbarEl.f7Searchbar.destroy();
33004 }
33005 });
33006 }
33007 }
33008 },
33009 clicks: {
33010 '.searchbar-clear': function clear($clickedEl, data) {
33011 if (data === void 0) {
33012 data = {};
33013 }
33014
33015 var app = this;
33016 var sb = app.searchbar.get(data.searchbar);
33017 if (sb) sb.clear();
33018 },
33019 '.searchbar-enable': function enable($clickedEl, data) {
33020 if (data === void 0) {
33021 data = {};
33022 }
33023
33024 var app = this;
33025 var sb = app.searchbar.get(data.searchbar);
33026 if (sb) sb.enable(true);
33027 },
33028 '.searchbar-disable': function disable($clickedEl, data) {
33029 if (data === void 0) {
33030 data = {};
33031 }
33032
33033 var app = this;
33034 var sb = app.searchbar.get(data.searchbar);
33035 if (sb) sb.disable();
33036 },
33037 '.searchbar-toggle': function toggle($clickedEl, data) {
33038 if (data === void 0) {
33039 data = {};
33040 }
33041
33042 var app = this;
33043 var sb = app.searchbar.get(data.searchbar);
33044 if (sb) sb.toggle();
33045 }
33046 },
33047 vnode: {
33048 'searchbar-init': {
33049 insert: function insert(vnode) {
33050 var app = this;
33051 var searchbarEl = vnode.elm;
33052 var $searchbarEl = $(searchbarEl);
33053 app.searchbar.create(extend$1($searchbarEl.dataset(), {
33054 el: searchbarEl
33055 }));
33056 },
33057 destroy: function destroy(vnode) {
33058 var searchbarEl = vnode.elm;
33059
33060 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
33061 searchbarEl.f7Searchbar.destroy();
33062 }
33063 }
33064 }
33065 }
33066 };
33067
33068 var Messages$1 = /*#__PURE__*/function (_Framework7Class) {
33069 _inheritsLoose(Messages, _Framework7Class);
33070
33071 function Messages(app, params) {
33072 var _this;
33073
33074 if (params === void 0) {
33075 params = {};
33076 }
33077
33078 _this = _Framework7Class.call(this, params, [app]) || this;
33079
33080 var m = _assertThisInitialized(_this);
33081
33082 var defaults = {
33083 autoLayout: true,
33084 messages: [],
33085 newMessagesFirst: false,
33086 scrollMessages: true,
33087 scrollMessagesOnEdge: true,
33088 firstMessageRule: undefined,
33089 lastMessageRule: undefined,
33090 tailMessageRule: undefined,
33091 sameNameMessageRule: undefined,
33092 sameHeaderMessageRule: undefined,
33093 sameFooterMessageRule: undefined,
33094 sameAvatarMessageRule: undefined,
33095 customClassMessageRule: undefined,
33096 renderMessage: undefined
33097 }; // Extend defaults with modules params
33098
33099 m.useModulesParams(defaults);
33100 m.params = extend$1(defaults, params);
33101 var $el = $(params.el).eq(0);
33102 if ($el.length === 0) return m || _assertThisInitialized(_this);
33103 if ($el[0].f7Messages) return $el[0].f7Messages || _assertThisInitialized(_this);
33104 $el[0].f7Messages = m;
33105 var $pageContentEl = $el.closest('.page-content').eq(0);
33106 extend$1(m, {
33107 messages: m.params.messages,
33108 $el: $el,
33109 el: $el[0],
33110 $pageContentEl: $pageContentEl,
33111 pageContentEl: $pageContentEl[0]
33112 }); // Install Modules
33113
33114 m.useModules(); // Init
33115
33116 m.init();
33117 return m || _assertThisInitialized(_this);
33118 } // eslint-disable-next-line
33119
33120
33121 var _proto = Messages.prototype;
33122
33123 _proto.getMessageData = function getMessageData(messageEl) {
33124 var $messageEl = $(messageEl);
33125 var data = {
33126 name: $messageEl.find('.message-name').html(),
33127 header: $messageEl.find('.message-header').html(),
33128 textHeader: $messageEl.find('.message-text-header').html(),
33129 textFooter: $messageEl.find('.message-text-footer').html(),
33130 footer: $messageEl.find('.message-footer').html(),
33131 isTitle: $messageEl.hasClass('messages-title'),
33132 type: $messageEl.hasClass('message-sent') ? 'sent' : 'received',
33133 text: $messageEl.find('.message-text').html(),
33134 image: $messageEl.find('.message-image').html(),
33135 imageSrc: $messageEl.find('.message-image img').attr('src'),
33136 typing: $messageEl.hasClass('message-typing')
33137 };
33138
33139 if (data.isTitle) {
33140 data.text = $messageEl.html();
33141 }
33142
33143 if (data.text && data.textHeader) {
33144 data.text = data.text.replace("<div class=\"message-text-header\">" + data.textHeader + "</div>", '');
33145 }
33146
33147 if (data.text && data.textFooter) {
33148 data.text = data.text.replace("<div class=\"message-text-footer\">" + data.textFooter + "</div>", '');
33149 }
33150
33151 var avatar = $messageEl.find('.message-avatar').css('background-image');
33152 if (avatar === 'none' || avatar === '') avatar = undefined;
33153
33154 if (avatar && typeof avatar === 'string') {
33155 avatar = avatar.replace('url(', '').replace(')', '').replace(/"/g, '').replace(/'/g, '');
33156 } else {
33157 avatar = undefined;
33158 }
33159
33160 data.avatar = avatar;
33161 return data;
33162 };
33163
33164 _proto.getMessagesData = function getMessagesData() {
33165 var m = this;
33166 var data = [];
33167 m.$el.find('.message, .messages-title').each(function (messageEl) {
33168 data.push(m.getMessageData(messageEl));
33169 });
33170 return data;
33171 };
33172
33173 _proto.renderMessage = function renderMessage(messageToRender) {
33174 var m = this;
33175 var message = extend$1({
33176 type: 'sent',
33177 attrs: {}
33178 }, messageToRender);
33179
33180 if (m.params.renderMessage) {
33181 return m.params.renderMessage.call(m, message);
33182 }
33183
33184 if (message.isTitle) {
33185 return "<div class=\"messages-title\">" + message.text + "</div>";
33186 }
33187
33188 return $jsx("div", _extends$j({
33189 class: "message message-" + message.type + " " + (message.isTyping ? 'message-typing' : '') + " " + (message.cssClass || '')
33190 }, message.attrs), message.avatar && $jsx("div", {
33191 class: "message-avatar",
33192 style: "background-image:url(" + message.avatar + ")"
33193 }), $jsx("div", {
33194 class: "message-content"
33195 }, message.name && $jsx("div", {
33196 class: "message-name"
33197 }, message.name), message.header && $jsx("div", {
33198 class: "message-header"
33199 }, message.header), $jsx("div", {
33200 class: "message-bubble"
33201 }, message.textHeader && $jsx("div", {
33202 class: "message-text-header"
33203 }, message.textHeader), message.image && $jsx("div", {
33204 class: "message-image"
33205 }, message.image), message.imageSrc && !message.image && $jsx("div", {
33206 class: "message-image"
33207 }, $jsx("img", {
33208 src: message.imageSrc
33209 })), (message.text || message.isTyping) && $jsx("div", {
33210 class: "message-text"
33211 }, message.text || '', message.isTyping && $jsx("div", {
33212 class: "message-typing-indicator"
33213 }, $jsx("div", null), $jsx("div", null), $jsx("div", null))), message.textFooter && $jsx("div", {
33214 class: "message-text-footer"
33215 }, message.textFooter)), message.footer && $jsx("div", {
33216 class: "message-footer"
33217 }, message.footer)));
33218 };
33219
33220 _proto.renderMessages = function renderMessages(messagesToRender, method) {
33221 if (messagesToRender === void 0) {
33222 messagesToRender = this.messages;
33223 }
33224
33225 if (method === void 0) {
33226 method = this.params.newMessagesFirst ? 'prepend' : 'append';
33227 }
33228
33229 var m = this;
33230 var html = messagesToRender.map(function (message) {
33231 return m.renderMessage(message);
33232 }).join('');
33233 m.$el[method](html);
33234 };
33235
33236 _proto.isFirstMessage = function isFirstMessage() {
33237 var _m$params;
33238
33239 var m = this;
33240 if (m.params.firstMessageRule) return (_m$params = m.params).firstMessageRule.apply(_m$params, arguments);
33241 return false;
33242 };
33243
33244 _proto.isLastMessage = function isLastMessage() {
33245 var _m$params2;
33246
33247 var m = this;
33248 if (m.params.lastMessageRule) return (_m$params2 = m.params).lastMessageRule.apply(_m$params2, arguments);
33249 return false;
33250 };
33251
33252 _proto.isTailMessage = function isTailMessage() {
33253 var _m$params3;
33254
33255 var m = this;
33256 if (m.params.tailMessageRule) return (_m$params3 = m.params).tailMessageRule.apply(_m$params3, arguments);
33257 return false;
33258 };
33259
33260 _proto.isSameNameMessage = function isSameNameMessage() {
33261 var _m$params4;
33262
33263 var m = this;
33264 if (m.params.sameNameMessageRule) return (_m$params4 = m.params).sameNameMessageRule.apply(_m$params4, arguments);
33265 return false;
33266 };
33267
33268 _proto.isSameHeaderMessage = function isSameHeaderMessage() {
33269 var _m$params5;
33270
33271 var m = this;
33272 if (m.params.sameHeaderMessageRule) return (_m$params5 = m.params).sameHeaderMessageRule.apply(_m$params5, arguments);
33273 return false;
33274 };
33275
33276 _proto.isSameFooterMessage = function isSameFooterMessage() {
33277 var _m$params6;
33278
33279 var m = this;
33280 if (m.params.sameFooterMessageRule) return (_m$params6 = m.params).sameFooterMessageRule.apply(_m$params6, arguments);
33281 return false;
33282 };
33283
33284 _proto.isSameAvatarMessage = function isSameAvatarMessage() {
33285 var _m$params7;
33286
33287 var m = this;
33288 if (m.params.sameAvatarMessageRule) return (_m$params7 = m.params).sameAvatarMessageRule.apply(_m$params7, arguments);
33289 return false;
33290 };
33291
33292 _proto.isCustomClassMessage = function isCustomClassMessage() {
33293 var _m$params8;
33294
33295 var m = this;
33296 if (m.params.customClassMessageRule) return (_m$params8 = m.params).customClassMessageRule.apply(_m$params8, arguments);
33297 return undefined;
33298 };
33299
33300 _proto.layout = function layout() {
33301 var m = this;
33302 m.$el.find('.message, .messages-title').each(function (messageEl, index) {
33303 var $messageEl = $(messageEl);
33304
33305 if (!m.messages) {
33306 m.messages = m.getMessagesData();
33307 }
33308
33309 var classes = [];
33310 var message = m.messages[index];
33311 var previousMessage = m.messages[index - 1];
33312 var nextMessage = m.messages[index + 1];
33313
33314 if (m.isFirstMessage(message, previousMessage, nextMessage)) {
33315 classes.push('message-first');
33316 }
33317
33318 if (m.isLastMessage(message, previousMessage, nextMessage)) {
33319 classes.push('message-last');
33320 }
33321
33322 if (m.isTailMessage(message, previousMessage, nextMessage)) {
33323 classes.push('message-tail');
33324 }
33325
33326 if (m.isSameNameMessage(message, previousMessage, nextMessage)) {
33327 classes.push('message-same-name');
33328 }
33329
33330 if (m.isSameHeaderMessage(message, previousMessage, nextMessage)) {
33331 classes.push('message-same-header');
33332 }
33333
33334 if (m.isSameFooterMessage(message, previousMessage, nextMessage)) {
33335 classes.push('message-same-footer');
33336 }
33337
33338 if (m.isSameAvatarMessage(message, previousMessage, nextMessage)) {
33339 classes.push('message-same-avatar');
33340 }
33341
33342 var customMessageClasses = m.isCustomClassMessage(message, previousMessage, nextMessage);
33343
33344 if (customMessageClasses && customMessageClasses.length) {
33345 if (typeof customMessageClasses === 'string') {
33346 customMessageClasses = customMessageClasses.split(' ');
33347 }
33348
33349 customMessageClasses.forEach(function (customClass) {
33350 classes.push(customClass);
33351 });
33352 }
33353
33354 $messageEl.removeClass('message-first message-last message-tail message-same-name message-same-header message-same-footer message-same-avatar');
33355 classes.forEach(function (className) {
33356 $messageEl.addClass(className);
33357 });
33358 });
33359 };
33360
33361 _proto.clear = function clear() {
33362 var m = this;
33363 m.messages = [];
33364 m.$el.html('');
33365 };
33366
33367 _proto.removeMessage = function removeMessage(messageToRemove, layout) {
33368 if (layout === void 0) {
33369 layout = true;
33370 }
33371
33372 var m = this; // Index or El
33373
33374 var index;
33375 var $el;
33376
33377 if (typeof messageToRemove === 'number') {
33378 index = messageToRemove;
33379 $el = m.$el.find('.message, .messages-title').eq(index);
33380 } else if (m.messages && m.messages.indexOf(messageToRemove) >= 0) {
33381 index = m.messages.indexOf(messageToRemove);
33382 $el = m.$el.children().eq(index);
33383 } else {
33384 $el = $(messageToRemove);
33385 index = $el.index();
33386 }
33387
33388 if ($el.length === 0) {
33389 return m;
33390 }
33391
33392 $el.remove();
33393 m.messages.splice(index, 1);
33394 if (m.params.autoLayout && layout) m.layout();
33395 return m;
33396 };
33397
33398 _proto.removeMessages = function removeMessages(messagesToRemove, layout) {
33399 if (layout === void 0) {
33400 layout = true;
33401 }
33402
33403 var m = this;
33404
33405 if (Array.isArray(messagesToRemove)) {
33406 var messagesToRemoveEls = [];
33407 messagesToRemove.forEach(function (messageToRemoveIndex) {
33408 messagesToRemoveEls.push(m.$el.find('.message, .messages-title').eq(messageToRemoveIndex));
33409 });
33410 messagesToRemoveEls.forEach(function (messageToRemove) {
33411 m.removeMessage(messageToRemove, false);
33412 });
33413 } else {
33414 $(messagesToRemove).each(function (messageToRemove) {
33415 m.removeMessage(messageToRemove, false);
33416 });
33417 }
33418
33419 if (m.params.autoLayout && layout) m.layout();
33420 return m;
33421 };
33422
33423 _proto.addMessage = function addMessage() {
33424 var m = this;
33425 var messageToAdd;
33426 var animate;
33427 var method;
33428
33429 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
33430 args[_key] = arguments[_key];
33431 }
33432
33433 if (typeof args[1] === 'boolean') {
33434 messageToAdd = args[0];
33435 animate = args[1];
33436 method = args[2];
33437 } else {
33438 messageToAdd = args[0];
33439 method = args[1];
33440 animate = args[2];
33441 }
33442
33443 if (typeof animate === 'undefined') {
33444 animate = true;
33445 }
33446
33447 if (typeof method === 'undefined') {
33448 method = m.params.newMessagesFirst ? 'prepend' : 'append';
33449 }
33450
33451 return m.addMessages([messageToAdd], animate, method);
33452 };
33453
33454 _proto.setScrollData = function setScrollData() {
33455 var m = this; // Define scroll positions before new messages added
33456
33457 var scrollHeightBefore = m.pageContentEl.scrollHeight;
33458 var heightBefore = m.pageContentEl.offsetHeight;
33459 var scrollBefore = m.pageContentEl.scrollTop;
33460 m.scrollData = {
33461 scrollHeightBefore: scrollHeightBefore,
33462 heightBefore: heightBefore,
33463 scrollBefore: scrollBefore
33464 };
33465 return {
33466 scrollHeightBefore: scrollHeightBefore,
33467 heightBefore: heightBefore,
33468 scrollBefore: scrollBefore
33469 };
33470 };
33471
33472 _proto.addMessages = function addMessages() {
33473 var m = this;
33474 var messagesToAdd;
33475 var animate;
33476 var method;
33477
33478 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
33479 args[_key2] = arguments[_key2];
33480 }
33481
33482 if (typeof args[1] === 'boolean') {
33483 messagesToAdd = args[0];
33484 animate = args[1];
33485 method = args[2];
33486 } else {
33487 messagesToAdd = args[0];
33488 method = args[1];
33489 animate = args[2];
33490 }
33491
33492 if (typeof animate === 'undefined') {
33493 animate = true;
33494 }
33495
33496 if (typeof method === 'undefined') {
33497 method = m.params.newMessagesFirst ? 'prepend' : 'append';
33498 }
33499
33500 var _m$setScrollData = m.setScrollData(),
33501 scrollHeightBefore = _m$setScrollData.scrollHeightBefore,
33502 scrollBefore = _m$setScrollData.scrollBefore; // Add message to DOM and data
33503
33504
33505 var messagesHTML = '';
33506 var typingMessage = m.messages.filter(function (el) {
33507 return el.isTyping;
33508 })[0];
33509 messagesToAdd.forEach(function (messageToAdd) {
33510 if (typingMessage) {
33511 if (method === 'append') {
33512 m.messages.splice(m.messages.indexOf(typingMessage), 0, messageToAdd);
33513 } else {
33514 m.messages.splice(m.messages.indexOf(typingMessage) + 1, 0, messageToAdd);
33515 }
33516 } else {
33517 m.messages[method === 'append' ? 'push' : 'unshift'](messageToAdd);
33518 }
33519
33520 messagesHTML += m.renderMessage(messageToAdd);
33521 });
33522 var $messagesEls = $(messagesHTML);
33523
33524 if (animate) {
33525 if (method === 'append' && !m.params.newMessagesFirst) {
33526 $messagesEls.addClass('message-appear-from-bottom');
33527 }
33528
33529 if (method === 'prepend' && m.params.newMessagesFirst) {
33530 $messagesEls.addClass('message-appear-from-top');
33531 }
33532 }
33533
33534 if (typingMessage) {
33535 if (method === 'append') {
33536 $messagesEls.insertBefore(m.$el.find('.message-typing'));
33537 } else {
33538 $messagesEls.insertAfter(m.$el.find('.message-typing'));
33539 }
33540 } else {
33541 m.$el[method]($messagesEls);
33542 } // Layout
33543
33544
33545 if (m.params.autoLayout) m.layout();
33546
33547 if (method === 'prepend' && !typingMessage) {
33548 m.pageContentEl.scrollTop = scrollBefore + (m.pageContentEl.scrollHeight - scrollHeightBefore);
33549 }
33550
33551 if (m.params.scrollMessages && (method === 'append' && !m.params.newMessagesFirst || method === 'prepend' && m.params.newMessagesFirst && !typingMessage)) {
33552 m.scrollWithEdgeCheck(animate);
33553 }
33554
33555 return m;
33556 };
33557
33558 _proto.showTyping = function showTyping(message) {
33559 if (message === void 0) {
33560 message = {};
33561 }
33562
33563 var m = this;
33564 var typingMessage = m.messages.filter(function (el) {
33565 return el.isTyping;
33566 })[0];
33567
33568 if (typingMessage) {
33569 m.removeMessage(m.messages.indexOf(typingMessage));
33570 }
33571
33572 m.addMessage(extend$1({
33573 type: 'received',
33574 isTyping: true
33575 }, message));
33576 return m;
33577 };
33578
33579 _proto.hideTyping = function hideTyping() {
33580 var m = this;
33581 var typingMessageIndex;
33582 var typingFound;
33583 m.messages.forEach(function (message, index) {
33584 if (message.isTyping) typingMessageIndex = index;
33585 });
33586
33587 if (typeof typingMessageIndex !== 'undefined') {
33588 if (m.$el.find('.message').eq(typingMessageIndex).hasClass('message-typing')) {
33589 typingFound = true;
33590 m.removeMessage(typingMessageIndex);
33591 }
33592 }
33593
33594 if (!typingFound) {
33595 var $typingMessageEl = m.$el.find('.message-typing');
33596
33597 if ($typingMessageEl.length) {
33598 m.removeMessage($typingMessageEl);
33599 }
33600 }
33601
33602 return m;
33603 };
33604
33605 _proto.scrollWithEdgeCheck = function scrollWithEdgeCheck(animate) {
33606 var m = this;
33607 var _m$scrollData = m.scrollData,
33608 scrollBefore = _m$scrollData.scrollBefore,
33609 scrollHeightBefore = _m$scrollData.scrollHeightBefore,
33610 heightBefore = _m$scrollData.heightBefore;
33611
33612 if (m.params.scrollMessagesOnEdge) {
33613 var onEdge = false;
33614
33615 if (m.params.newMessagesFirst && scrollBefore === 0) {
33616 onEdge = true;
33617 }
33618
33619 if (!m.params.newMessagesFirst && scrollBefore - (scrollHeightBefore - heightBefore) >= -10) {
33620 onEdge = true;
33621 }
33622
33623 if (onEdge) m.scroll(animate ? undefined : 0);
33624 } else {
33625 m.scroll(animate ? undefined : 0);
33626 }
33627 };
33628
33629 _proto.scroll = function scroll(duration, scrollTop) {
33630 if (duration === void 0) {
33631 duration = 300;
33632 }
33633
33634 var m = this;
33635 var currentScroll = m.pageContentEl.scrollTop;
33636 var newScrollTop;
33637 if (typeof scrollTop !== 'undefined') newScrollTop = scrollTop;else {
33638 newScrollTop = m.params.newMessagesFirst ? 0 : m.pageContentEl.scrollHeight - m.pageContentEl.offsetHeight;
33639 if (newScrollTop === currentScroll) return m;
33640 }
33641 m.$pageContentEl.scrollTop(newScrollTop, duration);
33642 return m;
33643 };
33644
33645 _proto.init = function init() {
33646 var m = this;
33647
33648 if (!m.messages || m.messages.length === 0) {
33649 m.messages = m.getMessagesData();
33650 }
33651
33652 if (m.params.messages && m.params.messages.length) {
33653 m.renderMessages();
33654 }
33655
33656 if (m.params.autoLayout) m.layout();
33657 if (m.params.scrollMessages) m.scroll(0);
33658 };
33659
33660 _proto.destroy = function destroy() {
33661 var m = this;
33662 m.emit('local::beforeDestroy messagesBeforeDestroy', m);
33663 m.$el.trigger('messages:beforedestroy');
33664
33665 if (m.$el[0]) {
33666 m.$el[0].f7Messages = null;
33667 delete m.$el[0].f7Messages;
33668 }
33669
33670 deleteProps$1(m);
33671 };
33672
33673 return Messages;
33674 }(Framework7Class);
33675
33676 var Messages = {
33677 name: 'messages',
33678 static: {
33679 Messages: Messages$1
33680 },
33681 create: function create() {
33682 var app = this;
33683 app.messages = ConstructorMethods({
33684 defaultSelector: '.messages',
33685 constructor: Messages$1,
33686 app: app,
33687 domProp: 'f7Messages',
33688 addMethods: 'renderMessages layout scroll clear removeMessage removeMessages addMessage addMessages'.split(' ')
33689 });
33690 },
33691 on: {
33692 tabBeforeRemove: function tabBeforeRemove(tabEl) {
33693 var app = this;
33694 $(tabEl).find('.messages-init').each(function (messagesEl) {
33695 app.messages.destroy(messagesEl);
33696 });
33697 },
33698 tabMounted: function tabMounted(tabEl) {
33699 var app = this;
33700 $(tabEl).find('.messages-init').each(function (messagesEl) {
33701 app.messages.create({
33702 el: messagesEl
33703 });
33704 });
33705 },
33706 pageBeforeRemove: function pageBeforeRemove(page) {
33707 var app = this;
33708 page.$el.find('.messages-init').each(function (messagesEl) {
33709 app.messages.destroy(messagesEl);
33710 });
33711 },
33712 pageInit: function pageInit(page) {
33713 var app = this;
33714 page.$el.find('.messages-init').each(function (messagesEl) {
33715 app.messages.create({
33716 el: messagesEl
33717 });
33718 });
33719 }
33720 },
33721 vnode: {
33722 'messages-init': {
33723 insert: function insert(vnode) {
33724 var app = this;
33725 var messagesEl = vnode.elm;
33726 app.messages.create({
33727 el: messagesEl
33728 });
33729 },
33730 destroy: function destroy(vnode) {
33731 var app = this;
33732 var messagesEl = vnode.elm;
33733 app.messages.destroy(messagesEl);
33734 }
33735 }
33736 }
33737 };
33738
33739 var Messagebar$1 = /*#__PURE__*/function (_Framework7Class) {
33740 _inheritsLoose(Messagebar, _Framework7Class);
33741
33742 function Messagebar(app, params) {
33743 var _this;
33744
33745 if (params === void 0) {
33746 params = {};
33747 }
33748
33749 _this = _Framework7Class.call(this, params, [app]) || this;
33750
33751 var messagebar = _assertThisInitialized(_this);
33752
33753 var defaults = {
33754 top: false,
33755 topOffset: 0,
33756 bottomOffset: 0,
33757 attachments: [],
33758 renderAttachments: undefined,
33759 renderAttachment: undefined,
33760 maxHeight: null,
33761 resizePage: true
33762 }; // Extend defaults with modules params
33763
33764 messagebar.useModulesParams(defaults);
33765 messagebar.params = extend$1(defaults, params); // El
33766
33767 var $el = $(messagebar.params.el);
33768 if ($el.length === 0) return messagebar || _assertThisInitialized(_this);
33769 if ($el[0].f7Messagebar) return $el[0].f7Messagebar || _assertThisInitialized(_this);
33770 $el[0].f7Messagebar = messagebar; // Page and PageContent
33771
33772 var $pageEl = $el.parents('.page').eq(0);
33773 var $pageContentEl = $pageEl.find('.page-content').eq(0); // Area
33774
33775 var $areaEl = $el.find('.messagebar-area'); // Textarea
33776
33777 var $textareaEl;
33778
33779 if (messagebar.params.textareaEl) {
33780 $textareaEl = $(messagebar.params.textareaEl);
33781 } else {
33782 $textareaEl = $el.find('textarea');
33783 } // Attachments & Library
33784
33785
33786 var $attachmentsEl = $el.find('.messagebar-attachments');
33787 var $sheetEl = $el.find('.messagebar-sheet');
33788
33789 if (messagebar.params.top) {
33790 $el.addClass('messagebar-top');
33791 }
33792
33793 extend$1(messagebar, {
33794 $el: $el,
33795 el: $el[0],
33796 $areaEl: $areaEl,
33797 areaEl: $areaEl[0],
33798 $textareaEl: $textareaEl,
33799 textareaEl: $textareaEl[0],
33800 $attachmentsEl: $attachmentsEl,
33801 attachmentsEl: $attachmentsEl[0],
33802 attachmentsVisible: $attachmentsEl.hasClass('messagebar-attachments-visible'),
33803 $sheetEl: $sheetEl,
33804 sheetEl: $sheetEl[0],
33805 sheetVisible: $sheetEl.hasClass('messagebar-sheet-visible'),
33806 $pageEl: $pageEl,
33807 pageEl: $pageEl[0],
33808 $pageContentEl: $pageContentEl,
33809 pageContentEl: $pageContentEl,
33810 top: $el.hasClass('messagebar-top') || messagebar.params.top,
33811 attachments: []
33812 }); // Events
33813
33814 function onAppResize() {
33815 if (messagebar.params.resizePage) {
33816 messagebar.resizePage();
33817 }
33818 }
33819
33820 function onSubmit(e) {
33821 e.preventDefault();
33822 }
33823
33824 function onAttachmentClick(e) {
33825 var index = $(this).index();
33826
33827 if ($(e.target).closest('.messagebar-attachment-delete').length) {
33828 $(this).trigger('messagebar:attachmentdelete', index);
33829 messagebar.emit('local::attachmentDelete messagebarAttachmentDelete', messagebar, this, index);
33830 } else {
33831 $(this).trigger('messagebar:attachmentclick', index);
33832 messagebar.emit('local::attachmentClick messagebarAttachmentClick', messagebar, this, index);
33833 }
33834 }
33835
33836 function onTextareaChange() {
33837 messagebar.checkEmptyState();
33838 messagebar.$el.trigger('messagebar:change');
33839 messagebar.emit('local::change messagebarChange', messagebar);
33840 }
33841
33842 function onTextareaFocus() {
33843 messagebar.sheetHide();
33844 messagebar.$el.addClass('messagebar-focused');
33845 messagebar.$el.trigger('messagebar:focus');
33846 messagebar.emit('local::focus messagebarFocus', messagebar);
33847 }
33848
33849 function onTextareaBlur() {
33850 messagebar.$el.removeClass('messagebar-focused');
33851 messagebar.$el.trigger('messagebar:blur');
33852 messagebar.emit('local::blur messagebarBlur', messagebar);
33853 }
33854
33855 messagebar.attachEvents = function attachEvents() {
33856 $el.on('textarea:resize', onAppResize);
33857 $el.on('submit', onSubmit);
33858 $el.on('click', '.messagebar-attachment', onAttachmentClick);
33859 $textareaEl.on('change input', onTextareaChange);
33860 $textareaEl.on('focus', onTextareaFocus);
33861 $textareaEl.on('blur', onTextareaBlur);
33862 app.on('resize', onAppResize);
33863 };
33864
33865 messagebar.detachEvents = function detachEvents() {
33866 $el.off('textarea:resize', onAppResize);
33867 $el.off('submit', onSubmit);
33868 $el.off('click', '.messagebar-attachment', onAttachmentClick);
33869 $textareaEl.off('change input', onTextareaChange);
33870 $textareaEl.off('focus', onTextareaFocus);
33871 $textareaEl.off('blur', onTextareaBlur);
33872 app.off('resize', onAppResize);
33873 }; // Install Modules
33874
33875
33876 messagebar.useModules(); // Init
33877
33878 messagebar.init();
33879 return messagebar || _assertThisInitialized(_this);
33880 }
33881
33882 var _proto = Messagebar.prototype;
33883
33884 _proto.focus = function focus() {
33885 var messagebar = this;
33886 messagebar.$textareaEl.focus();
33887 return messagebar;
33888 };
33889
33890 _proto.blur = function blur() {
33891 var messagebar = this;
33892 messagebar.$textareaEl.blur();
33893 return messagebar;
33894 };
33895
33896 _proto.clear = function clear() {
33897 var messagebar = this;
33898 messagebar.$textareaEl.val('').trigger('change');
33899 return messagebar;
33900 };
33901
33902 _proto.getValue = function getValue() {
33903 var messagebar = this;
33904 return messagebar.$textareaEl.val().trim();
33905 };
33906
33907 _proto.setValue = function setValue(value) {
33908 var messagebar = this;
33909 messagebar.$textareaEl.val(value).trigger('change');
33910 return messagebar;
33911 };
33912
33913 _proto.setPlaceholder = function setPlaceholder(placeholder) {
33914 var messagebar = this;
33915 messagebar.$textareaEl.attr('placeholder', placeholder);
33916 return messagebar;
33917 };
33918
33919 _proto.resizePage = function resizePage() {
33920 var messagebar = this;
33921 var params = messagebar.params,
33922 $el = messagebar.$el,
33923 top = messagebar.top,
33924 $pageEl = messagebar.$pageEl,
33925 $pageContentEl = messagebar.$pageContentEl,
33926 $areaEl = messagebar.$areaEl,
33927 $textareaEl = messagebar.$textareaEl,
33928 $sheetEl = messagebar.$sheetEl,
33929 $attachmentsEl = messagebar.$attachmentsEl;
33930 var elHeight = $el[0].offsetHeight;
33931 var maxHeight = params.maxHeight;
33932
33933 if (top) {
33934 /*
33935 Disable at the moment
33936 const requiredPaddingTop = elHeight + params.topOffset;
33937 const currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);
33938 if (requiredPaddingTop !== currentPaddingTop) {
33939 if (!maxHeight) {
33940 maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);
33941 }
33942 $textareaEl.css('max-height', `${maxHeight}px`);
33943 $pageContentEl.css('padding-top', `${requiredPaddingTop}px`);
33944 $el.trigger('messagebar:resizePage');
33945 messagebar.emit('local::resizepage messagebarResizePage');
33946 }
33947 */
33948 } else {
33949 var currentPaddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
33950 var requiredPaddingBottom = elHeight + params.bottomOffset;
33951
33952 if (requiredPaddingBottom !== currentPaddingBottom && $pageContentEl.length) {
33953 var currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);
33954 var pageScrollHeight = $pageContentEl[0].scrollHeight;
33955 var pageOffsetHeight = $pageContentEl[0].offsetHeight;
33956 var pageScrollTop = $pageContentEl[0].scrollTop;
33957 var scrollOnBottom = pageScrollTop === pageScrollHeight - pageOffsetHeight;
33958
33959 if (!maxHeight) {
33960 maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);
33961 }
33962
33963 $textareaEl.css('max-height', maxHeight + "px");
33964 $pageContentEl.css('padding-bottom', requiredPaddingBottom + "px");
33965
33966 if (scrollOnBottom) {
33967 $pageContentEl.scrollTop($pageContentEl[0].scrollHeight - pageOffsetHeight);
33968 }
33969
33970 $el.trigger('messagebar:resizepage');
33971 messagebar.emit('local::resizePage messagebarResizePage', messagebar);
33972 }
33973 }
33974 };
33975
33976 _proto.checkEmptyState = function checkEmptyState() {
33977 var messagebar = this;
33978 var $el = messagebar.$el,
33979 $textareaEl = messagebar.$textareaEl;
33980 var value = $textareaEl.val().trim();
33981
33982 if (value && value.length) {
33983 $el.addClass('messagebar-with-value');
33984 } else {
33985 $el.removeClass('messagebar-with-value');
33986 }
33987 };
33988
33989 _proto.attachmentsCreate = function attachmentsCreate(innerHTML) {
33990 if (innerHTML === void 0) {
33991 innerHTML = '';
33992 }
33993
33994 var messagebar = this;
33995 var $attachmentsEl = $("<div class=\"messagebar-attachments\">" + innerHTML + "</div>");
33996 $attachmentsEl.insertBefore(messagebar.$textareaEl);
33997 extend$1(messagebar, {
33998 $attachmentsEl: $attachmentsEl,
33999 attachmentsEl: $attachmentsEl[0]
34000 });
34001 return messagebar;
34002 };
34003
34004 _proto.attachmentsShow = function attachmentsShow(innerHTML) {
34005 if (innerHTML === void 0) {
34006 innerHTML = '';
34007 }
34008
34009 var messagebar = this;
34010 messagebar.$attachmentsEl = messagebar.$el.find('.messagebar-attachments');
34011
34012 if (messagebar.$attachmentsEl.length === 0) {
34013 messagebar.attachmentsCreate(innerHTML);
34014 }
34015
34016 messagebar.$el.addClass('messagebar-attachments-visible');
34017 messagebar.attachmentsVisible = true;
34018
34019 if (messagebar.params.resizePage) {
34020 messagebar.resizePage();
34021 }
34022
34023 return messagebar;
34024 };
34025
34026 _proto.attachmentsHide = function attachmentsHide() {
34027 var messagebar = this;
34028 messagebar.$el.removeClass('messagebar-attachments-visible');
34029 messagebar.attachmentsVisible = false;
34030
34031 if (messagebar.params.resizePage) {
34032 messagebar.resizePage();
34033 }
34034
34035 return messagebar;
34036 };
34037
34038 _proto.attachmentsToggle = function attachmentsToggle() {
34039 var messagebar = this;
34040
34041 if (messagebar.attachmentsVisible) {
34042 messagebar.attachmentsHide();
34043 } else {
34044 messagebar.attachmentsShow();
34045 }
34046
34047 return messagebar;
34048 };
34049
34050 _proto.renderAttachment = function renderAttachment(attachment) {
34051 var messagebar = this;
34052
34053 if (messagebar.params.renderAttachment) {
34054 return messagebar.params.renderAttachment.call(messagebar, attachment);
34055 }
34056
34057 return "\n <div class=\"messagebar-attachment\">\n <img src=\"" + attachment + "\">\n <span class=\"messagebar-attachment-delete\"></span>\n </div>\n ";
34058 };
34059
34060 _proto.renderAttachments = function renderAttachments() {
34061 var messagebar = this;
34062 var html;
34063
34064 if (messagebar.params.renderAttachments) {
34065 html = messagebar.params.renderAttachments.call(messagebar, messagebar.attachments);
34066 } else {
34067 html = "" + messagebar.attachments.map(function (attachment) {
34068 return messagebar.renderAttachment(attachment);
34069 }).join('');
34070 }
34071
34072 if (messagebar.$attachmentsEl.length === 0) {
34073 messagebar.attachmentsCreate(html);
34074 } else {
34075 messagebar.$attachmentsEl.html(html);
34076 }
34077 };
34078
34079 _proto.sheetCreate = function sheetCreate(innerHTML) {
34080 if (innerHTML === void 0) {
34081 innerHTML = '';
34082 }
34083
34084 var messagebar = this;
34085 var $sheetEl = $("<div class=\"messagebar-sheet\">" + innerHTML + "</div>");
34086 messagebar.$el.append($sheetEl);
34087 extend$1(messagebar, {
34088 $sheetEl: $sheetEl,
34089 sheetEl: $sheetEl[0]
34090 });
34091 return messagebar;
34092 };
34093
34094 _proto.sheetShow = function sheetShow(innerHTML) {
34095 if (innerHTML === void 0) {
34096 innerHTML = '';
34097 }
34098
34099 var messagebar = this;
34100 messagebar.$sheetEl = messagebar.$el.find('.messagebar-sheet');
34101
34102 if (messagebar.$sheetEl.length === 0) {
34103 messagebar.sheetCreate(innerHTML);
34104 }
34105
34106 messagebar.$el.addClass('messagebar-sheet-visible');
34107 messagebar.sheetVisible = true;
34108
34109 if (messagebar.params.resizePage) {
34110 messagebar.resizePage();
34111 }
34112
34113 return messagebar;
34114 };
34115
34116 _proto.sheetHide = function sheetHide() {
34117 var messagebar = this;
34118 messagebar.$el.removeClass('messagebar-sheet-visible');
34119 messagebar.sheetVisible = false;
34120
34121 if (messagebar.params.resizePage) {
34122 messagebar.resizePage();
34123 }
34124
34125 return messagebar;
34126 };
34127
34128 _proto.sheetToggle = function sheetToggle() {
34129 var messagebar = this;
34130
34131 if (messagebar.sheetVisible) {
34132 messagebar.sheetHide();
34133 } else {
34134 messagebar.sheetShow();
34135 }
34136
34137 return messagebar;
34138 };
34139
34140 _proto.init = function init() {
34141 var messagebar = this;
34142 messagebar.attachEvents();
34143 messagebar.checkEmptyState();
34144 return messagebar;
34145 };
34146
34147 _proto.destroy = function destroy() {
34148 var messagebar = this;
34149 messagebar.emit('local::beforeDestroy messagebarBeforeDestroy', messagebar);
34150 messagebar.$el.trigger('messagebar:beforedestroy');
34151 messagebar.detachEvents();
34152
34153 if (messagebar.$el[0]) {
34154 messagebar.$el[0].f7Messagebar = null;
34155 delete messagebar.$el[0].f7Messagebar;
34156 }
34157
34158 deleteProps$1(messagebar);
34159 };
34160
34161 return Messagebar;
34162 }(Framework7Class);
34163
34164 var Messagebar = {
34165 name: 'messagebar',
34166 static: {
34167 Messagebar: Messagebar$1
34168 },
34169 create: function create() {
34170 var app = this;
34171 app.messagebar = ConstructorMethods({
34172 defaultSelector: '.messagebar',
34173 constructor: Messagebar$1,
34174 app: app,
34175 domProp: 'f7Messagebar',
34176 addMethods: 'clear getValue setValue setPlaceholder resizePage focus blur attachmentsCreate attachmentsShow attachmentsHide attachmentsToggle renderAttachments sheetCreate sheetShow sheetHide sheetToggle'.split(' ')
34177 });
34178 },
34179 on: {
34180 tabBeforeRemove: function tabBeforeRemove(tabEl) {
34181 var app = this;
34182 $(tabEl).find('.messagebar-init').each(function (messagebarEl) {
34183 app.messagebar.destroy(messagebarEl);
34184 });
34185 },
34186 tabMounted: function tabMounted(tabEl) {
34187 var app = this;
34188 $(tabEl).find('.messagebar-init').each(function (messagebarEl) {
34189 app.messagebar.create(extend$1({
34190 el: messagebarEl
34191 }, $(messagebarEl).dataset()));
34192 });
34193 },
34194 pageBeforeRemove: function pageBeforeRemove(page) {
34195 var app = this;
34196 page.$el.find('.messagebar-init').each(function (messagebarEl) {
34197 app.messagebar.destroy(messagebarEl);
34198 });
34199 },
34200 pageInit: function pageInit(page) {
34201 var app = this;
34202 page.$el.find('.messagebar-init').each(function (messagebarEl) {
34203 app.messagebar.create(extend$1({
34204 el: messagebarEl
34205 }, $(messagebarEl).dataset()));
34206 });
34207 }
34208 },
34209 vnode: {
34210 'messagebar-init': {
34211 insert: function insert(vnode) {
34212 var app = this;
34213 var messagebarEl = vnode.elm;
34214 app.messagebar.create(extend$1({
34215 el: messagebarEl
34216 }, $(messagebarEl).dataset()));
34217 },
34218 destroy: function destroy(vnode) {
34219 var app = this;
34220 var messagebarEl = vnode.elm;
34221 app.messagebar.destroy(messagebarEl);
34222 }
34223 }
34224 }
34225 };
34226
34227 var Methods = {
34228 addClass: addClass,
34229 removeClass: removeClass,
34230 hasClass: hasClass,
34231 toggleClass: toggleClass,
34232 attr: attr,
34233 removeAttr: removeAttr,
34234 transform: transform,
34235 transition: transition$1,
34236 on: on,
34237 off: off,
34238 trigger: trigger,
34239 transitionEnd: transitionEnd$1,
34240 outerWidth: outerWidth,
34241 outerHeight: outerHeight,
34242 styles: styles,
34243 offset: offset,
34244 css: css,
34245 each: each,
34246 html: html,
34247 text: text,
34248 is: is,
34249 index: index,
34250 eq: eq,
34251 append: append,
34252 prepend: prepend,
34253 next: next,
34254 nextAll: nextAll,
34255 prev: prev,
34256 prevAll: prevAll,
34257 parent: parent,
34258 parents: parents,
34259 closest: closest,
34260 find: find,
34261 children: children,
34262 filter: filter,
34263 remove: remove
34264 };
34265 Object.keys(Methods).forEach(function (methodName) {
34266 Object.defineProperty($$1.fn, methodName, {
34267 value: Methods[methodName],
34268 writable: true
34269 });
34270 });
34271
34272 function deleteProps(obj) {
34273 var object = obj;
34274 Object.keys(object).forEach(function (key) {
34275 try {
34276 object[key] = null;
34277 } catch (e) {// no getter for object
34278 }
34279
34280 try {
34281 delete object[key];
34282 } catch (e) {// something got wrong
34283 }
34284 });
34285 }
34286
34287 function nextTick(callback, delay) {
34288 if (delay === void 0) {
34289 delay = 0;
34290 }
34291
34292 return setTimeout(callback, delay);
34293 }
34294
34295 function now() {
34296 return Date.now();
34297 }
34298
34299 function getComputedStyle$1(el) {
34300 var window = getWindow();
34301 var style;
34302
34303 if (window.getComputedStyle) {
34304 style = window.getComputedStyle(el, null);
34305 }
34306
34307 if (!style && el.currentStyle) {
34308 style = el.currentStyle;
34309 }
34310
34311 if (!style) {
34312 style = el.style;
34313 }
34314
34315 return style;
34316 }
34317
34318 function getTranslate(el, axis) {
34319 if (axis === void 0) {
34320 axis = 'x';
34321 }
34322
34323 var window = getWindow();
34324 var matrix;
34325 var curTransform;
34326 var transformMatrix;
34327 var curStyle = getComputedStyle$1(el, null);
34328
34329 if (window.WebKitCSSMatrix) {
34330 curTransform = curStyle.transform || curStyle.webkitTransform;
34331
34332 if (curTransform.split(',').length > 6) {
34333 curTransform = curTransform.split(', ').map(function (a) {
34334 return a.replace(',', '.');
34335 }).join(', ');
34336 } // Some old versions of Webkit choke when 'none' is passed; pass
34337 // empty string instead in this case
34338
34339
34340 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
34341 } else {
34342 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
34343 matrix = transformMatrix.toString().split(',');
34344 }
34345
34346 if (axis === 'x') {
34347 // Latest Chrome and webkits Fix
34348 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix
34349 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers
34350 else curTransform = parseFloat(matrix[4]);
34351 }
34352
34353 if (axis === 'y') {
34354 // Latest Chrome and webkits Fix
34355 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix
34356 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers
34357 else curTransform = parseFloat(matrix[5]);
34358 }
34359
34360 return curTransform || 0;
34361 }
34362
34363 function isObject(o) {
34364 return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
34365 }
34366
34367 function extend() {
34368 var to = Object(arguments.length <= 0 ? undefined : arguments[0]);
34369 var noExtend = ['__proto__', 'constructor', 'prototype'];
34370
34371 for (var i = 1; i < arguments.length; i += 1) {
34372 var nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
34373
34374 if (nextSource !== undefined && nextSource !== null) {
34375 var keysArray = Object.keys(Object(nextSource)).filter(function (key) {
34376 return noExtend.indexOf(key) < 0;
34377 });
34378
34379 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
34380 var nextKey = keysArray[nextIndex];
34381 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
34382
34383 if (desc !== undefined && desc.enumerable) {
34384 if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
34385 if (nextSource[nextKey].__swiper__) {
34386 to[nextKey] = nextSource[nextKey];
34387 } else {
34388 extend(to[nextKey], nextSource[nextKey]);
34389 }
34390 } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
34391 to[nextKey] = {};
34392
34393 if (nextSource[nextKey].__swiper__) {
34394 to[nextKey] = nextSource[nextKey];
34395 } else {
34396 extend(to[nextKey], nextSource[nextKey]);
34397 }
34398 } else {
34399 to[nextKey] = nextSource[nextKey];
34400 }
34401 }
34402 }
34403 }
34404 }
34405
34406 return to;
34407 }
34408
34409 function bindModuleMethods(instance, obj) {
34410 Object.keys(obj).forEach(function (key) {
34411 if (isObject(obj[key])) {
34412 Object.keys(obj[key]).forEach(function (subKey) {
34413 if (typeof obj[key][subKey] === 'function') {
34414 obj[key][subKey] = obj[key][subKey].bind(instance);
34415 }
34416 });
34417 }
34418
34419 instance[key] = obj[key];
34420 });
34421 }
34422
34423 function classesToSelector(classes) {
34424 if (classes === void 0) {
34425 classes = '';
34426 }
34427
34428 return "." + classes.trim().replace(/([\.:\/])/g, '\\$1') // eslint-disable-line
34429 .replace(/ /g, '.');
34430 }
34431
34432 var support;
34433
34434 function calcSupport() {
34435 var window = getWindow();
34436 var document = getDocument();
34437 return {
34438 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),
34439 pointerEvents: !!window.PointerEvent && 'maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints >= 0,
34440 observer: function checkObserver() {
34441 return 'MutationObserver' in window || 'WebkitMutationObserver' in window;
34442 }(),
34443 passiveListener: function checkPassiveListener() {
34444 var supportsPassive = false;
34445
34446 try {
34447 var opts = Object.defineProperty({}, 'passive', {
34448 // eslint-disable-next-line
34449 get: function get() {
34450 supportsPassive = true;
34451 }
34452 });
34453 window.addEventListener('testPassiveListener', null, opts);
34454 } catch (e) {// No support
34455 }
34456
34457 return supportsPassive;
34458 }(),
34459 gestures: function checkGestures() {
34460 return 'ongesturestart' in window;
34461 }()
34462 };
34463 }
34464
34465 function getSupport() {
34466 if (!support) {
34467 support = calcSupport();
34468 }
34469
34470 return support;
34471 }
34472
34473 var device;
34474
34475 function calcDevice(_temp) {
34476 var _ref = _temp === void 0 ? {} : _temp,
34477 userAgent = _ref.userAgent;
34478
34479 var support = getSupport();
34480 var window = getWindow();
34481 var platform = window.navigator.platform;
34482 var ua = userAgent || window.navigator.userAgent;
34483 var device = {
34484 ios: false,
34485 android: false
34486 };
34487 var screenWidth = window.screen.width;
34488 var screenHeight = window.screen.height;
34489 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
34490
34491 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
34492 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
34493 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
34494 var windows = platform === 'Win32';
34495 var macos = platform === 'MacIntel'; // iPadOs 13 fix
34496
34497 var iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
34498
34499 if (!ipad && macos && support.touch && iPadScreens.indexOf(screenWidth + "x" + screenHeight) >= 0) {
34500 ipad = ua.match(/(Version)\/([\d.]+)/);
34501 if (!ipad) ipad = [0, 1, '13_0_0'];
34502 macos = false;
34503 } // Android
34504
34505
34506 if (android && !windows) {
34507 device.os = 'android';
34508 device.android = true;
34509 }
34510
34511 if (ipad || iphone || ipod) {
34512 device.os = 'ios';
34513 device.ios = true;
34514 } // Export object
34515
34516
34517 return device;
34518 }
34519
34520 function getDevice(overrides) {
34521 if (overrides === void 0) {
34522 overrides = {};
34523 }
34524
34525 if (!device) {
34526 device = calcDevice(overrides);
34527 }
34528
34529 return device;
34530 }
34531
34532 var browser;
34533
34534 function calcBrowser() {
34535 var window = getWindow();
34536
34537 function isSafari() {
34538 var ua = window.navigator.userAgent.toLowerCase();
34539 return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
34540 }
34541
34542 return {
34543 isEdge: !!window.navigator.userAgent.match(/Edge/g),
34544 isSafari: isSafari(),
34545 isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)
34546 };
34547 }
34548
34549 function getBrowser() {
34550 if (!browser) {
34551 browser = calcBrowser();
34552 }
34553
34554 return browser;
34555 }
34556
34557 var supportsResizeObserver = function supportsResizeObserver() {
34558 var window = getWindow();
34559 return typeof window.ResizeObserver !== 'undefined';
34560 };
34561
34562 var Resize = {
34563 name: 'resize',
34564 create: function create() {
34565 var swiper = this;
34566 extend(swiper, {
34567 resize: {
34568 observer: null,
34569 createObserver: function createObserver() {
34570 if (!swiper || swiper.destroyed || !swiper.initialized) return;
34571 swiper.resize.observer = new ResizeObserver(function (entries) {
34572 var width = swiper.width,
34573 height = swiper.height;
34574 var newWidth = width;
34575 var newHeight = height;
34576 entries.forEach(function (_ref) {
34577 var contentBoxSize = _ref.contentBoxSize,
34578 contentRect = _ref.contentRect,
34579 target = _ref.target;
34580 if (target && target !== swiper.el) return;
34581 newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
34582 newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
34583 });
34584
34585 if (newWidth !== width || newHeight !== height) {
34586 swiper.resize.resizeHandler();
34587 }
34588 });
34589 swiper.resize.observer.observe(swiper.el);
34590 },
34591 removeObserver: function removeObserver() {
34592 if (swiper.resize.observer && swiper.resize.observer.unobserve && swiper.el) {
34593 swiper.resize.observer.unobserve(swiper.el);
34594 swiper.resize.observer = null;
34595 }
34596 },
34597 resizeHandler: function resizeHandler() {
34598 if (!swiper || swiper.destroyed || !swiper.initialized) return;
34599 swiper.emit('beforeResize');
34600 swiper.emit('resize');
34601 },
34602 orientationChangeHandler: function orientationChangeHandler() {
34603 if (!swiper || swiper.destroyed || !swiper.initialized) return;
34604 swiper.emit('orientationchange');
34605 }
34606 }
34607 });
34608 },
34609 on: {
34610 init: function init(swiper) {
34611 var window = getWindow();
34612
34613 if (swiper.params.resizeObserver && supportsResizeObserver()) {
34614 swiper.resize.createObserver();
34615 return;
34616 } // Emit resize
34617
34618
34619 window.addEventListener('resize', swiper.resize.resizeHandler); // Emit orientationchange
34620
34621 window.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
34622 },
34623 destroy: function destroy(swiper) {
34624 var window = getWindow();
34625 swiper.resize.removeObserver();
34626 window.removeEventListener('resize', swiper.resize.resizeHandler);
34627 window.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
34628 }
34629 }
34630 };
34631
34632 function _extends$i() {
34633 _extends$i = Object.assign || function (target) {
34634 for (var i = 1; i < arguments.length; i++) {
34635 var source = arguments[i];
34636
34637 for (var key in source) {
34638 if (Object.prototype.hasOwnProperty.call(source, key)) {
34639 target[key] = source[key];
34640 }
34641 }
34642 }
34643
34644 return target;
34645 };
34646
34647 return _extends$i.apply(this, arguments);
34648 }
34649 var Observer = {
34650 attach: function attach(target, options) {
34651 if (options === void 0) {
34652 options = {};
34653 }
34654
34655 var window = getWindow();
34656 var swiper = this;
34657 var ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
34658 var observer = new ObserverFunc(function (mutations) {
34659 // The observerUpdate event should only be triggered
34660 // once despite the number of mutations. Additional
34661 // triggers are redundant and are very costly
34662 if (mutations.length === 1) {
34663 swiper.emit('observerUpdate', mutations[0]);
34664 return;
34665 }
34666
34667 var observerUpdate = function observerUpdate() {
34668 swiper.emit('observerUpdate', mutations[0]);
34669 };
34670
34671 if (window.requestAnimationFrame) {
34672 window.requestAnimationFrame(observerUpdate);
34673 } else {
34674 window.setTimeout(observerUpdate, 0);
34675 }
34676 });
34677 observer.observe(target, {
34678 attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
34679 childList: typeof options.childList === 'undefined' ? true : options.childList,
34680 characterData: typeof options.characterData === 'undefined' ? true : options.characterData
34681 });
34682 swiper.observer.observers.push(observer);
34683 },
34684 init: function init() {
34685 var swiper = this;
34686 if (!swiper.support.observer || !swiper.params.observer) return;
34687
34688 if (swiper.params.observeParents) {
34689 var containerParents = swiper.$el.parents();
34690
34691 for (var i = 0; i < containerParents.length; i += 1) {
34692 swiper.observer.attach(containerParents[i]);
34693 }
34694 } // Observe container
34695
34696
34697 swiper.observer.attach(swiper.$el[0], {
34698 childList: swiper.params.observeSlideChildren
34699 }); // Observe wrapper
34700
34701 swiper.observer.attach(swiper.$wrapperEl[0], {
34702 attributes: false
34703 });
34704 },
34705 destroy: function destroy() {
34706 var swiper = this;
34707 swiper.observer.observers.forEach(function (observer) {
34708 observer.disconnect();
34709 });
34710 swiper.observer.observers = [];
34711 }
34712 };
34713 var Observer$1 = {
34714 name: 'observer',
34715 params: {
34716 observer: false,
34717 observeParents: false,
34718 observeSlideChildren: false
34719 },
34720 create: function create() {
34721 var swiper = this;
34722 bindModuleMethods(swiper, {
34723 observer: _extends$i({}, Observer, {
34724 observers: []
34725 })
34726 });
34727 },
34728 on: {
34729 init: function init(swiper) {
34730 swiper.observer.init();
34731 },
34732 destroy: function destroy(swiper) {
34733 swiper.observer.destroy();
34734 }
34735 }
34736 };
34737
34738 var modular = {
34739 useParams: function useParams(instanceParams) {
34740 var instance = this;
34741 if (!instance.modules) return;
34742 Object.keys(instance.modules).forEach(function (moduleName) {
34743 var module = instance.modules[moduleName]; // Extend params
34744
34745 if (module.params) {
34746 extend(instanceParams, module.params);
34747 }
34748 });
34749 },
34750 useModules: function useModules(modulesParams) {
34751 if (modulesParams === void 0) {
34752 modulesParams = {};
34753 }
34754
34755 var instance = this;
34756 if (!instance.modules) return;
34757 Object.keys(instance.modules).forEach(function (moduleName) {
34758 var module = instance.modules[moduleName];
34759 var moduleParams = modulesParams[moduleName] || {}; // Add event listeners
34760
34761 if (module.on && instance.on) {
34762 Object.keys(module.on).forEach(function (moduleEventName) {
34763 instance.on(moduleEventName, module.on[moduleEventName]);
34764 });
34765 } // Module create callback
34766
34767
34768 if (module.create) {
34769 module.create.bind(instance)(moduleParams);
34770 }
34771 });
34772 }
34773 };
34774
34775 /* eslint-disable no-underscore-dangle */
34776 var eventsEmitter = {
34777 on: function on(events, handler, priority) {
34778 var self = this;
34779 if (typeof handler !== 'function') return self;
34780 var method = priority ? 'unshift' : 'push';
34781 events.split(' ').forEach(function (event) {
34782 if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
34783 self.eventsListeners[event][method](handler);
34784 });
34785 return self;
34786 },
34787 once: function once(events, handler, priority) {
34788 var self = this;
34789 if (typeof handler !== 'function') return self;
34790
34791 function onceHandler() {
34792 self.off(events, onceHandler);
34793
34794 if (onceHandler.__emitterProxy) {
34795 delete onceHandler.__emitterProxy;
34796 }
34797
34798 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
34799 args[_key] = arguments[_key];
34800 }
34801
34802 handler.apply(self, args);
34803 }
34804
34805 onceHandler.__emitterProxy = handler;
34806 return self.on(events, onceHandler, priority);
34807 },
34808 onAny: function onAny(handler, priority) {
34809 var self = this;
34810 if (typeof handler !== 'function') return self;
34811 var method = priority ? 'unshift' : 'push';
34812
34813 if (self.eventsAnyListeners.indexOf(handler) < 0) {
34814 self.eventsAnyListeners[method](handler);
34815 }
34816
34817 return self;
34818 },
34819 offAny: function offAny(handler) {
34820 var self = this;
34821 if (!self.eventsAnyListeners) return self;
34822 var index = self.eventsAnyListeners.indexOf(handler);
34823
34824 if (index >= 0) {
34825 self.eventsAnyListeners.splice(index, 1);
34826 }
34827
34828 return self;
34829 },
34830 off: function off(events, handler) {
34831 var self = this;
34832 if (!self.eventsListeners) return self;
34833 events.split(' ').forEach(function (event) {
34834 if (typeof handler === 'undefined') {
34835 self.eventsListeners[event] = [];
34836 } else if (self.eventsListeners[event]) {
34837 self.eventsListeners[event].forEach(function (eventHandler, index) {
34838 if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
34839 self.eventsListeners[event].splice(index, 1);
34840 }
34841 });
34842 }
34843 });
34844 return self;
34845 },
34846 emit: function emit() {
34847 var self = this;
34848 if (!self.eventsListeners) return self;
34849 var events;
34850 var data;
34851 var context;
34852
34853 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
34854 args[_key2] = arguments[_key2];
34855 }
34856
34857 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
34858 events = args[0];
34859 data = args.slice(1, args.length);
34860 context = self;
34861 } else {
34862 events = args[0].events;
34863 data = args[0].data;
34864 context = args[0].context || self;
34865 }
34866
34867 data.unshift(context);
34868 var eventsArray = Array.isArray(events) ? events : events.split(' ');
34869 eventsArray.forEach(function (event) {
34870 if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
34871 self.eventsAnyListeners.forEach(function (eventHandler) {
34872 eventHandler.apply(context, [event].concat(data));
34873 });
34874 }
34875
34876 if (self.eventsListeners && self.eventsListeners[event]) {
34877 self.eventsListeners[event].forEach(function (eventHandler) {
34878 eventHandler.apply(context, data);
34879 });
34880 }
34881 });
34882 return self;
34883 }
34884 };
34885
34886 function updateSize() {
34887 var swiper = this;
34888 var width;
34889 var height;
34890 var $el = swiper.$el;
34891
34892 if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
34893 width = swiper.params.width;
34894 } else {
34895 width = $el[0].clientWidth;
34896 }
34897
34898 if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
34899 height = swiper.params.height;
34900 } else {
34901 height = $el[0].clientHeight;
34902 }
34903
34904 if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
34905 return;
34906 } // Subtract paddings
34907
34908
34909 width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10);
34910 height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10);
34911 if (Number.isNaN(width)) width = 0;
34912 if (Number.isNaN(height)) height = 0;
34913 extend(swiper, {
34914 width: width,
34915 height: height,
34916 size: swiper.isHorizontal() ? width : height
34917 });
34918 }
34919
34920 function updateSlides() {
34921 var swiper = this;
34922
34923 function getDirectionLabel(property) {
34924 if (swiper.isHorizontal()) {
34925 return property;
34926 } // prettier-ignore
34927
34928
34929 return {
34930 'width': 'height',
34931 'margin-top': 'margin-left',
34932 'margin-bottom ': 'margin-right',
34933 'margin-left': 'margin-top',
34934 'margin-right': 'margin-bottom',
34935 'padding-left': 'padding-top',
34936 'padding-right': 'padding-bottom',
34937 'marginRight': 'marginBottom'
34938 }[property];
34939 }
34940
34941 function getDirectionPropertyValue(node, label) {
34942 return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);
34943 }
34944
34945 var params = swiper.params;
34946 var $wrapperEl = swiper.$wrapperEl,
34947 swiperSize = swiper.size,
34948 rtl = swiper.rtlTranslate,
34949 wrongRTL = swiper.wrongRTL;
34950 var isVirtual = swiper.virtual && params.virtual.enabled;
34951 var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
34952 var slides = $wrapperEl.children("." + swiper.params.slideClass);
34953 var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
34954 var snapGrid = [];
34955 var slidesGrid = [];
34956 var slidesSizesGrid = [];
34957 var offsetBefore = params.slidesOffsetBefore;
34958
34959 if (typeof offsetBefore === 'function') {
34960 offsetBefore = params.slidesOffsetBefore.call(swiper);
34961 }
34962
34963 var offsetAfter = params.slidesOffsetAfter;
34964
34965 if (typeof offsetAfter === 'function') {
34966 offsetAfter = params.slidesOffsetAfter.call(swiper);
34967 }
34968
34969 var previousSnapGridLength = swiper.snapGrid.length;
34970 var previousSlidesGridLength = swiper.slidesGrid.length;
34971 var spaceBetween = params.spaceBetween;
34972 var slidePosition = -offsetBefore;
34973 var prevSlideSize = 0;
34974 var index = 0;
34975
34976 if (typeof swiperSize === 'undefined') {
34977 return;
34978 }
34979
34980 if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
34981 spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
34982 }
34983
34984 swiper.virtualSize = -spaceBetween; // reset margins
34985
34986 if (rtl) slides.css({
34987 marginLeft: '',
34988 marginTop: ''
34989 });else slides.css({
34990 marginRight: '',
34991 marginBottom: ''
34992 });
34993 var slidesNumberEvenToRows;
34994
34995 if (params.slidesPerColumn > 1) {
34996 if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
34997 slidesNumberEvenToRows = slidesLength;
34998 } else {
34999 slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
35000 }
35001
35002 if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
35003 slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
35004 }
35005 } // Calc slides
35006
35007
35008 var slideSize;
35009 var slidesPerColumn = params.slidesPerColumn;
35010 var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
35011 var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
35012
35013 for (var i = 0; i < slidesLength; i += 1) {
35014 slideSize = 0;
35015 var slide = slides.eq(i);
35016
35017 if (params.slidesPerColumn > 1) {
35018 // Set slides order
35019 var newSlideOrderIndex = void 0;
35020 var column = void 0;
35021 var row = void 0;
35022
35023 if (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1) {
35024 var groupIndex = Math.floor(i / (params.slidesPerGroup * params.slidesPerColumn));
35025 var slideIndexInGroup = i - params.slidesPerColumn * params.slidesPerGroup * groupIndex;
35026 var columnsInGroup = groupIndex === 0 ? params.slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * slidesPerColumn * params.slidesPerGroup) / slidesPerColumn), params.slidesPerGroup);
35027 row = Math.floor(slideIndexInGroup / columnsInGroup);
35028 column = slideIndexInGroup - row * columnsInGroup + groupIndex * params.slidesPerGroup;
35029 newSlideOrderIndex = column + row * slidesNumberEvenToRows / slidesPerColumn;
35030 slide.css({
35031 '-webkit-box-ordinal-group': newSlideOrderIndex,
35032 '-moz-box-ordinal-group': newSlideOrderIndex,
35033 '-ms-flex-order': newSlideOrderIndex,
35034 '-webkit-order': newSlideOrderIndex,
35035 order: newSlideOrderIndex
35036 });
35037 } else if (params.slidesPerColumnFill === 'column') {
35038 column = Math.floor(i / slidesPerColumn);
35039 row = i - column * slidesPerColumn;
35040
35041 if (column > numFullColumns || column === numFullColumns && row === slidesPerColumn - 1) {
35042 row += 1;
35043
35044 if (row >= slidesPerColumn) {
35045 row = 0;
35046 column += 1;
35047 }
35048 }
35049 } else {
35050 row = Math.floor(i / slidesPerRow);
35051 column = i - row * slidesPerRow;
35052 }
35053
35054 slide.css(getDirectionLabel('margin-top'), row !== 0 && params.spaceBetween && params.spaceBetween + "px");
35055 }
35056
35057 if (slide.css('display') === 'none') continue; // eslint-disable-line
35058
35059 if (params.slidesPerView === 'auto') {
35060 var slideStyles = getComputedStyle(slide[0]);
35061 var currentTransform = slide[0].style.transform;
35062 var currentWebKitTransform = slide[0].style.webkitTransform;
35063
35064 if (currentTransform) {
35065 slide[0].style.transform = 'none';
35066 }
35067
35068 if (currentWebKitTransform) {
35069 slide[0].style.webkitTransform = 'none';
35070 }
35071
35072 if (params.roundLengths) {
35073 slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);
35074 } else {
35075 // eslint-disable-next-line
35076 var width = getDirectionPropertyValue(slideStyles, 'width');
35077 var paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
35078 var paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
35079 var marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
35080 var marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
35081 var boxSizing = slideStyles.getPropertyValue('box-sizing');
35082
35083 if (boxSizing && boxSizing === 'border-box') {
35084 slideSize = width + marginLeft + marginRight;
35085 } else {
35086 var _slide$ = slide[0],
35087 clientWidth = _slide$.clientWidth,
35088 offsetWidth = _slide$.offsetWidth;
35089 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
35090 }
35091 }
35092
35093 if (currentTransform) {
35094 slide[0].style.transform = currentTransform;
35095 }
35096
35097 if (currentWebKitTransform) {
35098 slide[0].style.webkitTransform = currentWebKitTransform;
35099 }
35100
35101 if (params.roundLengths) slideSize = Math.floor(slideSize);
35102 } else {
35103 slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
35104 if (params.roundLengths) slideSize = Math.floor(slideSize);
35105
35106 if (slides[i]) {
35107 slides[i].style[getDirectionLabel('width')] = slideSize + "px";
35108 }
35109 }
35110
35111 if (slides[i]) {
35112 slides[i].swiperSlideSize = slideSize;
35113 }
35114
35115 slidesSizesGrid.push(slideSize);
35116
35117 if (params.centeredSlides) {
35118 slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
35119 if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
35120 if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
35121 if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
35122 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
35123 if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
35124 slidesGrid.push(slidePosition);
35125 } else {
35126 if (params.roundLengths) slidePosition = Math.floor(slidePosition);
35127 if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
35128 slidesGrid.push(slidePosition);
35129 slidePosition = slidePosition + slideSize + spaceBetween;
35130 }
35131
35132 swiper.virtualSize += slideSize + spaceBetween;
35133 prevSlideSize = slideSize;
35134 index += 1;
35135 }
35136
35137 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
35138 var newSlidesGrid;
35139
35140 if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
35141 $wrapperEl.css({
35142 width: swiper.virtualSize + params.spaceBetween + "px"
35143 });
35144 }
35145
35146 if (params.setWrapperSize) {
35147 var _$wrapperEl$css;
35148
35149 $wrapperEl.css((_$wrapperEl$css = {}, _$wrapperEl$css[getDirectionLabel('width')] = swiper.virtualSize + params.spaceBetween + "px", _$wrapperEl$css));
35150 }
35151
35152 if (params.slidesPerColumn > 1) {
35153 var _$wrapperEl$css2;
35154
35155 swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
35156 swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
35157 $wrapperEl.css((_$wrapperEl$css2 = {}, _$wrapperEl$css2[getDirectionLabel('width')] = swiper.virtualSize + params.spaceBetween + "px", _$wrapperEl$css2));
35158
35159 if (params.centeredSlides) {
35160 newSlidesGrid = [];
35161
35162 for (var _i = 0; _i < snapGrid.length; _i += 1) {
35163 var slidesGridItem = snapGrid[_i];
35164 if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
35165 if (snapGrid[_i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);
35166 }
35167
35168 snapGrid = newSlidesGrid;
35169 }
35170 } // Remove last grid elements depending on width
35171
35172
35173 if (!params.centeredSlides) {
35174 newSlidesGrid = [];
35175
35176 for (var _i2 = 0; _i2 < snapGrid.length; _i2 += 1) {
35177 var _slidesGridItem = snapGrid[_i2];
35178 if (params.roundLengths) _slidesGridItem = Math.floor(_slidesGridItem);
35179
35180 if (snapGrid[_i2] <= swiper.virtualSize - swiperSize) {
35181 newSlidesGrid.push(_slidesGridItem);
35182 }
35183 }
35184
35185 snapGrid = newSlidesGrid;
35186
35187 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
35188 snapGrid.push(swiper.virtualSize - swiperSize);
35189 }
35190 }
35191
35192 if (snapGrid.length === 0) snapGrid = [0];
35193
35194 if (params.spaceBetween !== 0) {
35195 var _slides$filter$css;
35196
35197 var key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');
35198 slides.filter(function (_, slideIndex) {
35199 if (!params.cssMode) return true;
35200
35201 if (slideIndex === slides.length - 1) {
35202 return false;
35203 }
35204
35205 return true;
35206 }).css((_slides$filter$css = {}, _slides$filter$css[key] = spaceBetween + "px", _slides$filter$css));
35207 }
35208
35209 if (params.centeredSlides && params.centeredSlidesBounds) {
35210 var allSlidesSize = 0;
35211 slidesSizesGrid.forEach(function (slideSizeValue) {
35212 allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
35213 });
35214 allSlidesSize -= params.spaceBetween;
35215 var maxSnap = allSlidesSize - swiperSize;
35216 snapGrid = snapGrid.map(function (snap) {
35217 if (snap < 0) return -offsetBefore;
35218 if (snap > maxSnap) return maxSnap + offsetAfter;
35219 return snap;
35220 });
35221 }
35222
35223 if (params.centerInsufficientSlides) {
35224 var _allSlidesSize = 0;
35225 slidesSizesGrid.forEach(function (slideSizeValue) {
35226 _allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
35227 });
35228 _allSlidesSize -= params.spaceBetween;
35229
35230 if (_allSlidesSize < swiperSize) {
35231 var allSlidesOffset = (swiperSize - _allSlidesSize) / 2;
35232 snapGrid.forEach(function (snap, snapIndex) {
35233 snapGrid[snapIndex] = snap - allSlidesOffset;
35234 });
35235 slidesGrid.forEach(function (snap, snapIndex) {
35236 slidesGrid[snapIndex] = snap + allSlidesOffset;
35237 });
35238 }
35239 }
35240
35241 extend(swiper, {
35242 slides: slides,
35243 snapGrid: snapGrid,
35244 slidesGrid: slidesGrid,
35245 slidesSizesGrid: slidesSizesGrid
35246 });
35247
35248 if (slidesLength !== previousSlidesLength) {
35249 swiper.emit('slidesLengthChange');
35250 }
35251
35252 if (snapGrid.length !== previousSnapGridLength) {
35253 if (swiper.params.watchOverflow) swiper.checkOverflow();
35254 swiper.emit('snapGridLengthChange');
35255 }
35256
35257 if (slidesGrid.length !== previousSlidesGridLength) {
35258 swiper.emit('slidesGridLengthChange');
35259 }
35260
35261 if (params.watchSlidesProgress || params.watchSlidesVisibility) {
35262 swiper.updateSlidesOffset();
35263 }
35264 }
35265
35266 function updateAutoHeight(speed) {
35267 var swiper = this;
35268 var activeSlides = [];
35269 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
35270 var newHeight = 0;
35271 var i;
35272
35273 if (typeof speed === 'number') {
35274 swiper.setTransition(speed);
35275 } else if (speed === true) {
35276 swiper.setTransition(swiper.params.speed);
35277 }
35278
35279 var getSlideByIndex = function getSlideByIndex(index) {
35280 if (isVirtual) {
35281 return swiper.slides.filter(function (el) {
35282 return parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index;
35283 })[0];
35284 }
35285
35286 return swiper.slides.eq(index)[0];
35287 }; // Find slides currently in view
35288
35289
35290 if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
35291 if (swiper.params.centeredSlides) {
35292 swiper.visibleSlides.each(function (slide) {
35293 activeSlides.push(slide);
35294 });
35295 } else {
35296 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
35297 var index = swiper.activeIndex + i;
35298 if (index > swiper.slides.length && !isVirtual) break;
35299 activeSlides.push(getSlideByIndex(index));
35300 }
35301 }
35302 } else {
35303 activeSlides.push(getSlideByIndex(swiper.activeIndex));
35304 } // Find new height from highest slide in view
35305
35306
35307 for (i = 0; i < activeSlides.length; i += 1) {
35308 if (typeof activeSlides[i] !== 'undefined') {
35309 var height = activeSlides[i].offsetHeight;
35310 newHeight = height > newHeight ? height : newHeight;
35311 }
35312 } // Update Height
35313
35314
35315 if (newHeight) swiper.$wrapperEl.css('height', newHeight + "px");
35316 }
35317
35318 function updateSlidesOffset() {
35319 var swiper = this;
35320 var slides = swiper.slides;
35321
35322 for (var i = 0; i < slides.length; i += 1) {
35323 slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
35324 }
35325 }
35326
35327 function updateSlidesProgress(translate) {
35328 if (translate === void 0) {
35329 translate = this && this.translate || 0;
35330 }
35331
35332 var swiper = this;
35333 var params = swiper.params;
35334 var slides = swiper.slides,
35335 rtl = swiper.rtlTranslate;
35336 if (slides.length === 0) return;
35337 if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
35338 var offsetCenter = -translate;
35339 if (rtl) offsetCenter = translate; // Visible Slides
35340
35341 slides.removeClass(params.slideVisibleClass);
35342 swiper.visibleSlidesIndexes = [];
35343 swiper.visibleSlides = [];
35344
35345 for (var i = 0; i < slides.length; i += 1) {
35346 var slide = slides[i];
35347 var slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slide.swiperSlideOffset) / (slide.swiperSlideSize + params.spaceBetween);
35348
35349 if (params.watchSlidesVisibility || params.centeredSlides && params.autoHeight) {
35350 var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
35351 var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
35352 var isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
35353
35354 if (isVisible) {
35355 swiper.visibleSlides.push(slide);
35356 swiper.visibleSlidesIndexes.push(i);
35357 slides.eq(i).addClass(params.slideVisibleClass);
35358 }
35359 }
35360
35361 slide.progress = rtl ? -slideProgress : slideProgress;
35362 }
35363
35364 swiper.visibleSlides = $$1(swiper.visibleSlides);
35365 }
35366
35367 function updateProgress(translate) {
35368 var swiper = this;
35369
35370 if (typeof translate === 'undefined') {
35371 var multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line
35372
35373 translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
35374 }
35375
35376 var params = swiper.params;
35377 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
35378 var progress = swiper.progress,
35379 isBeginning = swiper.isBeginning,
35380 isEnd = swiper.isEnd;
35381 var wasBeginning = isBeginning;
35382 var wasEnd = isEnd;
35383
35384 if (translatesDiff === 0) {
35385 progress = 0;
35386 isBeginning = true;
35387 isEnd = true;
35388 } else {
35389 progress = (translate - swiper.minTranslate()) / translatesDiff;
35390 isBeginning = progress <= 0;
35391 isEnd = progress >= 1;
35392 }
35393
35394 extend(swiper, {
35395 progress: progress,
35396 isBeginning: isBeginning,
35397 isEnd: isEnd
35398 });
35399 if (params.watchSlidesProgress || params.watchSlidesVisibility || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
35400
35401 if (isBeginning && !wasBeginning) {
35402 swiper.emit('reachBeginning toEdge');
35403 }
35404
35405 if (isEnd && !wasEnd) {
35406 swiper.emit('reachEnd toEdge');
35407 }
35408
35409 if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
35410 swiper.emit('fromEdge');
35411 }
35412
35413 swiper.emit('progress', progress);
35414 }
35415
35416 function updateSlidesClasses() {
35417 var swiper = this;
35418 var slides = swiper.slides,
35419 params = swiper.params,
35420 $wrapperEl = swiper.$wrapperEl,
35421 activeIndex = swiper.activeIndex,
35422 realIndex = swiper.realIndex;
35423 var isVirtual = swiper.virtual && params.virtual.enabled;
35424 slides.removeClass(params.slideActiveClass + " " + params.slideNextClass + " " + params.slidePrevClass + " " + params.slideDuplicateActiveClass + " " + params.slideDuplicateNextClass + " " + params.slideDuplicatePrevClass);
35425 var activeSlide;
35426
35427 if (isVirtual) {
35428 activeSlide = swiper.$wrapperEl.find("." + params.slideClass + "[data-swiper-slide-index=\"" + activeIndex + "\"]");
35429 } else {
35430 activeSlide = slides.eq(activeIndex);
35431 } // Active classes
35432
35433
35434 activeSlide.addClass(params.slideActiveClass);
35435
35436 if (params.loop) {
35437 // Duplicate to all looped slides
35438 if (activeSlide.hasClass(params.slideDuplicateClass)) {
35439 $wrapperEl.children("." + params.slideClass + ":not(." + params.slideDuplicateClass + ")[data-swiper-slide-index=\"" + realIndex + "\"]").addClass(params.slideDuplicateActiveClass);
35440 } else {
35441 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + "[data-swiper-slide-index=\"" + realIndex + "\"]").addClass(params.slideDuplicateActiveClass);
35442 }
35443 } // Next Slide
35444
35445
35446 var nextSlide = activeSlide.nextAll("." + params.slideClass).eq(0).addClass(params.slideNextClass);
35447
35448 if (params.loop && nextSlide.length === 0) {
35449 nextSlide = slides.eq(0);
35450 nextSlide.addClass(params.slideNextClass);
35451 } // Prev Slide
35452
35453
35454 var prevSlide = activeSlide.prevAll("." + params.slideClass).eq(0).addClass(params.slidePrevClass);
35455
35456 if (params.loop && prevSlide.length === 0) {
35457 prevSlide = slides.eq(-1);
35458 prevSlide.addClass(params.slidePrevClass);
35459 }
35460
35461 if (params.loop) {
35462 // Duplicate to all looped slides
35463 if (nextSlide.hasClass(params.slideDuplicateClass)) {
35464 $wrapperEl.children("." + params.slideClass + ":not(." + params.slideDuplicateClass + ")[data-swiper-slide-index=\"" + nextSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicateNextClass);
35465 } else {
35466 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + "[data-swiper-slide-index=\"" + nextSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicateNextClass);
35467 }
35468
35469 if (prevSlide.hasClass(params.slideDuplicateClass)) {
35470 $wrapperEl.children("." + params.slideClass + ":not(." + params.slideDuplicateClass + ")[data-swiper-slide-index=\"" + prevSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicatePrevClass);
35471 } else {
35472 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + "[data-swiper-slide-index=\"" + prevSlide.attr('data-swiper-slide-index') + "\"]").addClass(params.slideDuplicatePrevClass);
35473 }
35474 }
35475
35476 swiper.emitSlidesClasses();
35477 }
35478
35479 function updateActiveIndex(newActiveIndex) {
35480 var swiper = this;
35481 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
35482 var slidesGrid = swiper.slidesGrid,
35483 snapGrid = swiper.snapGrid,
35484 params = swiper.params,
35485 previousIndex = swiper.activeIndex,
35486 previousRealIndex = swiper.realIndex,
35487 previousSnapIndex = swiper.snapIndex;
35488 var activeIndex = newActiveIndex;
35489 var snapIndex;
35490
35491 if (typeof activeIndex === 'undefined') {
35492 for (var i = 0; i < slidesGrid.length; i += 1) {
35493 if (typeof slidesGrid[i + 1] !== 'undefined') {
35494 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
35495 activeIndex = i;
35496 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
35497 activeIndex = i + 1;
35498 }
35499 } else if (translate >= slidesGrid[i]) {
35500 activeIndex = i;
35501 }
35502 } // Normalize slideIndex
35503
35504
35505 if (params.normalizeSlideIndex) {
35506 if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
35507 }
35508 }
35509
35510 if (snapGrid.indexOf(translate) >= 0) {
35511 snapIndex = snapGrid.indexOf(translate);
35512 } else {
35513 var skip = Math.min(params.slidesPerGroupSkip, activeIndex);
35514 snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
35515 }
35516
35517 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
35518
35519 if (activeIndex === previousIndex) {
35520 if (snapIndex !== previousSnapIndex) {
35521 swiper.snapIndex = snapIndex;
35522 swiper.emit('snapIndexChange');
35523 }
35524
35525 return;
35526 } // Get real index
35527
35528
35529 var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
35530 extend(swiper, {
35531 snapIndex: snapIndex,
35532 realIndex: realIndex,
35533 previousIndex: previousIndex,
35534 activeIndex: activeIndex
35535 });
35536 swiper.emit('activeIndexChange');
35537 swiper.emit('snapIndexChange');
35538
35539 if (previousRealIndex !== realIndex) {
35540 swiper.emit('realIndexChange');
35541 }
35542
35543 if (swiper.initialized || swiper.params.runCallbacksOnInit) {
35544 swiper.emit('slideChange');
35545 }
35546 }
35547
35548 function updateClickedSlide(e) {
35549 var swiper = this;
35550 var params = swiper.params;
35551 var slide = $$1(e.target).closest("." + params.slideClass)[0];
35552 var slideFound = false;
35553 var slideIndex;
35554
35555 if (slide) {
35556 for (var i = 0; i < swiper.slides.length; i += 1) {
35557 if (swiper.slides[i] === slide) {
35558 slideFound = true;
35559 slideIndex = i;
35560 break;
35561 }
35562 }
35563 }
35564
35565 if (slide && slideFound) {
35566 swiper.clickedSlide = slide;
35567
35568 if (swiper.virtual && swiper.params.virtual.enabled) {
35569 swiper.clickedIndex = parseInt($$1(slide).attr('data-swiper-slide-index'), 10);
35570 } else {
35571 swiper.clickedIndex = slideIndex;
35572 }
35573 } else {
35574 swiper.clickedSlide = undefined;
35575 swiper.clickedIndex = undefined;
35576 return;
35577 }
35578
35579 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
35580 swiper.slideToClickedSlide();
35581 }
35582 }
35583
35584 var update = {
35585 updateSize: updateSize,
35586 updateSlides: updateSlides,
35587 updateAutoHeight: updateAutoHeight,
35588 updateSlidesOffset: updateSlidesOffset,
35589 updateSlidesProgress: updateSlidesProgress,
35590 updateProgress: updateProgress,
35591 updateSlidesClasses: updateSlidesClasses,
35592 updateActiveIndex: updateActiveIndex,
35593 updateClickedSlide: updateClickedSlide
35594 };
35595
35596 function getSwiperTranslate(axis) {
35597 if (axis === void 0) {
35598 axis = this.isHorizontal() ? 'x' : 'y';
35599 }
35600
35601 var swiper = this;
35602 var params = swiper.params,
35603 rtl = swiper.rtlTranslate,
35604 translate = swiper.translate,
35605 $wrapperEl = swiper.$wrapperEl;
35606
35607 if (params.virtualTranslate) {
35608 return rtl ? -translate : translate;
35609 }
35610
35611 if (params.cssMode) {
35612 return translate;
35613 }
35614
35615 var currentTranslate = getTranslate($wrapperEl[0], axis);
35616 if (rtl) currentTranslate = -currentTranslate;
35617 return currentTranslate || 0;
35618 }
35619
35620 function setTranslate(translate, byController) {
35621 var swiper = this;
35622 var rtl = swiper.rtlTranslate,
35623 params = swiper.params,
35624 $wrapperEl = swiper.$wrapperEl,
35625 wrapperEl = swiper.wrapperEl,
35626 progress = swiper.progress;
35627 var x = 0;
35628 var y = 0;
35629 var z = 0;
35630
35631 if (swiper.isHorizontal()) {
35632 x = rtl ? -translate : translate;
35633 } else {
35634 y = translate;
35635 }
35636
35637 if (params.roundLengths) {
35638 x = Math.floor(x);
35639 y = Math.floor(y);
35640 }
35641
35642 if (params.cssMode) {
35643 wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
35644 } else if (!params.virtualTranslate) {
35645 $wrapperEl.transform("translate3d(" + x + "px, " + y + "px, " + z + "px)");
35646 }
35647
35648 swiper.previousTranslate = swiper.translate;
35649 swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress
35650
35651 var newProgress;
35652 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
35653
35654 if (translatesDiff === 0) {
35655 newProgress = 0;
35656 } else {
35657 newProgress = (translate - swiper.minTranslate()) / translatesDiff;
35658 }
35659
35660 if (newProgress !== progress) {
35661 swiper.updateProgress(translate);
35662 }
35663
35664 swiper.emit('setTranslate', swiper.translate, byController);
35665 }
35666
35667 function minTranslate() {
35668 return -this.snapGrid[0];
35669 }
35670
35671 function maxTranslate() {
35672 return -this.snapGrid[this.snapGrid.length - 1];
35673 }
35674
35675 function translateTo(translate, speed, runCallbacks, translateBounds, internal) {
35676 if (translate === void 0) {
35677 translate = 0;
35678 }
35679
35680 if (speed === void 0) {
35681 speed = this.params.speed;
35682 }
35683
35684 if (runCallbacks === void 0) {
35685 runCallbacks = true;
35686 }
35687
35688 if (translateBounds === void 0) {
35689 translateBounds = true;
35690 }
35691
35692 var swiper = this;
35693 var params = swiper.params,
35694 wrapperEl = swiper.wrapperEl;
35695
35696 if (swiper.animating && params.preventInteractionOnTransition) {
35697 return false;
35698 }
35699
35700 var minTranslate = swiper.minTranslate();
35701 var maxTranslate = swiper.maxTranslate();
35702 var newTranslate;
35703 if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress
35704
35705 swiper.updateProgress(newTranslate);
35706
35707 if (params.cssMode) {
35708 var isH = swiper.isHorizontal();
35709
35710 if (speed === 0) {
35711 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
35712 } else {
35713 // eslint-disable-next-line
35714 if (wrapperEl.scrollTo) {
35715 var _wrapperEl$scrollTo;
35716
35717 wrapperEl.scrollTo((_wrapperEl$scrollTo = {}, _wrapperEl$scrollTo[isH ? 'left' : 'top'] = -newTranslate, _wrapperEl$scrollTo.behavior = 'smooth', _wrapperEl$scrollTo));
35718 } else {
35719 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
35720 }
35721 }
35722
35723 return true;
35724 }
35725
35726 if (speed === 0) {
35727 swiper.setTransition(0);
35728 swiper.setTranslate(newTranslate);
35729
35730 if (runCallbacks) {
35731 swiper.emit('beforeTransitionStart', speed, internal);
35732 swiper.emit('transitionEnd');
35733 }
35734 } else {
35735 swiper.setTransition(speed);
35736 swiper.setTranslate(newTranslate);
35737
35738 if (runCallbacks) {
35739 swiper.emit('beforeTransitionStart', speed, internal);
35740 swiper.emit('transitionStart');
35741 }
35742
35743 if (!swiper.animating) {
35744 swiper.animating = true;
35745
35746 if (!swiper.onTranslateToWrapperTransitionEnd) {
35747 swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
35748 if (!swiper || swiper.destroyed) return;
35749 if (e.target !== this) return;
35750 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
35751 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
35752 swiper.onTranslateToWrapperTransitionEnd = null;
35753 delete swiper.onTranslateToWrapperTransitionEnd;
35754
35755 if (runCallbacks) {
35756 swiper.emit('transitionEnd');
35757 }
35758 };
35759 }
35760
35761 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
35762 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
35763 }
35764 }
35765
35766 return true;
35767 }
35768
35769 var translate = {
35770 getTranslate: getSwiperTranslate,
35771 setTranslate: setTranslate,
35772 minTranslate: minTranslate,
35773 maxTranslate: maxTranslate,
35774 translateTo: translateTo
35775 };
35776
35777 function setTransition(duration, byController) {
35778 var swiper = this;
35779
35780 if (!swiper.params.cssMode) {
35781 swiper.$wrapperEl.transition(duration);
35782 }
35783
35784 swiper.emit('setTransition', duration, byController);
35785 }
35786
35787 function transitionStart(runCallbacks, direction) {
35788 if (runCallbacks === void 0) {
35789 runCallbacks = true;
35790 }
35791
35792 var swiper = this;
35793 var activeIndex = swiper.activeIndex,
35794 params = swiper.params,
35795 previousIndex = swiper.previousIndex;
35796 if (params.cssMode) return;
35797
35798 if (params.autoHeight) {
35799 swiper.updateAutoHeight();
35800 }
35801
35802 var dir = direction;
35803
35804 if (!dir) {
35805 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
35806 }
35807
35808 swiper.emit('transitionStart');
35809
35810 if (runCallbacks && activeIndex !== previousIndex) {
35811 if (dir === 'reset') {
35812 swiper.emit('slideResetTransitionStart');
35813 return;
35814 }
35815
35816 swiper.emit('slideChangeTransitionStart');
35817
35818 if (dir === 'next') {
35819 swiper.emit('slideNextTransitionStart');
35820 } else {
35821 swiper.emit('slidePrevTransitionStart');
35822 }
35823 }
35824 }
35825
35826 function transitionEnd(runCallbacks, direction) {
35827 if (runCallbacks === void 0) {
35828 runCallbacks = true;
35829 }
35830
35831 var swiper = this;
35832 var activeIndex = swiper.activeIndex,
35833 previousIndex = swiper.previousIndex,
35834 params = swiper.params;
35835 swiper.animating = false;
35836 if (params.cssMode) return;
35837 swiper.setTransition(0);
35838 var dir = direction;
35839
35840 if (!dir) {
35841 if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
35842 }
35843
35844 swiper.emit('transitionEnd');
35845
35846 if (runCallbacks && activeIndex !== previousIndex) {
35847 if (dir === 'reset') {
35848 swiper.emit('slideResetTransitionEnd');
35849 return;
35850 }
35851
35852 swiper.emit('slideChangeTransitionEnd');
35853
35854 if (dir === 'next') {
35855 swiper.emit('slideNextTransitionEnd');
35856 } else {
35857 swiper.emit('slidePrevTransitionEnd');
35858 }
35859 }
35860 }
35861
35862 var transition = {
35863 setTransition: setTransition,
35864 transitionStart: transitionStart,
35865 transitionEnd: transitionEnd
35866 };
35867
35868 function slideTo(index, speed, runCallbacks, internal, initial) {
35869 if (index === void 0) {
35870 index = 0;
35871 }
35872
35873 if (speed === void 0) {
35874 speed = this.params.speed;
35875 }
35876
35877 if (runCallbacks === void 0) {
35878 runCallbacks = true;
35879 }
35880
35881 if (typeof index !== 'number' && typeof index !== 'string') {
35882 throw new Error("The 'index' argument cannot have type other than 'number' or 'string'. [" + typeof index + "] given.");
35883 }
35884
35885 if (typeof index === 'string') {
35886 /**
35887 * The `index` argument converted from `string` to `number`.
35888 * @type {number}
35889 */
35890 var indexAsNumber = parseInt(index, 10);
35891 /**
35892 * Determines whether the `index` argument is a valid `number`
35893 * after being converted from the `string` type.
35894 * @type {boolean}
35895 */
35896
35897 var isValidNumber = isFinite(indexAsNumber);
35898
35899 if (!isValidNumber) {
35900 throw new Error("The passed-in 'index' (string) couldn't be converted to 'number'. [" + index + "] given.");
35901 } // Knowing that the converted `index` is a valid number,
35902 // we can update the original argument's value.
35903
35904
35905 index = indexAsNumber;
35906 }
35907
35908 var swiper = this;
35909 var slideIndex = index;
35910 if (slideIndex < 0) slideIndex = 0;
35911 var params = swiper.params,
35912 snapGrid = swiper.snapGrid,
35913 slidesGrid = swiper.slidesGrid,
35914 previousIndex = swiper.previousIndex,
35915 activeIndex = swiper.activeIndex,
35916 rtl = swiper.rtlTranslate,
35917 wrapperEl = swiper.wrapperEl,
35918 enabled = swiper.enabled;
35919
35920 if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {
35921 return false;
35922 }
35923
35924 var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
35925 var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
35926 if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
35927
35928 if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
35929 swiper.emit('beforeSlideChangeStart');
35930 }
35931
35932 var translate = -snapGrid[snapIndex]; // Update progress
35933
35934 swiper.updateProgress(translate); // Normalize slideIndex
35935
35936 if (params.normalizeSlideIndex) {
35937 for (var i = 0; i < slidesGrid.length; i += 1) {
35938 var normalizedTranslate = -Math.floor(translate * 100);
35939 var normalizedGird = Math.floor(slidesGrid[i] * 100);
35940 var normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
35941
35942 if (typeof slidesGrid[i + 1] !== 'undefined') {
35943 if (normalizedTranslate >= normalizedGird && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGird) / 2) {
35944 slideIndex = i;
35945 } else if (normalizedTranslate >= normalizedGird && normalizedTranslate < normalizedGridNext) {
35946 slideIndex = i + 1;
35947 }
35948 } else if (normalizedTranslate >= normalizedGird) {
35949 slideIndex = i;
35950 }
35951 }
35952 } // Directions locks
35953
35954
35955 if (swiper.initialized && slideIndex !== activeIndex) {
35956 if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
35957 return false;
35958 }
35959
35960 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
35961 if ((activeIndex || 0) !== slideIndex) return false;
35962 }
35963 }
35964
35965 var direction;
35966 if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index
35967
35968 if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {
35969 swiper.updateActiveIndex(slideIndex); // Update Height
35970
35971 if (params.autoHeight) {
35972 swiper.updateAutoHeight();
35973 }
35974
35975 swiper.updateSlidesClasses();
35976
35977 if (params.effect !== 'slide') {
35978 swiper.setTranslate(translate);
35979 }
35980
35981 if (direction !== 'reset') {
35982 swiper.transitionStart(runCallbacks, direction);
35983 swiper.transitionEnd(runCallbacks, direction);
35984 }
35985
35986 return false;
35987 }
35988
35989 if (params.cssMode) {
35990 var isH = swiper.isHorizontal();
35991 var t = -translate;
35992
35993 if (rtl) {
35994 t = wrapperEl.scrollWidth - wrapperEl.offsetWidth - t;
35995 }
35996
35997 if (speed === 0) {
35998 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
35999 } else {
36000 // eslint-disable-next-line
36001 if (wrapperEl.scrollTo) {
36002 var _wrapperEl$scrollTo;
36003
36004 wrapperEl.scrollTo((_wrapperEl$scrollTo = {}, _wrapperEl$scrollTo[isH ? 'left' : 'top'] = t, _wrapperEl$scrollTo.behavior = 'smooth', _wrapperEl$scrollTo));
36005 } else {
36006 wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
36007 }
36008 }
36009
36010 return true;
36011 }
36012
36013 if (speed === 0) {
36014 swiper.setTransition(0);
36015 swiper.setTranslate(translate);
36016 swiper.updateActiveIndex(slideIndex);
36017 swiper.updateSlidesClasses();
36018 swiper.emit('beforeTransitionStart', speed, internal);
36019 swiper.transitionStart(runCallbacks, direction);
36020 swiper.transitionEnd(runCallbacks, direction);
36021 } else {
36022 swiper.setTransition(speed);
36023 swiper.setTranslate(translate);
36024 swiper.updateActiveIndex(slideIndex);
36025 swiper.updateSlidesClasses();
36026 swiper.emit('beforeTransitionStart', speed, internal);
36027 swiper.transitionStart(runCallbacks, direction);
36028
36029 if (!swiper.animating) {
36030 swiper.animating = true;
36031
36032 if (!swiper.onSlideToWrapperTransitionEnd) {
36033 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
36034 if (!swiper || swiper.destroyed) return;
36035 if (e.target !== this) return;
36036 swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
36037 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
36038 swiper.onSlideToWrapperTransitionEnd = null;
36039 delete swiper.onSlideToWrapperTransitionEnd;
36040 swiper.transitionEnd(runCallbacks, direction);
36041 };
36042 }
36043
36044 swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
36045 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
36046 }
36047 }
36048
36049 return true;
36050 }
36051
36052 function slideToLoop(index, speed, runCallbacks, internal) {
36053 if (index === void 0) {
36054 index = 0;
36055 }
36056
36057 if (speed === void 0) {
36058 speed = this.params.speed;
36059 }
36060
36061 if (runCallbacks === void 0) {
36062 runCallbacks = true;
36063 }
36064
36065 var swiper = this;
36066 var newIndex = index;
36067
36068 if (swiper.params.loop) {
36069 newIndex += swiper.loopedSlides;
36070 }
36071
36072 return swiper.slideTo(newIndex, speed, runCallbacks, internal);
36073 }
36074
36075 /* eslint no-unused-vars: "off" */
36076 function slideNext(speed, runCallbacks, internal) {
36077 if (speed === void 0) {
36078 speed = this.params.speed;
36079 }
36080
36081 if (runCallbacks === void 0) {
36082 runCallbacks = true;
36083 }
36084
36085 var swiper = this;
36086 var params = swiper.params,
36087 animating = swiper.animating,
36088 enabled = swiper.enabled;
36089 if (!enabled) return swiper;
36090 var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup;
36091
36092 if (params.loop) {
36093 if (animating && params.loopPreventsSlide) return false;
36094 swiper.loopFix(); // eslint-disable-next-line
36095
36096 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
36097 }
36098
36099 return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
36100 }
36101
36102 /* eslint no-unused-vars: "off" */
36103 function slidePrev(speed, runCallbacks, internal) {
36104 if (speed === void 0) {
36105 speed = this.params.speed;
36106 }
36107
36108 if (runCallbacks === void 0) {
36109 runCallbacks = true;
36110 }
36111
36112 var swiper = this;
36113 var params = swiper.params,
36114 animating = swiper.animating,
36115 snapGrid = swiper.snapGrid,
36116 slidesGrid = swiper.slidesGrid,
36117 rtlTranslate = swiper.rtlTranslate,
36118 enabled = swiper.enabled;
36119 if (!enabled) return swiper;
36120
36121 if (params.loop) {
36122 if (animating && params.loopPreventsSlide) return false;
36123 swiper.loopFix(); // eslint-disable-next-line
36124
36125 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
36126 }
36127
36128 var translate = rtlTranslate ? swiper.translate : -swiper.translate;
36129
36130 function normalize(val) {
36131 if (val < 0) return -Math.floor(Math.abs(val));
36132 return Math.floor(val);
36133 }
36134
36135 var normalizedTranslate = normalize(translate);
36136 var normalizedSnapGrid = snapGrid.map(function (val) {
36137 return normalize(val);
36138 });
36139 var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
36140 var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
36141
36142 if (typeof prevSnap === 'undefined' && params.cssMode) {
36143 snapGrid.forEach(function (snap) {
36144 if (!prevSnap && normalizedTranslate >= snap) prevSnap = snap;
36145 });
36146 }
36147
36148 var prevIndex;
36149
36150 if (typeof prevSnap !== 'undefined') {
36151 prevIndex = slidesGrid.indexOf(prevSnap);
36152 if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
36153 }
36154
36155 return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
36156 }
36157
36158 /* eslint no-unused-vars: "off" */
36159 function slideReset(speed, runCallbacks, internal) {
36160 if (speed === void 0) {
36161 speed = this.params.speed;
36162 }
36163
36164 if (runCallbacks === void 0) {
36165 runCallbacks = true;
36166 }
36167
36168 var swiper = this;
36169 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
36170 }
36171
36172 /* eslint no-unused-vars: "off" */
36173 function slideToClosest(speed, runCallbacks, internal, threshold) {
36174 if (speed === void 0) {
36175 speed = this.params.speed;
36176 }
36177
36178 if (runCallbacks === void 0) {
36179 runCallbacks = true;
36180 }
36181
36182 if (threshold === void 0) {
36183 threshold = 0.5;
36184 }
36185
36186 var swiper = this;
36187 var index = swiper.activeIndex;
36188 var skip = Math.min(swiper.params.slidesPerGroupSkip, index);
36189 var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
36190 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
36191
36192 if (translate >= swiper.snapGrid[snapIndex]) {
36193 // The current translate is on or after the current snap index, so the choice
36194 // is between the current index and the one after it.
36195 var currentSnap = swiper.snapGrid[snapIndex];
36196 var nextSnap = swiper.snapGrid[snapIndex + 1];
36197
36198 if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
36199 index += swiper.params.slidesPerGroup;
36200 }
36201 } else {
36202 // The current translate is before the current snap index, so the choice
36203 // is between the current index and the one before it.
36204 var prevSnap = swiper.snapGrid[snapIndex - 1];
36205 var _currentSnap = swiper.snapGrid[snapIndex];
36206
36207 if (translate - prevSnap <= (_currentSnap - prevSnap) * threshold) {
36208 index -= swiper.params.slidesPerGroup;
36209 }
36210 }
36211
36212 index = Math.max(index, 0);
36213 index = Math.min(index, swiper.slidesGrid.length - 1);
36214 return swiper.slideTo(index, speed, runCallbacks, internal);
36215 }
36216
36217 function slideToClickedSlide() {
36218 var swiper = this;
36219 var params = swiper.params,
36220 $wrapperEl = swiper.$wrapperEl;
36221 var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
36222 var slideToIndex = swiper.clickedIndex;
36223 var realIndex;
36224
36225 if (params.loop) {
36226 if (swiper.animating) return;
36227 realIndex = parseInt($$1(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
36228
36229 if (params.centeredSlides) {
36230 if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
36231 swiper.loopFix();
36232 slideToIndex = $wrapperEl.children("." + params.slideClass + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + params.slideDuplicateClass + ")").eq(0).index();
36233 nextTick(function () {
36234 swiper.slideTo(slideToIndex);
36235 });
36236 } else {
36237 swiper.slideTo(slideToIndex);
36238 }
36239 } else if (slideToIndex > swiper.slides.length - slidesPerView) {
36240 swiper.loopFix();
36241 slideToIndex = $wrapperEl.children("." + params.slideClass + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + params.slideDuplicateClass + ")").eq(0).index();
36242 nextTick(function () {
36243 swiper.slideTo(slideToIndex);
36244 });
36245 } else {
36246 swiper.slideTo(slideToIndex);
36247 }
36248 } else {
36249 swiper.slideTo(slideToIndex);
36250 }
36251 }
36252
36253 var slide = {
36254 slideTo: slideTo,
36255 slideToLoop: slideToLoop,
36256 slideNext: slideNext,
36257 slidePrev: slidePrev,
36258 slideReset: slideReset,
36259 slideToClosest: slideToClosest,
36260 slideToClickedSlide: slideToClickedSlide
36261 };
36262
36263 function loopCreate() {
36264 var swiper = this;
36265 var document = getDocument();
36266 var params = swiper.params,
36267 $wrapperEl = swiper.$wrapperEl; // Remove duplicated slides
36268
36269 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass).remove();
36270 var slides = $wrapperEl.children("." + params.slideClass);
36271
36272 if (params.loopFillGroupWithBlank) {
36273 var blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup;
36274
36275 if (blankSlidesNum !== params.slidesPerGroup) {
36276 for (var i = 0; i < blankSlidesNum; i += 1) {
36277 var blankNode = $$1(document.createElement('div')).addClass(params.slideClass + " " + params.slideBlankClass);
36278 $wrapperEl.append(blankNode);
36279 }
36280
36281 slides = $wrapperEl.children("." + params.slideClass);
36282 }
36283 }
36284
36285 if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;
36286 swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));
36287 swiper.loopedSlides += params.loopAdditionalSlides;
36288
36289 if (swiper.loopedSlides > slides.length) {
36290 swiper.loopedSlides = slides.length;
36291 }
36292
36293 var prependSlides = [];
36294 var appendSlides = [];
36295 slides.each(function (el, index) {
36296 var slide = $$1(el);
36297
36298 if (index < swiper.loopedSlides) {
36299 appendSlides.push(el);
36300 }
36301
36302 if (index < slides.length && index >= slides.length - swiper.loopedSlides) {
36303 prependSlides.push(el);
36304 }
36305
36306 slide.attr('data-swiper-slide-index', index);
36307 });
36308
36309 for (var _i = 0; _i < appendSlides.length; _i += 1) {
36310 $wrapperEl.append($$1(appendSlides[_i].cloneNode(true)).addClass(params.slideDuplicateClass));
36311 }
36312
36313 for (var _i2 = prependSlides.length - 1; _i2 >= 0; _i2 -= 1) {
36314 $wrapperEl.prepend($$1(prependSlides[_i2].cloneNode(true)).addClass(params.slideDuplicateClass));
36315 }
36316 }
36317
36318 function loopFix() {
36319 var swiper = this;
36320 swiper.emit('beforeLoopFix');
36321 var activeIndex = swiper.activeIndex,
36322 slides = swiper.slides,
36323 loopedSlides = swiper.loopedSlides,
36324 allowSlidePrev = swiper.allowSlidePrev,
36325 allowSlideNext = swiper.allowSlideNext,
36326 snapGrid = swiper.snapGrid,
36327 rtl = swiper.rtlTranslate;
36328 var newIndex;
36329 swiper.allowSlidePrev = true;
36330 swiper.allowSlideNext = true;
36331 var snapTranslate = -snapGrid[activeIndex];
36332 var diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding
36333
36334 if (activeIndex < loopedSlides) {
36335 newIndex = slides.length - loopedSlides * 3 + activeIndex;
36336 newIndex += loopedSlides;
36337 var slideChanged = swiper.slideTo(newIndex, 0, false, true);
36338
36339 if (slideChanged && diff !== 0) {
36340 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
36341 }
36342 } else if (activeIndex >= slides.length - loopedSlides) {
36343 // Fix For Positive Oversliding
36344 newIndex = -slides.length + activeIndex + loopedSlides;
36345 newIndex += loopedSlides;
36346
36347 var _slideChanged = swiper.slideTo(newIndex, 0, false, true);
36348
36349 if (_slideChanged && diff !== 0) {
36350 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
36351 }
36352 }
36353
36354 swiper.allowSlidePrev = allowSlidePrev;
36355 swiper.allowSlideNext = allowSlideNext;
36356 swiper.emit('loopFix');
36357 }
36358
36359 function loopDestroy() {
36360 var swiper = this;
36361 var $wrapperEl = swiper.$wrapperEl,
36362 params = swiper.params,
36363 slides = swiper.slides;
36364 $wrapperEl.children("." + params.slideClass + "." + params.slideDuplicateClass + ",." + params.slideClass + "." + params.slideBlankClass).remove();
36365 slides.removeAttr('data-swiper-slide-index');
36366 }
36367
36368 var loop = {
36369 loopCreate: loopCreate,
36370 loopFix: loopFix,
36371 loopDestroy: loopDestroy
36372 };
36373
36374 function setGrabCursor(moving) {
36375 var swiper = this;
36376 if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
36377 var el = swiper.el;
36378 el.style.cursor = 'move';
36379 el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
36380 el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
36381 el.style.cursor = moving ? 'grabbing' : 'grab';
36382 }
36383
36384 function unsetGrabCursor() {
36385 var swiper = this;
36386
36387 if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
36388 return;
36389 }
36390
36391 swiper.el.style.cursor = '';
36392 }
36393
36394 var grabCursor = {
36395 setGrabCursor: setGrabCursor,
36396 unsetGrabCursor: unsetGrabCursor
36397 };
36398
36399 function appendSlide(slides) {
36400 var swiper = this;
36401 var $wrapperEl = swiper.$wrapperEl,
36402 params = swiper.params;
36403
36404 if (params.loop) {
36405 swiper.loopDestroy();
36406 }
36407
36408 if (typeof slides === 'object' && 'length' in slides) {
36409 for (var i = 0; i < slides.length; i += 1) {
36410 if (slides[i]) $wrapperEl.append(slides[i]);
36411 }
36412 } else {
36413 $wrapperEl.append(slides);
36414 }
36415
36416 if (params.loop) {
36417 swiper.loopCreate();
36418 }
36419
36420 if (!(params.observer && swiper.support.observer)) {
36421 swiper.update();
36422 }
36423 }
36424
36425 function prependSlide(slides) {
36426 var swiper = this;
36427 var params = swiper.params,
36428 $wrapperEl = swiper.$wrapperEl,
36429 activeIndex = swiper.activeIndex;
36430
36431 if (params.loop) {
36432 swiper.loopDestroy();
36433 }
36434
36435 var newActiveIndex = activeIndex + 1;
36436
36437 if (typeof slides === 'object' && 'length' in slides) {
36438 for (var i = 0; i < slides.length; i += 1) {
36439 if (slides[i]) $wrapperEl.prepend(slides[i]);
36440 }
36441
36442 newActiveIndex = activeIndex + slides.length;
36443 } else {
36444 $wrapperEl.prepend(slides);
36445 }
36446
36447 if (params.loop) {
36448 swiper.loopCreate();
36449 }
36450
36451 if (!(params.observer && swiper.support.observer)) {
36452 swiper.update();
36453 }
36454
36455 swiper.slideTo(newActiveIndex, 0, false);
36456 }
36457
36458 function addSlide(index, slides) {
36459 var swiper = this;
36460 var $wrapperEl = swiper.$wrapperEl,
36461 params = swiper.params,
36462 activeIndex = swiper.activeIndex;
36463 var activeIndexBuffer = activeIndex;
36464
36465 if (params.loop) {
36466 activeIndexBuffer -= swiper.loopedSlides;
36467 swiper.loopDestroy();
36468 swiper.slides = $wrapperEl.children("." + params.slideClass);
36469 }
36470
36471 var baseLength = swiper.slides.length;
36472
36473 if (index <= 0) {
36474 swiper.prependSlide(slides);
36475 return;
36476 }
36477
36478 if (index >= baseLength) {
36479 swiper.appendSlide(slides);
36480 return;
36481 }
36482
36483 var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
36484 var slidesBuffer = [];
36485
36486 for (var i = baseLength - 1; i >= index; i -= 1) {
36487 var currentSlide = swiper.slides.eq(i);
36488 currentSlide.remove();
36489 slidesBuffer.unshift(currentSlide);
36490 }
36491
36492 if (typeof slides === 'object' && 'length' in slides) {
36493 for (var _i = 0; _i < slides.length; _i += 1) {
36494 if (slides[_i]) $wrapperEl.append(slides[_i]);
36495 }
36496
36497 newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
36498 } else {
36499 $wrapperEl.append(slides);
36500 }
36501
36502 for (var _i2 = 0; _i2 < slidesBuffer.length; _i2 += 1) {
36503 $wrapperEl.append(slidesBuffer[_i2]);
36504 }
36505
36506 if (params.loop) {
36507 swiper.loopCreate();
36508 }
36509
36510 if (!(params.observer && swiper.support.observer)) {
36511 swiper.update();
36512 }
36513
36514 if (params.loop) {
36515 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
36516 } else {
36517 swiper.slideTo(newActiveIndex, 0, false);
36518 }
36519 }
36520
36521 function removeSlide(slidesIndexes) {
36522 var swiper = this;
36523 var params = swiper.params,
36524 $wrapperEl = swiper.$wrapperEl,
36525 activeIndex = swiper.activeIndex;
36526 var activeIndexBuffer = activeIndex;
36527
36528 if (params.loop) {
36529 activeIndexBuffer -= swiper.loopedSlides;
36530 swiper.loopDestroy();
36531 swiper.slides = $wrapperEl.children("." + params.slideClass);
36532 }
36533
36534 var newActiveIndex = activeIndexBuffer;
36535 var indexToRemove;
36536
36537 if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
36538 for (var i = 0; i < slidesIndexes.length; i += 1) {
36539 indexToRemove = slidesIndexes[i];
36540 if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();
36541 if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
36542 }
36543
36544 newActiveIndex = Math.max(newActiveIndex, 0);
36545 } else {
36546 indexToRemove = slidesIndexes;
36547 if (swiper.slides[indexToRemove]) swiper.slides.eq(indexToRemove).remove();
36548 if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
36549 newActiveIndex = Math.max(newActiveIndex, 0);
36550 }
36551
36552 if (params.loop) {
36553 swiper.loopCreate();
36554 }
36555
36556 if (!(params.observer && swiper.support.observer)) {
36557 swiper.update();
36558 }
36559
36560 if (params.loop) {
36561 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
36562 } else {
36563 swiper.slideTo(newActiveIndex, 0, false);
36564 }
36565 }
36566
36567 function removeAllSlides() {
36568 var swiper = this;
36569 var slidesIndexes = [];
36570
36571 for (var i = 0; i < swiper.slides.length; i += 1) {
36572 slidesIndexes.push(i);
36573 }
36574
36575 swiper.removeSlide(slidesIndexes);
36576 }
36577
36578 var manipulation = {
36579 appendSlide: appendSlide,
36580 prependSlide: prependSlide,
36581 addSlide: addSlide,
36582 removeSlide: removeSlide,
36583 removeAllSlides: removeAllSlides
36584 };
36585
36586 function onTouchStart(event) {
36587 var swiper = this;
36588 var document = getDocument();
36589 var window = getWindow();
36590 var data = swiper.touchEventsData;
36591 var params = swiper.params,
36592 touches = swiper.touches,
36593 enabled = swiper.enabled;
36594 if (!enabled) return;
36595
36596 if (swiper.animating && params.preventInteractionOnTransition) {
36597 return;
36598 }
36599
36600 var e = event;
36601 if (e.originalEvent) e = e.originalEvent;
36602 var $targetEl = $$1(e.target);
36603
36604 if (params.touchEventsTarget === 'wrapper') {
36605 if (!$targetEl.closest(swiper.wrapperEl).length) return;
36606 }
36607
36608 data.isTouchEvent = e.type === 'touchstart';
36609 if (!data.isTouchEvent && 'which' in e && e.which === 3) return;
36610 if (!data.isTouchEvent && 'button' in e && e.button > 0) return;
36611 if (data.isTouched && data.isMoved) return; // change target el for shadow root componenet
36612
36613 var swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
36614
36615 if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {
36616 $targetEl = $$1(event.path[0]);
36617 }
36618
36619 if (params.noSwiping && $targetEl.closest(params.noSwipingSelector ? params.noSwipingSelector : "." + params.noSwipingClass)[0]) {
36620 swiper.allowClick = true;
36621 return;
36622 }
36623
36624 if (params.swipeHandler) {
36625 if (!$targetEl.closest(params.swipeHandler)[0]) return;
36626 }
36627
36628 touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
36629 touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
36630 var startX = touches.currentX;
36631 var startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
36632
36633 var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
36634 var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
36635
36636 if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
36637 if (edgeSwipeDetection === 'prevent') {
36638 event.preventDefault();
36639 } else {
36640 return;
36641 }
36642 }
36643
36644 extend(data, {
36645 isTouched: true,
36646 isMoved: false,
36647 allowTouchCallbacks: true,
36648 isScrolling: undefined,
36649 startMoving: undefined
36650 });
36651 touches.startX = startX;
36652 touches.startY = startY;
36653 data.touchStartTime = now();
36654 swiper.allowClick = true;
36655 swiper.updateSize();
36656 swiper.swipeDirection = undefined;
36657 if (params.threshold > 0) data.allowThresholdMove = false;
36658
36659 if (e.type !== 'touchstart') {
36660 var preventDefault = true;
36661 if ($targetEl.is(data.formElements)) preventDefault = false;
36662
36663 if (document.activeElement && $$1(document.activeElement).is(data.formElements) && document.activeElement !== $targetEl[0]) {
36664 document.activeElement.blur();
36665 }
36666
36667 var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
36668
36669 if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) {
36670 e.preventDefault();
36671 }
36672 }
36673
36674 swiper.emit('touchStart', e);
36675 }
36676
36677 function onTouchMove(event) {
36678 var document = getDocument();
36679 var swiper = this;
36680 var data = swiper.touchEventsData;
36681 var params = swiper.params,
36682 touches = swiper.touches,
36683 rtl = swiper.rtlTranslate,
36684 enabled = swiper.enabled;
36685 if (!enabled) return;
36686 var e = event;
36687 if (e.originalEvent) e = e.originalEvent;
36688
36689 if (!data.isTouched) {
36690 if (data.startMoving && data.isScrolling) {
36691 swiper.emit('touchMoveOpposite', e);
36692 }
36693
36694 return;
36695 }
36696
36697 if (data.isTouchEvent && e.type !== 'touchmove') return;
36698 var targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
36699 var pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
36700 var pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
36701
36702 if (e.preventedByNestedSwiper) {
36703 touches.startX = pageX;
36704 touches.startY = pageY;
36705 return;
36706 }
36707
36708 if (!swiper.allowTouchMove) {
36709 // isMoved = true;
36710 swiper.allowClick = false;
36711
36712 if (data.isTouched) {
36713 extend(touches, {
36714 startX: pageX,
36715 startY: pageY,
36716 currentX: pageX,
36717 currentY: pageY
36718 });
36719 data.touchStartTime = now();
36720 }
36721
36722 return;
36723 }
36724
36725 if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
36726 if (swiper.isVertical()) {
36727 // Vertical
36728 if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
36729 data.isTouched = false;
36730 data.isMoved = false;
36731 return;
36732 }
36733 } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
36734 return;
36735 }
36736 }
36737
36738 if (data.isTouchEvent && document.activeElement) {
36739 if (e.target === document.activeElement && $$1(e.target).is(data.formElements)) {
36740 data.isMoved = true;
36741 swiper.allowClick = false;
36742 return;
36743 }
36744 }
36745
36746 if (data.allowTouchCallbacks) {
36747 swiper.emit('touchMove', e);
36748 }
36749
36750 if (e.targetTouches && e.targetTouches.length > 1) return;
36751 touches.currentX = pageX;
36752 touches.currentY = pageY;
36753 var diffX = touches.currentX - touches.startX;
36754 var diffY = touches.currentY - touches.startY;
36755 if (swiper.params.threshold && Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2)) < swiper.params.threshold) return;
36756
36757 if (typeof data.isScrolling === 'undefined') {
36758 var touchAngle;
36759
36760 if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
36761 data.isScrolling = false;
36762 } else {
36763 // eslint-disable-next-line
36764 if (diffX * diffX + diffY * diffY >= 25) {
36765 touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
36766 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
36767 }
36768 }
36769 }
36770
36771 if (data.isScrolling) {
36772 swiper.emit('touchMoveOpposite', e);
36773 }
36774
36775 if (typeof data.startMoving === 'undefined') {
36776 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
36777 data.startMoving = true;
36778 }
36779 }
36780
36781 if (data.isScrolling) {
36782 data.isTouched = false;
36783 return;
36784 }
36785
36786 if (!data.startMoving) {
36787 return;
36788 }
36789
36790 swiper.allowClick = false;
36791
36792 if (!params.cssMode && e.cancelable) {
36793 e.preventDefault();
36794 }
36795
36796 if (params.touchMoveStopPropagation && !params.nested) {
36797 e.stopPropagation();
36798 }
36799
36800 if (!data.isMoved) {
36801 if (params.loop) {
36802 swiper.loopFix();
36803 }
36804
36805 data.startTranslate = swiper.getTranslate();
36806 swiper.setTransition(0);
36807
36808 if (swiper.animating) {
36809 swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
36810 }
36811
36812 data.allowMomentumBounce = false; // Grab Cursor
36813
36814 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
36815 swiper.setGrabCursor(true);
36816 }
36817
36818 swiper.emit('sliderFirstMove', e);
36819 }
36820
36821 swiper.emit('sliderMove', e);
36822 data.isMoved = true;
36823 var diff = swiper.isHorizontal() ? diffX : diffY;
36824 touches.diff = diff;
36825 diff *= params.touchRatio;
36826 if (rtl) diff = -diff;
36827 swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
36828 data.currentTranslate = diff + data.startTranslate;
36829 var disableParentSwiper = true;
36830 var resistanceRatio = params.resistanceRatio;
36831
36832 if (params.touchReleaseOnEdges) {
36833 resistanceRatio = 0;
36834 }
36835
36836 if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {
36837 disableParentSwiper = false;
36838 if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + Math.pow(-swiper.minTranslate() + data.startTranslate + diff, resistanceRatio);
36839 } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
36840 disableParentSwiper = false;
36841 if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - Math.pow(swiper.maxTranslate() - data.startTranslate - diff, resistanceRatio);
36842 }
36843
36844 if (disableParentSwiper) {
36845 e.preventedByNestedSwiper = true;
36846 } // Directions locks
36847
36848
36849 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
36850 data.currentTranslate = data.startTranslate;
36851 }
36852
36853 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
36854 data.currentTranslate = data.startTranslate;
36855 }
36856
36857 if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
36858 data.currentTranslate = data.startTranslate;
36859 } // Threshold
36860
36861
36862 if (params.threshold > 0) {
36863 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
36864 if (!data.allowThresholdMove) {
36865 data.allowThresholdMove = true;
36866 touches.startX = touches.currentX;
36867 touches.startY = touches.currentY;
36868 data.currentTranslate = data.startTranslate;
36869 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
36870 return;
36871 }
36872 } else {
36873 data.currentTranslate = data.startTranslate;
36874 return;
36875 }
36876 }
36877
36878 if (!params.followFinger || params.cssMode) return; // Update active index in free mode
36879
36880 if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
36881 swiper.updateActiveIndex();
36882 swiper.updateSlidesClasses();
36883 }
36884
36885 if (params.freeMode) {
36886 // Velocity
36887 if (data.velocities.length === 0) {
36888 data.velocities.push({
36889 position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
36890 time: data.touchStartTime
36891 });
36892 }
36893
36894 data.velocities.push({
36895 position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
36896 time: now()
36897 });
36898 } // Update progress
36899
36900
36901 swiper.updateProgress(data.currentTranslate); // Update translate
36902
36903 swiper.setTranslate(data.currentTranslate);
36904 }
36905
36906 function onTouchEnd(event) {
36907 var swiper = this;
36908 var data = swiper.touchEventsData;
36909 var params = swiper.params,
36910 touches = swiper.touches,
36911 rtl = swiper.rtlTranslate,
36912 $wrapperEl = swiper.$wrapperEl,
36913 slidesGrid = swiper.slidesGrid,
36914 snapGrid = swiper.snapGrid,
36915 enabled = swiper.enabled;
36916 if (!enabled) return;
36917 var e = event;
36918 if (e.originalEvent) e = e.originalEvent;
36919
36920 if (data.allowTouchCallbacks) {
36921 swiper.emit('touchEnd', e);
36922 }
36923
36924 data.allowTouchCallbacks = false;
36925
36926 if (!data.isTouched) {
36927 if (data.isMoved && params.grabCursor) {
36928 swiper.setGrabCursor(false);
36929 }
36930
36931 data.isMoved = false;
36932 data.startMoving = false;
36933 return;
36934 } // Return Grab Cursor
36935
36936
36937 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
36938 swiper.setGrabCursor(false);
36939 } // Time diff
36940
36941
36942 var touchEndTime = now();
36943 var timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click
36944
36945 if (swiper.allowClick) {
36946 swiper.updateClickedSlide(e);
36947 swiper.emit('tap click', e);
36948
36949 if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
36950 swiper.emit('doubleTap doubleClick', e);
36951 }
36952 }
36953
36954 data.lastClickTime = now();
36955 nextTick(function () {
36956 if (!swiper.destroyed) swiper.allowClick = true;
36957 });
36958
36959 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
36960 data.isTouched = false;
36961 data.isMoved = false;
36962 data.startMoving = false;
36963 return;
36964 }
36965
36966 data.isTouched = false;
36967 data.isMoved = false;
36968 data.startMoving = false;
36969 var currentPos;
36970
36971 if (params.followFinger) {
36972 currentPos = rtl ? swiper.translate : -swiper.translate;
36973 } else {
36974 currentPos = -data.currentTranslate;
36975 }
36976
36977 if (params.cssMode) {
36978 return;
36979 }
36980
36981 if (params.freeMode) {
36982 if (currentPos < -swiper.minTranslate()) {
36983 swiper.slideTo(swiper.activeIndex);
36984 return;
36985 }
36986
36987 if (currentPos > -swiper.maxTranslate()) {
36988 if (swiper.slides.length < snapGrid.length) {
36989 swiper.slideTo(snapGrid.length - 1);
36990 } else {
36991 swiper.slideTo(swiper.slides.length - 1);
36992 }
36993
36994 return;
36995 }
36996
36997 if (params.freeModeMomentum) {
36998 if (data.velocities.length > 1) {
36999 var lastMoveEvent = data.velocities.pop();
37000 var velocityEvent = data.velocities.pop();
37001 var distance = lastMoveEvent.position - velocityEvent.position;
37002 var time = lastMoveEvent.time - velocityEvent.time;
37003 swiper.velocity = distance / time;
37004 swiper.velocity /= 2;
37005
37006 if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
37007 swiper.velocity = 0;
37008 } // this implies that the user stopped moving a finger then released.
37009 // There would be no events with distance zero, so the last event is stale.
37010
37011
37012 if (time > 150 || now() - lastMoveEvent.time > 300) {
37013 swiper.velocity = 0;
37014 }
37015 } else {
37016 swiper.velocity = 0;
37017 }
37018
37019 swiper.velocity *= params.freeModeMomentumVelocityRatio;
37020 data.velocities.length = 0;
37021 var momentumDuration = 1000 * params.freeModeMomentumRatio;
37022 var momentumDistance = swiper.velocity * momentumDuration;
37023 var newPosition = swiper.translate + momentumDistance;
37024 if (rtl) newPosition = -newPosition;
37025 var doBounce = false;
37026 var afterBouncePosition;
37027 var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
37028 var needsLoopFix;
37029
37030 if (newPosition < swiper.maxTranslate()) {
37031 if (params.freeModeMomentumBounce) {
37032 if (newPosition + swiper.maxTranslate() < -bounceAmount) {
37033 newPosition = swiper.maxTranslate() - bounceAmount;
37034 }
37035
37036 afterBouncePosition = swiper.maxTranslate();
37037 doBounce = true;
37038 data.allowMomentumBounce = true;
37039 } else {
37040 newPosition = swiper.maxTranslate();
37041 }
37042
37043 if (params.loop && params.centeredSlides) needsLoopFix = true;
37044 } else if (newPosition > swiper.minTranslate()) {
37045 if (params.freeModeMomentumBounce) {
37046 if (newPosition - swiper.minTranslate() > bounceAmount) {
37047 newPosition = swiper.minTranslate() + bounceAmount;
37048 }
37049
37050 afterBouncePosition = swiper.minTranslate();
37051 doBounce = true;
37052 data.allowMomentumBounce = true;
37053 } else {
37054 newPosition = swiper.minTranslate();
37055 }
37056
37057 if (params.loop && params.centeredSlides) needsLoopFix = true;
37058 } else if (params.freeModeSticky) {
37059 var nextSlide;
37060
37061 for (var j = 0; j < snapGrid.length; j += 1) {
37062 if (snapGrid[j] > -newPosition) {
37063 nextSlide = j;
37064 break;
37065 }
37066 }
37067
37068 if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
37069 newPosition = snapGrid[nextSlide];
37070 } else {
37071 newPosition = snapGrid[nextSlide - 1];
37072 }
37073
37074 newPosition = -newPosition;
37075 }
37076
37077 if (needsLoopFix) {
37078 swiper.once('transitionEnd', function () {
37079 swiper.loopFix();
37080 });
37081 } // Fix duration
37082
37083
37084 if (swiper.velocity !== 0) {
37085 if (rtl) {
37086 momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
37087 } else {
37088 momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
37089 }
37090
37091 if (params.freeModeSticky) {
37092 // If freeModeSticky is active and the user ends a swipe with a slow-velocity
37093 // event, then durations can be 20+ seconds to slide one (or zero!) slides.
37094 // It's easy to see this when simulating touch with mouse events. To fix this,
37095 // limit single-slide swipes to the default slide duration. This also has the
37096 // nice side effect of matching slide speed if the user stopped moving before
37097 // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
37098 // For faster swipes, also apply limits (albeit higher ones).
37099 var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
37100 var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
37101
37102 if (moveDistance < currentSlideSize) {
37103 momentumDuration = params.speed;
37104 } else if (moveDistance < 2 * currentSlideSize) {
37105 momentumDuration = params.speed * 1.5;
37106 } else {
37107 momentumDuration = params.speed * 2.5;
37108 }
37109 }
37110 } else if (params.freeModeSticky) {
37111 swiper.slideToClosest();
37112 return;
37113 }
37114
37115 if (params.freeModeMomentumBounce && doBounce) {
37116 swiper.updateProgress(afterBouncePosition);
37117 swiper.setTransition(momentumDuration);
37118 swiper.setTranslate(newPosition);
37119 swiper.transitionStart(true, swiper.swipeDirection);
37120 swiper.animating = true;
37121 $wrapperEl.transitionEnd(function () {
37122 if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;
37123 swiper.emit('momentumBounce');
37124 swiper.setTransition(params.speed);
37125 setTimeout(function () {
37126 swiper.setTranslate(afterBouncePosition);
37127 $wrapperEl.transitionEnd(function () {
37128 if (!swiper || swiper.destroyed) return;
37129 swiper.transitionEnd();
37130 });
37131 }, 0);
37132 });
37133 } else if (swiper.velocity) {
37134 swiper.updateProgress(newPosition);
37135 swiper.setTransition(momentumDuration);
37136 swiper.setTranslate(newPosition);
37137 swiper.transitionStart(true, swiper.swipeDirection);
37138
37139 if (!swiper.animating) {
37140 swiper.animating = true;
37141 $wrapperEl.transitionEnd(function () {
37142 if (!swiper || swiper.destroyed) return;
37143 swiper.transitionEnd();
37144 });
37145 }
37146 } else {
37147 swiper.emit('_freeModeNoMomentumRelease');
37148 swiper.updateProgress(newPosition);
37149 }
37150
37151 swiper.updateActiveIndex();
37152 swiper.updateSlidesClasses();
37153 } else if (params.freeModeSticky) {
37154 swiper.slideToClosest();
37155 return;
37156 } else if (params.freeMode) {
37157 swiper.emit('_freeModeNoMomentumRelease');
37158 }
37159
37160 if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
37161 swiper.updateProgress();
37162 swiper.updateActiveIndex();
37163 swiper.updateSlidesClasses();
37164 }
37165
37166 return;
37167 } // Find current slide
37168
37169
37170 var stopIndex = 0;
37171 var groupSize = swiper.slidesSizesGrid[0];
37172
37173 for (var i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
37174 var _increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
37175
37176 if (typeof slidesGrid[i + _increment] !== 'undefined') {
37177 if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + _increment]) {
37178 stopIndex = i;
37179 groupSize = slidesGrid[i + _increment] - slidesGrid[i];
37180 }
37181 } else if (currentPos >= slidesGrid[i]) {
37182 stopIndex = i;
37183 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
37184 }
37185 } // Find current slide size
37186
37187
37188 var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
37189 var increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
37190
37191 if (timeDiff > params.longSwipesMs) {
37192 // Long touches
37193 if (!params.longSwipes) {
37194 swiper.slideTo(swiper.activeIndex);
37195 return;
37196 }
37197
37198 if (swiper.swipeDirection === 'next') {
37199 if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);
37200 }
37201
37202 if (swiper.swipeDirection === 'prev') {
37203 if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);
37204 }
37205 } else {
37206 // Short swipes
37207 if (!params.shortSwipes) {
37208 swiper.slideTo(swiper.activeIndex);
37209 return;
37210 }
37211
37212 var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
37213
37214 if (!isNavButtonTarget) {
37215 if (swiper.swipeDirection === 'next') {
37216 swiper.slideTo(stopIndex + increment);
37217 }
37218
37219 if (swiper.swipeDirection === 'prev') {
37220 swiper.slideTo(stopIndex);
37221 }
37222 } else if (e.target === swiper.navigation.nextEl) {
37223 swiper.slideTo(stopIndex + increment);
37224 } else {
37225 swiper.slideTo(stopIndex);
37226 }
37227 }
37228 }
37229
37230 function onResize() {
37231 var swiper = this;
37232 var params = swiper.params,
37233 el = swiper.el;
37234 if (el && el.offsetWidth === 0) return; // Breakpoints
37235
37236 if (params.breakpoints) {
37237 swiper.setBreakpoint();
37238 } // Save locks
37239
37240
37241 var allowSlideNext = swiper.allowSlideNext,
37242 allowSlidePrev = swiper.allowSlidePrev,
37243 snapGrid = swiper.snapGrid; // Disable locks on resize
37244
37245 swiper.allowSlideNext = true;
37246 swiper.allowSlidePrev = true;
37247 swiper.updateSize();
37248 swiper.updateSlides();
37249 swiper.updateSlidesClasses();
37250
37251 if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) {
37252 swiper.slideTo(swiper.slides.length - 1, 0, false, true);
37253 } else {
37254 swiper.slideTo(swiper.activeIndex, 0, false, true);
37255 }
37256
37257 if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
37258 swiper.autoplay.run();
37259 } // Return locks after resize
37260
37261
37262 swiper.allowSlidePrev = allowSlidePrev;
37263 swiper.allowSlideNext = allowSlideNext;
37264
37265 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
37266 swiper.checkOverflow();
37267 }
37268 }
37269
37270 function onClick(e) {
37271 var swiper = this;
37272 if (!swiper.enabled) return;
37273
37274 if (!swiper.allowClick) {
37275 if (swiper.params.preventClicks) e.preventDefault();
37276
37277 if (swiper.params.preventClicksPropagation && swiper.animating) {
37278 e.stopPropagation();
37279 e.stopImmediatePropagation();
37280 }
37281 }
37282 }
37283
37284 function onScroll() {
37285 var swiper = this;
37286 var wrapperEl = swiper.wrapperEl,
37287 rtlTranslate = swiper.rtlTranslate,
37288 enabled = swiper.enabled;
37289 if (!enabled) return;
37290 swiper.previousTranslate = swiper.translate;
37291
37292 if (swiper.isHorizontal()) {
37293 if (rtlTranslate) {
37294 swiper.translate = wrapperEl.scrollWidth - wrapperEl.offsetWidth - wrapperEl.scrollLeft;
37295 } else {
37296 swiper.translate = -wrapperEl.scrollLeft;
37297 }
37298 } else {
37299 swiper.translate = -wrapperEl.scrollTop;
37300 } // eslint-disable-next-line
37301
37302
37303 if (swiper.translate === -0) swiper.translate = 0;
37304 swiper.updateActiveIndex();
37305 swiper.updateSlidesClasses();
37306 var newProgress;
37307 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
37308
37309 if (translatesDiff === 0) {
37310 newProgress = 0;
37311 } else {
37312 newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
37313 }
37314
37315 if (newProgress !== swiper.progress) {
37316 swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
37317 }
37318
37319 swiper.emit('setTranslate', swiper.translate, false);
37320 }
37321
37322 var dummyEventAttached = false;
37323
37324 function dummyEventListener() {}
37325
37326 function attachEvents() {
37327 var swiper = this;
37328 var document = getDocument();
37329 var params = swiper.params,
37330 touchEvents = swiper.touchEvents,
37331 el = swiper.el,
37332 wrapperEl = swiper.wrapperEl,
37333 device = swiper.device,
37334 support = swiper.support;
37335 swiper.onTouchStart = onTouchStart.bind(swiper);
37336 swiper.onTouchMove = onTouchMove.bind(swiper);
37337 swiper.onTouchEnd = onTouchEnd.bind(swiper);
37338
37339 if (params.cssMode) {
37340 swiper.onScroll = onScroll.bind(swiper);
37341 }
37342
37343 swiper.onClick = onClick.bind(swiper);
37344 var capture = !!params.nested; // Touch Events
37345
37346 if (!support.touch && support.pointerEvents) {
37347 el.addEventListener(touchEvents.start, swiper.onTouchStart, false);
37348 document.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
37349 document.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
37350 } else {
37351 if (support.touch) {
37352 var passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? {
37353 passive: true,
37354 capture: false
37355 } : false;
37356 el.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
37357 el.addEventListener(touchEvents.move, swiper.onTouchMove, support.passiveListener ? {
37358 passive: false,
37359 capture: capture
37360 } : capture);
37361 el.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
37362
37363 if (touchEvents.cancel) {
37364 el.addEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
37365 }
37366
37367 if (!dummyEventAttached) {
37368 document.addEventListener('touchstart', dummyEventListener);
37369 dummyEventAttached = true;
37370 }
37371 }
37372
37373 if (params.simulateTouch && !device.ios && !device.android || params.simulateTouch && !support.touch && device.ios) {
37374 el.addEventListener('mousedown', swiper.onTouchStart, false);
37375 document.addEventListener('mousemove', swiper.onTouchMove, capture);
37376 document.addEventListener('mouseup', swiper.onTouchEnd, false);
37377 }
37378 } // Prevent Links Clicks
37379
37380
37381 if (params.preventClicks || params.preventClicksPropagation) {
37382 el.addEventListener('click', swiper.onClick, true);
37383 }
37384
37385 if (params.cssMode) {
37386 wrapperEl.addEventListener('scroll', swiper.onScroll);
37387 } // Resize handler
37388
37389
37390 if (params.updateOnWindowResize) {
37391 swiper.on(device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
37392 } else {
37393 swiper.on('observerUpdate', onResize, true);
37394 }
37395 }
37396
37397 function detachEvents() {
37398 var swiper = this;
37399 var document = getDocument();
37400 var params = swiper.params,
37401 touchEvents = swiper.touchEvents,
37402 el = swiper.el,
37403 wrapperEl = swiper.wrapperEl,
37404 device = swiper.device,
37405 support = swiper.support;
37406 var capture = !!params.nested; // Touch Events
37407
37408 if (!support.touch && support.pointerEvents) {
37409 el.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
37410 document.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
37411 document.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
37412 } else {
37413 if (support.touch) {
37414 var passiveListener = touchEvents.start === 'onTouchStart' && support.passiveListener && params.passiveListeners ? {
37415 passive: true,
37416 capture: false
37417 } : false;
37418 el.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
37419 el.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
37420 el.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
37421
37422 if (touchEvents.cancel) {
37423 el.removeEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
37424 }
37425 }
37426
37427 if (params.simulateTouch && !device.ios && !device.android || params.simulateTouch && !support.touch && device.ios) {
37428 el.removeEventListener('mousedown', swiper.onTouchStart, false);
37429 document.removeEventListener('mousemove', swiper.onTouchMove, capture);
37430 document.removeEventListener('mouseup', swiper.onTouchEnd, false);
37431 }
37432 } // Prevent Links Clicks
37433
37434
37435 if (params.preventClicks || params.preventClicksPropagation) {
37436 el.removeEventListener('click', swiper.onClick, true);
37437 }
37438
37439 if (params.cssMode) {
37440 wrapperEl.removeEventListener('scroll', swiper.onScroll);
37441 } // Resize handler
37442
37443
37444 swiper.off(device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize);
37445 }
37446
37447 var events = {
37448 attachEvents: attachEvents,
37449 detachEvents: detachEvents
37450 };
37451
37452 function setBreakpoint() {
37453 var swiper = this;
37454 var activeIndex = swiper.activeIndex,
37455 initialized = swiper.initialized,
37456 _swiper$loopedSlides = swiper.loopedSlides,
37457 loopedSlides = _swiper$loopedSlides === void 0 ? 0 : _swiper$loopedSlides,
37458 params = swiper.params,
37459 $el = swiper.$el;
37460 var breakpoints = params.breakpoints;
37461 if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters
37462
37463 var breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);
37464 if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
37465 var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
37466
37467 if (breakpointOnlyParams) {
37468 ['slidesPerView', 'spaceBetween', 'slidesPerGroup', 'slidesPerGroupSkip', 'slidesPerColumn'].forEach(function (param) {
37469 var paramValue = breakpointOnlyParams[param];
37470 if (typeof paramValue === 'undefined') return;
37471
37472 if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
37473 breakpointOnlyParams[param] = 'auto';
37474 } else if (param === 'slidesPerView') {
37475 breakpointOnlyParams[param] = parseFloat(paramValue);
37476 } else {
37477 breakpointOnlyParams[param] = parseInt(paramValue, 10);
37478 }
37479 });
37480 }
37481
37482 var breakpointParams = breakpointOnlyParams || swiper.originalParams;
37483 var wasMultiRow = params.slidesPerColumn > 1;
37484 var isMultiRow = breakpointParams.slidesPerColumn > 1;
37485 var wasEnabled = params.enabled;
37486
37487 if (wasMultiRow && !isMultiRow) {
37488 $el.removeClass(params.containerModifierClass + "multirow " + params.containerModifierClass + "multirow-column");
37489 swiper.emitContainerClasses();
37490 } else if (!wasMultiRow && isMultiRow) {
37491 $el.addClass(params.containerModifierClass + "multirow");
37492
37493 if (breakpointParams.slidesPerColumnFill === 'column') {
37494 $el.addClass(params.containerModifierClass + "multirow-column");
37495 }
37496
37497 swiper.emitContainerClasses();
37498 }
37499
37500 var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
37501 var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
37502
37503 if (directionChanged && initialized) {
37504 swiper.changeDirection();
37505 }
37506
37507 extend(swiper.params, breakpointParams);
37508 var isEnabled = swiper.params.enabled;
37509 extend(swiper, {
37510 allowTouchMove: swiper.params.allowTouchMove,
37511 allowSlideNext: swiper.params.allowSlideNext,
37512 allowSlidePrev: swiper.params.allowSlidePrev
37513 });
37514
37515 if (wasEnabled && !isEnabled) {
37516 swiper.disable();
37517 } else if (!wasEnabled && isEnabled) {
37518 swiper.enable();
37519 }
37520
37521 swiper.currentBreakpoint = breakpoint;
37522 swiper.emit('_beforeBreakpoint', breakpointParams);
37523
37524 if (needsReLoop && initialized) {
37525 swiper.loopDestroy();
37526 swiper.loopCreate();
37527 swiper.updateSlides();
37528 swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);
37529 }
37530
37531 swiper.emit('breakpoint', breakpointParams);
37532 }
37533
37534 function getBreakpoint(breakpoints, base, containerEl) {
37535 if (base === void 0) {
37536 base = 'window';
37537 }
37538
37539 if (!breakpoints || base === 'container' && !containerEl) return undefined;
37540 var breakpoint = false;
37541 var window = getWindow();
37542 var currentWidth = base === 'window' ? window.innerWidth : containerEl.clientWidth;
37543 var currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
37544 var points = Object.keys(breakpoints).map(function (point) {
37545 if (typeof point === 'string' && point.indexOf('@') === 0) {
37546 var minRatio = parseFloat(point.substr(1));
37547 var value = currentHeight * minRatio;
37548 return {
37549 value: value,
37550 point: point
37551 };
37552 }
37553
37554 return {
37555 value: point,
37556 point: point
37557 };
37558 });
37559 points.sort(function (a, b) {
37560 return parseInt(a.value, 10) - parseInt(b.value, 10);
37561 });
37562
37563 for (var i = 0; i < points.length; i += 1) {
37564 var _points$i = points[i],
37565 point = _points$i.point,
37566 value = _points$i.value;
37567
37568 if (value <= currentWidth) {
37569 breakpoint = point;
37570 }
37571 }
37572
37573 return breakpoint || 'max';
37574 }
37575
37576 var breakpoints = {
37577 setBreakpoint: setBreakpoint,
37578 getBreakpoint: getBreakpoint
37579 };
37580
37581 function prepareClasses(entries, prefix) {
37582 var resultClasses = [];
37583 entries.forEach(function (item) {
37584 if (typeof item === 'object') {
37585 Object.keys(item).forEach(function (classNames) {
37586 if (item[classNames]) {
37587 resultClasses.push(prefix + classNames);
37588 }
37589 });
37590 } else if (typeof item === 'string') {
37591 resultClasses.push(prefix + item);
37592 }
37593 });
37594 return resultClasses;
37595 }
37596
37597 function addClasses() {
37598 var swiper = this;
37599 var classNames = swiper.classNames,
37600 params = swiper.params,
37601 rtl = swiper.rtl,
37602 $el = swiper.$el,
37603 device = swiper.device,
37604 support = swiper.support; // prettier-ignore
37605
37606 var suffixes = prepareClasses(['initialized', params.direction, {
37607 'pointer-events': support.pointerEvents && !support.touch
37608 }, {
37609 'free-mode': params.freeMode
37610 }, {
37611 'autoheight': params.autoHeight
37612 }, {
37613 'rtl': rtl
37614 }, {
37615 'multirow': params.slidesPerColumn > 1
37616 }, {
37617 'multirow-column': params.slidesPerColumn > 1 && params.slidesPerColumnFill === 'column'
37618 }, {
37619 'android': device.android
37620 }, {
37621 'ios': device.ios
37622 }, {
37623 'css-mode': params.cssMode
37624 }], params.containerModifierClass);
37625 classNames.push.apply(classNames, suffixes);
37626 $el.addClass([].concat(classNames).join(' '));
37627 swiper.emitContainerClasses();
37628 }
37629
37630 function removeClasses() {
37631 var swiper = this;
37632 var $el = swiper.$el,
37633 classNames = swiper.classNames;
37634 $el.removeClass(classNames.join(' '));
37635 swiper.emitContainerClasses();
37636 }
37637
37638 var classes = {
37639 addClasses: addClasses,
37640 removeClasses: removeClasses
37641 };
37642
37643 function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {
37644 var window = getWindow();
37645 var image;
37646
37647 function onReady() {
37648 if (callback) callback();
37649 }
37650
37651 var isPicture = $$1(imageEl).parent('picture')[0];
37652
37653 if (!isPicture && (!imageEl.complete || !checkForComplete)) {
37654 if (src) {
37655 image = new window.Image();
37656 image.onload = onReady;
37657 image.onerror = onReady;
37658
37659 if (sizes) {
37660 image.sizes = sizes;
37661 }
37662
37663 if (srcset) {
37664 image.srcset = srcset;
37665 }
37666
37667 if (src) {
37668 image.src = src;
37669 }
37670 } else {
37671 onReady();
37672 }
37673 } else {
37674 // image already loaded...
37675 onReady();
37676 }
37677 }
37678
37679 function preloadImages() {
37680 var swiper = this;
37681 swiper.imagesToLoad = swiper.$el.find('img');
37682
37683 function onReady() {
37684 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;
37685 if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;
37686
37687 if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
37688 if (swiper.params.updateOnImagesReady) swiper.update();
37689 swiper.emit('imagesReady');
37690 }
37691 }
37692
37693 for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
37694 var imageEl = swiper.imagesToLoad[i];
37695 swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady);
37696 }
37697 }
37698
37699 var images = {
37700 loadImage: loadImage,
37701 preloadImages: preloadImages
37702 };
37703
37704 function checkOverflow() {
37705 var swiper = this;
37706 var params = swiper.params;
37707 var wasLocked = swiper.isLocked;
37708 var lastSlidePosition = swiper.slides.length > 0 && params.slidesOffsetBefore + params.spaceBetween * (swiper.slides.length - 1) + swiper.slides[0].offsetWidth * swiper.slides.length;
37709
37710 if (params.slidesOffsetBefore && params.slidesOffsetAfter && lastSlidePosition) {
37711 swiper.isLocked = lastSlidePosition <= swiper.size;
37712 } else {
37713 swiper.isLocked = swiper.snapGrid.length === 1;
37714 }
37715
37716 swiper.allowSlideNext = !swiper.isLocked;
37717 swiper.allowSlidePrev = !swiper.isLocked; // events
37718
37719 if (wasLocked !== swiper.isLocked) swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
37720
37721 if (wasLocked && wasLocked !== swiper.isLocked) {
37722 swiper.isEnd = false;
37723 if (swiper.navigation) swiper.navigation.update();
37724 }
37725 }
37726
37727 var checkOverflow$1 = {
37728 checkOverflow: checkOverflow
37729 };
37730
37731 var defaults = {
37732 init: true,
37733 direction: 'horizontal',
37734 touchEventsTarget: 'container',
37735 initialSlide: 0,
37736 speed: 300,
37737 cssMode: false,
37738 updateOnWindowResize: true,
37739 resizeObserver: false,
37740 nested: false,
37741 enabled: true,
37742 // Overrides
37743 width: null,
37744 height: null,
37745 //
37746 preventInteractionOnTransition: false,
37747 // ssr
37748 userAgent: null,
37749 url: null,
37750 // To support iOS's swipe-to-go-back gesture (when being used in-app).
37751 edgeSwipeDetection: false,
37752 edgeSwipeThreshold: 20,
37753 // Free mode
37754 freeMode: false,
37755 freeModeMomentum: true,
37756 freeModeMomentumRatio: 1,
37757 freeModeMomentumBounce: true,
37758 freeModeMomentumBounceRatio: 1,
37759 freeModeMomentumVelocityRatio: 1,
37760 freeModeSticky: false,
37761 freeModeMinimumVelocity: 0.02,
37762 // Autoheight
37763 autoHeight: false,
37764 // Set wrapper width
37765 setWrapperSize: false,
37766 // Virtual Translate
37767 virtualTranslate: false,
37768 // Effects
37769 effect: 'slide',
37770 // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
37771 // Breakpoints
37772 breakpoints: undefined,
37773 breakpointsBase: 'window',
37774 // Slides grid
37775 spaceBetween: 0,
37776 slidesPerView: 1,
37777 slidesPerColumn: 1,
37778 slidesPerColumnFill: 'column',
37779 slidesPerGroup: 1,
37780 slidesPerGroupSkip: 0,
37781 centeredSlides: false,
37782 centeredSlidesBounds: false,
37783 slidesOffsetBefore: 0,
37784 // in px
37785 slidesOffsetAfter: 0,
37786 // in px
37787 normalizeSlideIndex: true,
37788 centerInsufficientSlides: false,
37789 // Disable swiper and hide navigation when container not overflow
37790 watchOverflow: false,
37791 // Round length
37792 roundLengths: false,
37793 // Touches
37794 touchRatio: 1,
37795 touchAngle: 45,
37796 simulateTouch: true,
37797 shortSwipes: true,
37798 longSwipes: true,
37799 longSwipesRatio: 0.5,
37800 longSwipesMs: 300,
37801 followFinger: true,
37802 allowTouchMove: true,
37803 threshold: 0,
37804 touchMoveStopPropagation: false,
37805 touchStartPreventDefault: true,
37806 touchStartForcePreventDefault: false,
37807 touchReleaseOnEdges: false,
37808 // Unique Navigation Elements
37809 uniqueNavElements: true,
37810 // Resistance
37811 resistance: true,
37812 resistanceRatio: 0.85,
37813 // Progress
37814 watchSlidesProgress: false,
37815 watchSlidesVisibility: false,
37816 // Cursor
37817 grabCursor: false,
37818 // Clicks
37819 preventClicks: true,
37820 preventClicksPropagation: true,
37821 slideToClickedSlide: false,
37822 // Images
37823 preloadImages: true,
37824 updateOnImagesReady: true,
37825 // loop
37826 loop: false,
37827 loopAdditionalSlides: 0,
37828 loopedSlides: null,
37829 loopFillGroupWithBlank: false,
37830 loopPreventsSlide: true,
37831 // Swiping/no swiping
37832 allowSlidePrev: true,
37833 allowSlideNext: true,
37834 swipeHandler: null,
37835 // '.swipe-handler',
37836 noSwiping: true,
37837 noSwipingClass: 'swiper-no-swiping',
37838 noSwipingSelector: null,
37839 // Passive Listeners
37840 passiveListeners: true,
37841 // NS
37842 containerModifierClass: 'swiper-container-',
37843 // NEW
37844 slideClass: 'swiper-slide',
37845 slideBlankClass: 'swiper-slide-invisible-blank',
37846 slideActiveClass: 'swiper-slide-active',
37847 slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
37848 slideVisibleClass: 'swiper-slide-visible',
37849 slideDuplicateClass: 'swiper-slide-duplicate',
37850 slideNextClass: 'swiper-slide-next',
37851 slideDuplicateNextClass: 'swiper-slide-duplicate-next',
37852 slidePrevClass: 'swiper-slide-prev',
37853 slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
37854 wrapperClass: 'swiper-wrapper',
37855 // Callbacks
37856 runCallbacksOnInit: true,
37857 // Internals
37858 _emitClasses: false
37859 };
37860
37861 function _defineProperties(target, props) {
37862 for (var i = 0; i < props.length; i++) {
37863 var descriptor = props[i];
37864 descriptor.enumerable = descriptor.enumerable || false;
37865 descriptor.configurable = true;
37866 if ("value" in descriptor) descriptor.writable = true;
37867 Object.defineProperty(target, descriptor.key, descriptor);
37868 }
37869 }
37870
37871 function _createClass(Constructor, protoProps, staticProps) {
37872 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
37873 if (staticProps) _defineProperties(Constructor, staticProps);
37874 return Constructor;
37875 }
37876 var prototypes = {
37877 modular: modular,
37878 eventsEmitter: eventsEmitter,
37879 update: update,
37880 translate: translate,
37881 transition: transition,
37882 slide: slide,
37883 loop: loop,
37884 grabCursor: grabCursor,
37885 manipulation: manipulation,
37886 events: events,
37887 breakpoints: breakpoints,
37888 checkOverflow: checkOverflow$1,
37889 classes: classes,
37890 images: images
37891 };
37892 var extendedDefaults = {};
37893
37894 var Swiper$1 = /*#__PURE__*/function () {
37895 function Swiper() {
37896 var el;
37897 var params;
37898
37899 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
37900 args[_key] = arguments[_key];
37901 }
37902
37903 if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
37904 params = args[0];
37905 } else {
37906 el = args[0];
37907 params = args[1];
37908 }
37909
37910 if (!params) params = {};
37911 params = extend({}, params);
37912 if (el && !params.el) params.el = el;
37913
37914 if (params.el && $$1(params.el).length > 1) {
37915 var swipers = [];
37916 $$1(params.el).each(function (containerEl) {
37917 var newParams = extend({}, params, {
37918 el: containerEl
37919 });
37920 swipers.push(new Swiper(newParams));
37921 });
37922 return swipers;
37923 } // Swiper Instance
37924
37925
37926 var swiper = this;
37927 swiper.__swiper__ = true;
37928 swiper.support = getSupport();
37929 swiper.device = getDevice({
37930 userAgent: params.userAgent
37931 });
37932 swiper.browser = getBrowser();
37933 swiper.eventsListeners = {};
37934 swiper.eventsAnyListeners = [];
37935
37936 if (typeof swiper.modules === 'undefined') {
37937 swiper.modules = {};
37938 }
37939
37940 Object.keys(swiper.modules).forEach(function (moduleName) {
37941 var module = swiper.modules[moduleName];
37942
37943 if (module.params) {
37944 var moduleParamName = Object.keys(module.params)[0];
37945 var moduleParams = module.params[moduleParamName];
37946 if (typeof moduleParams !== 'object' || moduleParams === null) return;
37947 if (!(moduleParamName in params && 'enabled' in moduleParams)) return;
37948
37949 if (params[moduleParamName] === true) {
37950 params[moduleParamName] = {
37951 enabled: true
37952 };
37953 }
37954
37955 if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {
37956 params[moduleParamName].enabled = true;
37957 }
37958
37959 if (!params[moduleParamName]) params[moduleParamName] = {
37960 enabled: false
37961 };
37962 }
37963 }); // Extend defaults with modules params
37964
37965 var swiperParams = extend({}, defaults);
37966 swiper.useParams(swiperParams); // Extend defaults with passed params
37967
37968 swiper.params = extend({}, swiperParams, extendedDefaults, params);
37969 swiper.originalParams = extend({}, swiper.params);
37970 swiper.passedParams = extend({}, params); // add event listeners
37971
37972 if (swiper.params && swiper.params.on) {
37973 Object.keys(swiper.params.on).forEach(function (eventName) {
37974 swiper.on(eventName, swiper.params.on[eventName]);
37975 });
37976 }
37977
37978 if (swiper.params && swiper.params.onAny) {
37979 swiper.onAny(swiper.params.onAny);
37980 } // Save Dom lib
37981
37982
37983 swiper.$ = $$1; // Extend Swiper
37984
37985 extend(swiper, {
37986 enabled: swiper.params.enabled,
37987 el: el,
37988 // Classes
37989 classNames: [],
37990 // Slides
37991 slides: $$1(),
37992 slidesGrid: [],
37993 snapGrid: [],
37994 slidesSizesGrid: [],
37995 // isDirection
37996 isHorizontal: function isHorizontal() {
37997 return swiper.params.direction === 'horizontal';
37998 },
37999 isVertical: function isVertical() {
38000 return swiper.params.direction === 'vertical';
38001 },
38002 // Indexes
38003 activeIndex: 0,
38004 realIndex: 0,
38005 //
38006 isBeginning: true,
38007 isEnd: false,
38008 // Props
38009 translate: 0,
38010 previousTranslate: 0,
38011 progress: 0,
38012 velocity: 0,
38013 animating: false,
38014 // Locks
38015 allowSlideNext: swiper.params.allowSlideNext,
38016 allowSlidePrev: swiper.params.allowSlidePrev,
38017 // Touch Events
38018 touchEvents: function touchEvents() {
38019 var touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
38020 var desktop = ['mousedown', 'mousemove', 'mouseup'];
38021
38022 if (swiper.support.pointerEvents) {
38023 desktop = ['pointerdown', 'pointermove', 'pointerup'];
38024 }
38025
38026 swiper.touchEventsTouch = {
38027 start: touch[0],
38028 move: touch[1],
38029 end: touch[2],
38030 cancel: touch[3]
38031 };
38032 swiper.touchEventsDesktop = {
38033 start: desktop[0],
38034 move: desktop[1],
38035 end: desktop[2]
38036 };
38037 return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
38038 }(),
38039 touchEventsData: {
38040 isTouched: undefined,
38041 isMoved: undefined,
38042 allowTouchCallbacks: undefined,
38043 touchStartTime: undefined,
38044 isScrolling: undefined,
38045 currentTranslate: undefined,
38046 startTranslate: undefined,
38047 allowThresholdMove: undefined,
38048 // Form elements to match
38049 formElements: 'input, select, option, textarea, button, video, label',
38050 // Last click time
38051 lastClickTime: now(),
38052 clickTimeout: undefined,
38053 // Velocities
38054 velocities: [],
38055 allowMomentumBounce: undefined,
38056 isTouchEvent: undefined,
38057 startMoving: undefined
38058 },
38059 // Clicks
38060 allowClick: true,
38061 // Touches
38062 allowTouchMove: swiper.params.allowTouchMove,
38063 touches: {
38064 startX: 0,
38065 startY: 0,
38066 currentX: 0,
38067 currentY: 0,
38068 diff: 0
38069 },
38070 // Images
38071 imagesToLoad: [],
38072 imagesLoaded: 0
38073 }); // Install Modules
38074
38075 swiper.useModules();
38076 swiper.emit('_swiper'); // Init
38077
38078 if (swiper.params.init) {
38079 swiper.init();
38080 } // Return app instance
38081
38082
38083 return swiper;
38084 }
38085
38086 var _proto = Swiper.prototype;
38087
38088 _proto.enable = function enable() {
38089 var swiper = this;
38090 if (swiper.enabled) return;
38091 swiper.enabled = true;
38092
38093 if (swiper.params.grabCursor) {
38094 swiper.setGrabCursor();
38095 }
38096
38097 swiper.emit('enable');
38098 };
38099
38100 _proto.disable = function disable() {
38101 var swiper = this;
38102 if (!swiper.enabled) return;
38103 swiper.enabled = false;
38104
38105 if (swiper.params.grabCursor) {
38106 swiper.unsetGrabCursor();
38107 }
38108
38109 swiper.emit('disable');
38110 };
38111
38112 _proto.setProgress = function setProgress(progress, speed) {
38113 var swiper = this;
38114 progress = Math.min(Math.max(progress, 0), 1);
38115 var min = swiper.minTranslate();
38116 var max = swiper.maxTranslate();
38117 var current = (max - min) * progress + min;
38118 swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);
38119 swiper.updateActiveIndex();
38120 swiper.updateSlidesClasses();
38121 };
38122
38123 _proto.emitContainerClasses = function emitContainerClasses() {
38124 var swiper = this;
38125 if (!swiper.params._emitClasses || !swiper.el) return;
38126 var classes = swiper.el.className.split(' ').filter(function (className) {
38127 return className.indexOf('swiper-container') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
38128 });
38129 swiper.emit('_containerClasses', classes.join(' '));
38130 };
38131
38132 _proto.getSlideClasses = function getSlideClasses(slideEl) {
38133 var swiper = this;
38134 return slideEl.className.split(' ').filter(function (className) {
38135 return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
38136 }).join(' ');
38137 };
38138
38139 _proto.emitSlidesClasses = function emitSlidesClasses() {
38140 var swiper = this;
38141 if (!swiper.params._emitClasses || !swiper.el) return;
38142 var updates = [];
38143 swiper.slides.each(function (slideEl) {
38144 var classNames = swiper.getSlideClasses(slideEl);
38145 updates.push({
38146 slideEl: slideEl,
38147 classNames: classNames
38148 });
38149 swiper.emit('_slideClass', slideEl, classNames);
38150 });
38151 swiper.emit('_slideClasses', updates);
38152 };
38153
38154 _proto.slidesPerViewDynamic = function slidesPerViewDynamic() {
38155 var swiper = this;
38156 var params = swiper.params,
38157 slides = swiper.slides,
38158 slidesGrid = swiper.slidesGrid,
38159 swiperSize = swiper.size,
38160 activeIndex = swiper.activeIndex;
38161 var spv = 1;
38162
38163 if (params.centeredSlides) {
38164 var slideSize = slides[activeIndex].swiperSlideSize;
38165 var breakLoop;
38166
38167 for (var i = activeIndex + 1; i < slides.length; i += 1) {
38168 if (slides[i] && !breakLoop) {
38169 slideSize += slides[i].swiperSlideSize;
38170 spv += 1;
38171 if (slideSize > swiperSize) breakLoop = true;
38172 }
38173 }
38174
38175 for (var _i = activeIndex - 1; _i >= 0; _i -= 1) {
38176 if (slides[_i] && !breakLoop) {
38177 slideSize += slides[_i].swiperSlideSize;
38178 spv += 1;
38179 if (slideSize > swiperSize) breakLoop = true;
38180 }
38181 }
38182 } else {
38183 for (var _i2 = activeIndex + 1; _i2 < slides.length; _i2 += 1) {
38184 if (slidesGrid[_i2] - slidesGrid[activeIndex] < swiperSize) {
38185 spv += 1;
38186 }
38187 }
38188 }
38189
38190 return spv;
38191 };
38192
38193 _proto.update = function update() {
38194 var swiper = this;
38195 if (!swiper || swiper.destroyed) return;
38196 var snapGrid = swiper.snapGrid,
38197 params = swiper.params; // Breakpoints
38198
38199 if (params.breakpoints) {
38200 swiper.setBreakpoint();
38201 }
38202
38203 swiper.updateSize();
38204 swiper.updateSlides();
38205 swiper.updateProgress();
38206 swiper.updateSlidesClasses();
38207
38208 function setTranslate() {
38209 var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
38210 var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
38211 swiper.setTranslate(newTranslate);
38212 swiper.updateActiveIndex();
38213 swiper.updateSlidesClasses();
38214 }
38215
38216 var translated;
38217
38218 if (swiper.params.freeMode) {
38219 setTranslate();
38220
38221 if (swiper.params.autoHeight) {
38222 swiper.updateAutoHeight();
38223 }
38224 } else {
38225 if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
38226 translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
38227 } else {
38228 translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
38229 }
38230
38231 if (!translated) {
38232 setTranslate();
38233 }
38234 }
38235
38236 if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
38237 swiper.checkOverflow();
38238 }
38239
38240 swiper.emit('update');
38241 };
38242
38243 _proto.changeDirection = function changeDirection(newDirection, needUpdate) {
38244 if (needUpdate === void 0) {
38245 needUpdate = true;
38246 }
38247
38248 var swiper = this;
38249 var currentDirection = swiper.params.direction;
38250
38251 if (!newDirection) {
38252 // eslint-disable-next-line
38253 newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
38254 }
38255
38256 if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
38257 return swiper;
38258 }
38259
38260 swiper.$el.removeClass("" + swiper.params.containerModifierClass + currentDirection).addClass("" + swiper.params.containerModifierClass + newDirection);
38261 swiper.emitContainerClasses();
38262 swiper.params.direction = newDirection;
38263 swiper.slides.each(function (slideEl) {
38264 if (newDirection === 'vertical') {
38265 slideEl.style.width = '';
38266 } else {
38267 slideEl.style.height = '';
38268 }
38269 });
38270 swiper.emit('changeDirection');
38271 if (needUpdate) swiper.update();
38272 return swiper;
38273 };
38274
38275 _proto.mount = function mount(el) {
38276 var swiper = this;
38277 if (swiper.mounted) return true; // Find el
38278
38279 var $el = $$1(el || swiper.params.el);
38280 el = $el[0];
38281
38282 if (!el) {
38283 return false;
38284 }
38285
38286 el.swiper = swiper; // Find Wrapper
38287
38288 var $wrapperEl;
38289
38290 if (el && el.shadowRoot && el.shadowRoot.querySelector) {
38291 $wrapperEl = $$1(el.shadowRoot.querySelector("." + swiper.params.wrapperClass)); // Children needs to return slot items
38292
38293 $wrapperEl.children = function (options) {
38294 return $el.children(options);
38295 };
38296 } else {
38297 $wrapperEl = $el.children("." + swiper.params.wrapperClass);
38298 }
38299
38300 extend(swiper, {
38301 $el: $el,
38302 el: el,
38303 $wrapperEl: $wrapperEl,
38304 wrapperEl: $wrapperEl[0],
38305 mounted: true,
38306 // RTL
38307 rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',
38308 rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
38309 wrongRTL: $wrapperEl.css('display') === '-webkit-box'
38310 });
38311 return true;
38312 };
38313
38314 _proto.init = function init(el) {
38315 var swiper = this;
38316 if (swiper.initialized) return swiper;
38317 var mounted = swiper.mount(el);
38318 if (mounted === false) return swiper;
38319 swiper.emit('beforeInit'); // Set breakpoint
38320
38321 if (swiper.params.breakpoints) {
38322 swiper.setBreakpoint();
38323 } // Add Classes
38324
38325
38326 swiper.addClasses(); // Create loop
38327
38328 if (swiper.params.loop) {
38329 swiper.loopCreate();
38330 } // Update size
38331
38332
38333 swiper.updateSize(); // Update slides
38334
38335 swiper.updateSlides();
38336
38337 if (swiper.params.watchOverflow) {
38338 swiper.checkOverflow();
38339 } // Set Grab Cursor
38340
38341
38342 if (swiper.params.grabCursor && swiper.enabled) {
38343 swiper.setGrabCursor();
38344 }
38345
38346 if (swiper.params.preloadImages) {
38347 swiper.preloadImages();
38348 } // Slide To Initial Slide
38349
38350
38351 if (swiper.params.loop) {
38352 swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true);
38353 } else {
38354 swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
38355 } // Attach events
38356
38357
38358 swiper.attachEvents(); // Init Flag
38359
38360 swiper.initialized = true; // Emit
38361
38362 swiper.emit('init');
38363 swiper.emit('afterInit');
38364 return swiper;
38365 };
38366
38367 _proto.destroy = function destroy(deleteInstance, cleanStyles) {
38368 if (deleteInstance === void 0) {
38369 deleteInstance = true;
38370 }
38371
38372 if (cleanStyles === void 0) {
38373 cleanStyles = true;
38374 }
38375
38376 var swiper = this;
38377 var params = swiper.params,
38378 $el = swiper.$el,
38379 $wrapperEl = swiper.$wrapperEl,
38380 slides = swiper.slides;
38381
38382 if (typeof swiper.params === 'undefined' || swiper.destroyed) {
38383 return null;
38384 }
38385
38386 swiper.emit('beforeDestroy'); // Init Flag
38387
38388 swiper.initialized = false; // Detach events
38389
38390 swiper.detachEvents(); // Destroy loop
38391
38392 if (params.loop) {
38393 swiper.loopDestroy();
38394 } // Cleanup styles
38395
38396
38397 if (cleanStyles) {
38398 swiper.removeClasses();
38399 $el.removeAttr('style');
38400 $wrapperEl.removeAttr('style');
38401
38402 if (slides && slides.length) {
38403 slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index');
38404 }
38405 }
38406
38407 swiper.emit('destroy'); // Detach emitter events
38408
38409 Object.keys(swiper.eventsListeners).forEach(function (eventName) {
38410 swiper.off(eventName);
38411 });
38412
38413 if (deleteInstance !== false) {
38414 swiper.$el[0].swiper = null;
38415 deleteProps(swiper);
38416 }
38417
38418 swiper.destroyed = true;
38419 return null;
38420 };
38421
38422 Swiper.extendDefaults = function extendDefaults(newDefaults) {
38423 extend(extendedDefaults, newDefaults);
38424 };
38425
38426 Swiper.installModule = function installModule(module) {
38427 if (!Swiper.prototype.modules) Swiper.prototype.modules = {};
38428 var name = module.name || Object.keys(Swiper.prototype.modules).length + "_" + now();
38429 Swiper.prototype.modules[name] = module;
38430 };
38431
38432 Swiper.use = function use(module) {
38433 if (Array.isArray(module)) {
38434 module.forEach(function (m) {
38435 return Swiper.installModule(m);
38436 });
38437 return Swiper;
38438 }
38439
38440 Swiper.installModule(module);
38441 return Swiper;
38442 };
38443
38444 _createClass(Swiper, null, [{
38445 key: "extendedDefaults",
38446 get: function get() {
38447 return extendedDefaults;
38448 }
38449 }, {
38450 key: "defaults",
38451 get: function get() {
38452 return defaults;
38453 }
38454 }]);
38455
38456 return Swiper;
38457 }();
38458
38459 Object.keys(prototypes).forEach(function (prototypeGroup) {
38460 Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
38461 Swiper$1.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
38462 });
38463 });
38464 Swiper$1.use([Resize, Observer$1]);
38465
38466 function _extends$h() {
38467 _extends$h = Object.assign || function (target) {
38468 for (var i = 1; i < arguments.length; i++) {
38469 var source = arguments[i];
38470
38471 for (var key in source) {
38472 if (Object.prototype.hasOwnProperty.call(source, key)) {
38473 target[key] = source[key];
38474 }
38475 }
38476 }
38477
38478 return target;
38479 };
38480
38481 return _extends$h.apply(this, arguments);
38482 }
38483 var Virtual = {
38484 update: function update(force) {
38485 var swiper = this;
38486 var _swiper$params = swiper.params,
38487 slidesPerView = _swiper$params.slidesPerView,
38488 slidesPerGroup = _swiper$params.slidesPerGroup,
38489 centeredSlides = _swiper$params.centeredSlides;
38490 var _swiper$params$virtua = swiper.params.virtual,
38491 addSlidesBefore = _swiper$params$virtua.addSlidesBefore,
38492 addSlidesAfter = _swiper$params$virtua.addSlidesAfter;
38493 var _swiper$virtual = swiper.virtual,
38494 previousFrom = _swiper$virtual.from,
38495 previousTo = _swiper$virtual.to,
38496 slides = _swiper$virtual.slides,
38497 previousSlidesGrid = _swiper$virtual.slidesGrid,
38498 renderSlide = _swiper$virtual.renderSlide,
38499 previousOffset = _swiper$virtual.offset;
38500 swiper.updateActiveIndex();
38501 var activeIndex = swiper.activeIndex || 0;
38502 var offsetProp;
38503 if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';
38504 var slidesAfter;
38505 var slidesBefore;
38506
38507 if (centeredSlides) {
38508 slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
38509 slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
38510 } else {
38511 slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;
38512 slidesBefore = slidesPerGroup + addSlidesBefore;
38513 }
38514
38515 var from = Math.max((activeIndex || 0) - slidesBefore, 0);
38516 var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
38517 var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
38518 extend(swiper.virtual, {
38519 from: from,
38520 to: to,
38521 offset: offset,
38522 slidesGrid: swiper.slidesGrid
38523 });
38524
38525 function onRendered() {
38526 swiper.updateSlides();
38527 swiper.updateProgress();
38528 swiper.updateSlidesClasses();
38529
38530 if (swiper.lazy && swiper.params.lazy.enabled) {
38531 swiper.lazy.load();
38532 }
38533 }
38534
38535 if (previousFrom === from && previousTo === to && !force) {
38536 if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
38537 swiper.slides.css(offsetProp, offset + "px");
38538 }
38539
38540 swiper.updateProgress();
38541 return;
38542 }
38543
38544 if (swiper.params.virtual.renderExternal) {
38545 swiper.params.virtual.renderExternal.call(swiper, {
38546 offset: offset,
38547 from: from,
38548 to: to,
38549 slides: function getSlides() {
38550 var slidesToRender = [];
38551
38552 for (var i = from; i <= to; i += 1) {
38553 slidesToRender.push(slides[i]);
38554 }
38555
38556 return slidesToRender;
38557 }()
38558 });
38559
38560 if (swiper.params.virtual.renderExternalUpdate) {
38561 onRendered();
38562 }
38563
38564 return;
38565 }
38566
38567 var prependIndexes = [];
38568 var appendIndexes = [];
38569
38570 if (force) {
38571 swiper.$wrapperEl.find("." + swiper.params.slideClass).remove();
38572 } else {
38573 for (var i = previousFrom; i <= previousTo; i += 1) {
38574 if (i < from || i > to) {
38575 swiper.$wrapperEl.find("." + swiper.params.slideClass + "[data-swiper-slide-index=\"" + i + "\"]").remove();
38576 }
38577 }
38578 }
38579
38580 for (var _i = 0; _i < slides.length; _i += 1) {
38581 if (_i >= from && _i <= to) {
38582 if (typeof previousTo === 'undefined' || force) {
38583 appendIndexes.push(_i);
38584 } else {
38585 if (_i > previousTo) appendIndexes.push(_i);
38586 if (_i < previousFrom) prependIndexes.push(_i);
38587 }
38588 }
38589 }
38590
38591 appendIndexes.forEach(function (index) {
38592 swiper.$wrapperEl.append(renderSlide(slides[index], index));
38593 });
38594 prependIndexes.sort(function (a, b) {
38595 return b - a;
38596 }).forEach(function (index) {
38597 swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
38598 });
38599 swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, offset + "px");
38600 onRendered();
38601 },
38602 renderSlide: function renderSlide(slide, index) {
38603 var swiper = this;
38604 var params = swiper.params.virtual;
38605
38606 if (params.cache && swiper.virtual.cache[index]) {
38607 return swiper.virtual.cache[index];
38608 }
38609
38610 var $slideEl = params.renderSlide ? $$1(params.renderSlide.call(swiper, slide, index)) : $$1("<div class=\"" + swiper.params.slideClass + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>");
38611 if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);
38612 if (params.cache) swiper.virtual.cache[index] = $slideEl;
38613 return $slideEl;
38614 },
38615 appendSlide: function appendSlide(slides) {
38616 var swiper = this;
38617
38618 if (typeof slides === 'object' && 'length' in slides) {
38619 for (var i = 0; i < slides.length; i += 1) {
38620 if (slides[i]) swiper.virtual.slides.push(slides[i]);
38621 }
38622 } else {
38623 swiper.virtual.slides.push(slides);
38624 }
38625
38626 swiper.virtual.update(true);
38627 },
38628 prependSlide: function prependSlide(slides) {
38629 var swiper = this;
38630 var activeIndex = swiper.activeIndex;
38631 var newActiveIndex = activeIndex + 1;
38632 var numberOfNewSlides = 1;
38633
38634 if (Array.isArray(slides)) {
38635 for (var i = 0; i < slides.length; i += 1) {
38636 if (slides[i]) swiper.virtual.slides.unshift(slides[i]);
38637 }
38638
38639 newActiveIndex = activeIndex + slides.length;
38640 numberOfNewSlides = slides.length;
38641 } else {
38642 swiper.virtual.slides.unshift(slides);
38643 }
38644
38645 if (swiper.params.virtual.cache) {
38646 var cache = swiper.virtual.cache;
38647 var newCache = {};
38648 Object.keys(cache).forEach(function (cachedIndex) {
38649 var $cachedEl = cache[cachedIndex];
38650 var cachedElIndex = $cachedEl.attr('data-swiper-slide-index');
38651
38652 if (cachedElIndex) {
38653 $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + 1);
38654 }
38655
38656 newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;
38657 });
38658 swiper.virtual.cache = newCache;
38659 }
38660
38661 swiper.virtual.update(true);
38662 swiper.slideTo(newActiveIndex, 0);
38663 },
38664 removeSlide: function removeSlide(slidesIndexes) {
38665 var swiper = this;
38666 if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;
38667 var activeIndex = swiper.activeIndex;
38668
38669 if (Array.isArray(slidesIndexes)) {
38670 for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
38671 swiper.virtual.slides.splice(slidesIndexes[i], 1);
38672
38673 if (swiper.params.virtual.cache) {
38674 delete swiper.virtual.cache[slidesIndexes[i]];
38675 }
38676
38677 if (slidesIndexes[i] < activeIndex) activeIndex -= 1;
38678 activeIndex = Math.max(activeIndex, 0);
38679 }
38680 } else {
38681 swiper.virtual.slides.splice(slidesIndexes, 1);
38682
38683 if (swiper.params.virtual.cache) {
38684 delete swiper.virtual.cache[slidesIndexes];
38685 }
38686
38687 if (slidesIndexes < activeIndex) activeIndex -= 1;
38688 activeIndex = Math.max(activeIndex, 0);
38689 }
38690
38691 swiper.virtual.update(true);
38692 swiper.slideTo(activeIndex, 0);
38693 },
38694 removeAllSlides: function removeAllSlides() {
38695 var swiper = this;
38696 swiper.virtual.slides = [];
38697
38698 if (swiper.params.virtual.cache) {
38699 swiper.virtual.cache = {};
38700 }
38701
38702 swiper.virtual.update(true);
38703 swiper.slideTo(0, 0);
38704 }
38705 };
38706 var Virtual$1 = {
38707 name: 'virtual',
38708 params: {
38709 virtual: {
38710 enabled: false,
38711 slides: [],
38712 cache: true,
38713 renderSlide: null,
38714 renderExternal: null,
38715 renderExternalUpdate: true,
38716 addSlidesBefore: 0,
38717 addSlidesAfter: 0
38718 }
38719 },
38720 create: function create() {
38721 var swiper = this;
38722 bindModuleMethods(swiper, {
38723 virtual: _extends$h({}, Virtual, {
38724 slides: swiper.params.virtual.slides,
38725 cache: {}
38726 })
38727 });
38728 },
38729 on: {
38730 beforeInit: function beforeInit(swiper) {
38731 if (!swiper.params.virtual.enabled) return;
38732 swiper.classNames.push(swiper.params.containerModifierClass + "virtual");
38733 var overwriteParams = {
38734 watchSlidesProgress: true
38735 };
38736 extend(swiper.params, overwriteParams);
38737 extend(swiper.originalParams, overwriteParams);
38738
38739 if (!swiper.params.initialSlide) {
38740 swiper.virtual.update();
38741 }
38742 },
38743 setTranslate: function setTranslate(swiper) {
38744 if (!swiper.params.virtual.enabled) return;
38745 swiper.virtual.update();
38746 }
38747 }
38748 };
38749
38750 function _extends$g() {
38751 _extends$g = Object.assign || function (target) {
38752 for (var i = 1; i < arguments.length; i++) {
38753 var source = arguments[i];
38754
38755 for (var key in source) {
38756 if (Object.prototype.hasOwnProperty.call(source, key)) {
38757 target[key] = source[key];
38758 }
38759 }
38760 }
38761
38762 return target;
38763 };
38764
38765 return _extends$g.apply(this, arguments);
38766 }
38767 var Keyboard = {
38768 handle: function handle(event) {
38769 var swiper = this;
38770 if (!swiper.enabled) return;
38771 var window = getWindow();
38772 var document = getDocument();
38773 var rtl = swiper.rtlTranslate;
38774 var e = event;
38775 if (e.originalEvent) e = e.originalEvent; // jquery fix
38776
38777 var kc = e.keyCode || e.charCode;
38778 var pageUpDown = swiper.params.keyboard.pageUpDown;
38779 var isPageUp = pageUpDown && kc === 33;
38780 var isPageDown = pageUpDown && kc === 34;
38781 var isArrowLeft = kc === 37;
38782 var isArrowRight = kc === 39;
38783 var isArrowUp = kc === 38;
38784 var isArrowDown = kc === 40; // Directions locks
38785
38786 if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {
38787 return false;
38788 }
38789
38790 if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {
38791 return false;
38792 }
38793
38794 if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
38795 return undefined;
38796 }
38797
38798 if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {
38799 return undefined;
38800 }
38801
38802 if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {
38803 var inView = false; // Check that swiper should be inside of visible area of window
38804
38805 if (swiper.$el.parents("." + swiper.params.slideClass).length > 0 && swiper.$el.parents("." + swiper.params.slideActiveClass).length === 0) {
38806 return undefined;
38807 }
38808
38809 var $el = swiper.$el;
38810 var swiperWidth = $el[0].clientWidth;
38811 var swiperHeight = $el[0].clientHeight;
38812 var windowWidth = window.innerWidth;
38813 var windowHeight = window.innerHeight;
38814 var swiperOffset = swiper.$el.offset();
38815 if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;
38816 var swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];
38817
38818 for (var i = 0; i < swiperCoord.length; i += 1) {
38819 var point = swiperCoord[i];
38820
38821 if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {
38822 if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
38823
38824 inView = true;
38825 }
38826 }
38827
38828 if (!inView) return undefined;
38829 }
38830
38831 if (swiper.isHorizontal()) {
38832 if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {
38833 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
38834 }
38835
38836 if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();
38837 if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();
38838 } else {
38839 if (isPageUp || isPageDown || isArrowUp || isArrowDown) {
38840 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
38841 }
38842
38843 if (isPageDown || isArrowDown) swiper.slideNext();
38844 if (isPageUp || isArrowUp) swiper.slidePrev();
38845 }
38846
38847 swiper.emit('keyPress', kc);
38848 return undefined;
38849 },
38850 enable: function enable() {
38851 var swiper = this;
38852 var document = getDocument();
38853 if (swiper.keyboard.enabled) return;
38854 $$1(document).on('keydown', swiper.keyboard.handle);
38855 swiper.keyboard.enabled = true;
38856 },
38857 disable: function disable() {
38858 var swiper = this;
38859 var document = getDocument();
38860 if (!swiper.keyboard.enabled) return;
38861 $$1(document).off('keydown', swiper.keyboard.handle);
38862 swiper.keyboard.enabled = false;
38863 }
38864 };
38865 var Keyboard$1 = {
38866 name: 'keyboard',
38867 params: {
38868 keyboard: {
38869 enabled: false,
38870 onlyInViewport: true,
38871 pageUpDown: true
38872 }
38873 },
38874 create: function create() {
38875 var swiper = this;
38876 bindModuleMethods(swiper, {
38877 keyboard: _extends$g({
38878 enabled: false
38879 }, Keyboard)
38880 });
38881 },
38882 on: {
38883 init: function init(swiper) {
38884 if (swiper.params.keyboard.enabled) {
38885 swiper.keyboard.enable();
38886 }
38887 },
38888 destroy: function destroy(swiper) {
38889 if (swiper.keyboard.enabled) {
38890 swiper.keyboard.disable();
38891 }
38892 }
38893 }
38894 };
38895
38896 /* eslint-disable consistent-return */
38897
38898 function isEventSupported() {
38899 var document = getDocument();
38900 var eventName = 'onwheel';
38901 var isSupported = (eventName in document);
38902
38903 if (!isSupported) {
38904 var element = document.createElement('div');
38905 element.setAttribute(eventName, 'return;');
38906 isSupported = typeof element[eventName] === 'function';
38907 }
38908
38909 if (!isSupported && document.implementation && document.implementation.hasFeature && // always returns true in newer browsers as per the standard.
38910 // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
38911 document.implementation.hasFeature('', '') !== true) {
38912 // This is the only way to test support for the `wheel` event in IE9+.
38913 isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
38914 }
38915
38916 return isSupported;
38917 }
38918
38919 var Mousewheel = {
38920 lastScrollTime: now(),
38921 lastEventBeforeSnap: undefined,
38922 recentWheelEvents: [],
38923 event: function event() {
38924 var window = getWindow();
38925 if (window.navigator.userAgent.indexOf('firefox') > -1) return 'DOMMouseScroll';
38926 return isEventSupported() ? 'wheel' : 'mousewheel';
38927 },
38928 normalize: function normalize(e) {
38929 // Reasonable defaults
38930 var PIXEL_STEP = 10;
38931 var LINE_HEIGHT = 40;
38932 var PAGE_HEIGHT = 800;
38933 var sX = 0;
38934 var sY = 0; // spinX, spinY
38935
38936 var pX = 0;
38937 var pY = 0; // pixelX, pixelY
38938 // Legacy
38939
38940 if ('detail' in e) {
38941 sY = e.detail;
38942 }
38943
38944 if ('wheelDelta' in e) {
38945 sY = -e.wheelDelta / 120;
38946 }
38947
38948 if ('wheelDeltaY' in e) {
38949 sY = -e.wheelDeltaY / 120;
38950 }
38951
38952 if ('wheelDeltaX' in e) {
38953 sX = -e.wheelDeltaX / 120;
38954 } // side scrolling on FF with DOMMouseScroll
38955
38956
38957 if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
38958 sX = sY;
38959 sY = 0;
38960 }
38961
38962 pX = sX * PIXEL_STEP;
38963 pY = sY * PIXEL_STEP;
38964
38965 if ('deltaY' in e) {
38966 pY = e.deltaY;
38967 }
38968
38969 if ('deltaX' in e) {
38970 pX = e.deltaX;
38971 }
38972
38973 if (e.shiftKey && !pX) {
38974 // if user scrolls with shift he wants horizontal scroll
38975 pX = pY;
38976 pY = 0;
38977 }
38978
38979 if ((pX || pY) && e.deltaMode) {
38980 if (e.deltaMode === 1) {
38981 // delta in LINE units
38982 pX *= LINE_HEIGHT;
38983 pY *= LINE_HEIGHT;
38984 } else {
38985 // delta in PAGE units
38986 pX *= PAGE_HEIGHT;
38987 pY *= PAGE_HEIGHT;
38988 }
38989 } // Fall-back if spin cannot be determined
38990
38991
38992 if (pX && !sX) {
38993 sX = pX < 1 ? -1 : 1;
38994 }
38995
38996 if (pY && !sY) {
38997 sY = pY < 1 ? -1 : 1;
38998 }
38999
39000 return {
39001 spinX: sX,
39002 spinY: sY,
39003 pixelX: pX,
39004 pixelY: pY
39005 };
39006 },
39007 handleMouseEnter: function handleMouseEnter() {
39008 var swiper = this;
39009 if (!swiper.enabled) return;
39010 swiper.mouseEntered = true;
39011 },
39012 handleMouseLeave: function handleMouseLeave() {
39013 var swiper = this;
39014 if (!swiper.enabled) return;
39015 swiper.mouseEntered = false;
39016 },
39017 handle: function handle(event) {
39018 var e = event;
39019 var disableParentSwiper = true;
39020 var swiper = this;
39021 if (!swiper.enabled) return;
39022 var params = swiper.params.mousewheel;
39023
39024 if (swiper.params.cssMode) {
39025 e.preventDefault();
39026 }
39027
39028 var target = swiper.$el;
39029
39030 if (swiper.params.mousewheel.eventsTarget !== 'container') {
39031 target = $$1(swiper.params.mousewheel.eventsTarget);
39032 }
39033
39034 if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) return true;
39035 if (e.originalEvent) e = e.originalEvent; // jquery fix
39036
39037 var delta = 0;
39038 var rtlFactor = swiper.rtlTranslate ? -1 : 1;
39039 var data = Mousewheel.normalize(e);
39040
39041 if (params.forceToAxis) {
39042 if (swiper.isHorizontal()) {
39043 if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
39044 } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
39045 } else {
39046 delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
39047 }
39048
39049 if (delta === 0) return true;
39050 if (params.invert) delta = -delta; // Get the scroll positions
39051
39052 var positions = swiper.getTranslate() + delta * params.sensitivity;
39053 if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
39054 if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate(); // When loop is true:
39055 // the disableParentSwiper will be true.
39056 // When loop is false:
39057 // if the scroll positions is not on edge,
39058 // then the disableParentSwiper will be true.
39059 // if the scroll on edge positions,
39060 // then the disableParentSwiper will be false.
39061
39062 disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
39063 if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
39064
39065 if (!swiper.params.freeMode) {
39066 // Register the new event in a variable which stores the relevant data
39067 var newEvent = {
39068 time: now(),
39069 delta: Math.abs(delta),
39070 direction: Math.sign(delta),
39071 raw: event
39072 }; // Keep the most recent events
39073
39074 var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
39075
39076 if (recentWheelEvents.length >= 2) {
39077 recentWheelEvents.shift(); // only store the last N events
39078 }
39079
39080 var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
39081 recentWheelEvents.push(newEvent); // If there is at least one previous recorded event:
39082 // If direction has changed or
39083 // if the scroll is quicker than the previous one:
39084 // Animate the slider.
39085 // Else (this is the first time the wheel is moved):
39086 // Animate the slider.
39087
39088 if (prevEvent) {
39089 if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
39090 swiper.mousewheel.animateSlider(newEvent);
39091 }
39092 } else {
39093 swiper.mousewheel.animateSlider(newEvent);
39094 } // If it's time to release the scroll:
39095 // Return now so you don't hit the preventDefault.
39096
39097
39098 if (swiper.mousewheel.releaseScroll(newEvent)) {
39099 return true;
39100 }
39101 } else {
39102 // Freemode or scrollContainer:
39103 // If we recently snapped after a momentum scroll, then ignore wheel events
39104 // to give time for the deceleration to finish. Stop ignoring after 500 msecs
39105 // or if it's a new scroll (larger delta or inverse sign as last event before
39106 // an end-of-momentum snap).
39107 var _newEvent = {
39108 time: now(),
39109 delta: Math.abs(delta),
39110 direction: Math.sign(delta)
39111 };
39112 var lastEventBeforeSnap = swiper.mousewheel.lastEventBeforeSnap;
39113 var ignoreWheelEvents = lastEventBeforeSnap && _newEvent.time < lastEventBeforeSnap.time + 500 && _newEvent.delta <= lastEventBeforeSnap.delta && _newEvent.direction === lastEventBeforeSnap.direction;
39114
39115 if (!ignoreWheelEvents) {
39116 swiper.mousewheel.lastEventBeforeSnap = undefined;
39117
39118 if (swiper.params.loop) {
39119 swiper.loopFix();
39120 }
39121
39122 var position = swiper.getTranslate() + delta * params.sensitivity;
39123 var wasBeginning = swiper.isBeginning;
39124 var wasEnd = swiper.isEnd;
39125 if (position >= swiper.minTranslate()) position = swiper.minTranslate();
39126 if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
39127 swiper.setTransition(0);
39128 swiper.setTranslate(position);
39129 swiper.updateProgress();
39130 swiper.updateActiveIndex();
39131 swiper.updateSlidesClasses();
39132
39133 if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
39134 swiper.updateSlidesClasses();
39135 }
39136
39137 if (swiper.params.freeModeSticky) {
39138 // When wheel scrolling starts with sticky (aka snap) enabled, then detect
39139 // the end of a momentum scroll by storing recent (N=15?) wheel events.
39140 // 1. do all N events have decreasing or same (absolute value) delta?
39141 // 2. did all N events arrive in the last M (M=500?) msecs?
39142 // 3. does the earliest event have an (absolute value) delta that's
39143 // at least P (P=1?) larger than the most recent event's delta?
39144 // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
39145 // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
39146 // Snap immediately and ignore remaining wheel events in this scroll.
39147 // See comment above for "remaining wheel events in this scroll" determination.
39148 // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
39149 clearTimeout(swiper.mousewheel.timeout);
39150 swiper.mousewheel.timeout = undefined;
39151 var _recentWheelEvents = swiper.mousewheel.recentWheelEvents;
39152
39153 if (_recentWheelEvents.length >= 15) {
39154 _recentWheelEvents.shift(); // only store the last N events
39155
39156 }
39157
39158 var _prevEvent = _recentWheelEvents.length ? _recentWheelEvents[_recentWheelEvents.length - 1] : undefined;
39159
39160 var firstEvent = _recentWheelEvents[0];
39161
39162 _recentWheelEvents.push(_newEvent);
39163
39164 if (_prevEvent && (_newEvent.delta > _prevEvent.delta || _newEvent.direction !== _prevEvent.direction)) {
39165 // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
39166 _recentWheelEvents.splice(0);
39167 } else if (_recentWheelEvents.length >= 15 && _newEvent.time - firstEvent.time < 500 && firstEvent.delta - _newEvent.delta >= 1 && _newEvent.delta <= 6) {
39168 // We're at the end of the deceleration of a momentum scroll, so there's no need
39169 // to wait for more events. Snap ASAP on the next tick.
39170 // Also, because there's some remaining momentum we'll bias the snap in the
39171 // direction of the ongoing scroll because it's better UX for the scroll to snap
39172 // in the same direction as the scroll instead of reversing to snap. Therefore,
39173 // if it's already scrolled more than 20% in the current direction, keep going.
39174 var snapToThreshold = delta > 0 ? 0.8 : 0.2;
39175 swiper.mousewheel.lastEventBeforeSnap = _newEvent;
39176
39177 _recentWheelEvents.splice(0);
39178
39179 swiper.mousewheel.timeout = nextTick(function () {
39180 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
39181 }, 0); // no delay; move on next tick
39182 }
39183
39184 if (!swiper.mousewheel.timeout) {
39185 // if we get here, then we haven't detected the end of a momentum scroll, so
39186 // we'll consider a scroll "complete" when there haven't been any wheel events
39187 // for 500ms.
39188 swiper.mousewheel.timeout = nextTick(function () {
39189 var snapToThreshold = 0.5;
39190 swiper.mousewheel.lastEventBeforeSnap = _newEvent;
39191
39192 _recentWheelEvents.splice(0);
39193
39194 swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
39195 }, 500);
39196 }
39197 } // Emit event
39198
39199
39200 if (!ignoreWheelEvents) swiper.emit('scroll', e); // Stop autoplay
39201
39202 if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop(); // Return page scroll on edge positions
39203
39204 if (position === swiper.minTranslate() || position === swiper.maxTranslate()) return true;
39205 }
39206 }
39207
39208 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
39209 return false;
39210 },
39211 animateSlider: function animateSlider(newEvent) {
39212 var swiper = this;
39213 var window = getWindow();
39214
39215 if (this.params.mousewheel.thresholdDelta && newEvent.delta < this.params.mousewheel.thresholdDelta) {
39216 // Prevent if delta of wheel scroll delta is below configured threshold
39217 return false;
39218 }
39219
39220 if (this.params.mousewheel.thresholdTime && now() - swiper.mousewheel.lastScrollTime < this.params.mousewheel.thresholdTime) {
39221 // Prevent if time between scrolls is below configured threshold
39222 return false;
39223 } // If the movement is NOT big enough and
39224 // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
39225 // Don't go any further (avoid insignificant scroll movement).
39226
39227
39228 if (newEvent.delta >= 6 && now() - swiper.mousewheel.lastScrollTime < 60) {
39229 // Return false as a default
39230 return true;
39231 } // If user is scrolling towards the end:
39232 // If the slider hasn't hit the latest slide or
39233 // if the slider is a loop and
39234 // if the slider isn't moving right now:
39235 // Go to next slide and
39236 // emit a scroll event.
39237 // Else (the user is scrolling towards the beginning) and
39238 // if the slider hasn't hit the first slide or
39239 // if the slider is a loop and
39240 // if the slider isn't moving right now:
39241 // Go to prev slide and
39242 // emit a scroll event.
39243
39244
39245 if (newEvent.direction < 0) {
39246 if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
39247 swiper.slideNext();
39248 swiper.emit('scroll', newEvent.raw);
39249 }
39250 } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
39251 swiper.slidePrev();
39252 swiper.emit('scroll', newEvent.raw);
39253 } // If you got here is because an animation has been triggered so store the current time
39254
39255
39256 swiper.mousewheel.lastScrollTime = new window.Date().getTime(); // Return false as a default
39257
39258 return false;
39259 },
39260 releaseScroll: function releaseScroll(newEvent) {
39261 var swiper = this;
39262 var params = swiper.params.mousewheel;
39263
39264 if (newEvent.direction < 0) {
39265 if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
39266 // Return true to animate scroll on edges
39267 return true;
39268 }
39269 } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
39270 // Return true to animate scroll on edges
39271 return true;
39272 }
39273
39274 return false;
39275 },
39276 enable: function enable() {
39277 var swiper = this;
39278 var event = Mousewheel.event();
39279
39280 if (swiper.params.cssMode) {
39281 swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
39282 return true;
39283 }
39284
39285 if (!event) return false;
39286 if (swiper.mousewheel.enabled) return false;
39287 var target = swiper.$el;
39288
39289 if (swiper.params.mousewheel.eventsTarget !== 'container') {
39290 target = $$1(swiper.params.mousewheel.eventsTarget);
39291 }
39292
39293 target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
39294 target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
39295 target.on(event, swiper.mousewheel.handle);
39296 swiper.mousewheel.enabled = true;
39297 return true;
39298 },
39299 disable: function disable() {
39300 var swiper = this;
39301 var event = Mousewheel.event();
39302
39303 if (swiper.params.cssMode) {
39304 swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
39305 return true;
39306 }
39307
39308 if (!event) return false;
39309 if (!swiper.mousewheel.enabled) return false;
39310 var target = swiper.$el;
39311
39312 if (swiper.params.mousewheel.eventsTarget !== 'container') {
39313 target = $$1(swiper.params.mousewheel.eventsTarget);
39314 }
39315
39316 target.off(event, swiper.mousewheel.handle);
39317 swiper.mousewheel.enabled = false;
39318 return true;
39319 }
39320 };
39321 var Mousewheel$1 = {
39322 name: 'mousewheel',
39323 params: {
39324 mousewheel: {
39325 enabled: false,
39326 releaseOnEdges: false,
39327 invert: false,
39328 forceToAxis: false,
39329 sensitivity: 1,
39330 eventsTarget: 'container',
39331 thresholdDelta: null,
39332 thresholdTime: null
39333 }
39334 },
39335 create: function create() {
39336 var swiper = this;
39337 bindModuleMethods(swiper, {
39338 mousewheel: {
39339 enabled: false,
39340 lastScrollTime: now(),
39341 lastEventBeforeSnap: undefined,
39342 recentWheelEvents: [],
39343 enable: Mousewheel.enable,
39344 disable: Mousewheel.disable,
39345 handle: Mousewheel.handle,
39346 handleMouseEnter: Mousewheel.handleMouseEnter,
39347 handleMouseLeave: Mousewheel.handleMouseLeave,
39348 animateSlider: Mousewheel.animateSlider,
39349 releaseScroll: Mousewheel.releaseScroll
39350 }
39351 });
39352 },
39353 on: {
39354 init: function init(swiper) {
39355 if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
39356 swiper.mousewheel.disable();
39357 }
39358
39359 if (swiper.params.mousewheel.enabled) swiper.mousewheel.enable();
39360 },
39361 destroy: function destroy(swiper) {
39362 if (swiper.params.cssMode) {
39363 swiper.mousewheel.enable();
39364 }
39365
39366 if (swiper.mousewheel.enabled) swiper.mousewheel.disable();
39367 }
39368 }
39369 };
39370
39371 function _extends$f() {
39372 _extends$f = Object.assign || function (target) {
39373 for (var i = 1; i < arguments.length; i++) {
39374 var source = arguments[i];
39375
39376 for (var key in source) {
39377 if (Object.prototype.hasOwnProperty.call(source, key)) {
39378 target[key] = source[key];
39379 }
39380 }
39381 }
39382
39383 return target;
39384 };
39385
39386 return _extends$f.apply(this, arguments);
39387 }
39388 var Navigation = {
39389 toggleEl: function toggleEl($el, disabled) {
39390 $el[disabled ? 'addClass' : 'removeClass'](this.params.navigation.disabledClass);
39391 if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;
39392 },
39393 update: function update() {
39394 // Update Navigation Buttons
39395 var swiper = this;
39396 var params = swiper.params.navigation;
39397 var toggleEl = swiper.navigation.toggleEl;
39398 if (swiper.params.loop) return;
39399 var _swiper$navigation = swiper.navigation,
39400 $nextEl = _swiper$navigation.$nextEl,
39401 $prevEl = _swiper$navigation.$prevEl;
39402
39403 if ($prevEl && $prevEl.length > 0) {
39404 if (swiper.isBeginning) {
39405 toggleEl($prevEl, true);
39406 } else {
39407 toggleEl($prevEl, false);
39408 }
39409
39410 if (swiper.params.watchOverflow && swiper.enabled) {
39411 $prevEl[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
39412 }
39413 }
39414
39415 if ($nextEl && $nextEl.length > 0) {
39416 if (swiper.isEnd) {
39417 toggleEl($nextEl, true);
39418 } else {
39419 toggleEl($nextEl, false);
39420 }
39421
39422 if (swiper.params.watchOverflow && swiper.enabled) {
39423 $nextEl[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
39424 }
39425 }
39426 },
39427 onPrevClick: function onPrevClick(e) {
39428 var swiper = this;
39429 e.preventDefault();
39430 if (swiper.isBeginning && !swiper.params.loop) return;
39431 swiper.slidePrev();
39432 },
39433 onNextClick: function onNextClick(e) {
39434 var swiper = this;
39435 e.preventDefault();
39436 if (swiper.isEnd && !swiper.params.loop) return;
39437 swiper.slideNext();
39438 },
39439 init: function init() {
39440 var swiper = this;
39441 var params = swiper.params.navigation;
39442 if (!(params.nextEl || params.prevEl)) return;
39443 var $nextEl;
39444 var $prevEl;
39445
39446 if (params.nextEl) {
39447 $nextEl = $$1(params.nextEl);
39448
39449 if (swiper.params.uniqueNavElements && typeof params.nextEl === 'string' && $nextEl.length > 1 && swiper.$el.find(params.nextEl).length === 1) {
39450 $nextEl = swiper.$el.find(params.nextEl);
39451 }
39452 }
39453
39454 if (params.prevEl) {
39455 $prevEl = $$1(params.prevEl);
39456
39457 if (swiper.params.uniqueNavElements && typeof params.prevEl === 'string' && $prevEl.length > 1 && swiper.$el.find(params.prevEl).length === 1) {
39458 $prevEl = swiper.$el.find(params.prevEl);
39459 }
39460 }
39461
39462 if ($nextEl && $nextEl.length > 0) {
39463 $nextEl.on('click', swiper.navigation.onNextClick);
39464 }
39465
39466 if ($prevEl && $prevEl.length > 0) {
39467 $prevEl.on('click', swiper.navigation.onPrevClick);
39468 }
39469
39470 extend(swiper.navigation, {
39471 $nextEl: $nextEl,
39472 nextEl: $nextEl && $nextEl[0],
39473 $prevEl: $prevEl,
39474 prevEl: $prevEl && $prevEl[0]
39475 });
39476
39477 if (!swiper.enabled) {
39478 if ($nextEl) $nextEl.addClass(params.lockClass);
39479 if ($prevEl) $prevEl.addClass(params.lockClass);
39480 }
39481 },
39482 destroy: function destroy() {
39483 var swiper = this;
39484 var _swiper$navigation2 = swiper.navigation,
39485 $nextEl = _swiper$navigation2.$nextEl,
39486 $prevEl = _swiper$navigation2.$prevEl;
39487
39488 if ($nextEl && $nextEl.length) {
39489 $nextEl.off('click', swiper.navigation.onNextClick);
39490 $nextEl.removeClass(swiper.params.navigation.disabledClass);
39491 }
39492
39493 if ($prevEl && $prevEl.length) {
39494 $prevEl.off('click', swiper.navigation.onPrevClick);
39495 $prevEl.removeClass(swiper.params.navigation.disabledClass);
39496 }
39497 }
39498 };
39499 var Navigation$1 = {
39500 name: 'navigation',
39501 params: {
39502 navigation: {
39503 nextEl: null,
39504 prevEl: null,
39505 hideOnClick: false,
39506 disabledClass: 'swiper-button-disabled',
39507 hiddenClass: 'swiper-button-hidden',
39508 lockClass: 'swiper-button-lock'
39509 }
39510 },
39511 create: function create() {
39512 var swiper = this;
39513 bindModuleMethods(swiper, {
39514 navigation: _extends$f({}, Navigation)
39515 });
39516 },
39517 on: {
39518 init: function init(swiper) {
39519 swiper.navigation.init();
39520 swiper.navigation.update();
39521 },
39522 toEdge: function toEdge(swiper) {
39523 swiper.navigation.update();
39524 },
39525 fromEdge: function fromEdge(swiper) {
39526 swiper.navigation.update();
39527 },
39528 destroy: function destroy(swiper) {
39529 swiper.navigation.destroy();
39530 },
39531 'enable disable': function enableDisable(swiper) {
39532 var _swiper$navigation3 = swiper.navigation,
39533 $nextEl = _swiper$navigation3.$nextEl,
39534 $prevEl = _swiper$navigation3.$prevEl;
39535
39536 if ($nextEl) {
39537 $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);
39538 }
39539
39540 if ($prevEl) {
39541 $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);
39542 }
39543 },
39544 click: function click(swiper, e) {
39545 var _swiper$navigation4 = swiper.navigation,
39546 $nextEl = _swiper$navigation4.$nextEl,
39547 $prevEl = _swiper$navigation4.$prevEl;
39548 var targetEl = e.target;
39549
39550 if (swiper.params.navigation.hideOnClick && !$$1(targetEl).is($prevEl) && !$$1(targetEl).is($nextEl)) {
39551 if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;
39552 var isHidden;
39553
39554 if ($nextEl) {
39555 isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
39556 } else if ($prevEl) {
39557 isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
39558 }
39559
39560 if (isHidden === true) {
39561 swiper.emit('navigationShow');
39562 } else {
39563 swiper.emit('navigationHide');
39564 }
39565
39566 if ($nextEl) {
39567 $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
39568 }
39569
39570 if ($prevEl) {
39571 $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
39572 }
39573 }
39574 }
39575 }
39576 };
39577
39578 function _extends$e() {
39579 _extends$e = Object.assign || function (target) {
39580 for (var i = 1; i < arguments.length; i++) {
39581 var source = arguments[i];
39582
39583 for (var key in source) {
39584 if (Object.prototype.hasOwnProperty.call(source, key)) {
39585 target[key] = source[key];
39586 }
39587 }
39588 }
39589
39590 return target;
39591 };
39592
39593 return _extends$e.apply(this, arguments);
39594 }
39595 var Pagination = {
39596 update: function update() {
39597 // Render || Update Pagination bullets/items
39598 var swiper = this;
39599 var rtl = swiper.rtl;
39600 var params = swiper.params.pagination;
39601 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return;
39602 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
39603 var $el = swiper.pagination.$el; // Current/Total
39604
39605 var current;
39606 var total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
39607
39608 if (swiper.params.loop) {
39609 current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
39610
39611 if (current > slidesLength - 1 - swiper.loopedSlides * 2) {
39612 current -= slidesLength - swiper.loopedSlides * 2;
39613 }
39614
39615 if (current > total - 1) current -= total;
39616 if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;
39617 } else if (typeof swiper.snapIndex !== 'undefined') {
39618 current = swiper.snapIndex;
39619 } else {
39620 current = swiper.activeIndex || 0;
39621 } // Types
39622
39623
39624 if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
39625 var bullets = swiper.pagination.bullets;
39626 var firstIndex;
39627 var lastIndex;
39628 var midIndex;
39629
39630 if (params.dynamicBullets) {
39631 swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
39632 $el.css(swiper.isHorizontal() ? 'width' : 'height', swiper.pagination.bulletSize * (params.dynamicMainBullets + 4) + "px");
39633
39634 if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
39635 swiper.pagination.dynamicBulletIndex += current - swiper.previousIndex;
39636
39637 if (swiper.pagination.dynamicBulletIndex > params.dynamicMainBullets - 1) {
39638 swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
39639 } else if (swiper.pagination.dynamicBulletIndex < 0) {
39640 swiper.pagination.dynamicBulletIndex = 0;
39641 }
39642 }
39643
39644 firstIndex = current - swiper.pagination.dynamicBulletIndex;
39645 lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
39646 midIndex = (lastIndex + firstIndex) / 2;
39647 }
39648
39649 bullets.removeClass(params.bulletActiveClass + " " + params.bulletActiveClass + "-next " + params.bulletActiveClass + "-next-next " + params.bulletActiveClass + "-prev " + params.bulletActiveClass + "-prev-prev " + params.bulletActiveClass + "-main");
39650
39651 if ($el.length > 1) {
39652 bullets.each(function (bullet) {
39653 var $bullet = $$1(bullet);
39654 var bulletIndex = $bullet.index();
39655
39656 if (bulletIndex === current) {
39657 $bullet.addClass(params.bulletActiveClass);
39658 }
39659
39660 if (params.dynamicBullets) {
39661 if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
39662 $bullet.addClass(params.bulletActiveClass + "-main");
39663 }
39664
39665 if (bulletIndex === firstIndex) {
39666 $bullet.prev().addClass(params.bulletActiveClass + "-prev").prev().addClass(params.bulletActiveClass + "-prev-prev");
39667 }
39668
39669 if (bulletIndex === lastIndex) {
39670 $bullet.next().addClass(params.bulletActiveClass + "-next").next().addClass(params.bulletActiveClass + "-next-next");
39671 }
39672 }
39673 });
39674 } else {
39675 var $bullet = bullets.eq(current);
39676 var bulletIndex = $bullet.index();
39677 $bullet.addClass(params.bulletActiveClass);
39678
39679 if (params.dynamicBullets) {
39680 var $firstDisplayedBullet = bullets.eq(firstIndex);
39681 var $lastDisplayedBullet = bullets.eq(lastIndex);
39682
39683 for (var i = firstIndex; i <= lastIndex; i += 1) {
39684 bullets.eq(i).addClass(params.bulletActiveClass + "-main");
39685 }
39686
39687 if (swiper.params.loop) {
39688 if (bulletIndex >= bullets.length - params.dynamicMainBullets) {
39689 for (var _i = params.dynamicMainBullets; _i >= 0; _i -= 1) {
39690 bullets.eq(bullets.length - _i).addClass(params.bulletActiveClass + "-main");
39691 }
39692
39693 bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(params.bulletActiveClass + "-prev");
39694 } else {
39695 $firstDisplayedBullet.prev().addClass(params.bulletActiveClass + "-prev").prev().addClass(params.bulletActiveClass + "-prev-prev");
39696 $lastDisplayedBullet.next().addClass(params.bulletActiveClass + "-next").next().addClass(params.bulletActiveClass + "-next-next");
39697 }
39698 } else {
39699 $firstDisplayedBullet.prev().addClass(params.bulletActiveClass + "-prev").prev().addClass(params.bulletActiveClass + "-prev-prev");
39700 $lastDisplayedBullet.next().addClass(params.bulletActiveClass + "-next").next().addClass(params.bulletActiveClass + "-next-next");
39701 }
39702 }
39703 }
39704
39705 if (params.dynamicBullets) {
39706 var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
39707 var bulletsOffset = (swiper.pagination.bulletSize * dynamicBulletsLength - swiper.pagination.bulletSize) / 2 - midIndex * swiper.pagination.bulletSize;
39708 var offsetProp = rtl ? 'right' : 'left';
39709 bullets.css(swiper.isHorizontal() ? offsetProp : 'top', bulletsOffset + "px");
39710 }
39711 }
39712
39713 if (params.type === 'fraction') {
39714 $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1));
39715 $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));
39716 }
39717
39718 if (params.type === 'progressbar') {
39719 var progressbarDirection;
39720
39721 if (params.progressbarOpposite) {
39722 progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
39723 } else {
39724 progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
39725 }
39726
39727 var scale = (current + 1) / total;
39728 var scaleX = 1;
39729 var scaleY = 1;
39730
39731 if (progressbarDirection === 'horizontal') {
39732 scaleX = scale;
39733 } else {
39734 scaleY = scale;
39735 }
39736
39737 $el.find(classesToSelector(params.progressbarFillClass)).transform("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")").transition(swiper.params.speed);
39738 }
39739
39740 if (params.type === 'custom' && params.renderCustom) {
39741 $el.html(params.renderCustom(swiper, current + 1, total));
39742 swiper.emit('paginationRender', $el[0]);
39743 } else {
39744 swiper.emit('paginationUpdate', $el[0]);
39745 }
39746
39747 if (swiper.params.watchOverflow && swiper.enabled) {
39748 $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
39749 }
39750 },
39751 render: function render() {
39752 // Render Container
39753 var swiper = this;
39754 var params = swiper.params.pagination;
39755 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return;
39756 var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
39757 var $el = swiper.pagination.$el;
39758 var paginationHTML = '';
39759
39760 if (params.type === 'bullets') {
39761 var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
39762
39763 if (swiper.params.freeMode && !swiper.params.loop && numberOfBullets > slidesLength) {
39764 numberOfBullets = slidesLength;
39765 }
39766
39767 for (var i = 0; i < numberOfBullets; i += 1) {
39768 if (params.renderBullet) {
39769 paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
39770 } else {
39771 paginationHTML += "<" + params.bulletElement + " class=\"" + params.bulletClass + "\"></" + params.bulletElement + ">";
39772 }
39773 }
39774
39775 $el.html(paginationHTML);
39776 swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));
39777 }
39778
39779 if (params.type === 'fraction') {
39780 if (params.renderFraction) {
39781 paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
39782 } else {
39783 paginationHTML = "<span class=\"" + params.currentClass + "\"></span>" + ' / ' + ("<span class=\"" + params.totalClass + "\"></span>");
39784 }
39785
39786 $el.html(paginationHTML);
39787 }
39788
39789 if (params.type === 'progressbar') {
39790 if (params.renderProgressbar) {
39791 paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
39792 } else {
39793 paginationHTML = "<span class=\"" + params.progressbarFillClass + "\"></span>";
39794 }
39795
39796 $el.html(paginationHTML);
39797 }
39798
39799 if (params.type !== 'custom') {
39800 swiper.emit('paginationRender', swiper.pagination.$el[0]);
39801 }
39802 },
39803 init: function init() {
39804 var swiper = this;
39805 var params = swiper.params.pagination;
39806 if (!params.el) return;
39807 var $el = $$1(params.el);
39808 if ($el.length === 0) return;
39809
39810 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {
39811 $el = swiper.$el.find(params.el);
39812 }
39813
39814 if (params.type === 'bullets' && params.clickable) {
39815 $el.addClass(params.clickableClass);
39816 }
39817
39818 $el.addClass(params.modifierClass + params.type);
39819
39820 if (params.type === 'bullets' && params.dynamicBullets) {
39821 $el.addClass("" + params.modifierClass + params.type + "-dynamic");
39822 swiper.pagination.dynamicBulletIndex = 0;
39823
39824 if (params.dynamicMainBullets < 1) {
39825 params.dynamicMainBullets = 1;
39826 }
39827 }
39828
39829 if (params.type === 'progressbar' && params.progressbarOpposite) {
39830 $el.addClass(params.progressbarOppositeClass);
39831 }
39832
39833 if (params.clickable) {
39834 $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {
39835 e.preventDefault();
39836 var index = $$1(this).index() * swiper.params.slidesPerGroup;
39837 if (swiper.params.loop) index += swiper.loopedSlides;
39838 swiper.slideTo(index);
39839 });
39840 }
39841
39842 extend(swiper.pagination, {
39843 $el: $el,
39844 el: $el[0]
39845 });
39846
39847 if (!swiper.enabled) {
39848 $el.addClass(params.lockClass);
39849 }
39850 },
39851 destroy: function destroy() {
39852 var swiper = this;
39853 var params = swiper.params.pagination;
39854 if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) return;
39855 var $el = swiper.pagination.$el;
39856 $el.removeClass(params.hiddenClass);
39857 $el.removeClass(params.modifierClass + params.type);
39858 if (swiper.pagination.bullets) swiper.pagination.bullets.removeClass(params.bulletActiveClass);
39859
39860 if (params.clickable) {
39861 $el.off('click', classesToSelector(params.bulletClass));
39862 }
39863 }
39864 };
39865 var Pagination$1 = {
39866 name: 'pagination',
39867 params: {
39868 pagination: {
39869 el: null,
39870 bulletElement: 'span',
39871 clickable: false,
39872 hideOnClick: false,
39873 renderBullet: null,
39874 renderProgressbar: null,
39875 renderFraction: null,
39876 renderCustom: null,
39877 progressbarOpposite: false,
39878 type: 'bullets',
39879 // 'bullets' or 'progressbar' or 'fraction' or 'custom'
39880 dynamicBullets: false,
39881 dynamicMainBullets: 1,
39882 formatFractionCurrent: function formatFractionCurrent(number) {
39883 return number;
39884 },
39885 formatFractionTotal: function formatFractionTotal(number) {
39886 return number;
39887 },
39888 bulletClass: 'swiper-pagination-bullet',
39889 bulletActiveClass: 'swiper-pagination-bullet-active',
39890 modifierClass: 'swiper-pagination-',
39891 // NEW
39892 currentClass: 'swiper-pagination-current',
39893 totalClass: 'swiper-pagination-total',
39894 hiddenClass: 'swiper-pagination-hidden',
39895 progressbarFillClass: 'swiper-pagination-progressbar-fill',
39896 progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
39897 clickableClass: 'swiper-pagination-clickable',
39898 // NEW
39899 lockClass: 'swiper-pagination-lock'
39900 }
39901 },
39902 create: function create() {
39903 var swiper = this;
39904 bindModuleMethods(swiper, {
39905 pagination: _extends$e({
39906 dynamicBulletIndex: 0
39907 }, Pagination)
39908 });
39909 },
39910 on: {
39911 init: function init(swiper) {
39912 swiper.pagination.init();
39913 swiper.pagination.render();
39914 swiper.pagination.update();
39915 },
39916 activeIndexChange: function activeIndexChange(swiper) {
39917 if (swiper.params.loop) {
39918 swiper.pagination.update();
39919 } else if (typeof swiper.snapIndex === 'undefined') {
39920 swiper.pagination.update();
39921 }
39922 },
39923 snapIndexChange: function snapIndexChange(swiper) {
39924 if (!swiper.params.loop) {
39925 swiper.pagination.update();
39926 }
39927 },
39928 slidesLengthChange: function slidesLengthChange(swiper) {
39929 if (swiper.params.loop) {
39930 swiper.pagination.render();
39931 swiper.pagination.update();
39932 }
39933 },
39934 snapGridLengthChange: function snapGridLengthChange(swiper) {
39935 if (!swiper.params.loop) {
39936 swiper.pagination.render();
39937 swiper.pagination.update();
39938 }
39939 },
39940 destroy: function destroy(swiper) {
39941 swiper.pagination.destroy();
39942 },
39943 'enable disable': function enableDisable(swiper) {
39944 var $el = swiper.pagination.$el;
39945
39946 if ($el) {
39947 $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);
39948 }
39949 },
39950 click: function click(swiper, e) {
39951 var targetEl = e.target;
39952
39953 if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && swiper.pagination.$el.length > 0 && !$$1(targetEl).hasClass(swiper.params.pagination.bulletClass)) {
39954 if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;
39955 var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
39956
39957 if (isHidden === true) {
39958 swiper.emit('paginationShow');
39959 } else {
39960 swiper.emit('paginationHide');
39961 }
39962
39963 swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
39964 }
39965 }
39966 }
39967 };
39968
39969 function _extends$d() {
39970 _extends$d = Object.assign || function (target) {
39971 for (var i = 1; i < arguments.length; i++) {
39972 var source = arguments[i];
39973
39974 for (var key in source) {
39975 if (Object.prototype.hasOwnProperty.call(source, key)) {
39976 target[key] = source[key];
39977 }
39978 }
39979 }
39980
39981 return target;
39982 };
39983
39984 return _extends$d.apply(this, arguments);
39985 }
39986 var Scrollbar = {
39987 setTranslate: function setTranslate() {
39988 var swiper = this;
39989 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
39990 var scrollbar = swiper.scrollbar,
39991 rtl = swiper.rtlTranslate,
39992 progress = swiper.progress;
39993 var dragSize = scrollbar.dragSize,
39994 trackSize = scrollbar.trackSize,
39995 $dragEl = scrollbar.$dragEl,
39996 $el = scrollbar.$el;
39997 var params = swiper.params.scrollbar;
39998 var newSize = dragSize;
39999 var newPos = (trackSize - dragSize) * progress;
40000
40001 if (rtl) {
40002 newPos = -newPos;
40003
40004 if (newPos > 0) {
40005 newSize = dragSize - newPos;
40006 newPos = 0;
40007 } else if (-newPos + dragSize > trackSize) {
40008 newSize = trackSize + newPos;
40009 }
40010 } else if (newPos < 0) {
40011 newSize = dragSize + newPos;
40012 newPos = 0;
40013 } else if (newPos + dragSize > trackSize) {
40014 newSize = trackSize - newPos;
40015 }
40016
40017 if (swiper.isHorizontal()) {
40018 $dragEl.transform("translate3d(" + newPos + "px, 0, 0)");
40019 $dragEl[0].style.width = newSize + "px";
40020 } else {
40021 $dragEl.transform("translate3d(0px, " + newPos + "px, 0)");
40022 $dragEl[0].style.height = newSize + "px";
40023 }
40024
40025 if (params.hide) {
40026 clearTimeout(swiper.scrollbar.timeout);
40027 $el[0].style.opacity = 1;
40028 swiper.scrollbar.timeout = setTimeout(function () {
40029 $el[0].style.opacity = 0;
40030 $el.transition(400);
40031 }, 1000);
40032 }
40033 },
40034 setTransition: function setTransition(duration) {
40035 var swiper = this;
40036 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
40037 swiper.scrollbar.$dragEl.transition(duration);
40038 },
40039 updateSize: function updateSize() {
40040 var swiper = this;
40041 if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
40042 var scrollbar = swiper.scrollbar;
40043 var $dragEl = scrollbar.$dragEl,
40044 $el = scrollbar.$el;
40045 $dragEl[0].style.width = '';
40046 $dragEl[0].style.height = '';
40047 var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
40048 var divider = swiper.size / swiper.virtualSize;
40049 var moveDivider = divider * (trackSize / swiper.size);
40050 var dragSize;
40051
40052 if (swiper.params.scrollbar.dragSize === 'auto') {
40053 dragSize = trackSize * divider;
40054 } else {
40055 dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
40056 }
40057
40058 if (swiper.isHorizontal()) {
40059 $dragEl[0].style.width = dragSize + "px";
40060 } else {
40061 $dragEl[0].style.height = dragSize + "px";
40062 }
40063
40064 if (divider >= 1) {
40065 $el[0].style.display = 'none';
40066 } else {
40067 $el[0].style.display = '';
40068 }
40069
40070 if (swiper.params.scrollbar.hide) {
40071 $el[0].style.opacity = 0;
40072 }
40073
40074 extend(scrollbar, {
40075 trackSize: trackSize,
40076 divider: divider,
40077 moveDivider: moveDivider,
40078 dragSize: dragSize
40079 });
40080
40081 if (swiper.params.watchOverflow && swiper.enabled) {
40082 scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
40083 }
40084 },
40085 getPointerPosition: function getPointerPosition(e) {
40086 var swiper = this;
40087
40088 if (swiper.isHorizontal()) {
40089 return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX;
40090 }
40091
40092 return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY;
40093 },
40094 setDragPosition: function setDragPosition(e) {
40095 var swiper = this;
40096 var scrollbar = swiper.scrollbar,
40097 rtl = swiper.rtlTranslate;
40098 var $el = scrollbar.$el,
40099 dragSize = scrollbar.dragSize,
40100 trackSize = scrollbar.trackSize,
40101 dragStartPos = scrollbar.dragStartPos;
40102 var positionRatio;
40103 positionRatio = (scrollbar.getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
40104 positionRatio = Math.max(Math.min(positionRatio, 1), 0);
40105
40106 if (rtl) {
40107 positionRatio = 1 - positionRatio;
40108 }
40109
40110 var position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;
40111 swiper.updateProgress(position);
40112 swiper.setTranslate(position);
40113 swiper.updateActiveIndex();
40114 swiper.updateSlidesClasses();
40115 },
40116 onDragStart: function onDragStart(e) {
40117 var swiper = this;
40118 var params = swiper.params.scrollbar;
40119 var scrollbar = swiper.scrollbar,
40120 $wrapperEl = swiper.$wrapperEl;
40121 var $el = scrollbar.$el,
40122 $dragEl = scrollbar.$dragEl;
40123 swiper.scrollbar.isTouched = true;
40124 swiper.scrollbar.dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
40125 e.preventDefault();
40126 e.stopPropagation();
40127 $wrapperEl.transition(100);
40128 $dragEl.transition(100);
40129 scrollbar.setDragPosition(e);
40130 clearTimeout(swiper.scrollbar.dragTimeout);
40131 $el.transition(0);
40132
40133 if (params.hide) {
40134 $el.css('opacity', 1);
40135 }
40136
40137 if (swiper.params.cssMode) {
40138 swiper.$wrapperEl.css('scroll-snap-type', 'none');
40139 }
40140
40141 swiper.emit('scrollbarDragStart', e);
40142 },
40143 onDragMove: function onDragMove(e) {
40144 var swiper = this;
40145 var scrollbar = swiper.scrollbar,
40146 $wrapperEl = swiper.$wrapperEl;
40147 var $el = scrollbar.$el,
40148 $dragEl = scrollbar.$dragEl;
40149 if (!swiper.scrollbar.isTouched) return;
40150 if (e.preventDefault) e.preventDefault();else e.returnValue = false;
40151 scrollbar.setDragPosition(e);
40152 $wrapperEl.transition(0);
40153 $el.transition(0);
40154 $dragEl.transition(0);
40155 swiper.emit('scrollbarDragMove', e);
40156 },
40157 onDragEnd: function onDragEnd(e) {
40158 var swiper = this;
40159 var params = swiper.params.scrollbar;
40160 var scrollbar = swiper.scrollbar,
40161 $wrapperEl = swiper.$wrapperEl;
40162 var $el = scrollbar.$el;
40163 if (!swiper.scrollbar.isTouched) return;
40164 swiper.scrollbar.isTouched = false;
40165
40166 if (swiper.params.cssMode) {
40167 swiper.$wrapperEl.css('scroll-snap-type', '');
40168 $wrapperEl.transition('');
40169 }
40170
40171 if (params.hide) {
40172 clearTimeout(swiper.scrollbar.dragTimeout);
40173 swiper.scrollbar.dragTimeout = nextTick(function () {
40174 $el.css('opacity', 0);
40175 $el.transition(400);
40176 }, 1000);
40177 }
40178
40179 swiper.emit('scrollbarDragEnd', e);
40180
40181 if (params.snapOnRelease) {
40182 swiper.slideToClosest();
40183 }
40184 },
40185 enableDraggable: function enableDraggable() {
40186 var swiper = this;
40187 if (!swiper.params.scrollbar.el) return;
40188 var document = getDocument();
40189 var scrollbar = swiper.scrollbar,
40190 touchEventsTouch = swiper.touchEventsTouch,
40191 touchEventsDesktop = swiper.touchEventsDesktop,
40192 params = swiper.params,
40193 support = swiper.support;
40194 var $el = scrollbar.$el;
40195 var target = $el[0];
40196 var activeListener = support.passiveListener && params.passiveListeners ? {
40197 passive: false,
40198 capture: false
40199 } : false;
40200 var passiveListener = support.passiveListener && params.passiveListeners ? {
40201 passive: true,
40202 capture: false
40203 } : false;
40204 if (!target) return;
40205
40206 if (!support.touch) {
40207 target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
40208 document.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
40209 document.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
40210 } else {
40211 target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
40212 target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
40213 target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
40214 }
40215 },
40216 disableDraggable: function disableDraggable() {
40217 var swiper = this;
40218 if (!swiper.params.scrollbar.el) return;
40219 var document = getDocument();
40220 var scrollbar = swiper.scrollbar,
40221 touchEventsTouch = swiper.touchEventsTouch,
40222 touchEventsDesktop = swiper.touchEventsDesktop,
40223 params = swiper.params,
40224 support = swiper.support;
40225 var $el = scrollbar.$el;
40226 var target = $el[0];
40227 var activeListener = support.passiveListener && params.passiveListeners ? {
40228 passive: false,
40229 capture: false
40230 } : false;
40231 var passiveListener = support.passiveListener && params.passiveListeners ? {
40232 passive: true,
40233 capture: false
40234 } : false;
40235 if (!target) return;
40236
40237 if (!support.touch) {
40238 target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
40239 document.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
40240 document.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
40241 } else {
40242 target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
40243 target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
40244 target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
40245 }
40246 },
40247 init: function init() {
40248 var swiper = this;
40249 if (!swiper.params.scrollbar.el) return;
40250 var scrollbar = swiper.scrollbar,
40251 $swiperEl = swiper.$el;
40252 var params = swiper.params.scrollbar;
40253 var $el = $$1(params.el);
40254
40255 if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
40256 $el = $swiperEl.find(params.el);
40257 }
40258
40259 var $dragEl = $el.find("." + swiper.params.scrollbar.dragClass);
40260
40261 if ($dragEl.length === 0) {
40262 $dragEl = $$1("<div class=\"" + swiper.params.scrollbar.dragClass + "\"></div>");
40263 $el.append($dragEl);
40264 }
40265
40266 extend(scrollbar, {
40267 $el: $el,
40268 el: $el[0],
40269 $dragEl: $dragEl,
40270 dragEl: $dragEl[0]
40271 });
40272
40273 if (params.draggable) {
40274 scrollbar.enableDraggable();
40275 }
40276
40277 if ($el) {
40278 $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);
40279 }
40280 },
40281 destroy: function destroy() {
40282 var swiper = this;
40283 swiper.scrollbar.disableDraggable();
40284 }
40285 };
40286 var Scrollbar$1 = {
40287 name: 'scrollbar',
40288 params: {
40289 scrollbar: {
40290 el: null,
40291 dragSize: 'auto',
40292 hide: false,
40293 draggable: false,
40294 snapOnRelease: true,
40295 lockClass: 'swiper-scrollbar-lock',
40296 dragClass: 'swiper-scrollbar-drag'
40297 }
40298 },
40299 create: function create() {
40300 var swiper = this;
40301 bindModuleMethods(swiper, {
40302 scrollbar: _extends$d({
40303 isTouched: false,
40304 timeout: null,
40305 dragTimeout: null
40306 }, Scrollbar)
40307 });
40308 },
40309 on: {
40310 init: function init(swiper) {
40311 swiper.scrollbar.init();
40312 swiper.scrollbar.updateSize();
40313 swiper.scrollbar.setTranslate();
40314 },
40315 update: function update(swiper) {
40316 swiper.scrollbar.updateSize();
40317 },
40318 resize: function resize(swiper) {
40319 swiper.scrollbar.updateSize();
40320 },
40321 observerUpdate: function observerUpdate(swiper) {
40322 swiper.scrollbar.updateSize();
40323 },
40324 setTranslate: function setTranslate(swiper) {
40325 swiper.scrollbar.setTranslate();
40326 },
40327 setTransition: function setTransition(swiper, duration) {
40328 swiper.scrollbar.setTransition(duration);
40329 },
40330 'enable disable': function enableDisable(swiper) {
40331 var $el = swiper.scrollbar.$el;
40332
40333 if ($el) {
40334 $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);
40335 }
40336 },
40337 destroy: function destroy(swiper) {
40338 swiper.scrollbar.destroy();
40339 }
40340 }
40341 };
40342
40343 function _extends$c() {
40344 _extends$c = Object.assign || function (target) {
40345 for (var i = 1; i < arguments.length; i++) {
40346 var source = arguments[i];
40347
40348 for (var key in source) {
40349 if (Object.prototype.hasOwnProperty.call(source, key)) {
40350 target[key] = source[key];
40351 }
40352 }
40353 }
40354
40355 return target;
40356 };
40357
40358 return _extends$c.apply(this, arguments);
40359 }
40360 var Parallax = {
40361 setTransform: function setTransform(el, progress) {
40362 var swiper = this;
40363 var rtl = swiper.rtl;
40364 var $el = $$1(el);
40365 var rtlFactor = rtl ? -1 : 1;
40366 var p = $el.attr('data-swiper-parallax') || '0';
40367 var x = $el.attr('data-swiper-parallax-x');
40368 var y = $el.attr('data-swiper-parallax-y');
40369 var scale = $el.attr('data-swiper-parallax-scale');
40370 var opacity = $el.attr('data-swiper-parallax-opacity');
40371
40372 if (x || y) {
40373 x = x || '0';
40374 y = y || '0';
40375 } else if (swiper.isHorizontal()) {
40376 x = p;
40377 y = '0';
40378 } else {
40379 y = p;
40380 x = '0';
40381 }
40382
40383 if (x.indexOf('%') >= 0) {
40384 x = parseInt(x, 10) * progress * rtlFactor + "%";
40385 } else {
40386 x = x * progress * rtlFactor + "px";
40387 }
40388
40389 if (y.indexOf('%') >= 0) {
40390 y = parseInt(y, 10) * progress + "%";
40391 } else {
40392 y = y * progress + "px";
40393 }
40394
40395 if (typeof opacity !== 'undefined' && opacity !== null) {
40396 var currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));
40397 $el[0].style.opacity = currentOpacity;
40398 }
40399
40400 if (typeof scale === 'undefined' || scale === null) {
40401 $el.transform("translate3d(" + x + ", " + y + ", 0px)");
40402 } else {
40403 var currentScale = scale - (scale - 1) * (1 - Math.abs(progress));
40404 $el.transform("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")");
40405 }
40406 },
40407 setTranslate: function setTranslate() {
40408 var swiper = this;
40409 var $el = swiper.$el,
40410 slides = swiper.slides,
40411 progress = swiper.progress,
40412 snapGrid = swiper.snapGrid;
40413 $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (el) {
40414 swiper.parallax.setTransform(el, progress);
40415 });
40416 slides.each(function (slideEl, slideIndex) {
40417 var slideProgress = slideEl.progress;
40418
40419 if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
40420 slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);
40421 }
40422
40423 slideProgress = Math.min(Math.max(slideProgress, -1), 1);
40424 $$1(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (el) {
40425 swiper.parallax.setTransform(el, slideProgress);
40426 });
40427 });
40428 },
40429 setTransition: function setTransition(duration) {
40430 if (duration === void 0) {
40431 duration = this.params.speed;
40432 }
40433
40434 var swiper = this;
40435 var $el = swiper.$el;
40436 $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]').each(function (parallaxEl) {
40437 var $parallaxEl = $$1(parallaxEl);
40438 var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
40439 if (duration === 0) parallaxDuration = 0;
40440 $parallaxEl.transition(parallaxDuration);
40441 });
40442 }
40443 };
40444 var Parallax$1 = {
40445 name: 'parallax',
40446 params: {
40447 parallax: {
40448 enabled: false
40449 }
40450 },
40451 create: function create() {
40452 var swiper = this;
40453 bindModuleMethods(swiper, {
40454 parallax: _extends$c({}, Parallax)
40455 });
40456 },
40457 on: {
40458 beforeInit: function beforeInit(swiper) {
40459 if (!swiper.params.parallax.enabled) return;
40460 swiper.params.watchSlidesProgress = true;
40461 swiper.originalParams.watchSlidesProgress = true;
40462 },
40463 init: function init(swiper) {
40464 if (!swiper.params.parallax.enabled) return;
40465 swiper.parallax.setTranslate();
40466 },
40467 setTranslate: function setTranslate(swiper) {
40468 if (!swiper.params.parallax.enabled) return;
40469 swiper.parallax.setTranslate();
40470 },
40471 setTransition: function setTransition(swiper, duration) {
40472 if (!swiper.params.parallax.enabled) return;
40473 swiper.parallax.setTransition(duration);
40474 }
40475 }
40476 };
40477
40478 function _extends$b() {
40479 _extends$b = Object.assign || function (target) {
40480 for (var i = 1; i < arguments.length; i++) {
40481 var source = arguments[i];
40482
40483 for (var key in source) {
40484 if (Object.prototype.hasOwnProperty.call(source, key)) {
40485 target[key] = source[key];
40486 }
40487 }
40488 }
40489
40490 return target;
40491 };
40492
40493 return _extends$b.apply(this, arguments);
40494 }
40495 var Zoom = {
40496 // Calc Scale From Multi-touches
40497 getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
40498 if (e.targetTouches.length < 2) return 1;
40499 var x1 = e.targetTouches[0].pageX;
40500 var y1 = e.targetTouches[0].pageY;
40501 var x2 = e.targetTouches[1].pageX;
40502 var y2 = e.targetTouches[1].pageY;
40503 var distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
40504 return distance;
40505 },
40506 // Events
40507 onGestureStart: function onGestureStart(e) {
40508 var swiper = this;
40509 var support = swiper.support;
40510 var params = swiper.params.zoom;
40511 var zoom = swiper.zoom;
40512 var gesture = zoom.gesture;
40513 zoom.fakeGestureTouched = false;
40514 zoom.fakeGestureMoved = false;
40515
40516 if (!support.gestures) {
40517 if (e.type !== 'touchstart' || e.type === 'touchstart' && e.targetTouches.length < 2) {
40518 return;
40519 }
40520
40521 zoom.fakeGestureTouched = true;
40522 gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
40523 }
40524
40525 if (!gesture.$slideEl || !gesture.$slideEl.length) {
40526 gesture.$slideEl = $$1(e.target).closest("." + swiper.params.slideClass);
40527 if (gesture.$slideEl.length === 0) gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
40528 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
40529 gesture.$imageWrapEl = gesture.$imageEl.parent("." + params.containerClass);
40530 gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
40531
40532 if (gesture.$imageWrapEl.length === 0) {
40533 gesture.$imageEl = undefined;
40534 return;
40535 }
40536 }
40537
40538 if (gesture.$imageEl) {
40539 gesture.$imageEl.transition(0);
40540 }
40541
40542 swiper.zoom.isScaling = true;
40543 },
40544 onGestureChange: function onGestureChange(e) {
40545 var swiper = this;
40546 var support = swiper.support;
40547 var params = swiper.params.zoom;
40548 var zoom = swiper.zoom;
40549 var gesture = zoom.gesture;
40550
40551 if (!support.gestures) {
40552 if (e.type !== 'touchmove' || e.type === 'touchmove' && e.targetTouches.length < 2) {
40553 return;
40554 }
40555
40556 zoom.fakeGestureMoved = true;
40557 gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
40558 }
40559
40560 if (!gesture.$imageEl || gesture.$imageEl.length === 0) {
40561 if (e.type === 'gesturechange') zoom.onGestureStart(e);
40562 return;
40563 }
40564
40565 if (support.gestures) {
40566 zoom.scale = e.scale * zoom.currentScale;
40567 } else {
40568 zoom.scale = gesture.scaleMove / gesture.scaleStart * zoom.currentScale;
40569 }
40570
40571 if (zoom.scale > gesture.maxRatio) {
40572 zoom.scale = gesture.maxRatio - 1 + Math.pow(zoom.scale - gesture.maxRatio + 1, 0.5);
40573 }
40574
40575 if (zoom.scale < params.minRatio) {
40576 zoom.scale = params.minRatio + 1 - Math.pow(params.minRatio - zoom.scale + 1, 0.5);
40577 }
40578
40579 gesture.$imageEl.transform("translate3d(0,0,0) scale(" + zoom.scale + ")");
40580 },
40581 onGestureEnd: function onGestureEnd(e) {
40582 var swiper = this;
40583 var device = swiper.device;
40584 var support = swiper.support;
40585 var params = swiper.params.zoom;
40586 var zoom = swiper.zoom;
40587 var gesture = zoom.gesture;
40588
40589 if (!support.gestures) {
40590 if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
40591 return;
40592 }
40593
40594 if (e.type !== 'touchend' || e.type === 'touchend' && e.changedTouches.length < 2 && !device.android) {
40595 return;
40596 }
40597
40598 zoom.fakeGestureTouched = false;
40599 zoom.fakeGestureMoved = false;
40600 }
40601
40602 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
40603 zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
40604 gesture.$imageEl.transition(swiper.params.speed).transform("translate3d(0,0,0) scale(" + zoom.scale + ")");
40605 zoom.currentScale = zoom.scale;
40606 zoom.isScaling = false;
40607 if (zoom.scale === 1) gesture.$slideEl = undefined;
40608 },
40609 onTouchStart: function onTouchStart(e) {
40610 var swiper = this;
40611 var device = swiper.device;
40612 var zoom = swiper.zoom;
40613 var gesture = zoom.gesture,
40614 image = zoom.image;
40615 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
40616 if (image.isTouched) return;
40617 if (device.android && e.cancelable) e.preventDefault();
40618 image.isTouched = true;
40619 image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
40620 image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
40621 },
40622 onTouchMove: function onTouchMove(e) {
40623 var swiper = this;
40624 var zoom = swiper.zoom;
40625 var gesture = zoom.gesture,
40626 image = zoom.image,
40627 velocity = zoom.velocity;
40628 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
40629 swiper.allowClick = false;
40630 if (!image.isTouched || !gesture.$slideEl) return;
40631
40632 if (!image.isMoved) {
40633 image.width = gesture.$imageEl[0].offsetWidth;
40634 image.height = gesture.$imageEl[0].offsetHeight;
40635 image.startX = getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
40636 image.startY = getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
40637 gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
40638 gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
40639 gesture.$imageWrapEl.transition(0);
40640
40641 if (swiper.rtl) {
40642 image.startX = -image.startX;
40643 image.startY = -image.startY;
40644 }
40645 } // Define if we need image drag
40646
40647
40648 var scaledWidth = image.width * zoom.scale;
40649 var scaledHeight = image.height * zoom.scale;
40650 if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) return;
40651 image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
40652 image.maxX = -image.minX;
40653 image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
40654 image.maxY = -image.minY;
40655 image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
40656 image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
40657
40658 if (!image.isMoved && !zoom.isScaling) {
40659 if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {
40660 image.isTouched = false;
40661 return;
40662 }
40663
40664 if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {
40665 image.isTouched = false;
40666 return;
40667 }
40668 }
40669
40670 if (e.cancelable) {
40671 e.preventDefault();
40672 }
40673
40674 e.stopPropagation();
40675 image.isMoved = true;
40676 image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX;
40677 image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY;
40678
40679 if (image.currentX < image.minX) {
40680 image.currentX = image.minX + 1 - Math.pow(image.minX - image.currentX + 1, 0.8);
40681 }
40682
40683 if (image.currentX > image.maxX) {
40684 image.currentX = image.maxX - 1 + Math.pow(image.currentX - image.maxX + 1, 0.8);
40685 }
40686
40687 if (image.currentY < image.minY) {
40688 image.currentY = image.minY + 1 - Math.pow(image.minY - image.currentY + 1, 0.8);
40689 }
40690
40691 if (image.currentY > image.maxY) {
40692 image.currentY = image.maxY - 1 + Math.pow(image.currentY - image.maxY + 1, 0.8);
40693 } // Velocity
40694
40695
40696 if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;
40697 if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;
40698 if (!velocity.prevTime) velocity.prevTime = Date.now();
40699 velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
40700 velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
40701 if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;
40702 if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;
40703 velocity.prevPositionX = image.touchesCurrent.x;
40704 velocity.prevPositionY = image.touchesCurrent.y;
40705 velocity.prevTime = Date.now();
40706 gesture.$imageWrapEl.transform("translate3d(" + image.currentX + "px, " + image.currentY + "px,0)");
40707 },
40708 onTouchEnd: function onTouchEnd() {
40709 var swiper = this;
40710 var zoom = swiper.zoom;
40711 var gesture = zoom.gesture,
40712 image = zoom.image,
40713 velocity = zoom.velocity;
40714 if (!gesture.$imageEl || gesture.$imageEl.length === 0) return;
40715
40716 if (!image.isTouched || !image.isMoved) {
40717 image.isTouched = false;
40718 image.isMoved = false;
40719 return;
40720 }
40721
40722 image.isTouched = false;
40723 image.isMoved = false;
40724 var momentumDurationX = 300;
40725 var momentumDurationY = 300;
40726 var momentumDistanceX = velocity.x * momentumDurationX;
40727 var newPositionX = image.currentX + momentumDistanceX;
40728 var momentumDistanceY = velocity.y * momentumDurationY;
40729 var newPositionY = image.currentY + momentumDistanceY; // Fix duration
40730
40731 if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);
40732 if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);
40733 var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
40734 image.currentX = newPositionX;
40735 image.currentY = newPositionY; // Define if we need image drag
40736
40737 var scaledWidth = image.width * zoom.scale;
40738 var scaledHeight = image.height * zoom.scale;
40739 image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
40740 image.maxX = -image.minX;
40741 image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
40742 image.maxY = -image.minY;
40743 image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
40744 image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
40745 gesture.$imageWrapEl.transition(momentumDuration).transform("translate3d(" + image.currentX + "px, " + image.currentY + "px,0)");
40746 },
40747 onTransitionEnd: function onTransitionEnd() {
40748 var swiper = this;
40749 var zoom = swiper.zoom;
40750 var gesture = zoom.gesture;
40751
40752 if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
40753 if (gesture.$imageEl) {
40754 gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
40755 }
40756
40757 if (gesture.$imageWrapEl) {
40758 gesture.$imageWrapEl.transform('translate3d(0,0,0)');
40759 }
40760
40761 zoom.scale = 1;
40762 zoom.currentScale = 1;
40763 gesture.$slideEl = undefined;
40764 gesture.$imageEl = undefined;
40765 gesture.$imageWrapEl = undefined;
40766 }
40767 },
40768 // Toggle Zoom
40769 toggle: function toggle(e) {
40770 var swiper = this;
40771 var zoom = swiper.zoom;
40772
40773 if (zoom.scale && zoom.scale !== 1) {
40774 // Zoom Out
40775 zoom.out();
40776 } else {
40777 // Zoom In
40778 zoom.in(e);
40779 }
40780 },
40781 in: function _in(e) {
40782 var swiper = this;
40783 var window = getWindow();
40784 var zoom = swiper.zoom;
40785 var params = swiper.params.zoom;
40786 var gesture = zoom.gesture,
40787 image = zoom.image;
40788
40789 if (!gesture.$slideEl) {
40790 if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
40791 gesture.$slideEl = swiper.$wrapperEl.children("." + swiper.params.slideActiveClass);
40792 } else {
40793 gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
40794 }
40795
40796 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
40797 gesture.$imageWrapEl = gesture.$imageEl.parent("." + params.containerClass);
40798 }
40799
40800 if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return;
40801 gesture.$slideEl.addClass("" + params.zoomedSlideClass);
40802 var touchX;
40803 var touchY;
40804 var offsetX;
40805 var offsetY;
40806 var diffX;
40807 var diffY;
40808 var translateX;
40809 var translateY;
40810 var imageWidth;
40811 var imageHeight;
40812 var scaledWidth;
40813 var scaledHeight;
40814 var translateMinX;
40815 var translateMinY;
40816 var translateMaxX;
40817 var translateMaxY;
40818 var slideWidth;
40819 var slideHeight;
40820
40821 if (typeof image.touchesStart.x === 'undefined' && e) {
40822 touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
40823 touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
40824 } else {
40825 touchX = image.touchesStart.x;
40826 touchY = image.touchesStart.y;
40827 }
40828
40829 zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
40830 zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
40831
40832 if (e) {
40833 slideWidth = gesture.$slideEl[0].offsetWidth;
40834 slideHeight = gesture.$slideEl[0].offsetHeight;
40835 offsetX = gesture.$slideEl.offset().left + window.scrollX;
40836 offsetY = gesture.$slideEl.offset().top + window.scrollY;
40837 diffX = offsetX + slideWidth / 2 - touchX;
40838 diffY = offsetY + slideHeight / 2 - touchY;
40839 imageWidth = gesture.$imageEl[0].offsetWidth;
40840 imageHeight = gesture.$imageEl[0].offsetHeight;
40841 scaledWidth = imageWidth * zoom.scale;
40842 scaledHeight = imageHeight * zoom.scale;
40843 translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);
40844 translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);
40845 translateMaxX = -translateMinX;
40846 translateMaxY = -translateMinY;
40847 translateX = diffX * zoom.scale;
40848 translateY = diffY * zoom.scale;
40849
40850 if (translateX < translateMinX) {
40851 translateX = translateMinX;
40852 }
40853
40854 if (translateX > translateMaxX) {
40855 translateX = translateMaxX;
40856 }
40857
40858 if (translateY < translateMinY) {
40859 translateY = translateMinY;
40860 }
40861
40862 if (translateY > translateMaxY) {
40863 translateY = translateMaxY;
40864 }
40865 } else {
40866 translateX = 0;
40867 translateY = 0;
40868 }
40869
40870 gesture.$imageWrapEl.transition(300).transform("translate3d(" + translateX + "px, " + translateY + "px,0)");
40871 gesture.$imageEl.transition(300).transform("translate3d(0,0,0) scale(" + zoom.scale + ")");
40872 },
40873 out: function out() {
40874 var swiper = this;
40875 var zoom = swiper.zoom;
40876 var params = swiper.params.zoom;
40877 var gesture = zoom.gesture;
40878
40879 if (!gesture.$slideEl) {
40880 if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
40881 gesture.$slideEl = swiper.$wrapperEl.children("." + swiper.params.slideActiveClass);
40882 } else {
40883 gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
40884 }
40885
40886 gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
40887 gesture.$imageWrapEl = gesture.$imageEl.parent("." + params.containerClass);
40888 }
40889
40890 if (!gesture.$imageEl || gesture.$imageEl.length === 0 || !gesture.$imageWrapEl || gesture.$imageWrapEl.length === 0) return;
40891 zoom.scale = 1;
40892 zoom.currentScale = 1;
40893 gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
40894 gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
40895 gesture.$slideEl.removeClass("" + params.zoomedSlideClass);
40896 gesture.$slideEl = undefined;
40897 },
40898 toggleGestures: function toggleGestures(method) {
40899 var swiper = this;
40900 var zoom = swiper.zoom;
40901 var selector = zoom.slideSelector,
40902 passive = zoom.passiveListener;
40903 swiper.$wrapperEl[method]('gesturestart', selector, zoom.onGestureStart, passive);
40904 swiper.$wrapperEl[method]('gesturechange', selector, zoom.onGestureChange, passive);
40905 swiper.$wrapperEl[method]('gestureend', selector, zoom.onGestureEnd, passive);
40906 },
40907 enableGestures: function enableGestures() {
40908 if (this.zoom.gesturesEnabled) return;
40909 this.zoom.gesturesEnabled = true;
40910 this.zoom.toggleGestures('on');
40911 },
40912 disableGestures: function disableGestures() {
40913 if (!this.zoom.gesturesEnabled) return;
40914 this.zoom.gesturesEnabled = false;
40915 this.zoom.toggleGestures('off');
40916 },
40917 // Attach/Detach Events
40918 enable: function enable() {
40919 var swiper = this;
40920 var support = swiper.support;
40921 var zoom = swiper.zoom;
40922 if (zoom.enabled) return;
40923 zoom.enabled = true;
40924 var passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? {
40925 passive: true,
40926 capture: false
40927 } : false;
40928 var activeListenerWithCapture = support.passiveListener ? {
40929 passive: false,
40930 capture: true
40931 } : true;
40932 var slideSelector = "." + swiper.params.slideClass;
40933 swiper.zoom.passiveListener = passiveListener;
40934 swiper.zoom.slideSelector = slideSelector; // Scale image
40935
40936 if (support.gestures) {
40937 swiper.$wrapperEl.on(swiper.touchEvents.start, swiper.zoom.enableGestures, passiveListener);
40938 swiper.$wrapperEl.on(swiper.touchEvents.end, swiper.zoom.disableGestures, passiveListener);
40939 } else if (swiper.touchEvents.start === 'touchstart') {
40940 swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
40941 swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
40942 swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
40943
40944 if (swiper.touchEvents.cancel) {
40945 swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
40946 }
40947 } // Move image
40948
40949
40950 swiper.$wrapperEl.on(swiper.touchEvents.move, "." + swiper.params.zoom.containerClass, zoom.onTouchMove, activeListenerWithCapture);
40951 },
40952 disable: function disable() {
40953 var swiper = this;
40954 var zoom = swiper.zoom;
40955 if (!zoom.enabled) return;
40956 var support = swiper.support;
40957 swiper.zoom.enabled = false;
40958 var passiveListener = swiper.touchEvents.start === 'touchstart' && support.passiveListener && swiper.params.passiveListeners ? {
40959 passive: true,
40960 capture: false
40961 } : false;
40962 var activeListenerWithCapture = support.passiveListener ? {
40963 passive: false,
40964 capture: true
40965 } : true;
40966 var slideSelector = "." + swiper.params.slideClass; // Scale image
40967
40968 if (support.gestures) {
40969 swiper.$wrapperEl.off(swiper.touchEvents.start, swiper.zoom.enableGestures, passiveListener);
40970 swiper.$wrapperEl.off(swiper.touchEvents.end, swiper.zoom.disableGestures, passiveListener);
40971 } else if (swiper.touchEvents.start === 'touchstart') {
40972 swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
40973 swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
40974 swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
40975
40976 if (swiper.touchEvents.cancel) {
40977 swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
40978 }
40979 } // Move image
40980
40981
40982 swiper.$wrapperEl.off(swiper.touchEvents.move, "." + swiper.params.zoom.containerClass, zoom.onTouchMove, activeListenerWithCapture);
40983 }
40984 };
40985 var Zoom$1 = {
40986 name: 'zoom',
40987 params: {
40988 zoom: {
40989 enabled: false,
40990 maxRatio: 3,
40991 minRatio: 1,
40992 toggle: true,
40993 containerClass: 'swiper-zoom-container',
40994 zoomedSlideClass: 'swiper-slide-zoomed'
40995 }
40996 },
40997 create: function create() {
40998 var swiper = this;
40999 bindModuleMethods(swiper, {
41000 zoom: _extends$b({
41001 enabled: false,
41002 scale: 1,
41003 currentScale: 1,
41004 isScaling: false,
41005 gesture: {
41006 $slideEl: undefined,
41007 slideWidth: undefined,
41008 slideHeight: undefined,
41009 $imageEl: undefined,
41010 $imageWrapEl: undefined,
41011 maxRatio: 3
41012 },
41013 image: {
41014 isTouched: undefined,
41015 isMoved: undefined,
41016 currentX: undefined,
41017 currentY: undefined,
41018 minX: undefined,
41019 minY: undefined,
41020 maxX: undefined,
41021 maxY: undefined,
41022 width: undefined,
41023 height: undefined,
41024 startX: undefined,
41025 startY: undefined,
41026 touchesStart: {},
41027 touchesCurrent: {}
41028 },
41029 velocity: {
41030 x: undefined,
41031 y: undefined,
41032 prevPositionX: undefined,
41033 prevPositionY: undefined,
41034 prevTime: undefined
41035 }
41036 }, Zoom)
41037 });
41038 var scale = 1;
41039 Object.defineProperty(swiper.zoom, 'scale', {
41040 get: function get() {
41041 return scale;
41042 },
41043 set: function set(value) {
41044 if (scale !== value) {
41045 var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
41046 var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
41047 swiper.emit('zoomChange', value, imageEl, slideEl);
41048 }
41049
41050 scale = value;
41051 }
41052 });
41053 },
41054 on: {
41055 init: function init(swiper) {
41056 if (swiper.params.zoom.enabled) {
41057 swiper.zoom.enable();
41058 }
41059 },
41060 destroy: function destroy(swiper) {
41061 swiper.zoom.disable();
41062 },
41063 touchStart: function touchStart(swiper, e) {
41064 if (!swiper.zoom.enabled) return;
41065 swiper.zoom.onTouchStart(e);
41066 },
41067 touchEnd: function touchEnd(swiper, e) {
41068 if (!swiper.zoom.enabled) return;
41069 swiper.zoom.onTouchEnd(e);
41070 },
41071 doubleTap: function doubleTap(swiper, e) {
41072 if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
41073 swiper.zoom.toggle(e);
41074 }
41075 },
41076 transitionEnd: function transitionEnd(swiper) {
41077 if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
41078 swiper.zoom.onTransitionEnd();
41079 }
41080 },
41081 slideChange: function slideChange(swiper) {
41082 if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
41083 swiper.zoom.onTransitionEnd();
41084 }
41085 }
41086 }
41087 };
41088
41089 function _extends$a() {
41090 _extends$a = Object.assign || function (target) {
41091 for (var i = 1; i < arguments.length; i++) {
41092 var source = arguments[i];
41093
41094 for (var key in source) {
41095 if (Object.prototype.hasOwnProperty.call(source, key)) {
41096 target[key] = source[key];
41097 }
41098 }
41099 }
41100
41101 return target;
41102 };
41103
41104 return _extends$a.apply(this, arguments);
41105 }
41106 var Lazy = {
41107 loadInSlide: function loadInSlide(index, loadInDuplicate) {
41108 if (loadInDuplicate === void 0) {
41109 loadInDuplicate = true;
41110 }
41111
41112 var swiper = this;
41113 var params = swiper.params.lazy;
41114 if (typeof index === 'undefined') return;
41115 if (swiper.slides.length === 0) return;
41116 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
41117 var $slideEl = isVirtual ? swiper.$wrapperEl.children("." + swiper.params.slideClass + "[data-swiper-slide-index=\"" + index + "\"]") : swiper.slides.eq(index);
41118 var $images = $slideEl.find("." + params.elementClass + ":not(." + params.loadedClass + "):not(." + params.loadingClass + ")");
41119
41120 if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
41121 $images.push($slideEl[0]);
41122 }
41123
41124 if ($images.length === 0) return;
41125 $images.each(function (imageEl) {
41126 var $imageEl = $$1(imageEl);
41127 $imageEl.addClass(params.loadingClass);
41128 var background = $imageEl.attr('data-background');
41129 var src = $imageEl.attr('data-src');
41130 var srcset = $imageEl.attr('data-srcset');
41131 var sizes = $imageEl.attr('data-sizes');
41132 var $pictureEl = $imageEl.parent('picture');
41133 swiper.loadImage($imageEl[0], src || background, srcset, sizes, false, function () {
41134 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper && !swiper.params || swiper.destroyed) return;
41135
41136 if (background) {
41137 $imageEl.css('background-image', "url(\"" + background + "\")");
41138 $imageEl.removeAttr('data-background');
41139 } else {
41140 if (srcset) {
41141 $imageEl.attr('srcset', srcset);
41142 $imageEl.removeAttr('data-srcset');
41143 }
41144
41145 if (sizes) {
41146 $imageEl.attr('sizes', sizes);
41147 $imageEl.removeAttr('data-sizes');
41148 }
41149
41150 if ($pictureEl.length) {
41151 $pictureEl.children('source').each(function (sourceEl) {
41152 var $source = $$1(sourceEl);
41153
41154 if ($source.attr('data-srcset')) {
41155 $source.attr('srcset', $source.attr('data-srcset'));
41156 $source.removeAttr('data-srcset');
41157 }
41158 });
41159 }
41160
41161 if (src) {
41162 $imageEl.attr('src', src);
41163 $imageEl.removeAttr('data-src');
41164 }
41165 }
41166
41167 $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
41168 $slideEl.find("." + params.preloaderClass).remove();
41169
41170 if (swiper.params.loop && loadInDuplicate) {
41171 var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
41172
41173 if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
41174 var originalSlide = swiper.$wrapperEl.children("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + swiper.params.slideDuplicateClass + ")");
41175 swiper.lazy.loadInSlide(originalSlide.index(), false);
41176 } else {
41177 var duplicatedSlide = swiper.$wrapperEl.children("." + swiper.params.slideDuplicateClass + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]");
41178 swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
41179 }
41180 }
41181
41182 swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
41183
41184 if (swiper.params.autoHeight) {
41185 swiper.updateAutoHeight();
41186 }
41187 });
41188 swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
41189 });
41190 },
41191 load: function load() {
41192 var swiper = this;
41193 var $wrapperEl = swiper.$wrapperEl,
41194 swiperParams = swiper.params,
41195 slides = swiper.slides,
41196 activeIndex = swiper.activeIndex;
41197 var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
41198 var params = swiperParams.lazy;
41199 var slidesPerView = swiperParams.slidesPerView;
41200
41201 if (slidesPerView === 'auto') {
41202 slidesPerView = 0;
41203 }
41204
41205 function slideExist(index) {
41206 if (isVirtual) {
41207 if ($wrapperEl.children("." + swiperParams.slideClass + "[data-swiper-slide-index=\"" + index + "\"]").length) {
41208 return true;
41209 }
41210 } else if (slides[index]) return true;
41211
41212 return false;
41213 }
41214
41215 function slideIndex(slideEl) {
41216 if (isVirtual) {
41217 return $$1(slideEl).attr('data-swiper-slide-index');
41218 }
41219
41220 return $$1(slideEl).index();
41221 }
41222
41223 if (!swiper.lazy.initialImageLoaded) swiper.lazy.initialImageLoaded = true;
41224
41225 if (swiper.params.watchSlidesVisibility) {
41226 $wrapperEl.children("." + swiperParams.slideVisibleClass).each(function (slideEl) {
41227 var index = isVirtual ? $$1(slideEl).attr('data-swiper-slide-index') : $$1(slideEl).index();
41228 swiper.lazy.loadInSlide(index);
41229 });
41230 } else if (slidesPerView > 1) {
41231 for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
41232 if (slideExist(i)) swiper.lazy.loadInSlide(i);
41233 }
41234 } else {
41235 swiper.lazy.loadInSlide(activeIndex);
41236 }
41237
41238 if (params.loadPrevNext) {
41239 if (slidesPerView > 1 || params.loadPrevNextAmount && params.loadPrevNextAmount > 1) {
41240 var amount = params.loadPrevNextAmount;
41241 var spv = slidesPerView;
41242 var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
41243 var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0); // Next Slides
41244
41245 for (var _i = activeIndex + slidesPerView; _i < maxIndex; _i += 1) {
41246 if (slideExist(_i)) swiper.lazy.loadInSlide(_i);
41247 } // Prev Slides
41248
41249
41250 for (var _i2 = minIndex; _i2 < activeIndex; _i2 += 1) {
41251 if (slideExist(_i2)) swiper.lazy.loadInSlide(_i2);
41252 }
41253 } else {
41254 var nextSlide = $wrapperEl.children("." + swiperParams.slideNextClass);
41255 if (nextSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(nextSlide));
41256 var prevSlide = $wrapperEl.children("." + swiperParams.slidePrevClass);
41257 if (prevSlide.length > 0) swiper.lazy.loadInSlide(slideIndex(prevSlide));
41258 }
41259 }
41260 },
41261 checkInViewOnLoad: function checkInViewOnLoad() {
41262 var window = getWindow();
41263 var swiper = this;
41264 if (!swiper || swiper.destroyed) return;
41265 var $scrollElement = swiper.params.lazy.scrollingElement ? $$1(swiper.params.lazy.scrollingElement) : $$1(window);
41266 var isWindow = $scrollElement[0] === window;
41267 var scrollElementWidth = isWindow ? window.innerWidth : $scrollElement[0].offsetWidth;
41268 var scrollElementHeight = isWindow ? window.innerHeight : $scrollElement[0].offsetHeight;
41269 var swiperOffset = swiper.$el.offset();
41270 var rtl = swiper.rtlTranslate;
41271 var inView = false;
41272 if (rtl) swiperOffset.left -= swiper.$el[0].scrollLeft;
41273 var swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiper.width, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiper.height], [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height]];
41274
41275 for (var i = 0; i < swiperCoord.length; i += 1) {
41276 var point = swiperCoord[i];
41277
41278 if (point[0] >= 0 && point[0] <= scrollElementWidth && point[1] >= 0 && point[1] <= scrollElementHeight) {
41279 if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
41280
41281 inView = true;
41282 }
41283 }
41284
41285 if (inView) {
41286 swiper.lazy.load();
41287 $scrollElement.off('scroll', swiper.lazy.checkInViewOnLoad);
41288 } else if (!swiper.lazy.scrollHandlerAttached) {
41289 swiper.lazy.scrollHandlerAttached = true;
41290 $scrollElement.on('scroll', swiper.lazy.checkInViewOnLoad);
41291 }
41292 }
41293 };
41294 var Lazy$1 = {
41295 name: 'lazy',
41296 params: {
41297 lazy: {
41298 checkInView: false,
41299 enabled: false,
41300 loadPrevNext: false,
41301 loadPrevNextAmount: 1,
41302 loadOnTransitionStart: false,
41303 scrollingElement: '',
41304 elementClass: 'swiper-lazy',
41305 loadingClass: 'swiper-lazy-loading',
41306 loadedClass: 'swiper-lazy-loaded',
41307 preloaderClass: 'swiper-lazy-preloader'
41308 }
41309 },
41310 create: function create() {
41311 var swiper = this;
41312 bindModuleMethods(swiper, {
41313 lazy: _extends$a({
41314 initialImageLoaded: false
41315 }, Lazy)
41316 });
41317 },
41318 on: {
41319 beforeInit: function beforeInit(swiper) {
41320 if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
41321 swiper.params.preloadImages = false;
41322 }
41323 },
41324 init: function init(swiper) {
41325 if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
41326 if (swiper.params.lazy.checkInView) {
41327 swiper.lazy.checkInViewOnLoad();
41328 } else {
41329 swiper.lazy.load();
41330 }
41331 }
41332 },
41333 scroll: function scroll(swiper) {
41334 if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
41335 swiper.lazy.load();
41336 }
41337 },
41338 'scrollbarDragMove resize _freeModeNoMomentumRelease': function lazyLoad(swiper) {
41339 if (swiper.params.lazy.enabled) {
41340 swiper.lazy.load();
41341 }
41342 },
41343 transitionStart: function transitionStart(swiper) {
41344 if (swiper.params.lazy.enabled) {
41345 if (swiper.params.lazy.loadOnTransitionStart || !swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded) {
41346 swiper.lazy.load();
41347 }
41348 }
41349 },
41350 transitionEnd: function transitionEnd(swiper) {
41351 if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
41352 swiper.lazy.load();
41353 }
41354 },
41355 slideChange: function slideChange(swiper) {
41356 if (swiper.params.lazy.enabled && swiper.params.cssMode) {
41357 swiper.lazy.load();
41358 }
41359 }
41360 }
41361 };
41362
41363 function _extends$9() {
41364 _extends$9 = Object.assign || function (target) {
41365 for (var i = 1; i < arguments.length; i++) {
41366 var source = arguments[i];
41367
41368 for (var key in source) {
41369 if (Object.prototype.hasOwnProperty.call(source, key)) {
41370 target[key] = source[key];
41371 }
41372 }
41373 }
41374
41375 return target;
41376 };
41377
41378 return _extends$9.apply(this, arguments);
41379 }
41380 var Controller = {
41381 LinearSpline: function LinearSpline(x, y) {
41382 var binarySearch = function search() {
41383 var maxIndex;
41384 var minIndex;
41385 var guess;
41386 return function (array, val) {
41387 minIndex = -1;
41388 maxIndex = array.length;
41389
41390 while (maxIndex - minIndex > 1) {
41391 guess = maxIndex + minIndex >> 1;
41392
41393 if (array[guess] <= val) {
41394 minIndex = guess;
41395 } else {
41396 maxIndex = guess;
41397 }
41398 }
41399
41400 return maxIndex;
41401 };
41402 }();
41403
41404 this.x = x;
41405 this.y = y;
41406 this.lastIndex = x.length - 1; // Given an x value (x2), return the expected y2 value:
41407 // (x1,y1) is the known point before given value,
41408 // (x3,y3) is the known point after given value.
41409
41410 var i1;
41411 var i3;
41412
41413 this.interpolate = function interpolate(x2) {
41414 if (!x2) return 0; // Get the indexes of x1 and x3 (the array indexes before and after given x2):
41415
41416 i3 = binarySearch(this.x, x2);
41417 i1 = i3 - 1; // We have our indexes i1 & i3, so we can calculate already:
41418 // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
41419
41420 return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];
41421 };
41422
41423 return this;
41424 },
41425 // xxx: for now i will just save one spline function to to
41426 getInterpolateFunction: function getInterpolateFunction(c) {
41427 var swiper = this;
41428
41429 if (!swiper.controller.spline) {
41430 swiper.controller.spline = swiper.params.loop ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid) : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
41431 }
41432 },
41433 setTranslate: function setTranslate(_setTranslate, byController) {
41434 var swiper = this;
41435 var controlled = swiper.controller.control;
41436 var multiplier;
41437 var controlledTranslate;
41438 var Swiper = swiper.constructor;
41439
41440 function setControlledTranslate(c) {
41441 // this will create an Interpolate function based on the snapGrids
41442 // x is the Grid of the scrolled scroller and y will be the controlled scroller
41443 // it makes sense to create this only once and recall it for the interpolation
41444 // the function does a lot of value caching for performance
41445 var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
41446
41447 if (swiper.params.controller.by === 'slide') {
41448 swiper.controller.getInterpolateFunction(c); // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
41449 // but it did not work out
41450
41451 controlledTranslate = -swiper.controller.spline.interpolate(-translate);
41452 }
41453
41454 if (!controlledTranslate || swiper.params.controller.by === 'container') {
41455 multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
41456 controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();
41457 }
41458
41459 if (swiper.params.controller.inverse) {
41460 controlledTranslate = c.maxTranslate() - controlledTranslate;
41461 }
41462
41463 c.updateProgress(controlledTranslate);
41464 c.setTranslate(controlledTranslate, swiper);
41465 c.updateActiveIndex();
41466 c.updateSlidesClasses();
41467 }
41468
41469 if (Array.isArray(controlled)) {
41470 for (var i = 0; i < controlled.length; i += 1) {
41471 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
41472 setControlledTranslate(controlled[i]);
41473 }
41474 }
41475 } else if (controlled instanceof Swiper && byController !== controlled) {
41476 setControlledTranslate(controlled);
41477 }
41478 },
41479 setTransition: function setTransition(duration, byController) {
41480 var swiper = this;
41481 var Swiper = swiper.constructor;
41482 var controlled = swiper.controller.control;
41483 var i;
41484
41485 function setControlledTransition(c) {
41486 c.setTransition(duration, swiper);
41487
41488 if (duration !== 0) {
41489 c.transitionStart();
41490
41491 if (c.params.autoHeight) {
41492 nextTick(function () {
41493 c.updateAutoHeight();
41494 });
41495 }
41496
41497 c.$wrapperEl.transitionEnd(function () {
41498 if (!controlled) return;
41499
41500 if (c.params.loop && swiper.params.controller.by === 'slide') {
41501 c.loopFix();
41502 }
41503
41504 c.transitionEnd();
41505 });
41506 }
41507 }
41508
41509 if (Array.isArray(controlled)) {
41510 for (i = 0; i < controlled.length; i += 1) {
41511 if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
41512 setControlledTransition(controlled[i]);
41513 }
41514 }
41515 } else if (controlled instanceof Swiper && byController !== controlled) {
41516 setControlledTransition(controlled);
41517 }
41518 }
41519 };
41520 var Controller$1 = {
41521 name: 'controller',
41522 params: {
41523 controller: {
41524 control: undefined,
41525 inverse: false,
41526 by: 'slide' // or 'container'
41527
41528 }
41529 },
41530 create: function create() {
41531 var swiper = this;
41532 bindModuleMethods(swiper, {
41533 controller: _extends$9({
41534 control: swiper.params.controller.control
41535 }, Controller)
41536 });
41537 },
41538 on: {
41539 update: function update(swiper) {
41540 if (!swiper.controller.control) return;
41541
41542 if (swiper.controller.spline) {
41543 swiper.controller.spline = undefined;
41544 delete swiper.controller.spline;
41545 }
41546 },
41547 resize: function resize(swiper) {
41548 if (!swiper.controller.control) return;
41549
41550 if (swiper.controller.spline) {
41551 swiper.controller.spline = undefined;
41552 delete swiper.controller.spline;
41553 }
41554 },
41555 observerUpdate: function observerUpdate(swiper) {
41556 if (!swiper.controller.control) return;
41557
41558 if (swiper.controller.spline) {
41559 swiper.controller.spline = undefined;
41560 delete swiper.controller.spline;
41561 }
41562 },
41563 setTranslate: function setTranslate(swiper, translate, byController) {
41564 if (!swiper.controller.control) return;
41565 swiper.controller.setTranslate(translate, byController);
41566 },
41567 setTransition: function setTransition(swiper, duration, byController) {
41568 if (!swiper.controller.control) return;
41569 swiper.controller.setTransition(duration, byController);
41570 }
41571 }
41572 };
41573
41574 function _extends$8() {
41575 _extends$8 = Object.assign || function (target) {
41576 for (var i = 1; i < arguments.length; i++) {
41577 var source = arguments[i];
41578
41579 for (var key in source) {
41580 if (Object.prototype.hasOwnProperty.call(source, key)) {
41581 target[key] = source[key];
41582 }
41583 }
41584 }
41585
41586 return target;
41587 };
41588
41589 return _extends$8.apply(this, arguments);
41590 }
41591 var A11y = {
41592 getRandomNumber: function getRandomNumber(size) {
41593 if (size === void 0) {
41594 size = 16;
41595 }
41596
41597 var randomChar = function randomChar() {
41598 return Math.round(16 * Math.random()).toString(16);
41599 };
41600
41601 return 'x'.repeat(size).replace(/x/g, randomChar);
41602 },
41603 makeElFocusable: function makeElFocusable($el) {
41604 $el.attr('tabIndex', '0');
41605 return $el;
41606 },
41607 makeElNotFocusable: function makeElNotFocusable($el) {
41608 $el.attr('tabIndex', '-1');
41609 return $el;
41610 },
41611 addElRole: function addElRole($el, role) {
41612 $el.attr('role', role);
41613 return $el;
41614 },
41615 addElRoleDescription: function addElRoleDescription($el, description) {
41616 $el.attr('aria-roledescription', description);
41617 return $el;
41618 },
41619 addElControls: function addElControls($el, controls) {
41620 $el.attr('aria-controls', controls);
41621 return $el;
41622 },
41623 addElLabel: function addElLabel($el, label) {
41624 $el.attr('aria-label', label);
41625 return $el;
41626 },
41627 addElId: function addElId($el, id) {
41628 $el.attr('id', id);
41629 return $el;
41630 },
41631 addElLive: function addElLive($el, live) {
41632 $el.attr('aria-live', live);
41633 return $el;
41634 },
41635 disableEl: function disableEl($el) {
41636 $el.attr('aria-disabled', true);
41637 return $el;
41638 },
41639 enableEl: function enableEl($el) {
41640 $el.attr('aria-disabled', false);
41641 return $el;
41642 },
41643 onEnterOrSpaceKey: function onEnterOrSpaceKey(e) {
41644 if (e.keyCode !== 13 && e.keyCode !== 32) return;
41645 var swiper = this;
41646 var params = swiper.params.a11y;
41647 var $targetEl = $$1(e.target);
41648
41649 if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
41650 if (!(swiper.isEnd && !swiper.params.loop)) {
41651 swiper.slideNext();
41652 }
41653
41654 if (swiper.isEnd) {
41655 swiper.a11y.notify(params.lastSlideMessage);
41656 } else {
41657 swiper.a11y.notify(params.nextSlideMessage);
41658 }
41659 }
41660
41661 if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
41662 if (!(swiper.isBeginning && !swiper.params.loop)) {
41663 swiper.slidePrev();
41664 }
41665
41666 if (swiper.isBeginning) {
41667 swiper.a11y.notify(params.firstSlideMessage);
41668 } else {
41669 swiper.a11y.notify(params.prevSlideMessage);
41670 }
41671 }
41672
41673 if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) {
41674 $targetEl[0].click();
41675 }
41676 },
41677 notify: function notify(message) {
41678 var swiper = this;
41679 var notification = swiper.a11y.liveRegion;
41680 if (notification.length === 0) return;
41681 notification.html('');
41682 notification.html(message);
41683 },
41684 updateNavigation: function updateNavigation() {
41685 var swiper = this;
41686 if (swiper.params.loop || !swiper.navigation) return;
41687 var _swiper$navigation = swiper.navigation,
41688 $nextEl = _swiper$navigation.$nextEl,
41689 $prevEl = _swiper$navigation.$prevEl;
41690
41691 if ($prevEl && $prevEl.length > 0) {
41692 if (swiper.isBeginning) {
41693 swiper.a11y.disableEl($prevEl);
41694 swiper.a11y.makeElNotFocusable($prevEl);
41695 } else {
41696 swiper.a11y.enableEl($prevEl);
41697 swiper.a11y.makeElFocusable($prevEl);
41698 }
41699 }
41700
41701 if ($nextEl && $nextEl.length > 0) {
41702 if (swiper.isEnd) {
41703 swiper.a11y.disableEl($nextEl);
41704 swiper.a11y.makeElNotFocusable($nextEl);
41705 } else {
41706 swiper.a11y.enableEl($nextEl);
41707 swiper.a11y.makeElFocusable($nextEl);
41708 }
41709 }
41710 },
41711 updatePagination: function updatePagination() {
41712 var swiper = this;
41713 var params = swiper.params.a11y;
41714
41715 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
41716 swiper.pagination.bullets.each(function (bulletEl) {
41717 var $bulletEl = $$1(bulletEl);
41718 swiper.a11y.makeElFocusable($bulletEl);
41719
41720 if (!swiper.params.pagination.renderBullet) {
41721 swiper.a11y.addElRole($bulletEl, 'button');
41722 swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1));
41723 }
41724 });
41725 }
41726 },
41727 init: function init() {
41728 var swiper = this;
41729 var params = swiper.params.a11y;
41730 swiper.$el.append(swiper.a11y.liveRegion); // Container
41731
41732 var $containerEl = swiper.$el;
41733
41734 if (params.containerRoleDescriptionMessage) {
41735 swiper.a11y.addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);
41736 }
41737
41738 if (params.containerMessage) {
41739 swiper.a11y.addElLabel($containerEl, params.containerMessage);
41740 } // Wrapper
41741
41742
41743 var $wrapperEl = swiper.$wrapperEl;
41744 var wrapperId = $wrapperEl.attr('id') || "swiper-wrapper-" + swiper.a11y.getRandomNumber(16);
41745 var live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';
41746 swiper.a11y.addElId($wrapperEl, wrapperId);
41747 swiper.a11y.addElLive($wrapperEl, live); // Slide
41748
41749 if (params.itemRoleDescriptionMessage) {
41750 swiper.a11y.addElRoleDescription($$1(swiper.slides), params.itemRoleDescriptionMessage);
41751 }
41752
41753 swiper.a11y.addElRole($$1(swiper.slides), params.slideRole);
41754 swiper.slides.each(function (slideEl) {
41755 var $slideEl = $$1(slideEl);
41756 var ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, $slideEl.index() + 1).replace(/\{\{slidesLength\}\}/, swiper.slides.length);
41757 swiper.a11y.addElLabel($slideEl, ariaLabelMessage);
41758 }); // Navigation
41759
41760 var $nextEl;
41761 var $prevEl;
41762
41763 if (swiper.navigation && swiper.navigation.$nextEl) {
41764 $nextEl = swiper.navigation.$nextEl;
41765 }
41766
41767 if (swiper.navigation && swiper.navigation.$prevEl) {
41768 $prevEl = swiper.navigation.$prevEl;
41769 }
41770
41771 if ($nextEl && $nextEl.length) {
41772 swiper.a11y.makeElFocusable($nextEl);
41773
41774 if ($nextEl[0].tagName !== 'BUTTON') {
41775 swiper.a11y.addElRole($nextEl, 'button');
41776 $nextEl.on('keydown', swiper.a11y.onEnterOrSpaceKey);
41777 }
41778
41779 swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
41780 swiper.a11y.addElControls($nextEl, wrapperId);
41781 }
41782
41783 if ($prevEl && $prevEl.length) {
41784 swiper.a11y.makeElFocusable($prevEl);
41785
41786 if ($prevEl[0].tagName !== 'BUTTON') {
41787 swiper.a11y.addElRole($prevEl, 'button');
41788 $prevEl.on('keydown', swiper.a11y.onEnterOrSpaceKey);
41789 }
41790
41791 swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
41792 swiper.a11y.addElControls($prevEl, wrapperId);
41793 } // Pagination
41794
41795
41796 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
41797 swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), swiper.a11y.onEnterOrSpaceKey);
41798 }
41799 },
41800 destroy: function destroy() {
41801 var swiper = this;
41802 if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) swiper.a11y.liveRegion.remove();
41803 var $nextEl;
41804 var $prevEl;
41805
41806 if (swiper.navigation && swiper.navigation.$nextEl) {
41807 $nextEl = swiper.navigation.$nextEl;
41808 }
41809
41810 if (swiper.navigation && swiper.navigation.$prevEl) {
41811 $prevEl = swiper.navigation.$prevEl;
41812 }
41813
41814 if ($nextEl) {
41815 $nextEl.off('keydown', swiper.a11y.onEnterOrSpaceKey);
41816 }
41817
41818 if ($prevEl) {
41819 $prevEl.off('keydown', swiper.a11y.onEnterOrSpaceKey);
41820 } // Pagination
41821
41822
41823 if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
41824 swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), swiper.a11y.onEnterOrSpaceKey);
41825 }
41826 }
41827 };
41828 var A11y$1 = {
41829 name: 'a11y',
41830 params: {
41831 a11y: {
41832 enabled: true,
41833 notificationClass: 'swiper-notification',
41834 prevSlideMessage: 'Previous slide',
41835 nextSlideMessage: 'Next slide',
41836 firstSlideMessage: 'This is the first slide',
41837 lastSlideMessage: 'This is the last slide',
41838 paginationBulletMessage: 'Go to slide {{index}}',
41839 slideLabelMessage: '{{index}} / {{slidesLength}}',
41840 containerMessage: null,
41841 containerRoleDescriptionMessage: null,
41842 itemRoleDescriptionMessage: null,
41843 slideRole: 'group'
41844 }
41845 },
41846 create: function create() {
41847 var swiper = this;
41848 bindModuleMethods(swiper, {
41849 a11y: _extends$8({}, A11y, {
41850 liveRegion: $$1("<span class=\"" + swiper.params.a11y.notificationClass + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")
41851 })
41852 });
41853 },
41854 on: {
41855 afterInit: function afterInit(swiper) {
41856 if (!swiper.params.a11y.enabled) return;
41857 swiper.a11y.init();
41858 swiper.a11y.updateNavigation();
41859 },
41860 toEdge: function toEdge(swiper) {
41861 if (!swiper.params.a11y.enabled) return;
41862 swiper.a11y.updateNavigation();
41863 },
41864 fromEdge: function fromEdge(swiper) {
41865 if (!swiper.params.a11y.enabled) return;
41866 swiper.a11y.updateNavigation();
41867 },
41868 paginationUpdate: function paginationUpdate(swiper) {
41869 if (!swiper.params.a11y.enabled) return;
41870 swiper.a11y.updatePagination();
41871 },
41872 destroy: function destroy(swiper) {
41873 if (!swiper.params.a11y.enabled) return;
41874 swiper.a11y.destroy();
41875 }
41876 }
41877 };
41878
41879 function _extends$7() {
41880 _extends$7 = Object.assign || function (target) {
41881 for (var i = 1; i < arguments.length; i++) {
41882 var source = arguments[i];
41883
41884 for (var key in source) {
41885 if (Object.prototype.hasOwnProperty.call(source, key)) {
41886 target[key] = source[key];
41887 }
41888 }
41889 }
41890
41891 return target;
41892 };
41893
41894 return _extends$7.apply(this, arguments);
41895 }
41896 var History = {
41897 init: function init() {
41898 var swiper = this;
41899 var window = getWindow();
41900 if (!swiper.params.history) return;
41901
41902 if (!window.history || !window.history.pushState) {
41903 swiper.params.history.enabled = false;
41904 swiper.params.hashNavigation.enabled = true;
41905 return;
41906 }
41907
41908 var history = swiper.history;
41909 history.initialized = true;
41910 history.paths = History.getPathValues(swiper.params.url);
41911 if (!history.paths.key && !history.paths.value) return;
41912 history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
41913
41914 if (!swiper.params.history.replaceState) {
41915 window.addEventListener('popstate', swiper.history.setHistoryPopState);
41916 }
41917 },
41918 destroy: function destroy() {
41919 var swiper = this;
41920 var window = getWindow();
41921
41922 if (!swiper.params.history.replaceState) {
41923 window.removeEventListener('popstate', swiper.history.setHistoryPopState);
41924 }
41925 },
41926 setHistoryPopState: function setHistoryPopState() {
41927 var swiper = this;
41928 swiper.history.paths = History.getPathValues(swiper.params.url);
41929 swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
41930 },
41931 getPathValues: function getPathValues(urlOverride) {
41932 var window = getWindow();
41933 var location;
41934
41935 if (urlOverride) {
41936 location = new URL(urlOverride);
41937 } else {
41938 location = window.location;
41939 }
41940
41941 var pathArray = location.pathname.slice(1).split('/').filter(function (part) {
41942 return part !== '';
41943 });
41944 var total = pathArray.length;
41945 var key = pathArray[total - 2];
41946 var value = pathArray[total - 1];
41947 return {
41948 key: key,
41949 value: value
41950 };
41951 },
41952 setHistory: function setHistory(key, index) {
41953 var swiper = this;
41954 var window = getWindow();
41955 if (!swiper.history.initialized || !swiper.params.history.enabled) return;
41956 var location;
41957
41958 if (swiper.params.url) {
41959 location = new URL(swiper.params.url);
41960 } else {
41961 location = window.location;
41962 }
41963
41964 var slide = swiper.slides.eq(index);
41965 var value = History.slugify(slide.attr('data-history'));
41966
41967 if (swiper.params.history.root.length > 0) {
41968 var root = swiper.params.history.root;
41969 if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);
41970 value = root + "/" + key + "/" + value;
41971 } else if (!location.pathname.includes(key)) {
41972 value = key + "/" + value;
41973 }
41974
41975 var currentState = window.history.state;
41976
41977 if (currentState && currentState.value === value) {
41978 return;
41979 }
41980
41981 if (swiper.params.history.replaceState) {
41982 window.history.replaceState({
41983 value: value
41984 }, null, value);
41985 } else {
41986 window.history.pushState({
41987 value: value
41988 }, null, value);
41989 }
41990 },
41991 slugify: function slugify(text) {
41992 return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');
41993 },
41994 scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
41995 var swiper = this;
41996
41997 if (value) {
41998 for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
41999 var slide = swiper.slides.eq(i);
42000 var slideHistory = History.slugify(slide.attr('data-history'));
42001
42002 if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
42003 var index = slide.index();
42004 swiper.slideTo(index, speed, runCallbacks);
42005 }
42006 }
42007 } else {
42008 swiper.slideTo(0, speed, runCallbacks);
42009 }
42010 }
42011 };
42012 var History$1 = {
42013 name: 'history',
42014 params: {
42015 history: {
42016 enabled: false,
42017 root: '',
42018 replaceState: false,
42019 key: 'slides'
42020 }
42021 },
42022 create: function create() {
42023 var swiper = this;
42024 bindModuleMethods(swiper, {
42025 history: _extends$7({}, History)
42026 });
42027 },
42028 on: {
42029 init: function init(swiper) {
42030 if (swiper.params.history.enabled) {
42031 swiper.history.init();
42032 }
42033 },
42034 destroy: function destroy(swiper) {
42035 if (swiper.params.history.enabled) {
42036 swiper.history.destroy();
42037 }
42038 },
42039 'transitionEnd _freeModeNoMomentumRelease': function transitionEnd_freeModeNoMomentumRelease(swiper) {
42040 if (swiper.history.initialized) {
42041 swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
42042 }
42043 },
42044 slideChange: function slideChange(swiper) {
42045 if (swiper.history.initialized && swiper.params.cssMode) {
42046 swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
42047 }
42048 }
42049 }
42050 };
42051
42052 function _extends$6() {
42053 _extends$6 = Object.assign || function (target) {
42054 for (var i = 1; i < arguments.length; i++) {
42055 var source = arguments[i];
42056
42057 for (var key in source) {
42058 if (Object.prototype.hasOwnProperty.call(source, key)) {
42059 target[key] = source[key];
42060 }
42061 }
42062 }
42063
42064 return target;
42065 };
42066
42067 return _extends$6.apply(this, arguments);
42068 }
42069 var HashNavigation = {
42070 onHashCange: function onHashCange() {
42071 var swiper = this;
42072 var document = getDocument();
42073 swiper.emit('hashChange');
42074 var newHash = document.location.hash.replace('#', '');
42075 var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');
42076
42077 if (newHash !== activeSlideHash) {
42078 var newIndex = swiper.$wrapperEl.children("." + swiper.params.slideClass + "[data-hash=\"" + newHash + "\"]").index();
42079 if (typeof newIndex === 'undefined') return;
42080 swiper.slideTo(newIndex);
42081 }
42082 },
42083 setHash: function setHash() {
42084 var swiper = this;
42085 var window = getWindow();
42086 var document = getDocument();
42087 if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) return;
42088
42089 if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {
42090 window.history.replaceState(null, null, "#" + swiper.slides.eq(swiper.activeIndex).attr('data-hash') || '');
42091 swiper.emit('hashSet');
42092 } else {
42093 var slide = swiper.slides.eq(swiper.activeIndex);
42094 var hash = slide.attr('data-hash') || slide.attr('data-history');
42095 document.location.hash = hash || '';
42096 swiper.emit('hashSet');
42097 }
42098 },
42099 init: function init() {
42100 var swiper = this;
42101 var document = getDocument();
42102 var window = getWindow();
42103 if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;
42104 swiper.hashNavigation.initialized = true;
42105 var hash = document.location.hash.replace('#', '');
42106
42107 if (hash) {
42108 var speed = 0;
42109
42110 for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
42111 var slide = swiper.slides.eq(i);
42112 var slideHash = slide.attr('data-hash') || slide.attr('data-history');
42113
42114 if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {
42115 var index = slide.index();
42116 swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);
42117 }
42118 }
42119 }
42120
42121 if (swiper.params.hashNavigation.watchState) {
42122 $$1(window).on('hashchange', swiper.hashNavigation.onHashCange);
42123 }
42124 },
42125 destroy: function destroy() {
42126 var swiper = this;
42127 var window = getWindow();
42128
42129 if (swiper.params.hashNavigation.watchState) {
42130 $$1(window).off('hashchange', swiper.hashNavigation.onHashCange);
42131 }
42132 }
42133 };
42134 var HashNavigation$1 = {
42135 name: 'hash-navigation',
42136 params: {
42137 hashNavigation: {
42138 enabled: false,
42139 replaceState: false,
42140 watchState: false
42141 }
42142 },
42143 create: function create() {
42144 var swiper = this;
42145 bindModuleMethods(swiper, {
42146 hashNavigation: _extends$6({
42147 initialized: false
42148 }, HashNavigation)
42149 });
42150 },
42151 on: {
42152 init: function init(swiper) {
42153 if (swiper.params.hashNavigation.enabled) {
42154 swiper.hashNavigation.init();
42155 }
42156 },
42157 destroy: function destroy(swiper) {
42158 if (swiper.params.hashNavigation.enabled) {
42159 swiper.hashNavigation.destroy();
42160 }
42161 },
42162 'transitionEnd _freeModeNoMomentumRelease': function transitionEnd_freeModeNoMomentumRelease(swiper) {
42163 if (swiper.hashNavigation.initialized) {
42164 swiper.hashNavigation.setHash();
42165 }
42166 },
42167 slideChange: function slideChange(swiper) {
42168 if (swiper.hashNavigation.initialized && swiper.params.cssMode) {
42169 swiper.hashNavigation.setHash();
42170 }
42171 }
42172 }
42173 };
42174
42175 function _extends$5() {
42176 _extends$5 = Object.assign || function (target) {
42177 for (var i = 1; i < arguments.length; i++) {
42178 var source = arguments[i];
42179
42180 for (var key in source) {
42181 if (Object.prototype.hasOwnProperty.call(source, key)) {
42182 target[key] = source[key];
42183 }
42184 }
42185 }
42186
42187 return target;
42188 };
42189
42190 return _extends$5.apply(this, arguments);
42191 }
42192 var Autoplay = {
42193 run: function run() {
42194 var swiper = this;
42195 var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
42196 var delay = swiper.params.autoplay.delay;
42197
42198 if ($activeSlideEl.attr('data-swiper-autoplay')) {
42199 delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
42200 }
42201
42202 clearTimeout(swiper.autoplay.timeout);
42203 swiper.autoplay.timeout = nextTick(function () {
42204 var autoplayResult;
42205
42206 if (swiper.params.autoplay.reverseDirection) {
42207 if (swiper.params.loop) {
42208 swiper.loopFix();
42209 autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);
42210 swiper.emit('autoplay');
42211 } else if (!swiper.isBeginning) {
42212 autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);
42213 swiper.emit('autoplay');
42214 } else if (!swiper.params.autoplay.stopOnLastSlide) {
42215 autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
42216 swiper.emit('autoplay');
42217 } else {
42218 swiper.autoplay.stop();
42219 }
42220 } else if (swiper.params.loop) {
42221 swiper.loopFix();
42222 autoplayResult = swiper.slideNext(swiper.params.speed, true, true);
42223 swiper.emit('autoplay');
42224 } else if (!swiper.isEnd) {
42225 autoplayResult = swiper.slideNext(swiper.params.speed, true, true);
42226 swiper.emit('autoplay');
42227 } else if (!swiper.params.autoplay.stopOnLastSlide) {
42228 autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);
42229 swiper.emit('autoplay');
42230 } else {
42231 swiper.autoplay.stop();
42232 }
42233
42234 if (swiper.params.cssMode && swiper.autoplay.running) swiper.autoplay.run();else if (autoplayResult === false) {
42235 swiper.autoplay.run();
42236 }
42237 }, delay);
42238 },
42239 start: function start() {
42240 var swiper = this;
42241 if (typeof swiper.autoplay.timeout !== 'undefined') return false;
42242 if (swiper.autoplay.running) return false;
42243 swiper.autoplay.running = true;
42244 swiper.emit('autoplayStart');
42245 swiper.autoplay.run();
42246 return true;
42247 },
42248 stop: function stop() {
42249 var swiper = this;
42250 if (!swiper.autoplay.running) return false;
42251 if (typeof swiper.autoplay.timeout === 'undefined') return false;
42252
42253 if (swiper.autoplay.timeout) {
42254 clearTimeout(swiper.autoplay.timeout);
42255 swiper.autoplay.timeout = undefined;
42256 }
42257
42258 swiper.autoplay.running = false;
42259 swiper.emit('autoplayStop');
42260 return true;
42261 },
42262 pause: function pause(speed) {
42263 var swiper = this;
42264 if (!swiper.autoplay.running) return;
42265 if (swiper.autoplay.paused) return;
42266 if (swiper.autoplay.timeout) clearTimeout(swiper.autoplay.timeout);
42267 swiper.autoplay.paused = true;
42268
42269 if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
42270 swiper.autoplay.paused = false;
42271 swiper.autoplay.run();
42272 } else {
42273 ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {
42274 swiper.$wrapperEl[0].addEventListener(event, swiper.autoplay.onTransitionEnd);
42275 });
42276 }
42277 },
42278 onVisibilityChange: function onVisibilityChange() {
42279 var swiper = this;
42280 var document = getDocument();
42281
42282 if (document.visibilityState === 'hidden' && swiper.autoplay.running) {
42283 swiper.autoplay.pause();
42284 }
42285
42286 if (document.visibilityState === 'visible' && swiper.autoplay.paused) {
42287 swiper.autoplay.run();
42288 swiper.autoplay.paused = false;
42289 }
42290 },
42291 onTransitionEnd: function onTransitionEnd(e) {
42292 var swiper = this;
42293 if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;
42294 if (e.target !== swiper.$wrapperEl[0]) return;
42295 ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {
42296 swiper.$wrapperEl[0].removeEventListener(event, swiper.autoplay.onTransitionEnd);
42297 });
42298 swiper.autoplay.paused = false;
42299
42300 if (!swiper.autoplay.running) {
42301 swiper.autoplay.stop();
42302 } else {
42303 swiper.autoplay.run();
42304 }
42305 },
42306 onMouseEnter: function onMouseEnter() {
42307 var swiper = this;
42308 swiper.autoplay.pause();
42309 ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {
42310 swiper.$wrapperEl[0].removeEventListener(event, swiper.autoplay.onTransitionEnd);
42311 });
42312 },
42313 onMouseLeave: function onMouseLeave() {
42314 var swiper = this;
42315 swiper.autoplay.paused = false;
42316 swiper.autoplay.run();
42317 },
42318 attachMouseEvents: function attachMouseEvents() {
42319 var swiper = this;
42320
42321 if (swiper.params.autoplay.pauseOnMouseEnter) {
42322 swiper.$el.on('mouseenter', swiper.autoplay.onMouseEnter);
42323 swiper.$el.on('mouseleave', swiper.autoplay.onMouseLeave);
42324 }
42325 },
42326 detachMouseEvents: function detachMouseEvents() {
42327 var swiper = this;
42328 swiper.$el.off('mouseenter', swiper.autoplay.onMouseEnter);
42329 swiper.$el.off('mouseleave', swiper.autoplay.onMouseLeave);
42330 }
42331 };
42332 var Autoplay$1 = {
42333 name: 'autoplay',
42334 params: {
42335 autoplay: {
42336 enabled: false,
42337 delay: 3000,
42338 waitForTransition: true,
42339 disableOnInteraction: true,
42340 stopOnLastSlide: false,
42341 reverseDirection: false,
42342 pauseOnMouseEnter: false
42343 }
42344 },
42345 create: function create() {
42346 var swiper = this;
42347 bindModuleMethods(swiper, {
42348 autoplay: _extends$5({}, Autoplay, {
42349 running: false,
42350 paused: false
42351 })
42352 });
42353 },
42354 on: {
42355 init: function init(swiper) {
42356 if (swiper.params.autoplay.enabled) {
42357 swiper.autoplay.start();
42358 var document = getDocument();
42359 document.addEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
42360 swiper.autoplay.attachMouseEvents();
42361 }
42362 },
42363 beforeTransitionStart: function beforeTransitionStart(swiper, speed, internal) {
42364 if (swiper.autoplay.running) {
42365 if (internal || !swiper.params.autoplay.disableOnInteraction) {
42366 swiper.autoplay.pause(speed);
42367 } else {
42368 swiper.autoplay.stop();
42369 }
42370 }
42371 },
42372 sliderFirstMove: function sliderFirstMove(swiper) {
42373 if (swiper.autoplay.running) {
42374 if (swiper.params.autoplay.disableOnInteraction) {
42375 swiper.autoplay.stop();
42376 } else {
42377 swiper.autoplay.pause();
42378 }
42379 }
42380 },
42381 touchEnd: function touchEnd(swiper) {
42382 if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {
42383 swiper.autoplay.run();
42384 }
42385 },
42386 destroy: function destroy(swiper) {
42387 swiper.autoplay.detachMouseEvents();
42388
42389 if (swiper.autoplay.running) {
42390 swiper.autoplay.stop();
42391 }
42392
42393 var document = getDocument();
42394 document.removeEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
42395 }
42396 }
42397 };
42398
42399 function _extends$4() {
42400 _extends$4 = Object.assign || function (target) {
42401 for (var i = 1; i < arguments.length; i++) {
42402 var source = arguments[i];
42403
42404 for (var key in source) {
42405 if (Object.prototype.hasOwnProperty.call(source, key)) {
42406 target[key] = source[key];
42407 }
42408 }
42409 }
42410
42411 return target;
42412 };
42413
42414 return _extends$4.apply(this, arguments);
42415 }
42416 var Fade = {
42417 setTranslate: function setTranslate() {
42418 var swiper = this;
42419 var slides = swiper.slides;
42420
42421 for (var i = 0; i < slides.length; i += 1) {
42422 var $slideEl = swiper.slides.eq(i);
42423 var offset = $slideEl[0].swiperSlideOffset;
42424 var tx = -offset;
42425 if (!swiper.params.virtualTranslate) tx -= swiper.translate;
42426 var ty = 0;
42427
42428 if (!swiper.isHorizontal()) {
42429 ty = tx;
42430 tx = 0;
42431 }
42432
42433 var slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs($slideEl[0].progress), 0) : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
42434 $slideEl.css({
42435 opacity: slideOpacity
42436 }).transform("translate3d(" + tx + "px, " + ty + "px, 0px)");
42437 }
42438 },
42439 setTransition: function setTransition(duration) {
42440 var swiper = this;
42441 var slides = swiper.slides,
42442 $wrapperEl = swiper.$wrapperEl;
42443 slides.transition(duration);
42444
42445 if (swiper.params.virtualTranslate && duration !== 0) {
42446 var eventTriggered = false;
42447 slides.transitionEnd(function () {
42448 if (eventTriggered) return;
42449 if (!swiper || swiper.destroyed) return;
42450 eventTriggered = true;
42451 swiper.animating = false;
42452 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
42453
42454 for (var i = 0; i < triggerEvents.length; i += 1) {
42455 $wrapperEl.trigger(triggerEvents[i]);
42456 }
42457 });
42458 }
42459 }
42460 };
42461 var EffectFade = {
42462 name: 'effect-fade',
42463 params: {
42464 fadeEffect: {
42465 crossFade: false
42466 }
42467 },
42468 create: function create() {
42469 var swiper = this;
42470 bindModuleMethods(swiper, {
42471 fadeEffect: _extends$4({}, Fade)
42472 });
42473 },
42474 on: {
42475 beforeInit: function beforeInit(swiper) {
42476 if (swiper.params.effect !== 'fade') return;
42477 swiper.classNames.push(swiper.params.containerModifierClass + "fade");
42478 var overwriteParams = {
42479 slidesPerView: 1,
42480 slidesPerColumn: 1,
42481 slidesPerGroup: 1,
42482 watchSlidesProgress: true,
42483 spaceBetween: 0,
42484 virtualTranslate: true
42485 };
42486 extend(swiper.params, overwriteParams);
42487 extend(swiper.originalParams, overwriteParams);
42488 },
42489 setTranslate: function setTranslate(swiper) {
42490 if (swiper.params.effect !== 'fade') return;
42491 swiper.fadeEffect.setTranslate();
42492 },
42493 setTransition: function setTransition(swiper, duration) {
42494 if (swiper.params.effect !== 'fade') return;
42495 swiper.fadeEffect.setTransition(duration);
42496 }
42497 }
42498 };
42499
42500 function _extends$3() {
42501 _extends$3 = Object.assign || function (target) {
42502 for (var i = 1; i < arguments.length; i++) {
42503 var source = arguments[i];
42504
42505 for (var key in source) {
42506 if (Object.prototype.hasOwnProperty.call(source, key)) {
42507 target[key] = source[key];
42508 }
42509 }
42510 }
42511
42512 return target;
42513 };
42514
42515 return _extends$3.apply(this, arguments);
42516 }
42517 var Cube = {
42518 setTranslate: function setTranslate() {
42519 var swiper = this;
42520 var $el = swiper.$el,
42521 $wrapperEl = swiper.$wrapperEl,
42522 slides = swiper.slides,
42523 swiperWidth = swiper.width,
42524 swiperHeight = swiper.height,
42525 rtl = swiper.rtlTranslate,
42526 swiperSize = swiper.size,
42527 browser = swiper.browser;
42528 var params = swiper.params.cubeEffect;
42529 var isHorizontal = swiper.isHorizontal();
42530 var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
42531 var wrapperRotate = 0;
42532 var $cubeShadowEl;
42533
42534 if (params.shadow) {
42535 if (isHorizontal) {
42536 $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
42537
42538 if ($cubeShadowEl.length === 0) {
42539 $cubeShadowEl = $$1('<div class="swiper-cube-shadow"></div>');
42540 $wrapperEl.append($cubeShadowEl);
42541 }
42542
42543 $cubeShadowEl.css({
42544 height: swiperWidth + "px"
42545 });
42546 } else {
42547 $cubeShadowEl = $el.find('.swiper-cube-shadow');
42548
42549 if ($cubeShadowEl.length === 0) {
42550 $cubeShadowEl = $$1('<div class="swiper-cube-shadow"></div>');
42551 $el.append($cubeShadowEl);
42552 }
42553 }
42554 }
42555
42556 for (var i = 0; i < slides.length; i += 1) {
42557 var $slideEl = slides.eq(i);
42558 var slideIndex = i;
42559
42560 if (isVirtual) {
42561 slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
42562 }
42563
42564 var slideAngle = slideIndex * 90;
42565 var round = Math.floor(slideAngle / 360);
42566
42567 if (rtl) {
42568 slideAngle = -slideAngle;
42569 round = Math.floor(-slideAngle / 360);
42570 }
42571
42572 var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
42573 var tx = 0;
42574 var ty = 0;
42575 var tz = 0;
42576
42577 if (slideIndex % 4 === 0) {
42578 tx = -round * 4 * swiperSize;
42579 tz = 0;
42580 } else if ((slideIndex - 1) % 4 === 0) {
42581 tx = 0;
42582 tz = -round * 4 * swiperSize;
42583 } else if ((slideIndex - 2) % 4 === 0) {
42584 tx = swiperSize + round * 4 * swiperSize;
42585 tz = swiperSize;
42586 } else if ((slideIndex - 3) % 4 === 0) {
42587 tx = -swiperSize;
42588 tz = 3 * swiperSize + swiperSize * 4 * round;
42589 }
42590
42591 if (rtl) {
42592 tx = -tx;
42593 }
42594
42595 if (!isHorizontal) {
42596 ty = tx;
42597 tx = 0;
42598 }
42599
42600 var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
42601
42602 if (progress <= 1 && progress > -1) {
42603 wrapperRotate = slideIndex * 90 + progress * 90;
42604 if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;
42605 }
42606
42607 $slideEl.transform(transform);
42608
42609 if (params.slideShadows) {
42610 // Set shadows
42611 var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
42612 var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
42613
42614 if (shadowBefore.length === 0) {
42615 shadowBefore = $$1("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>");
42616 $slideEl.append(shadowBefore);
42617 }
42618
42619 if (shadowAfter.length === 0) {
42620 shadowAfter = $$1("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>");
42621 $slideEl.append(shadowAfter);
42622 }
42623
42624 if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);
42625 if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);
42626 }
42627 }
42628
42629 $wrapperEl.css({
42630 '-webkit-transform-origin': "50% 50% -" + swiperSize / 2 + "px",
42631 '-moz-transform-origin': "50% 50% -" + swiperSize / 2 + "px",
42632 '-ms-transform-origin': "50% 50% -" + swiperSize / 2 + "px",
42633 'transform-origin': "50% 50% -" + swiperSize / 2 + "px"
42634 });
42635
42636 if (params.shadow) {
42637 if (isHorizontal) {
42638 $cubeShadowEl.transform("translate3d(0px, " + (swiperWidth / 2 + params.shadowOffset) + "px, " + -swiperWidth / 2 + "px) rotateX(90deg) rotateZ(0deg) scale(" + params.shadowScale + ")");
42639 } else {
42640 var shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
42641 var multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
42642 var scale1 = params.shadowScale;
42643 var scale2 = params.shadowScale / multiplier;
42644 var offset = params.shadowOffset;
42645 $cubeShadowEl.transform("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + (swiperHeight / 2 + offset) + "px, " + -swiperHeight / 2 / scale2 + "px) rotateX(-90deg)");
42646 }
42647 }
42648
42649 var zFactor = browser.isSafari || browser.isWebView ? -swiperSize / 2 : 0;
42650 $wrapperEl.transform("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)");
42651 },
42652 setTransition: function setTransition(duration) {
42653 var swiper = this;
42654 var $el = swiper.$el,
42655 slides = swiper.slides;
42656 slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
42657
42658 if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
42659 $el.find('.swiper-cube-shadow').transition(duration);
42660 }
42661 }
42662 };
42663 var EffectCube = {
42664 name: 'effect-cube',
42665 params: {
42666 cubeEffect: {
42667 slideShadows: true,
42668 shadow: true,
42669 shadowOffset: 20,
42670 shadowScale: 0.94
42671 }
42672 },
42673 create: function create() {
42674 var swiper = this;
42675 bindModuleMethods(swiper, {
42676 cubeEffect: _extends$3({}, Cube)
42677 });
42678 },
42679 on: {
42680 beforeInit: function beforeInit(swiper) {
42681 if (swiper.params.effect !== 'cube') return;
42682 swiper.classNames.push(swiper.params.containerModifierClass + "cube");
42683 swiper.classNames.push(swiper.params.containerModifierClass + "3d");
42684 var overwriteParams = {
42685 slidesPerView: 1,
42686 slidesPerColumn: 1,
42687 slidesPerGroup: 1,
42688 watchSlidesProgress: true,
42689 resistanceRatio: 0,
42690 spaceBetween: 0,
42691 centeredSlides: false,
42692 virtualTranslate: true
42693 };
42694 extend(swiper.params, overwriteParams);
42695 extend(swiper.originalParams, overwriteParams);
42696 },
42697 setTranslate: function setTranslate(swiper) {
42698 if (swiper.params.effect !== 'cube') return;
42699 swiper.cubeEffect.setTranslate();
42700 },
42701 setTransition: function setTransition(swiper, duration) {
42702 if (swiper.params.effect !== 'cube') return;
42703 swiper.cubeEffect.setTransition(duration);
42704 }
42705 }
42706 };
42707
42708 function _extends$2() {
42709 _extends$2 = Object.assign || function (target) {
42710 for (var i = 1; i < arguments.length; i++) {
42711 var source = arguments[i];
42712
42713 for (var key in source) {
42714 if (Object.prototype.hasOwnProperty.call(source, key)) {
42715 target[key] = source[key];
42716 }
42717 }
42718 }
42719
42720 return target;
42721 };
42722
42723 return _extends$2.apply(this, arguments);
42724 }
42725 var Flip = {
42726 setTranslate: function setTranslate() {
42727 var swiper = this;
42728 var slides = swiper.slides,
42729 rtl = swiper.rtlTranslate;
42730
42731 for (var i = 0; i < slides.length; i += 1) {
42732 var $slideEl = slides.eq(i);
42733 var progress = $slideEl[0].progress;
42734
42735 if (swiper.params.flipEffect.limitRotation) {
42736 progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
42737 }
42738
42739 var offset = $slideEl[0].swiperSlideOffset;
42740 var rotate = -180 * progress;
42741 var rotateY = rotate;
42742 var rotateX = 0;
42743 var tx = -offset;
42744 var ty = 0;
42745
42746 if (!swiper.isHorizontal()) {
42747 ty = tx;
42748 tx = 0;
42749 rotateX = -rotateY;
42750 rotateY = 0;
42751 } else if (rtl) {
42752 rotateY = -rotateY;
42753 }
42754
42755 $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
42756
42757 if (swiper.params.flipEffect.slideShadows) {
42758 // Set shadows
42759 var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
42760 var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
42761
42762 if (shadowBefore.length === 0) {
42763 shadowBefore = $$1("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>");
42764 $slideEl.append(shadowBefore);
42765 }
42766
42767 if (shadowAfter.length === 0) {
42768 shadowAfter = $$1("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>");
42769 $slideEl.append(shadowAfter);
42770 }
42771
42772 if (shadowBefore.length) shadowBefore[0].style.opacity = Math.max(-progress, 0);
42773 if (shadowAfter.length) shadowAfter[0].style.opacity = Math.max(progress, 0);
42774 }
42775
42776 $slideEl.transform("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)");
42777 }
42778 },
42779 setTransition: function setTransition(duration) {
42780 var swiper = this;
42781 var slides = swiper.slides,
42782 activeIndex = swiper.activeIndex,
42783 $wrapperEl = swiper.$wrapperEl;
42784 slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
42785
42786 if (swiper.params.virtualTranslate && duration !== 0) {
42787 var eventTriggered = false; // eslint-disable-next-line
42788
42789 slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
42790 if (eventTriggered) return;
42791 if (!swiper || swiper.destroyed) return; // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
42792
42793 eventTriggered = true;
42794 swiper.animating = false;
42795 var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
42796
42797 for (var i = 0; i < triggerEvents.length; i += 1) {
42798 $wrapperEl.trigger(triggerEvents[i]);
42799 }
42800 });
42801 }
42802 }
42803 };
42804 var EffectFlip = {
42805 name: 'effect-flip',
42806 params: {
42807 flipEffect: {
42808 slideShadows: true,
42809 limitRotation: true
42810 }
42811 },
42812 create: function create() {
42813 var swiper = this;
42814 bindModuleMethods(swiper, {
42815 flipEffect: _extends$2({}, Flip)
42816 });
42817 },
42818 on: {
42819 beforeInit: function beforeInit(swiper) {
42820 if (swiper.params.effect !== 'flip') return;
42821 swiper.classNames.push(swiper.params.containerModifierClass + "flip");
42822 swiper.classNames.push(swiper.params.containerModifierClass + "3d");
42823 var overwriteParams = {
42824 slidesPerView: 1,
42825 slidesPerColumn: 1,
42826 slidesPerGroup: 1,
42827 watchSlidesProgress: true,
42828 spaceBetween: 0,
42829 virtualTranslate: true
42830 };
42831 extend(swiper.params, overwriteParams);
42832 extend(swiper.originalParams, overwriteParams);
42833 },
42834 setTranslate: function setTranslate(swiper) {
42835 if (swiper.params.effect !== 'flip') return;
42836 swiper.flipEffect.setTranslate();
42837 },
42838 setTransition: function setTransition(swiper, duration) {
42839 if (swiper.params.effect !== 'flip') return;
42840 swiper.flipEffect.setTransition(duration);
42841 }
42842 }
42843 };
42844
42845 function _extends$1() {
42846 _extends$1 = Object.assign || function (target) {
42847 for (var i = 1; i < arguments.length; i++) {
42848 var source = arguments[i];
42849
42850 for (var key in source) {
42851 if (Object.prototype.hasOwnProperty.call(source, key)) {
42852 target[key] = source[key];
42853 }
42854 }
42855 }
42856
42857 return target;
42858 };
42859
42860 return _extends$1.apply(this, arguments);
42861 }
42862 var Coverflow = {
42863 setTranslate: function setTranslate() {
42864 var swiper = this;
42865 var swiperWidth = swiper.width,
42866 swiperHeight = swiper.height,
42867 slides = swiper.slides,
42868 slidesSizesGrid = swiper.slidesSizesGrid;
42869 var params = swiper.params.coverflowEffect;
42870 var isHorizontal = swiper.isHorizontal();
42871 var transform = swiper.translate;
42872 var center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;
42873 var rotate = isHorizontal ? params.rotate : -params.rotate;
42874 var translate = params.depth; // Each slide offset from center
42875
42876 for (var i = 0, length = slides.length; i < length; i += 1) {
42877 var $slideEl = slides.eq(i);
42878 var slideSize = slidesSizesGrid[i];
42879 var slideOffset = $slideEl[0].swiperSlideOffset;
42880 var offsetMultiplier = (center - slideOffset - slideSize / 2) / slideSize * params.modifier;
42881 var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
42882 var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier; // var rotateZ = 0
42883
42884 var translateZ = -translate * Math.abs(offsetMultiplier);
42885 var stretch = params.stretch; // Allow percentage to make a relative stretch for responsive sliders
42886
42887 if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
42888 stretch = parseFloat(params.stretch) / 100 * slideSize;
42889 }
42890
42891 var translateY = isHorizontal ? 0 : stretch * offsetMultiplier;
42892 var translateX = isHorizontal ? stretch * offsetMultiplier : 0;
42893 var scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier); // Fix for ultra small values
42894
42895 if (Math.abs(translateX) < 0.001) translateX = 0;
42896 if (Math.abs(translateY) < 0.001) translateY = 0;
42897 if (Math.abs(translateZ) < 0.001) translateZ = 0;
42898 if (Math.abs(rotateY) < 0.001) rotateY = 0;
42899 if (Math.abs(rotateX) < 0.001) rotateX = 0;
42900 if (Math.abs(scale) < 0.001) scale = 0;
42901 var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg) scale(" + scale + ")";
42902 $slideEl.transform(slideTransform);
42903 $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
42904
42905 if (params.slideShadows) {
42906 // Set shadows
42907 var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
42908 var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
42909
42910 if ($shadowBeforeEl.length === 0) {
42911 $shadowBeforeEl = $$1("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>");
42912 $slideEl.append($shadowBeforeEl);
42913 }
42914
42915 if ($shadowAfterEl.length === 0) {
42916 $shadowAfterEl = $$1("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>");
42917 $slideEl.append($shadowAfterEl);
42918 }
42919
42920 if ($shadowBeforeEl.length) $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
42921 if ($shadowAfterEl.length) $shadowAfterEl[0].style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;
42922 }
42923 }
42924 },
42925 setTransition: function setTransition(duration) {
42926 var swiper = this;
42927 swiper.slides.transition(duration).find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').transition(duration);
42928 }
42929 };
42930 var EffectCoverflow = {
42931 name: 'effect-coverflow',
42932 params: {
42933 coverflowEffect: {
42934 rotate: 50,
42935 stretch: 0,
42936 depth: 100,
42937 scale: 1,
42938 modifier: 1,
42939 slideShadows: true
42940 }
42941 },
42942 create: function create() {
42943 var swiper = this;
42944 bindModuleMethods(swiper, {
42945 coverflowEffect: _extends$1({}, Coverflow)
42946 });
42947 },
42948 on: {
42949 beforeInit: function beforeInit(swiper) {
42950 if (swiper.params.effect !== 'coverflow') return;
42951 swiper.classNames.push(swiper.params.containerModifierClass + "coverflow");
42952 swiper.classNames.push(swiper.params.containerModifierClass + "3d");
42953 swiper.params.watchSlidesProgress = true;
42954 swiper.originalParams.watchSlidesProgress = true;
42955 },
42956 setTranslate: function setTranslate(swiper) {
42957 if (swiper.params.effect !== 'coverflow') return;
42958 swiper.coverflowEffect.setTranslate();
42959 },
42960 setTransition: function setTransition(swiper, duration) {
42961 if (swiper.params.effect !== 'coverflow') return;
42962 swiper.coverflowEffect.setTransition(duration);
42963 }
42964 }
42965 };
42966
42967 function _extends() {
42968 _extends = Object.assign || function (target) {
42969 for (var i = 1; i < arguments.length; i++) {
42970 var source = arguments[i];
42971
42972 for (var key in source) {
42973 if (Object.prototype.hasOwnProperty.call(source, key)) {
42974 target[key] = source[key];
42975 }
42976 }
42977 }
42978
42979 return target;
42980 };
42981
42982 return _extends.apply(this, arguments);
42983 }
42984 var Thumbs = {
42985 init: function init() {
42986 var swiper = this;
42987 var thumbsParams = swiper.params.thumbs;
42988 if (swiper.thumbs.initialized) return false;
42989 swiper.thumbs.initialized = true;
42990 var SwiperClass = swiper.constructor;
42991
42992 if (thumbsParams.swiper instanceof SwiperClass) {
42993 swiper.thumbs.swiper = thumbsParams.swiper;
42994 extend(swiper.thumbs.swiper.originalParams, {
42995 watchSlidesProgress: true,
42996 slideToClickedSlide: false
42997 });
42998 extend(swiper.thumbs.swiper.params, {
42999 watchSlidesProgress: true,
43000 slideToClickedSlide: false
43001 });
43002 } else if (isObject(thumbsParams.swiper)) {
43003 swiper.thumbs.swiper = new SwiperClass(extend({}, thumbsParams.swiper, {
43004 watchSlidesVisibility: true,
43005 watchSlidesProgress: true,
43006 slideToClickedSlide: false
43007 }));
43008 swiper.thumbs.swiperCreated = true;
43009 }
43010
43011 swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
43012 swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
43013 return true;
43014 },
43015 onThumbClick: function onThumbClick() {
43016 var swiper = this;
43017 var thumbsSwiper = swiper.thumbs.swiper;
43018 if (!thumbsSwiper) return;
43019 var clickedIndex = thumbsSwiper.clickedIndex;
43020 var clickedSlide = thumbsSwiper.clickedSlide;
43021 if (clickedSlide && $$1(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) return;
43022 if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
43023 var slideToIndex;
43024
43025 if (thumbsSwiper.params.loop) {
43026 slideToIndex = parseInt($$1(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
43027 } else {
43028 slideToIndex = clickedIndex;
43029 }
43030
43031 if (swiper.params.loop) {
43032 var currentIndex = swiper.activeIndex;
43033
43034 if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
43035 swiper.loopFix(); // eslint-disable-next-line
43036
43037 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
43038 currentIndex = swiper.activeIndex;
43039 }
43040
43041 var prevIndex = swiper.slides.eq(currentIndex).prevAll("[data-swiper-slide-index=\"" + slideToIndex + "\"]").eq(0).index();
43042 var nextIndex = swiper.slides.eq(currentIndex).nextAll("[data-swiper-slide-index=\"" + slideToIndex + "\"]").eq(0).index();
43043 if (typeof prevIndex === 'undefined') slideToIndex = nextIndex;else if (typeof nextIndex === 'undefined') slideToIndex = prevIndex;else if (nextIndex - currentIndex < currentIndex - prevIndex) slideToIndex = nextIndex;else slideToIndex = prevIndex;
43044 }
43045
43046 swiper.slideTo(slideToIndex);
43047 },
43048 update: function update(initial) {
43049 var swiper = this;
43050 var thumbsSwiper = swiper.thumbs.swiper;
43051 if (!thumbsSwiper) return;
43052 var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;
43053 var autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
43054 var useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
43055
43056 if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
43057 var currentThumbsIndex = thumbsSwiper.activeIndex;
43058 var newThumbsIndex;
43059 var direction;
43060
43061 if (thumbsSwiper.params.loop) {
43062 if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
43063 thumbsSwiper.loopFix(); // eslint-disable-next-line
43064
43065 thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
43066 currentThumbsIndex = thumbsSwiper.activeIndex;
43067 } // Find actual thumbs index to slide to
43068
43069
43070 var prevThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).prevAll("[data-swiper-slide-index=\"" + swiper.realIndex + "\"]").eq(0).index();
43071 var nextThumbsIndex = thumbsSwiper.slides.eq(currentThumbsIndex).nextAll("[data-swiper-slide-index=\"" + swiper.realIndex + "\"]").eq(0).index();
43072 if (typeof prevThumbsIndex === 'undefined') newThumbsIndex = nextThumbsIndex;else if (typeof nextThumbsIndex === 'undefined') newThumbsIndex = prevThumbsIndex;else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) newThumbsIndex = currentThumbsIndex;else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) newThumbsIndex = nextThumbsIndex;else newThumbsIndex = prevThumbsIndex;
43073 direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
43074 } else {
43075 newThumbsIndex = swiper.realIndex;
43076 direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
43077 }
43078
43079 if (useOffset) {
43080 newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
43081 }
43082
43083 if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
43084 if (thumbsSwiper.params.centeredSlides) {
43085 if (newThumbsIndex > currentThumbsIndex) {
43086 newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
43087 } else {
43088 newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
43089 }
43090 } else if (newThumbsIndex > currentThumbsIndex) {
43091 newThumbsIndex = newThumbsIndex - slidesPerView + 1;
43092 }
43093
43094 thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
43095 }
43096 } // Activate thumbs
43097
43098
43099 var thumbsToActivate = 1;
43100 var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
43101
43102 if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
43103 thumbsToActivate = swiper.params.slidesPerView;
43104 }
43105
43106 if (!swiper.params.thumbs.multipleActiveThumbs) {
43107 thumbsToActivate = 1;
43108 }
43109
43110 thumbsToActivate = Math.floor(thumbsToActivate);
43111 thumbsSwiper.slides.removeClass(thumbActiveClass);
43112
43113 if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {
43114 for (var i = 0; i < thumbsToActivate; i += 1) {
43115 thumbsSwiper.$wrapperEl.children("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]").addClass(thumbActiveClass);
43116 }
43117 } else {
43118 for (var _i = 0; _i < thumbsToActivate; _i += 1) {
43119 thumbsSwiper.slides.eq(swiper.realIndex + _i).addClass(thumbActiveClass);
43120 }
43121 }
43122 }
43123 };
43124 var Thumbs$1 = {
43125 name: 'thumbs',
43126 params: {
43127 thumbs: {
43128 swiper: null,
43129 multipleActiveThumbs: true,
43130 autoScrollOffset: 0,
43131 slideThumbActiveClass: 'swiper-slide-thumb-active',
43132 thumbsContainerClass: 'swiper-container-thumbs'
43133 }
43134 },
43135 create: function create() {
43136 var swiper = this;
43137 bindModuleMethods(swiper, {
43138 thumbs: _extends({
43139 swiper: null,
43140 initialized: false
43141 }, Thumbs)
43142 });
43143 },
43144 on: {
43145 beforeInit: function beforeInit(swiper) {
43146 var thumbs = swiper.params.thumbs;
43147 if (!thumbs || !thumbs.swiper) return;
43148 swiper.thumbs.init();
43149 swiper.thumbs.update(true);
43150 },
43151 slideChange: function slideChange(swiper) {
43152 if (!swiper.thumbs.swiper) return;
43153 swiper.thumbs.update();
43154 },
43155 update: function update(swiper) {
43156 if (!swiper.thumbs.swiper) return;
43157 swiper.thumbs.update();
43158 },
43159 resize: function resize(swiper) {
43160 if (!swiper.thumbs.swiper) return;
43161 swiper.thumbs.update();
43162 },
43163 observerUpdate: function observerUpdate(swiper) {
43164 if (!swiper.thumbs.swiper) return;
43165 swiper.thumbs.update();
43166 },
43167 setTransition: function setTransition(swiper, duration) {
43168 var thumbsSwiper = swiper.thumbs.swiper;
43169 if (!thumbsSwiper) return;
43170 thumbsSwiper.setTransition(duration);
43171 },
43172 beforeDestroy: function beforeDestroy(swiper) {
43173 var thumbsSwiper = swiper.thumbs.swiper;
43174 if (!thumbsSwiper) return;
43175
43176 if (swiper.thumbs.swiperCreated && thumbsSwiper) {
43177 thumbsSwiper.destroy();
43178 }
43179 }
43180 }
43181 };
43182
43183 /**
43184 * Swiper 6.6.2
43185 * Most modern mobile touch slider and framework with hardware accelerated transitions
43186 * https://swiperjs.com
43187 *
43188 * Copyright 2014-2021 Vladimir Kharlampidi
43189 *
43190 * Released under the MIT License
43191 *
43192 * Released on: May 19, 2021
43193 */
43194
43195 var components = [Virtual$1, Keyboard$1, Mousewheel$1, Navigation$1, Pagination$1, Scrollbar$1, Parallax$1, Zoom$1, Lazy$1, Controller$1, A11y$1, History$1, HashNavigation$1, Autoplay$1, EffectFade, EffectCube, EffectFlip, EffectCoverflow, Thumbs$1];
43196 Swiper$1.use(components);
43197
43198 /* eslint-disable */
43199
43200 if (!window.Swiper) {
43201 window.Swiper = Swiper$1;
43202 }
43203 /* eslint-enable */
43204 // UMD_ONLY_END
43205
43206
43207 function initSwiper(swiperEl) {
43208 var app = this;
43209 var $swiperEl = $(swiperEl);
43210 if ($swiperEl.length === 0) return;
43211 if ($swiperEl[0].swiper) return;
43212 var initialSlide;
43213 var params = {};
43214 var isTabs;
43215 var isRoutableTabs;
43216
43217 if ($swiperEl.hasClass('tabs-swipeable-wrap')) {
43218 $swiperEl.addClass('swiper-container').children('.tabs').addClass('swiper-wrapper').children('.tab').addClass('swiper-slide');
43219 initialSlide = $swiperEl.children('.tabs').children('.tab-active').index();
43220 isTabs = true;
43221 isRoutableTabs = $swiperEl.find('.tabs-routable').length > 0;
43222 }
43223
43224 if ($swiperEl.attr('data-swiper')) {
43225 params = JSON.parse($swiperEl.attr('data-swiper'));
43226 } else if ($swiperEl[0].f7SwiperParams) {
43227 params = $swiperEl[0].f7SwiperParams;
43228 } else {
43229 params = $swiperEl.dataset();
43230 Object.keys(params).forEach(function (key) {
43231 var value = params[key];
43232
43233 if (typeof value === 'string' && value.indexOf('{') === 0 && value.indexOf('}') > 0) {
43234 try {
43235 params[key] = JSON.parse(value);
43236 } catch (e) {// not JSON
43237 }
43238 }
43239 });
43240 }
43241
43242 if (typeof params.initialSlide === 'undefined' && typeof initialSlide !== 'undefined') {
43243 params.initialSlide = initialSlide;
43244 }
43245
43246 var swiper = app.swiper.create($swiperEl[0], params);
43247
43248 function updateSwiper() {
43249 swiper.update();
43250 }
43251
43252 var $tabEl = $swiperEl.parents('.tab').filter(function (tabEl) {
43253 return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, .tabs-swipeable-wrap').length === 0;
43254 }).eq(0);
43255 $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').on('modal:open', updateSwiper);
43256 $swiperEl.parents('.panel').on('panel:open', updateSwiper);
43257
43258 if ($tabEl && $tabEl.length) {
43259 $tabEl.on('tab:show', updateSwiper);
43260 }
43261
43262 swiper.on('beforeDestroy', function () {
43263 $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').off('modal:open', updateSwiper);
43264 $swiperEl.parents('.panel').off('panel:open', updateSwiper);
43265
43266 if ($tabEl && $tabEl.length) {
43267 $tabEl.off('tab:show', updateSwiper);
43268 }
43269 });
43270
43271 if (isTabs) {
43272 swiper.on('slideChange', function () {
43273 if (isRoutableTabs) {
43274 var view = app.views.get($swiperEl.parents('.view'));
43275 if (!view) view = app.views.main;
43276 var router = view.router;
43277 var tabRouteUrl = router.findTabRouteUrl(swiper.slides.eq(swiper.activeIndex)[0]);
43278
43279 if (tabRouteUrl) {
43280 setTimeout(function () {
43281 router.navigate(tabRouteUrl);
43282 }, 0);
43283 }
43284 } else {
43285 app.tab.show({
43286 tabEl: swiper.slides.eq(swiper.activeIndex)
43287 });
43288 }
43289 });
43290 }
43291 }
43292
43293 var Swiper = {
43294 name: 'swiper',
43295 static: {
43296 Swiper: Swiper$1
43297 },
43298 create: function create() {
43299 var app = this;
43300 app.swiper = ConstructorMethods({
43301 defaultSelector: '.swiper-container',
43302 constructor: Swiper$1,
43303 domProp: 'swiper'
43304 });
43305 },
43306 on: {
43307 pageBeforeRemove: function pageBeforeRemove(page) {
43308 var app = this;
43309 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (swiperEl) {
43310 app.swiper.destroy(swiperEl);
43311 });
43312 },
43313 pageMounted: function pageMounted(page) {
43314 var app = this;
43315 page.$el.find('.tabs-swipeable-wrap').each(function (swiperEl) {
43316 initSwiper.call(app, swiperEl);
43317 });
43318 },
43319 pageInit: function pageInit(page) {
43320 var app = this;
43321 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (swiperEl) {
43322 initSwiper.call(app, swiperEl);
43323 });
43324 },
43325 pageReinit: function pageReinit(page) {
43326 var app = this;
43327 page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (swiperEl) {
43328 var swiper = app.swiper.get(swiperEl);
43329 if (swiper && swiper.update) swiper.update();
43330 });
43331 },
43332 tabMounted: function tabMounted(tabEl) {
43333 var app = this;
43334 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (swiperEl) {
43335 initSwiper.call(app, swiperEl);
43336 });
43337 },
43338 tabShow: function tabShow(tabEl) {
43339 var app = this;
43340 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (swiperEl) {
43341 var swiper = app.swiper.get(swiperEl);
43342 if (swiper && swiper.update) swiper.update();
43343 });
43344 },
43345 tabBeforeRemove: function tabBeforeRemove(tabEl) {
43346 var app = this;
43347 $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (swiperEl) {
43348 app.swiper.destroy(swiperEl);
43349 });
43350 }
43351 },
43352 vnode: {
43353 'swiper-init': {
43354 insert: function insert(vnode) {
43355 var app = this;
43356 var swiperEl = vnode.elm;
43357 initSwiper.call(app, swiperEl);
43358 },
43359 destroy: function destroy(vnode) {
43360 var app = this;
43361 var swiperEl = vnode.elm;
43362 app.swiper.destroy(swiperEl);
43363 }
43364 },
43365 'tabs-swipeable-wrap': {
43366 insert: function insert(vnode) {
43367 var app = this;
43368 var swiperEl = vnode.elm;
43369 initSwiper.call(app, swiperEl);
43370 },
43371 destroy: function destroy(vnode) {
43372 var app = this;
43373 var swiperEl = vnode.elm;
43374 app.swiper.destroy(swiperEl);
43375 }
43376 }
43377 }
43378 };
43379
43380 var PhotoBrowser$1 = /*#__PURE__*/function (_Framework7Class) {
43381 _inheritsLoose(PhotoBrowser, _Framework7Class);
43382
43383 function PhotoBrowser(app, params) {
43384 var _this;
43385
43386 if (params === void 0) {
43387 params = {};
43388 }
43389
43390 _this = _Framework7Class.call(this, params, [app]) || this;
43391
43392 var pb = _assertThisInitialized(_this);
43393
43394 pb.app = app;
43395 var defaults = extend$1({
43396 on: {}
43397 }, app.params.photoBrowser); // Extend defaults with modules params
43398
43399 pb.useModulesParams(defaults);
43400 pb.params = extend$1(defaults, params);
43401 extend$1(pb, {
43402 exposed: false,
43403 opened: false,
43404 activeIndex: pb.params.swiper.initialSlide,
43405 url: pb.params.url,
43406 swipeToClose: {
43407 allow: true,
43408 isTouched: false,
43409 diff: undefined,
43410 start: undefined,
43411 current: undefined,
43412 started: false,
43413 activeSlide: undefined,
43414 timeStart: undefined
43415 }
43416 }); // Install Modules
43417
43418 pb.useModules(); // Init
43419
43420 pb.init();
43421 return _this;
43422 }
43423
43424 var _proto = PhotoBrowser.prototype;
43425
43426 _proto.onSlideChange = function onSlideChange(swiper) {
43427 var pb = this;
43428 pb.activeIndex = swiper.activeIndex;
43429 var current = swiper.activeIndex + 1;
43430 var total = pb.params.virtualSlides ? pb.params.photos.length : swiper.slides.length;
43431
43432 if (swiper.params.loop) {
43433 total -= 2;
43434 current -= swiper.loopedSlides;
43435 if (current < 1) current = total + current;
43436 if (current > total) current -= total;
43437 }
43438
43439 var $activeSlideEl = pb.params.virtualSlides ? swiper.$wrapperEl.find(".swiper-slide[data-swiper-slide-index=\"" + swiper.activeIndex + "\"]") : swiper.slides.eq(swiper.activeIndex);
43440 var $previousSlideEl = pb.params.virtualSlides ? swiper.$wrapperEl.find(".swiper-slide[data-swiper-slide-index=\"" + swiper.previousIndex + "\"]") : swiper.slides.eq(swiper.previousIndex);
43441 var $currentEl = pb.$el.find('.photo-browser-current');
43442 var $totalEl = pb.$el.find('.photo-browser-total');
43443 var navbarEl;
43444
43445 if (pb.params.type === 'page' && pb.params.navbar && $currentEl.length === 0 && pb.app.theme === 'ios') {
43446 navbarEl = pb.app.navbar.getElByPage(pb.$el);
43447
43448 if (navbarEl) {
43449 $currentEl = $(navbarEl).find('.photo-browser-current');
43450 $totalEl = $(navbarEl).find('.photo-browser-total');
43451 }
43452 }
43453
43454 if ($currentEl.length && $totalEl.length) {
43455 $currentEl.text(current);
43456 $totalEl.text(total);
43457 if (!navbarEl) navbarEl = $currentEl.parents('.navbar')[0];
43458
43459 if (navbarEl) {
43460 pb.app.navbar.size(navbarEl);
43461 }
43462 } // Update captions
43463
43464
43465 if (pb.captions.length > 0) {
43466 var captionIndex = swiper.params.loop ? $activeSlideEl.attr('data-swiper-slide-index') : pb.activeIndex;
43467 pb.$captionsContainerEl.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');
43468 pb.$captionsContainerEl.find("[data-caption-index=\"" + captionIndex + "\"]").addClass('photo-browser-caption-active');
43469 } // Stop Video
43470
43471
43472 var previousSlideVideo = $previousSlideEl.find('video');
43473
43474 if (previousSlideVideo.length > 0) {
43475 if ('pause' in previousSlideVideo[0]) previousSlideVideo[0].pause();
43476 }
43477 };
43478
43479 _proto.onTouchStart = function onTouchStart() {
43480 var pb = this;
43481 var swipeToClose = pb.swipeToClose;
43482 if (!swipeToClose.allow) return;
43483 swipeToClose.isTouched = true;
43484 };
43485
43486 _proto.onTouchMove = function onTouchMove(e) {
43487 var pb = this;
43488 var swipeToClose = pb.swipeToClose;
43489 if (!swipeToClose.isTouched) return;
43490
43491 if (!swipeToClose.started) {
43492 swipeToClose.started = true;
43493 swipeToClose.start = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
43494
43495 if (pb.params.virtualSlides) {
43496 swipeToClose.activeSlide = pb.swiper.$wrapperEl.children('.swiper-slide-active');
43497 } else {
43498 swipeToClose.activeSlide = pb.swiper.slides.eq(pb.swiper.activeIndex);
43499 }
43500
43501 swipeToClose.timeStart = now$1();
43502 }
43503
43504 e.preventDefault();
43505 swipeToClose.current = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
43506 swipeToClose.diff = swipeToClose.start - swipeToClose.current;
43507 pb.$el.transition(0).transform("translate3d(0," + -swipeToClose.diff + "px,0)");
43508 };
43509
43510 _proto.onTouchEnd = function onTouchEnd() {
43511 var pb = this;
43512 var swipeToClose = pb.swipeToClose;
43513 swipeToClose.isTouched = false;
43514
43515 if (!swipeToClose.started) {
43516 swipeToClose.started = false;
43517 return;
43518 }
43519
43520 swipeToClose.started = false;
43521 swipeToClose.allow = false;
43522 var diff = Math.abs(swipeToClose.diff);
43523 var timeDiff = new Date().getTime() - swipeToClose.timeStart;
43524
43525 if (timeDiff < 300 && diff > 20 || timeDiff >= 300 && diff > 100) {
43526 nextTick$1(function () {
43527 if (pb.$el) {
43528 if (swipeToClose.diff < 0) pb.$el.addClass('swipe-close-to-bottom');else pb.$el.addClass('swipe-close-to-top');
43529 }
43530
43531 pb.emit('local::swipeToClose', pb);
43532 pb.$el.transform('').transition('');
43533 pb.close();
43534 swipeToClose.allow = true;
43535 });
43536 return;
43537 }
43538
43539 if (diff !== 0) {
43540 pb.$el.addClass('photo-browser-transitioning').transitionEnd(function () {
43541 swipeToClose.allow = true;
43542 pb.$el.removeClass('photo-browser-transitioning');
43543 });
43544 } else {
43545 swipeToClose.allow = true;
43546 }
43547
43548 nextTick$1(function () {
43549 pb.$el.transform('').transition('');
43550 });
43551 } // Render Functions
43552 ;
43553
43554 _proto.renderNavbar = function renderNavbar() {
43555 var pb = this;
43556 if (pb.params.renderNavbar) return pb.params.renderNavbar.call(pb);
43557 var iconsColor = pb.params.iconsColor;
43558 if (!pb.params.iconsColor && pb.params.theme === 'dark') iconsColor = 'white';
43559 var pageBackLinkText = (pb.app.theme === 'ios' || pb.app.theme === 'aurora') && pb.params.pageBackLinkText ? pb.params.pageBackLinkText : '';
43560 var renderNavbarCount = typeof pb.params.navbarShowCount === 'undefined' ? pb.params.photos.length > 1 : pb.params.navbarShowCount;
43561 var isPopup = pb.params.type !== 'page';
43562 return $jsx("div", {
43563 class: "navbar navbar-photo-browser " + (pb.params.theme === 'dark' ? 'navbar-photo-browser-dark' : '')
43564 }, $jsx("div", {
43565 class: "navbar-bg"
43566 }), $jsx("div", {
43567 class: "navbar-inner navbar-inner-centered-title sliding"
43568 }, !isPopup && $jsx("div", {
43569 class: "left"
43570 }, $jsx("a", {
43571 class: "link " + (!pageBackLinkText ? 'icon-only' : '') + " back"
43572 }, $jsx("i", {
43573 class: "icon icon-back " + (iconsColor ? "color-" + iconsColor : '')
43574 }), pageBackLinkText && $jsx("span", null, pageBackLinkText))), renderNavbarCount && $jsx("div", {
43575 class: "title"
43576 }, $jsx("span", {
43577 class: "photo-browser-current"
43578 }), $jsx("span", {
43579 class: "photo-browser-of"
43580 }, pb.params.navbarOfText), $jsx("span", {
43581 class: "photo-browser-total"
43582 })), isPopup && $jsx("div", {
43583 class: "right"
43584 }, $jsx("a", {
43585 class: "link popup-close",
43586 "data-popup": ".photo-browser-popup"
43587 }, $jsx("span", null, pb.params.popupCloseLinkText)))));
43588 };
43589
43590 _proto.renderToolbar = function renderToolbar() {
43591 var pb = this;
43592 if (pb.params.renderToolbar) return pb.params.renderToolbar.call(pb);
43593 var iconsColor = pb.params.iconsColor;
43594 if (!pb.params.iconsColor && pb.params.theme === 'dark') iconsColor = 'white';
43595 return $jsx("div", {
43596 class: "toolbar toolbar-bottom tabbar"
43597 }, $jsx("div", {
43598 class: "toolbar-inner"
43599 }, $jsx("a", {
43600 class: "link photo-browser-prev"
43601 }, $jsx("i", {
43602 class: "icon icon-back " + (iconsColor ? "color-" + iconsColor : '')
43603 })), $jsx("a", {
43604 class: "link photo-browser-next"
43605 }, $jsx("i", {
43606 class: "icon icon-forward " + (iconsColor ? "color-" + iconsColor : '')
43607 }))));
43608 };
43609
43610 _proto.renderCaption = function renderCaption(caption, index) {
43611 var pb = this;
43612 if (pb.params.renderCaption) return pb.params.renderCaption.call(pb, caption, index);
43613 return $jsx("div", {
43614 class: "photo-browser-caption",
43615 "data-caption-index": index
43616 }, caption);
43617 };
43618
43619 _proto.renderObject = function renderObject(photo, index) {
43620 var pb = this;
43621 if (pb.params.renderObject) return pb.params.renderObject.call(pb, photo, index);
43622 return $jsx("div", {
43623 class: "photo-browser-slide photo-browser-object-slide swiper-slide",
43624 "data-swiper-slide-index": index
43625 }, photo.html ? photo.html : photo);
43626 };
43627
43628 _proto.renderLazyPhoto = function renderLazyPhoto(photo, index) {
43629 var pb = this;
43630 if (pb.params.renderLazyPhoto) return pb.params.renderLazyPhoto.call(pb, photo, index);
43631 return $jsx("div", {
43632 class: "photo-browser-slide photo-browser-slide-lazy swiper-slide",
43633 "data-swiper-slide-index": index
43634 }, $jsx("div", {
43635 class: "swiper-lazy-preloader"
43636 }), $jsx("span", {
43637 class: "swiper-zoom-container"
43638 }, $jsx("img", {
43639 "data-src": photo.url ? photo.url : photo,
43640 class: "swiper-lazy"
43641 })));
43642 };
43643
43644 _proto.renderPhoto = function renderPhoto(photo, index) {
43645 var pb = this;
43646 if (pb.params.renderPhoto) return pb.params.renderPhoto.call(pb, photo, index);
43647 return $jsx("div", {
43648 class: "photo-browser-slide swiper-slide",
43649 "data-swiper-slide-index": index
43650 }, $jsx("span", {
43651 class: "swiper-zoom-container"
43652 }, $jsx("img", {
43653 src: photo.url ? photo.url : photo
43654 })));
43655 };
43656
43657 _proto.render = function render() {
43658 var pb = this;
43659 if (pb.params.render) return pb.params.render.call(pb, pb.params);
43660 return $jsx("div", {
43661 class: "photo-browser photo-browser-" + pb.params.theme
43662 }, $jsx("div", {
43663 class: "view"
43664 }, $jsx("div", {
43665 class: "page photo-browser-page photo-browser-page-" + pb.params.theme + " no-toolbar " + (!pb.params.navbar ? 'no-navbar' : ''),
43666 "data-name": "photo-browser-page"
43667 }, pb.params.navbar && pb.renderNavbar(), pb.params.toolbar && pb.renderToolbar(), $jsx("div", {
43668 class: "photo-browser-captions photo-browser-captions-" + (pb.params.captionsTheme || pb.params.theme)
43669 }, pb.params.photos.map(function (photo, index) {
43670 if (photo.caption) return pb.renderCaption(photo.caption, index);
43671 return '';
43672 })), $jsx("div", {
43673 class: "photo-browser-swiper-container swiper-container"
43674 }, $jsx("div", {
43675 class: "photo-browser-swiper-wrapper swiper-wrapper"
43676 }, !pb.params.virtualSlides && pb.params.photos.map(function (photo, index) {
43677 if (photo.html || (typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0) {
43678 return pb.renderObject(photo, index);
43679 }
43680
43681 if (pb.params.swiper.lazy === true || pb.params.swiper.lazy && pb.params.swiper.lazy.enabled) {
43682 return pb.renderLazyPhoto(photo, index);
43683 }
43684
43685 return pb.renderPhoto(photo, index);
43686 }))))));
43687 };
43688
43689 _proto.renderStandalone = function renderStandalone() {
43690 var pb = this;
43691 if (pb.params.renderStandalone) return pb.params.renderStandalone.call(pb);
43692 var standaloneHtml = "<div class=\"popup photo-browser-popup photo-browser-standalone popup-tablet-fullscreen\">" + pb.render() + "</div>";
43693 return standaloneHtml;
43694 };
43695
43696 _proto.renderPage = function renderPage() {
43697 var pb = this;
43698 if (pb.params.renderPage) return pb.params.renderPage.call(pb);
43699 var pageHtml = pb.render();
43700 return pageHtml;
43701 };
43702
43703 _proto.renderPopup = function renderPopup() {
43704 var pb = this;
43705 if (pb.params.renderPopup) return pb.params.renderPopup.call(pb);
43706 var popupHtml = "<div class=\"popup photo-browser-popup\">" + pb.render() + "</div>";
43707 return popupHtml;
43708 } // Callbacks
43709 ;
43710
43711 _proto.onOpen = function onOpen(type, el) {
43712 var pb = this;
43713 var app = pb.app;
43714 var $el = $(el);
43715 $el[0].f7PhotoBrowser = pb;
43716 pb.$el = $el;
43717 pb.el = $el[0];
43718 pb.openedIn = type;
43719 pb.opened = true;
43720 pb.$swiperContainerEl = pb.$el.find('.photo-browser-swiper-container');
43721 pb.$swiperWrapperEl = pb.$el.find('.photo-browser-swiper-wrapper');
43722 pb.slides = pb.$el.find('.photo-browser-slide');
43723 pb.$captionsContainerEl = pb.$el.find('.photo-browser-captions');
43724 pb.captions = pb.$el.find('.photo-browser-caption'); // Init Swiper
43725
43726 var clickTimeout;
43727 var swiperParams = extend$1({}, pb.params.swiper, {
43728 initialSlide: pb.activeIndex,
43729 on: {
43730 click: function click(e) {
43731 clearTimeout(clickTimeout);
43732
43733 if (pb.params.exposition) {
43734 clickTimeout = setTimeout(function () {
43735 pb.expositionToggle();
43736 }, 350);
43737 }
43738
43739 pb.emit('local::tap', e);
43740 pb.emit('local::click', e);
43741 },
43742 doubleClick: function doubleClick(e) {
43743 clearTimeout(clickTimeout);
43744 pb.emit('local::doubleTap', e);
43745 pb.emit('local::doubleClick', e);
43746 },
43747 slideChange: function slideChange() {
43748 var swiper = this;
43749 pb.onSlideChange(swiper);
43750
43751 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
43752 args[_key] = arguments[_key];
43753 }
43754
43755 pb.emit.apply(pb, ['local::slideChange'].concat(args));
43756 },
43757 transitionStart: function transitionStart() {
43758 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
43759 args[_key2] = arguments[_key2];
43760 }
43761
43762 pb.emit.apply(pb, ['local::transitionStart'].concat(args));
43763 },
43764 transitionEnd: function transitionEnd() {
43765 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
43766 args[_key3] = arguments[_key3];
43767 }
43768
43769 pb.emit.apply(pb, ['local::transitionEnd'].concat(args));
43770 },
43771 slideChangeTransitionStart: function slideChangeTransitionStart() {
43772 var swiper = this;
43773 pb.onSlideChange(swiper);
43774
43775 for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
43776 args[_key4] = arguments[_key4];
43777 }
43778
43779 pb.emit.apply(pb, ['local::slideChangeTransitionStart'].concat(args));
43780 },
43781 slideChangeTransitionEnd: function slideChangeTransitionEnd() {
43782 for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
43783 args[_key5] = arguments[_key5];
43784 }
43785
43786 pb.emit.apply(pb, ['local::slideChangeTransitionEnd'].concat(args));
43787 },
43788 lazyImageLoad: function lazyImageLoad() {
43789 for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
43790 args[_key6] = arguments[_key6];
43791 }
43792
43793 pb.emit.apply(pb, ['local::lazyImageLoad'].concat(args));
43794 },
43795 lazyImageReady: function lazyImageReady() {
43796 for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
43797 args[_key7] = arguments[_key7];
43798 }
43799
43800 var slideEl = args[0];
43801 $(slideEl).removeClass('photo-browser-slide-lazy');
43802 pb.emit.apply(pb, ['local::lazyImageReady'].concat(args));
43803 }
43804 }
43805 });
43806
43807 if (pb.params.swipeToClose && pb.params.type !== 'page') {
43808 extend$1(swiperParams.on, {
43809 touchStart: function touchStart(swiper, e) {
43810 pb.onTouchStart(e);
43811 pb.emit('local::touchStart', e);
43812 },
43813 touchMoveOpposite: function touchMoveOpposite(swiper, e) {
43814 pb.onTouchMove(e);
43815 pb.emit('local::touchMoveOpposite', e);
43816 },
43817 touchEnd: function touchEnd(swiper, e) {
43818 pb.onTouchEnd(e);
43819 pb.emit('local::touchEnd', e);
43820 }
43821 });
43822 }
43823
43824 if (pb.params.virtualSlides) {
43825 extend$1(swiperParams, {
43826 virtual: {
43827 slides: pb.params.photos,
43828 renderSlide: function renderSlide(photo, index) {
43829 if (photo.html || (typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0) {
43830 return pb.renderObject(photo, index);
43831 }
43832
43833 if (pb.params.swiper.lazy === true || pb.params.swiper.lazy && pb.params.swiper.lazy.enabled) {
43834 return pb.renderLazyPhoto(photo, index);
43835 }
43836
43837 return pb.renderPhoto(photo, index);
43838 }
43839 }
43840 });
43841 }
43842
43843 var window = getWindow();
43844 pb.swiper = app.swiper ? app.swiper.create(pb.$swiperContainerEl, swiperParams) : new window.Swiper(pb.$swiperContainerEl, swiperParams);
43845
43846 if (pb.activeIndex === 0) {
43847 pb.onSlideChange(pb.swiper);
43848 }
43849
43850 if (pb.$el) {
43851 pb.$el.trigger('photobrowser:open');
43852 }
43853
43854 pb.emit('local::open photoBrowserOpen', pb);
43855 };
43856
43857 _proto.onOpened = function onOpened() {
43858 var pb = this;
43859
43860 if (pb.$el && pb.params.type === 'standalone') {
43861 pb.$el.css('animation', 'none');
43862 }
43863
43864 if (pb.$el) {
43865 pb.$el.trigger('photobrowser:opened');
43866 }
43867
43868 pb.emit('local::opened photoBrowserOpened', pb);
43869 };
43870
43871 _proto.onClose = function onClose() {
43872 var pb = this;
43873 if (pb.destroyed) return; // Destroy Swiper
43874
43875 if (pb.swiper && pb.swiper.destroy) {
43876 pb.swiper.destroy(true, false);
43877 pb.swiper = null;
43878 delete pb.swiper;
43879 }
43880
43881 if (pb.$el) {
43882 pb.$el.trigger('photobrowser:close');
43883 }
43884
43885 pb.emit('local::close photoBrowserClose', pb);
43886 };
43887
43888 _proto.onClosed = function onClosed() {
43889 var pb = this;
43890 if (pb.destroyed) return;
43891 pb.opened = false;
43892 pb.$el = null;
43893 pb.el = null;
43894 delete pb.$el;
43895 delete pb.el;
43896
43897 if (pb.$el) {
43898 pb.$el.trigger('photobrowser:closed');
43899 }
43900
43901 pb.emit('local::closed photoBrowserClosed', pb);
43902 } // Open
43903 ;
43904
43905 _proto.openPage = function openPage() {
43906 var pb = this;
43907 if (pb.opened) return pb;
43908 var pageHtml = pb.renderPage();
43909 pb.view.router.navigate({
43910 url: pb.url,
43911 route: {
43912 content: pageHtml,
43913 path: pb.url,
43914 on: {
43915 pageBeforeIn: function pageBeforeIn(e, page) {
43916 pb.view.$el.addClass("with-photo-browser-page with-photo-browser-page-" + pb.params.theme);
43917 pb.onOpen('page', page.el);
43918 },
43919 pageAfterIn: function pageAfterIn(e, page) {
43920 pb.onOpened('page', page.el);
43921 },
43922 pageBeforeOut: function pageBeforeOut(e, page) {
43923 pb.view.$el.removeClass("with-photo-browser-page with-photo-browser-page-exposed with-photo-browser-page-" + pb.params.theme);
43924 pb.onClose('page', page.el);
43925 },
43926 pageAfterOut: function pageAfterOut(e, page) {
43927 pb.onClosed('page', page.el);
43928 }
43929 }
43930 }
43931 });
43932 return pb;
43933 };
43934
43935 _proto.openStandalone = function openStandalone() {
43936 var pb = this;
43937 if (pb.opened) return pb;
43938 var standaloneHtml = pb.renderStandalone();
43939 var popupParams = {
43940 backdrop: false,
43941 content: standaloneHtml,
43942 on: {
43943 popupOpen: function popupOpen(popup) {
43944 pb.onOpen('popup', popup.el);
43945 },
43946 popupOpened: function popupOpened(popup) {
43947 pb.onOpened('popup', popup.el);
43948 },
43949 popupClose: function popupClose(popup) {
43950 pb.onClose('popup', popup.el);
43951 },
43952 popupClosed: function popupClosed(popup) {
43953 pb.onClosed('popup', popup.el);
43954 }
43955 }
43956 };
43957
43958 if (pb.params.routableModals && pb.view) {
43959 pb.view.router.navigate({
43960 url: pb.url,
43961 route: {
43962 path: pb.url,
43963 popup: popupParams
43964 }
43965 });
43966 } else {
43967 pb.modal = pb.app.popup.create(popupParams).open();
43968 }
43969
43970 return pb;
43971 };
43972
43973 _proto.openPopup = function openPopup() {
43974 var pb = this;
43975 if (pb.opened) return pb;
43976 var popupHtml = pb.renderPopup();
43977 var popupParams = {
43978 content: popupHtml,
43979 push: pb.params.popupPush,
43980 on: {
43981 popupOpen: function popupOpen(popup) {
43982 pb.onOpen('popup', popup.el);
43983 },
43984 popupOpened: function popupOpened(popup) {
43985 pb.onOpened('popup', popup.el);
43986 },
43987 popupClose: function popupClose(popup) {
43988 pb.onClose('popup', popup.el);
43989 },
43990 popupClosed: function popupClosed(popup) {
43991 pb.onClosed('popup', popup.el);
43992 }
43993 }
43994 };
43995
43996 if (pb.params.routableModals && pb.view) {
43997 pb.view.router.navigate({
43998 url: pb.url,
43999 route: {
44000 path: pb.url,
44001 popup: popupParams
44002 }
44003 });
44004 } else {
44005 pb.modal = pb.app.popup.create(popupParams).open();
44006 }
44007
44008 return pb;
44009 } // Exposition
44010 ;
44011
44012 _proto.expositionEnable = function expositionEnable() {
44013 var pb = this;
44014
44015 if (pb.params.type === 'page') {
44016 pb.view.$el.addClass('with-photo-browser-page-exposed');
44017 }
44018
44019 if (pb.$el) pb.$el.addClass('photo-browser-exposed');
44020 if (pb.params.expositionHideCaptions) pb.$captionsContainerEl.addClass('photo-browser-captions-exposed');
44021 pb.exposed = true;
44022 return pb;
44023 };
44024
44025 _proto.expositionDisable = function expositionDisable() {
44026 var pb = this;
44027
44028 if (pb.params.type === 'page') {
44029 pb.view.$el.removeClass('with-photo-browser-page-exposed');
44030 }
44031
44032 if (pb.$el) pb.$el.removeClass('photo-browser-exposed');
44033 if (pb.params.expositionHideCaptions) pb.$captionsContainerEl.removeClass('photo-browser-captions-exposed');
44034 pb.exposed = false;
44035 return pb;
44036 };
44037
44038 _proto.expositionToggle = function expositionToggle() {
44039 var pb = this;
44040
44041 if (pb.params.type === 'page') {
44042 pb.view.$el.toggleClass('with-photo-browser-page-exposed');
44043 }
44044
44045 if (pb.$el) pb.$el.toggleClass('photo-browser-exposed');
44046 if (pb.params.expositionHideCaptions) pb.$captionsContainerEl.toggleClass('photo-browser-captions-exposed');
44047 pb.exposed = !pb.exposed;
44048 return pb;
44049 };
44050
44051 _proto.open = function open(index) {
44052 var pb = this;
44053 var type = pb.params.type;
44054
44055 if (pb.opened) {
44056 if (pb.swiper && typeof index !== 'undefined') {
44057 pb.swiper.slideTo(parseInt(index, 10));
44058 }
44059
44060 return pb;
44061 }
44062
44063 if (typeof index !== 'undefined') {
44064 pb.activeIndex = index;
44065 }
44066
44067 if (type === 'standalone') {
44068 pb.openStandalone();
44069 }
44070
44071 if (type === 'page') {
44072 pb.openPage();
44073 }
44074
44075 if (type === 'popup') {
44076 pb.openPopup();
44077 }
44078
44079 return pb;
44080 };
44081
44082 _proto.close = function close() {
44083 var pb = this;
44084 if (!pb.opened) return pb;
44085
44086 if (pb.params.routableModals && pb.view || pb.openedIn === 'page') {
44087 pb.view.router.back();
44088 } else {
44089 pb.modal.once('modalClosed', function () {
44090 nextTick$1(function () {
44091 if (pb.destroyed) return;
44092 pb.modal.destroy();
44093 delete pb.modal;
44094 });
44095 });
44096 pb.modal.close();
44097 }
44098
44099 return pb;
44100 } // eslint-disable-next-line
44101 ;
44102
44103 _proto.init = function init() {};
44104
44105 _proto.destroy = function destroy() {
44106 var pb = this;
44107 pb.emit('local::beforeDestroy photoBrowserBeforeDestroy', pb);
44108
44109 if (pb.$el) {
44110 pb.$el.trigger('photobrowser:beforedestroy');
44111 pb.$el[0].f7PhotoBrowser = null;
44112 delete pb.$el[0].f7PhotoBrowser;
44113 }
44114
44115 deleteProps$1(pb);
44116 pb.destroyed = true;
44117 pb = null;
44118 };
44119
44120 _createClass$1(PhotoBrowser, [{
44121 key: "view",
44122 get: function get() {
44123 var params = this.params,
44124 app = this.app;
44125 return params.view || app.views.main;
44126 }
44127 }]);
44128
44129 return PhotoBrowser;
44130 }(Framework7Class);
44131
44132 var PhotoBrowser = {
44133 name: 'photoBrowser',
44134 params: {
44135 photoBrowser: {
44136 photos: [],
44137 exposition: true,
44138 expositionHideCaptions: false,
44139 type: 'standalone',
44140 navbar: true,
44141 toolbar: true,
44142 theme: 'light',
44143 captionsTheme: undefined,
44144 iconsColor: undefined,
44145 popupPush: false,
44146 swipeToClose: true,
44147 pageBackLinkText: 'Back',
44148 popupCloseLinkText: 'Close',
44149 navbarOfText: 'of',
44150 navbarShowCount: undefined,
44151 view: undefined,
44152 url: 'photos/',
44153 routableModals: false,
44154 virtualSlides: true,
44155 renderNavbar: undefined,
44156 renderToolbar: undefined,
44157 renderCaption: undefined,
44158 renderObject: undefined,
44159 renderLazyPhoto: undefined,
44160 renderPhoto: undefined,
44161 renderPage: undefined,
44162 renderPopup: undefined,
44163 renderStandalone: undefined,
44164 swiper: {
44165 initialSlide: 0,
44166 spaceBetween: 20,
44167 speed: 300,
44168 loop: false,
44169 preloadImages: true,
44170 navigation: {
44171 nextEl: '.photo-browser-next',
44172 prevEl: '.photo-browser-prev'
44173 },
44174 zoom: {
44175 enabled: true,
44176 maxRatio: 3,
44177 minRatio: 1
44178 },
44179 lazy: {
44180 enabled: true
44181 }
44182 }
44183 }
44184 },
44185 create: function create() {
44186 var app = this;
44187 app.photoBrowser = ConstructorMethods({
44188 defaultSelector: '.photo-browser-popup, .photo-browser-page',
44189 constructor: PhotoBrowser$1,
44190 app: app,
44191 domProp: 'f7PhotoBrowser'
44192 });
44193 },
44194 static: {
44195 PhotoBrowser: PhotoBrowser$1
44196 }
44197 };
44198
44199 var Notification$1 = /*#__PURE__*/function (_Modal) {
44200 _inheritsLoose(Notification, _Modal);
44201
44202 function Notification(app, params) {
44203 var _this;
44204
44205 var extendedParams = extend$1({
44206 on: {}
44207 }, app.params.notification, params); // Extends with open/close Modal methods;
44208
44209 _this = _Modal.call(this, app, extendedParams) || this;
44210
44211 var notification = _assertThisInitialized(_this);
44212
44213 notification.app = app;
44214 notification.params = extendedParams;
44215 var _notification$params = notification.params,
44216 icon = _notification$params.icon,
44217 title = _notification$params.title,
44218 titleRightText = _notification$params.titleRightText,
44219 subtitle = _notification$params.subtitle,
44220 text = _notification$params.text,
44221 closeButton = _notification$params.closeButton,
44222 closeTimeout = _notification$params.closeTimeout,
44223 cssClass = _notification$params.cssClass,
44224 closeOnClick = _notification$params.closeOnClick;
44225 var $el;
44226
44227 if (!notification.params.el) {
44228 // Find Element
44229 var notificationHtml = notification.render({
44230 icon: icon,
44231 title: title,
44232 titleRightText: titleRightText,
44233 subtitle: subtitle,
44234 text: text,
44235 closeButton: closeButton,
44236 cssClass: cssClass
44237 });
44238 $el = $(notificationHtml);
44239 } else {
44240 $el = $(notification.params.el);
44241 }
44242
44243 if ($el && $el.length > 0 && $el[0].f7Modal) {
44244 return $el[0].f7Modal || _assertThisInitialized(_this);
44245 }
44246
44247 if ($el.length === 0) {
44248 return notification.destroy() || _assertThisInitialized(_this);
44249 }
44250
44251 extend$1(notification, {
44252 $el: $el,
44253 el: $el[0],
44254 type: 'notification'
44255 });
44256 $el[0].f7Modal = notification;
44257
44258 if (closeButton) {
44259 $el.find('.notification-close-button').on('click', function () {
44260 notification.close();
44261 });
44262 }
44263
44264 $el.on('click', function (e) {
44265 if (closeButton && $(e.target).closest('.notification-close-button').length) {
44266 return;
44267 }
44268
44269 notification.emit('local::click notificationClick', notification);
44270 if (closeOnClick) notification.close();
44271 });
44272 notification.on('beforeDestroy', function () {
44273 $el.off('click');
44274 });
44275 /* Touch Events */
44276
44277 var isTouched;
44278 var isMoved;
44279 var isScrolling;
44280 var touchesDiff;
44281 var touchStartTime;
44282 var notificationHeight;
44283 var touchesStart = {};
44284
44285 function handleTouchStart(e) {
44286 if (isTouched) return;
44287 isTouched = true;
44288 isMoved = false;
44289 isScrolling = undefined;
44290 touchStartTime = now$1();
44291 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
44292 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
44293 }
44294
44295 function handleTouchMove(e) {
44296 if (!isTouched) return;
44297 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
44298 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
44299
44300 if (typeof isScrolling === 'undefined') {
44301 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) < Math.abs(pageX - touchesStart.x));
44302 }
44303
44304 if (isScrolling) {
44305 isTouched = false;
44306 return;
44307 }
44308
44309 e.preventDefault();
44310
44311 if (!isMoved) {
44312 notification.$el.removeClass('notification-transitioning');
44313 notification.$el.transition(0);
44314 notificationHeight = notification.$el[0].offsetHeight / 2;
44315 }
44316
44317 isMoved = true;
44318 touchesDiff = pageY - touchesStart.y;
44319 var newTranslate = touchesDiff;
44320
44321 if (touchesDiff > 0) {
44322 newTranslate = Math.pow(touchesDiff, 0.8);
44323 }
44324
44325 notification.$el.transform("translate3d(0, " + newTranslate + "px, 0)");
44326 }
44327
44328 function handleTouchEnd() {
44329 if (!isTouched || !isMoved) {
44330 isTouched = false;
44331 isMoved = false;
44332 return;
44333 }
44334
44335 isTouched = false;
44336 isMoved = false;
44337
44338 if (touchesDiff === 0) {
44339 return;
44340 }
44341
44342 var timeDiff = now$1() - touchStartTime;
44343 notification.$el.transition('');
44344 notification.$el.addClass('notification-transitioning');
44345 notification.$el.transform('');
44346
44347 if (touchesDiff < -10 && timeDiff < 300 || -touchesDiff >= notificationHeight / 1) {
44348 notification.close();
44349 }
44350 }
44351
44352 function attachTouchEvents() {
44353 notification.$el.on(app.touchEvents.start, handleTouchStart, {
44354 passive: true
44355 });
44356 app.on('touchmove:active', handleTouchMove);
44357 app.on('touchend:passive', handleTouchEnd);
44358 }
44359
44360 function detachTouchEvents() {
44361 notification.$el.off(app.touchEvents.start, handleTouchStart, {
44362 passive: true
44363 });
44364 app.off('touchmove:active', handleTouchMove);
44365 app.off('touchend:passive', handleTouchEnd);
44366 }
44367
44368 var timeoutId;
44369
44370 function closeOnTimeout() {
44371 timeoutId = nextTick$1(function () {
44372 if (isTouched && isMoved) {
44373 closeOnTimeout();
44374 return;
44375 }
44376
44377 notification.close();
44378 }, closeTimeout);
44379 }
44380
44381 notification.on('open', function () {
44382 if (notification.params.swipeToClose) {
44383 attachTouchEvents();
44384 }
44385
44386 $('.notification.modal-in').each(function (openedEl) {
44387 var notificationInstance = app.notification.get(openedEl);
44388
44389 if (openedEl !== notification.el && notificationInstance) {
44390 notificationInstance.close();
44391 }
44392 });
44393
44394 if (closeTimeout) {
44395 closeOnTimeout();
44396 }
44397 });
44398 notification.on('close beforeDestroy', function () {
44399 if (notification.params.swipeToClose) {
44400 detachTouchEvents();
44401 }
44402
44403 clearTimeout(timeoutId);
44404 });
44405 return notification || _assertThisInitialized(_this);
44406 }
44407
44408 var _proto = Notification.prototype;
44409
44410 _proto.render = function render() {
44411 var notification = this;
44412 if (notification.params.render) return notification.params.render.call(notification, notification);
44413 var _notification$params2 = notification.params,
44414 icon = _notification$params2.icon,
44415 title = _notification$params2.title,
44416 titleRightText = _notification$params2.titleRightText,
44417 subtitle = _notification$params2.subtitle,
44418 text = _notification$params2.text,
44419 closeButton = _notification$params2.closeButton,
44420 cssClass = _notification$params2.cssClass;
44421 return $jsx("div", {
44422 class: "notification " + (cssClass || '')
44423 }, $jsx("div", {
44424 class: "notification-header"
44425 }, icon && $jsx("div", {
44426 class: "notification-icon"
44427 }, icon), title && $jsx("div", {
44428 class: "notification-title"
44429 }, title), titleRightText && $jsx("div", {
44430 class: "notification-title-right-text"
44431 }, titleRightText), closeButton && $jsx("span", {
44432 class: "notification-close-button"
44433 })), $jsx("div", {
44434 class: "notification-content"
44435 }, subtitle && $jsx("div", {
44436 class: "notification-subtitle"
44437 }, subtitle), text && $jsx("div", {
44438 class: "notification-text"
44439 }, text)));
44440 };
44441
44442 return Notification;
44443 }(Modal$1);
44444
44445 var Notification = {
44446 name: 'notification',
44447 static: {
44448 Notification: Notification$1
44449 },
44450 create: function create() {
44451 var app = this;
44452 app.notification = extend$1({}, ModalMethods({
44453 app: app,
44454 constructor: Notification$1,
44455 defaultSelector: '.notification.modal-in'
44456 }));
44457 },
44458 params: {
44459 notification: {
44460 icon: null,
44461 title: null,
44462 titleRightText: null,
44463 subtitle: null,
44464 text: null,
44465 closeButton: false,
44466 closeTimeout: null,
44467 closeOnClick: false,
44468 swipeToClose: true,
44469 cssClass: null,
44470 render: null,
44471 containerEl: null
44472 }
44473 }
44474 };
44475
44476 var Autocomplete$1 = /*#__PURE__*/function (_Framework7Class) {
44477 _inheritsLoose(Autocomplete, _Framework7Class);
44478
44479 function Autocomplete(app, params) {
44480 var _this;
44481
44482 if (params === void 0) {
44483 params = {};
44484 }
44485
44486 _this = _Framework7Class.call(this, params, [app]) || this;
44487
44488 var ac = _assertThisInitialized(_this);
44489
44490 ac.app = app;
44491 var device = getDevice$1();
44492 var defaults = extend$1({
44493 on: {}
44494 }, app.params.autocomplete);
44495
44496 if (typeof defaults.searchbarDisableButton === 'undefined') {
44497 defaults.searchbarDisableButton = app.theme !== 'aurora';
44498 } // Extend defaults with modules params
44499
44500
44501 ac.useModulesParams(defaults);
44502 ac.params = extend$1(defaults, params);
44503 var $openerEl;
44504
44505 if (ac.params.openerEl) {
44506 $openerEl = $(ac.params.openerEl);
44507 if ($openerEl.length) $openerEl[0].f7Autocomplete = ac;
44508 }
44509
44510 var $inputEl;
44511
44512 if (ac.params.inputEl) {
44513 $inputEl = $(ac.params.inputEl);
44514 if ($inputEl.length) $inputEl[0].f7Autocomplete = ac;
44515 }
44516
44517 var uniqueId = id();
44518 var url = params.url;
44519
44520 if (!url && $openerEl && $openerEl.length) {
44521 if ($openerEl.attr('href')) url = $openerEl.attr('href');else if ($openerEl.find('a').length > 0) {
44522 url = $openerEl.find('a').attr('href');
44523 }
44524 }
44525
44526 if (!url || url === '#' || url === '') url = ac.params.url;
44527 var inputType = ac.params.multiple ? 'checkbox' : 'radio';
44528 extend$1(ac, {
44529 $openerEl: $openerEl,
44530 openerEl: $openerEl && $openerEl[0],
44531 $inputEl: $inputEl,
44532 inputEl: $inputEl && $inputEl[0],
44533 id: uniqueId,
44534 url: url,
44535 value: ac.params.value || [],
44536 inputType: inputType,
44537 inputName: inputType + "-" + uniqueId,
44538 $modalEl: undefined,
44539 $dropdownEl: undefined
44540 });
44541 var previousQuery = '';
44542
44543 function onInputChange() {
44544 var query = ac.$inputEl.val().trim();
44545 if (!ac.params.source) return;
44546 ac.params.source.call(ac, query, function (items) {
44547 var itemsHTML = '';
44548 var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
44549 ac.items = items;
44550 var regExp;
44551
44552 if (ac.params.highlightMatches) {
44553 query = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
44554 regExp = new RegExp("(" + query + ")", 'i');
44555 }
44556
44557 var firstValue;
44558 var firstItem;
44559
44560 for (var i = 0; i < limit; i += 1) {
44561 var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
44562 var itemText = typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i];
44563
44564 if (i === 0) {
44565 firstValue = itemValue;
44566 firstItem = ac.items[i];
44567 }
44568
44569 itemsHTML += ac.renderItem({
44570 value: itemValue,
44571 text: ac.params.highlightMatches ? itemText.replace(regExp, '<b>$1</b>') : itemText
44572 }, i);
44573 }
44574
44575 if (itemsHTML === '' && query === '' && ac.params.dropdownPlaceholderText) {
44576 itemsHTML += ac.renderItem({
44577 placeholder: true,
44578 text: ac.params.dropdownPlaceholderText
44579 });
44580 }
44581
44582 ac.$dropdownEl.find('ul').html(itemsHTML);
44583
44584 if (ac.params.typeahead) {
44585 if (!firstValue || !firstItem) {
44586 return;
44587 }
44588
44589 if (firstValue.toLowerCase().indexOf(query.toLowerCase()) !== 0) {
44590 return;
44591 }
44592
44593 if (previousQuery.toLowerCase() === query.toLowerCase()) {
44594 ac.value = [];
44595 return;
44596 }
44597
44598 if (previousQuery.toLowerCase().indexOf(query.toLowerCase()) === 0) {
44599 previousQuery = query;
44600 ac.value = [];
44601 return;
44602 }
44603
44604 $inputEl.val(firstValue);
44605 $inputEl[0].setSelectionRange(query.length, firstValue.length);
44606 var previousValue = typeof ac.value[0] === 'object' ? ac.value[0][ac.params.valueProperty] : ac.value[0];
44607
44608 if (!previousValue || firstValue.toLowerCase() !== previousValue.toLowerCase()) {
44609 ac.value = [firstItem];
44610 ac.emit('local::change autocompleteChange', [firstItem]);
44611 }
44612 }
44613
44614 previousQuery = query;
44615 });
44616 }
44617
44618 function onPageInputChange() {
44619 var inputEl = this;
44620 var value = inputEl.value;
44621 var isValues = $(inputEl).parents('.autocomplete-values').length > 0;
44622 var item;
44623 var itemValue;
44624 var aValue;
44625
44626 if (isValues) {
44627 if (ac.inputType === 'checkbox' && !inputEl.checked) {
44628 for (var i = 0; i < ac.value.length; i += 1) {
44629 aValue = typeof ac.value[i] === 'string' ? ac.value[i] : ac.value[i][ac.params.valueProperty];
44630
44631 if (aValue === value || aValue * 1 === value * 1) {
44632 ac.value.splice(i, 1);
44633 }
44634 }
44635
44636 ac.updateValues();
44637 ac.emit('local::change autocompleteChange', ac.value);
44638 }
44639
44640 return;
44641 } // Find Related Item
44642
44643
44644 for (var _i = 0; _i < ac.items.length; _i += 1) {
44645 itemValue = typeof ac.items[_i] === 'object' ? ac.items[_i][ac.params.valueProperty] : ac.items[_i];
44646 if (itemValue === value || itemValue * 1 === value * 1) item = ac.items[_i];
44647 }
44648
44649 if (ac.inputType === 'radio') {
44650 ac.value = [item];
44651 } else if (inputEl.checked) {
44652 ac.value.push(item);
44653 } else {
44654 for (var _i2 = 0; _i2 < ac.value.length; _i2 += 1) {
44655 aValue = typeof ac.value[_i2] === 'object' ? ac.value[_i2][ac.params.valueProperty] : ac.value[_i2];
44656
44657 if (aValue === value || aValue * 1 === value * 1) {
44658 ac.value.splice(_i2, 1);
44659 }
44660 }
44661 } // Update Values Block
44662
44663
44664 ac.updateValues(); // On Select Callback
44665
44666 if (ac.inputType === 'radio' && inputEl.checked || ac.inputType === 'checkbox') {
44667 ac.emit('local::change autocompleteChange', ac.value);
44668 }
44669 }
44670
44671 function onHtmlClick(e) {
44672 var $targetEl = $(e.target);
44673 if ($targetEl.is(ac.$inputEl[0]) || ac.$dropdownEl && $targetEl.closest(ac.$dropdownEl[0]).length) return;
44674 ac.close();
44675 }
44676
44677 function onOpenerClick() {
44678 ac.open();
44679 }
44680
44681 function onInputFocus() {
44682 ac.open();
44683 }
44684
44685 function onInputBlur() {
44686 if (ac.$dropdownEl.find('label.active-state').length > 0) return;
44687 setTimeout(function () {
44688 ac.close();
44689 }, 0);
44690 }
44691
44692 function onResize() {
44693 ac.positionDropdown();
44694 }
44695
44696 function onKeyDown(e) {
44697 if (!ac.opened) return;
44698
44699 if (e.keyCode === 27) {
44700 // ESC
44701 e.preventDefault();
44702 ac.$inputEl.blur();
44703 return;
44704 }
44705
44706 if (e.keyCode === 13) {
44707 // Enter
44708 var $selectedItemLabel = ac.$dropdownEl.find('.autocomplete-dropdown-selected label');
44709
44710 if ($selectedItemLabel.length) {
44711 e.preventDefault();
44712 $selectedItemLabel.trigger('click');
44713 ac.$inputEl.blur();
44714 return;
44715 }
44716
44717 if (ac.params.typeahead) {
44718 e.preventDefault();
44719 ac.$inputEl.blur();
44720 }
44721
44722 return;
44723 }
44724
44725 if (e.keyCode !== 40 && e.keyCode !== 38) return;
44726 e.preventDefault();
44727 var $selectedItem = ac.$dropdownEl.find('.autocomplete-dropdown-selected');
44728 var $newItem;
44729
44730 if ($selectedItem.length) {
44731 $newItem = $selectedItem[e.keyCode === 40 ? 'next' : 'prev']('li');
44732
44733 if (!$newItem.length) {
44734 $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
44735 }
44736 } else {
44737 $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
44738 }
44739
44740 if ($newItem.hasClass('autocomplete-dropdown-placeholder')) return;
44741 $selectedItem.removeClass('autocomplete-dropdown-selected');
44742 $newItem.addClass('autocomplete-dropdown-selected');
44743 }
44744
44745 function onDropdownClick() {
44746 var $clickedEl = $(this);
44747 var clickedItem;
44748
44749 for (var i = 0; i < ac.items.length; i += 1) {
44750 var itemValue = typeof ac.items[i] === 'object' ? ac.items[i][ac.params.valueProperty] : ac.items[i];
44751 var value = $clickedEl.attr('data-value');
44752
44753 if (itemValue === value || itemValue * 1 === value * 1) {
44754 clickedItem = ac.items[i];
44755 }
44756 }
44757
44758 if (ac.params.updateInputValueOnSelect) {
44759 ac.$inputEl.val(typeof clickedItem === 'object' ? clickedItem[ac.params.valueProperty] : clickedItem);
44760 ac.$inputEl.trigger('input change');
44761 }
44762
44763 ac.value = [clickedItem];
44764 ac.emit('local::change autocompleteChange', [clickedItem]);
44765 ac.close();
44766 }
44767
44768 ac.attachEvents = function attachEvents() {
44769 if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
44770 ac.$openerEl.on('click', onOpenerClick);
44771 }
44772
44773 if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
44774 ac.$inputEl.on('focus', onInputFocus);
44775 ac.$inputEl.on(ac.params.inputEvents, onInputChange);
44776
44777 if (device.android) {
44778 $('html').on('click', onHtmlClick);
44779 } else {
44780 ac.$inputEl.on('blur', onInputBlur);
44781 }
44782
44783 ac.$inputEl.on('keydown', onKeyDown);
44784 }
44785 };
44786
44787 ac.detachEvents = function attachEvents() {
44788 if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
44789 ac.$openerEl.off('click', onOpenerClick);
44790 }
44791
44792 if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
44793 ac.$inputEl.off('focus', onInputFocus);
44794 ac.$inputEl.off(ac.params.inputEvents, onInputChange);
44795
44796 if (device.android) {
44797 $('html').off('click', onHtmlClick);
44798 } else {
44799 ac.$inputEl.off('blur', onInputBlur);
44800 }
44801
44802 ac.$inputEl.off('keydown', onKeyDown);
44803 }
44804 };
44805
44806 ac.attachDropdownEvents = function attachDropdownEvents() {
44807 ac.$dropdownEl.on('click', 'label', onDropdownClick);
44808 app.on('resize', onResize);
44809 };
44810
44811 ac.detachDropdownEvents = function detachDropdownEvents() {
44812 ac.$dropdownEl.off('click', 'label', onDropdownClick);
44813 app.off('resize', onResize);
44814 };
44815
44816 ac.attachPageEvents = function attachPageEvents() {
44817 ac.$el.on('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
44818
44819 if (ac.params.closeOnSelect && !ac.params.multiple) {
44820 ac.$el.once('click', '.list label', function () {
44821 nextTick$1(function () {
44822 ac.close();
44823 });
44824 });
44825 }
44826 };
44827
44828 ac.detachPageEvents = function detachPageEvents() {
44829 ac.$el.off('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
44830 }; // Install Modules
44831
44832
44833 ac.useModules(); // Init
44834
44835 ac.init();
44836 return ac || _assertThisInitialized(_this);
44837 }
44838
44839 var _proto = Autocomplete.prototype;
44840
44841 _proto.positionDropdown = function positionDropdown() {
44842 var _$dropdownEl$children;
44843
44844 var ac = this;
44845 var $inputEl = ac.$inputEl,
44846 app = ac.app,
44847 $dropdownEl = ac.$dropdownEl;
44848 var $pageContentEl = $inputEl.parents('.page-content');
44849 if ($pageContentEl.length === 0) return;
44850 var inputOffset = $inputEl.offset();
44851 var inputOffsetWidth = $inputEl[0].offsetWidth;
44852 var inputOffsetHeight = $inputEl[0].offsetHeight;
44853 var $listEl = $inputEl.parents('.list');
44854 var $listParent;
44855 $listEl.parents().each(function (parentEl) {
44856 if ($listParent) return;
44857 var $parentEl = $(parentEl);
44858 if ($parentEl.parent($pageContentEl).length) $listParent = $parentEl;
44859 });
44860 var listOffset = $listEl.offset();
44861 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
44862 var listOffsetLeft = $listEl.length > 0 ? listOffset.left - $pageContentEl.offset().left : 0;
44863 var inputOffsetLeft = inputOffset.left - ($listEl.length > 0 ? listOffset.left : 0) - (app.rtl ? 0 : 0);
44864 var inputOffsetTop = inputOffset.top - ($pageContentEl.offset().top - $pageContentEl[0].scrollTop);
44865 var maxHeight = $pageContentEl[0].scrollHeight - paddingBottom - (inputOffsetTop + $pageContentEl[0].scrollTop) - $inputEl[0].offsetHeight;
44866 var paddingProp = app.rtl ? 'padding-right' : 'padding-left';
44867 var paddingValue;
44868
44869 if ($listEl.length && !ac.params.expandInput) {
44870 paddingValue = (app.rtl ? $listEl[0].offsetWidth - inputOffsetLeft - inputOffsetWidth : inputOffsetLeft) - (app.theme === 'md' ? 16 : 15);
44871 }
44872
44873 $dropdownEl.css({
44874 left: ($listEl.length > 0 ? listOffsetLeft : inputOffsetLeft) + "px",
44875 top: inputOffsetTop + $pageContentEl[0].scrollTop + inputOffsetHeight + "px",
44876 width: ($listEl.length > 0 ? $listEl[0].offsetWidth : inputOffsetWidth) + "px"
44877 });
44878 $dropdownEl.children('.autocomplete-dropdown-inner').css((_$dropdownEl$children = {
44879 maxHeight: maxHeight + "px"
44880 }, _$dropdownEl$children[paddingProp] = $listEl.length > 0 && !ac.params.expandInput ? paddingValue + "px" : '', _$dropdownEl$children));
44881 };
44882
44883 _proto.focus = function focus() {
44884 var ac = this;
44885 ac.$el.find('input[type=search]').focus();
44886 };
44887
44888 _proto.source = function source(query) {
44889 var ac = this;
44890 if (!ac.params.source) return;
44891 var $el = ac.$el;
44892 ac.params.source.call(ac, query, function (items) {
44893 var itemsHTML = '';
44894 var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
44895 ac.items = items;
44896
44897 for (var i = 0; i < limit; i += 1) {
44898 var selected = false;
44899 var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
44900
44901 for (var j = 0; j < ac.value.length; j += 1) {
44902 var aValue = typeof ac.value[j] === 'object' ? ac.value[j][ac.params.valueProperty] : ac.value[j];
44903 if (aValue === itemValue || aValue * 1 === itemValue * 1) selected = true;
44904 }
44905
44906 itemsHTML += ac.renderItem({
44907 value: itemValue,
44908 text: typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i],
44909 inputType: ac.inputType,
44910 id: ac.id,
44911 inputName: ac.inputName,
44912 selected: selected
44913 }, i);
44914 }
44915
44916 $el.find('.autocomplete-found ul').html(itemsHTML);
44917
44918 if (items.length === 0) {
44919 if (query.length !== 0) {
44920 $el.find('.autocomplete-not-found').show();
44921 $el.find('.autocomplete-found, .autocomplete-values').hide();
44922 } else {
44923 $el.find('.autocomplete-values').show();
44924 $el.find('.autocomplete-found, .autocomplete-not-found').hide();
44925 }
44926 } else {
44927 $el.find('.autocomplete-found').show();
44928 $el.find('.autocomplete-not-found, .autocomplete-values').hide();
44929 }
44930 });
44931 };
44932
44933 _proto.updateValues = function updateValues() {
44934 var ac = this;
44935 var valuesHTML = '';
44936
44937 for (var i = 0; i < ac.value.length; i += 1) {
44938 valuesHTML += ac.renderItem({
44939 value: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.valueProperty] : ac.value[i],
44940 text: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.textProperty] : ac.value[i],
44941 inputType: ac.inputType,
44942 id: ac.id,
44943 inputName: ac.inputName + "-checked}",
44944 selected: true
44945 }, i);
44946 }
44947
44948 ac.$el.find('.autocomplete-values ul').html(valuesHTML);
44949 };
44950
44951 _proto.preloaderHide = function preloaderHide() {
44952 var ac = this;
44953
44954 if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
44955 ac.$dropdownEl.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
44956 } else {
44957 $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
44958 }
44959 };
44960
44961 _proto.preloaderShow = function preloaderShow() {
44962 var ac = this;
44963
44964 if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
44965 ac.$dropdownEl.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
44966 } else {
44967 $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
44968 }
44969 };
44970
44971 _proto.renderPreloader = function renderPreloader() {
44972 var ac = this;
44973 var preloaders = {
44974 iosPreloaderContent: iosPreloaderContent,
44975 mdPreloaderContent: mdPreloaderContent,
44976 auroraPreloaderContent: auroraPreloaderContent
44977 };
44978 return $jsx("div", {
44979 class: "autocomplete-preloader preloader " + (ac.params.preloaderColor ? "color-" + ac.params.preloaderColor : '')
44980 }, preloaders[ac.app.theme + "PreloaderContent"] || '');
44981 };
44982
44983 _proto.renderSearchbar = function renderSearchbar() {
44984 var ac = this;
44985 if (ac.params.renderSearchbar) return ac.params.renderSearchbar.call(ac);
44986 return $jsx("form", {
44987 class: "searchbar"
44988 }, $jsx("div", {
44989 class: "searchbar-inner"
44990 }, $jsx("div", {
44991 class: "searchbar-input-wrap"
44992 }, $jsx("input", {
44993 type: "search",
44994 spellcheck: ac.params.searchbarSpellcheck || 'false',
44995 placeholder: ac.params.searchbarPlaceholder
44996 }), $jsx("i", {
44997 class: "searchbar-icon"
44998 }), $jsx("span", {
44999 class: "input-clear-button"
45000 })), ac.params.searchbarDisableButton && $jsx("span", {
45001 class: "searchbar-disable-button"
45002 }, ac.params.searchbarDisableText)));
45003 };
45004
45005 _proto.renderItem = function renderItem(item, index) {
45006 var ac = this;
45007 if (ac.params.renderItem) return ac.params.renderItem.call(ac, item, index);
45008 var itemValue = item.value && typeof item.value === 'string' ? item.value.replace(/"/g, '&quot;') : item.value;
45009
45010 if (ac.params.openIn !== 'dropdown') {
45011 return $jsx("li", null, $jsx("label", {
45012 class: "item-" + item.inputType + " item-content"
45013 }, $jsx("input", {
45014 type: item.inputType,
45015 name: item.inputName,
45016 value: itemValue,
45017 _checked: item.selected
45018 }), $jsx("i", {
45019 class: "icon icon-" + item.inputType
45020 }), $jsx("div", {
45021 class: "item-inner"
45022 }, $jsx("div", {
45023 class: "item-title"
45024 }, item.text))));
45025 } // Dropdown
45026
45027
45028 if (!item.placeholder) {
45029 return $jsx("li", null, $jsx("label", {
45030 class: "item-radio item-content",
45031 "data-value": itemValue
45032 }, $jsx("div", {
45033 class: "item-inner"
45034 }, $jsx("div", {
45035 class: "item-title"
45036 }, item.text))));
45037 } // Dropwdown placeholder
45038
45039
45040 return $jsx("li", {
45041 class: "autocomplete-dropdown-placeholder"
45042 }, $jsx("label", {
45043 class: "item-content"
45044 }, $jsx("div", {
45045 class: "item-inner"
45046 }, $jsx("div", {
45047 class: "item-title"
45048 }, item.text))));
45049 };
45050
45051 _proto.renderNavbar = function renderNavbar() {
45052 var ac = this;
45053 if (ac.params.renderNavbar) return ac.params.renderNavbar.call(ac);
45054 var pageTitle = ac.params.pageTitle;
45055
45056 if (typeof pageTitle === 'undefined' && ac.$openerEl && ac.$openerEl.length) {
45057 pageTitle = ac.$openerEl.find('.item-title').text().trim();
45058 }
45059
45060 var inPopup = ac.params.openIn === 'popup'; // eslint-disable-next-line
45061
45062 var navbarLeft = inPopup ? ac.params.preloader && $jsx("div", {
45063 class: "left"
45064 }, ac.renderPreloader()) : $jsx("div", {
45065 class: "left sliding"
45066 }, $jsx("a", {
45067 class: "link back"
45068 }, $jsx("i", {
45069 class: "icon icon-back"
45070 }), $jsx("span", {
45071 class: "if-not-md"
45072 }, ac.params.pageBackLinkText)));
45073 var navbarRight = inPopup ? $jsx("div", {
45074 class: "right"
45075 }, $jsx("a", {
45076 class: "link popup-close",
45077 "data-popup": ".autocomplete-popup"
45078 }, ac.params.popupCloseLinkText)) : ac.params.preloader && $jsx("div", {
45079 class: "right"
45080 }, ac.renderPreloader());
45081 return $jsx("div", {
45082 class: "navbar " + (ac.params.navbarColorTheme ? "color-" + ac.params.navbarColorTheme : '')
45083 }, $jsx("div", {
45084 class: "navbar-bg"
45085 }), $jsx("div", {
45086 class: "navbar-inner " + (ac.params.navbarColorTheme ? "color-" + ac.params.navbarColorTheme : '')
45087 }, navbarLeft, pageTitle && $jsx("div", {
45088 class: "title sliding"
45089 }, pageTitle), navbarRight, $jsx("div", {
45090 class: "subnavbar sliding"
45091 }, ac.renderSearchbar())));
45092 };
45093
45094 _proto.renderDropdown = function renderDropdown() {
45095 var ac = this;
45096 if (ac.params.renderDropdown) return ac.params.renderDropdown.call(ac, ac.items);
45097 return $jsx("div", {
45098 class: "autocomplete-dropdown"
45099 }, $jsx("div", {
45100 class: "autocomplete-dropdown-inner"
45101 }, $jsx("div", {
45102 class: "list " + (!ac.params.expandInput ? 'no-safe-areas' : '')
45103 }, $jsx("ul", null))), ac.params.preloader && ac.renderPreloader());
45104 };
45105
45106 _proto.renderPage = function renderPage(inPopup) {
45107 var ac = this;
45108 if (ac.params.renderPage) return ac.params.renderPage.call(ac, ac.items);
45109 return $jsx("div", {
45110 class: "page page-with-subnavbar autocomplete-page",
45111 "data-name": "autocomplete-page"
45112 }, ac.renderNavbar(inPopup), $jsx("div", {
45113 class: "searchbar-backdrop"
45114 }), $jsx("div", {
45115 class: "page-content"
45116 }, $jsx("div", {
45117 class: "list autocomplete-list autocomplete-found autocomplete-list-" + ac.id + " " + (ac.params.formColorTheme ? "color-" + ac.params.formColorTheme : '')
45118 }, $jsx("ul", null)), $jsx("div", {
45119 class: "list autocomplete-not-found"
45120 }, $jsx("ul", null, $jsx("li", {
45121 class: "item-content"
45122 }, $jsx("div", {
45123 class: "item-inner"
45124 }, $jsx("div", {
45125 class: "item-title"
45126 }, ac.params.notFoundText))))), $jsx("div", {
45127 class: "list autocomplete-values"
45128 }, $jsx("ul", null))));
45129 };
45130
45131 _proto.renderPopup = function renderPopup() {
45132 var ac = this;
45133 if (ac.params.renderPopup) return ac.params.renderPopup.call(ac, ac.items);
45134 return $jsx("div", {
45135 class: "popup autocomplete-popup"
45136 }, $jsx("div", {
45137 class: "view"
45138 }, ac.renderPage(true), ";"));
45139 };
45140
45141 _proto.onOpen = function onOpen(type, el) {
45142 var ac = this;
45143 var app = ac.app;
45144 var $el = $(el);
45145 ac.$el = $el;
45146 ac.el = $el[0];
45147 ac.openedIn = type;
45148 ac.opened = true;
45149
45150 if (ac.params.openIn === 'dropdown') {
45151 ac.attachDropdownEvents();
45152 ac.$dropdownEl.addClass('autocomplete-dropdown-in');
45153 ac.$inputEl.trigger('input');
45154 } else {
45155 // Init SB
45156 var $searchbarEl = $el.find('.searchbar');
45157
45158 if (ac.params.openIn === 'page' && app.theme === 'ios' && $searchbarEl.length === 0) {
45159 $searchbarEl = $(app.navbar.getElByPage($el)).find('.searchbar');
45160 }
45161
45162 ac.searchbar = app.searchbar.create({
45163 el: $searchbarEl,
45164 backdropEl: $el.find('.searchbar-backdrop'),
45165 customSearch: true,
45166 on: {
45167 search: function search(sb, query) {
45168 if (query.length === 0 && ac.searchbar.enabled) {
45169 ac.searchbar.backdropShow();
45170 } else {
45171 ac.searchbar.backdropHide();
45172 }
45173
45174 ac.source(query);
45175 }
45176 }
45177 }); // Attach page events
45178
45179 ac.attachPageEvents(); // Update Values On Page Init
45180
45181 ac.updateValues(); // Source on load
45182
45183 if (ac.params.requestSourceOnOpen) ac.source('');
45184 }
45185
45186 ac.emit('local::open autocompleteOpen', ac);
45187 };
45188
45189 _proto.autoFocus = function autoFocus() {
45190 var ac = this;
45191
45192 if (ac.searchbar && ac.searchbar.$inputEl) {
45193 ac.searchbar.$inputEl.focus();
45194 }
45195
45196 return ac;
45197 };
45198
45199 _proto.onOpened = function onOpened() {
45200 var ac = this;
45201
45202 if (ac.params.openIn !== 'dropdown' && ac.params.autoFocus) {
45203 ac.autoFocus();
45204 }
45205
45206 ac.emit('local::opened autocompleteOpened', ac);
45207 };
45208
45209 _proto.onClose = function onClose() {
45210 var ac = this;
45211 if (ac.destroyed) return; // Destroy SB
45212
45213 if (ac.searchbar && ac.searchbar.destroy) {
45214 ac.searchbar.destroy();
45215 ac.searchbar = null;
45216 delete ac.searchbar;
45217 }
45218
45219 if (ac.params.openIn === 'dropdown') {
45220 ac.detachDropdownEvents();
45221 ac.$dropdownEl.removeClass('autocomplete-dropdown-in').remove();
45222 ac.$inputEl.parents('.item-content-dropdown-expanded').removeClass('item-content-dropdown-expanded');
45223 } else {
45224 ac.detachPageEvents();
45225 }
45226
45227 ac.emit('local::close autocompleteClose', ac);
45228 };
45229
45230 _proto.onClosed = function onClosed() {
45231 var ac = this;
45232 if (ac.destroyed) return;
45233 ac.opened = false;
45234 ac.$el = null;
45235 ac.el = null;
45236 delete ac.$el;
45237 delete ac.el;
45238 ac.emit('local::closed autocompleteClosed', ac);
45239 };
45240
45241 _proto.openPage = function openPage() {
45242 var ac = this;
45243 if (ac.opened) return ac;
45244 var pageHtml = ac.renderPage();
45245 ac.view.router.navigate({
45246 url: ac.url,
45247 route: {
45248 content: pageHtml,
45249 path: ac.url,
45250 on: {
45251 pageBeforeIn: function pageBeforeIn(e, page) {
45252 ac.onOpen('page', page.el);
45253 },
45254 pageAfterIn: function pageAfterIn(e, page) {
45255 ac.onOpened('page', page.el);
45256 },
45257 pageBeforeOut: function pageBeforeOut(e, page) {
45258 ac.onClose('page', page.el);
45259 },
45260 pageAfterOut: function pageAfterOut(e, page) {
45261 ac.onClosed('page', page.el);
45262 }
45263 },
45264 options: {
45265 animate: ac.params.animate
45266 }
45267 }
45268 });
45269 return ac;
45270 };
45271
45272 _proto.openPopup = function openPopup() {
45273 var ac = this;
45274 if (ac.opened) return ac;
45275 var popupHtml = ac.renderPopup();
45276 var popupParams = {
45277 content: popupHtml,
45278 animate: ac.params.animate,
45279 push: ac.params.popupPush,
45280 swipeToClose: ac.params.popupSwipeToClose,
45281 on: {
45282 popupOpen: function popupOpen(popup) {
45283 ac.onOpen('popup', popup.el);
45284 },
45285 popupOpened: function popupOpened(popup) {
45286 ac.onOpened('popup', popup.el);
45287 },
45288 popupClose: function popupClose(popup) {
45289 ac.onClose('popup', popup.el);
45290 },
45291 popupClosed: function popupClosed(popup) {
45292 ac.onClosed('popup', popup.el);
45293 }
45294 }
45295 };
45296
45297 if (ac.params.routableModals && ac.view) {
45298 ac.view.router.navigate({
45299 url: ac.url,
45300 route: {
45301 path: ac.url,
45302 popup: popupParams
45303 }
45304 });
45305 } else {
45306 ac.modal = ac.app.popup.create(popupParams).open(ac.params.animate);
45307 }
45308
45309 return ac;
45310 };
45311
45312 _proto.openDropdown = function openDropdown() {
45313 var ac = this;
45314
45315 if (!ac.$dropdownEl) {
45316 ac.$dropdownEl = $(ac.renderDropdown());
45317 }
45318
45319 var $listEl = ac.$inputEl.parents('.list');
45320
45321 if ($listEl.length && ac.$inputEl.parents('.item-content').length > 0 && ac.params.expandInput) {
45322 ac.$inputEl.parents('.item-content').addClass('item-content-dropdown-expanded');
45323 }
45324
45325 var $pageContentEl = ac.$inputEl.parents('.page-content');
45326
45327 if (ac.params.dropdownContainerEl) {
45328 $(ac.params.dropdownContainerEl).append(ac.$dropdownEl);
45329 } else if ($pageContentEl.length === 0) {
45330 ac.$dropdownEl.insertAfter(ac.$inputEl);
45331 } else {
45332 ac.positionDropdown();
45333 $pageContentEl.append(ac.$dropdownEl);
45334 }
45335
45336 ac.onOpen('dropdown', ac.$dropdownEl);
45337 ac.onOpened('dropdown', ac.$dropdownEl);
45338 };
45339
45340 _proto.open = function open() {
45341 var ac = this;
45342 if (ac.opened) return ac;
45343 var openIn = ac.params.openIn;
45344 ac["open" + openIn.split('').map(function (el, index) {
45345 if (index === 0) return el.toUpperCase();
45346 return el;
45347 }).join('')]();
45348 return ac;
45349 };
45350
45351 _proto.close = function close() {
45352 var ac = this;
45353 if (!ac.opened) return ac;
45354
45355 if (ac.params.openIn === 'dropdown') {
45356 ac.onClose();
45357 ac.onClosed();
45358 } else if (ac.params.routableModals && ac.view || ac.openedIn === 'page') {
45359 ac.view.router.back({
45360 animate: ac.params.animate
45361 });
45362 } else {
45363 ac.modal.once('modalClosed', function () {
45364 nextTick$1(function () {
45365 if (ac.destroyed) return;
45366 ac.modal.destroy();
45367 delete ac.modal;
45368 });
45369 });
45370 ac.modal.close();
45371 }
45372
45373 return ac;
45374 };
45375
45376 _proto.init = function init() {
45377 var ac = this;
45378 ac.attachEvents();
45379 };
45380
45381 _proto.destroy = function destroy() {
45382 var ac = this;
45383 ac.emit('local::beforeDestroy autocompleteBeforeDestroy', ac);
45384 ac.detachEvents();
45385
45386 if (ac.$inputEl && ac.$inputEl[0]) {
45387 delete ac.$inputEl[0].f7Autocomplete;
45388 }
45389
45390 if (ac.$openerEl && ac.$openerEl[0]) {
45391 delete ac.$openerEl[0].f7Autocomplete;
45392 }
45393
45394 deleteProps$1(ac);
45395 ac.destroyed = true;
45396 };
45397
45398 _createClass$1(Autocomplete, [{
45399 key: "view",
45400 get: function get() {
45401 var ac = this;
45402 var $openerEl = ac.$openerEl,
45403 $inputEl = ac.$inputEl,
45404 app = ac.app;
45405 var view;
45406
45407 if (ac.params.view) {
45408 view = ac.params.view;
45409 } else if ($openerEl || $inputEl) {
45410 var $el = $openerEl || $inputEl;
45411 view = $el.closest('.view').length && $el.closest('.view')[0].f7View;
45412 }
45413
45414 if (!view) view = app.views.main;
45415 return view;
45416 }
45417 }]);
45418
45419 return Autocomplete;
45420 }(Framework7Class);
45421
45422 var Autocomplete = {
45423 name: 'autocomplete',
45424 params: {
45425 autocomplete: {
45426 openerEl: undefined,
45427 inputEl: undefined,
45428 view: undefined,
45429 // DropDown
45430 dropdownContainerEl: undefined,
45431 dropdownPlaceholderText: undefined,
45432 typeahead: false,
45433 highlightMatches: true,
45434 expandInput: false,
45435 updateInputValueOnSelect: true,
45436 inputEvents: 'input',
45437 value: undefined,
45438 multiple: false,
45439 source: undefined,
45440 limit: undefined,
45441 valueProperty: 'id',
45442 textProperty: 'text',
45443 openIn: 'page',
45444 // or 'popup' or 'dropdown'
45445 pageBackLinkText: 'Back',
45446 popupCloseLinkText: 'Close',
45447 pageTitle: undefined,
45448 searchbarPlaceholder: 'Search...',
45449 searchbarDisableText: 'Cancel',
45450 searchbarDisableButton: undefined,
45451 searchbarSpellcheck: false,
45452 popupPush: false,
45453 popupSwipeToClose: undefined,
45454 animate: true,
45455 autoFocus: false,
45456 closeOnSelect: false,
45457 notFoundText: 'Nothing found',
45458 requestSourceOnOpen: false,
45459 // Preloader
45460 preloaderColor: undefined,
45461 preloader: false,
45462 // Colors
45463 formColorTheme: undefined,
45464 navbarColorTheme: undefined,
45465 // Routing
45466 routableModals: false,
45467 url: 'select/',
45468 // Custom render functions
45469 renderDropdown: undefined,
45470 renderPage: undefined,
45471 renderPopup: undefined,
45472 renderItem: undefined,
45473 renderSearchbar: undefined,
45474 renderNavbar: undefined
45475 }
45476 },
45477 static: {
45478 Autocomplete: Autocomplete$1
45479 },
45480 create: function create() {
45481 var app = this;
45482 app.autocomplete = extend$1(ConstructorMethods({
45483 defaultSelector: undefined,
45484 constructor: Autocomplete$1,
45485 app: app,
45486 domProp: 'f7Autocomplete'
45487 }), {
45488 open: function open(autocompleteEl) {
45489 var ac = app.autocomplete.get(autocompleteEl);
45490 if (ac && ac.open) return ac.open();
45491 return undefined;
45492 },
45493 close: function close(autocompleteEl) {
45494 var ac = app.autocomplete.get(autocompleteEl);
45495 if (ac && ac.close) return ac.close();
45496 return undefined;
45497 }
45498 });
45499 }
45500 };
45501
45502 var Tooltip$1 = /*#__PURE__*/function (_Framework7Class) {
45503 _inheritsLoose(Tooltip, _Framework7Class);
45504
45505 function Tooltip(app, params) {
45506 var _this;
45507
45508 if (params === void 0) {
45509 params = {};
45510 }
45511
45512 _this = _Framework7Class.call(this, params, [app]) || this;
45513
45514 var tooltip = _assertThisInitialized(_this);
45515
45516 var support = getSupport$1();
45517 var defaults = extend$1({}, app.params.tooltip);
45518 var document = getDocument(); // Extend defaults with modules params
45519
45520 tooltip.useModulesParams(defaults);
45521 tooltip.params = extend$1(defaults, params);
45522
45523 if (typeof params.offset === 'undefined' && support.touch && tooltip.params.trigger === 'hover') {
45524 tooltip.params.offset = 10;
45525 }
45526
45527 var _tooltip$params = tooltip.params,
45528 targetEl = _tooltip$params.targetEl,
45529 containerEl = _tooltip$params.containerEl;
45530 if (!targetEl && !tooltip.params.delegated) return tooltip || _assertThisInitialized(_this);
45531 var $targetEl = $(targetEl);
45532 if ($targetEl.length === 0 && !tooltip.params.delegated) return tooltip || _assertThisInitialized(_this);
45533 if ($targetEl[0] && $targetEl[0].f7Tooltip && !tooltip.params.delegated) return $targetEl[0].f7Tooltip || _assertThisInitialized(_this);
45534 var $containerEl = $(containerEl || app.$el).eq(0);
45535
45536 if ($containerEl.length === 0) {
45537 $containerEl = app.$el;
45538 }
45539
45540 var $el = $(tooltip.render()).eq(0);
45541 extend$1(tooltip, {
45542 app: app,
45543 $targetEl: $targetEl,
45544 targetEl: $targetEl && $targetEl[0],
45545 $containerEl: $containerEl,
45546 containerEl: $containerEl && $containerEl[0],
45547 $el: $el,
45548 el: $el && $el[0],
45549 text: tooltip.params.text || '',
45550 visible: false,
45551 opened: false
45552 });
45553 if ($targetEl[0]) $targetEl[0].f7Tooltip = tooltip;
45554 var touchesStart = {};
45555 var isTouched;
45556
45557 function handleClick() {
45558 if (tooltip.opened) tooltip.hide();else tooltip.show(this);
45559 }
45560
45561 function handleClickOut(e) {
45562 if (tooltip.opened && ($(e.target).closest($targetEl).length || $(e.target).closest(tooltip.$el).length)) return;
45563 tooltip.hide();
45564 }
45565
45566 function handleTouchStart(e) {
45567 if (isTouched) return;
45568 isTouched = true;
45569 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
45570 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
45571 tooltip.show(this);
45572 }
45573
45574 function handleTouchMove(e) {
45575 if (!isTouched) return;
45576 var x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
45577 var y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
45578 var distance = Math.pow(Math.pow(x - touchesStart.x, 2) + Math.pow(y - touchesStart.y, 2), 0.5);
45579
45580 if (distance > 50) {
45581 isTouched = false;
45582 tooltip.hide();
45583 }
45584 }
45585
45586 function handleTouchEnd() {
45587 if (!isTouched) return;
45588 isTouched = false;
45589 tooltip.hide();
45590 }
45591
45592 function handleMouseEnter() {
45593 tooltip.show(this);
45594 }
45595
45596 function handleMouseLeave() {
45597 tooltip.hide();
45598 }
45599
45600 function handleTransitionEnd() {
45601 if (!$el.hasClass('tooltip-in')) {
45602 $el.removeClass('tooltip-out').remove();
45603 }
45604 }
45605
45606 tooltip.attachEvents = function attachEvents() {
45607 $el.on('transitionend', handleTransitionEnd);
45608
45609 if (tooltip.params.trigger === 'click') {
45610 if (tooltip.params.delegated) {
45611 $(document).on('click', tooltip.params.targetEl, handleClick);
45612 } else {
45613 tooltip.$targetEl.on('click', handleClick);
45614 }
45615
45616 $('html').on('click', handleClickOut);
45617 return;
45618 }
45619
45620 if (tooltip.params.trigger === 'manual') return;
45621
45622 if (support.touch) {
45623 var passive = support.passiveListener ? {
45624 passive: true
45625 } : false;
45626
45627 if (tooltip.params.delegated) {
45628 $(document).on(app.touchEvents.start, tooltip.params.targetEl, handleTouchStart, passive);
45629 } else {
45630 tooltip.$targetEl.on(app.touchEvents.start, handleTouchStart, passive);
45631 }
45632
45633 app.on('touchmove', handleTouchMove);
45634 app.on('touchend:passive', handleTouchEnd);
45635 } else {
45636 // eslint-disable-next-line
45637 if (tooltip.params.delegated) {
45638 $(document).on(support.pointerEvents ? 'pointerenter' : 'mouseenter', tooltip.params.targetEl, handleMouseEnter, true);
45639 $(document).on(support.pointerEvents ? 'pointerleave' : 'mouseleave', tooltip.params.targetEl, handleMouseLeave, true);
45640 } else {
45641 tooltip.$targetEl.on(support.pointerEvents ? 'pointerenter' : 'mouseenter', handleMouseEnter);
45642 tooltip.$targetEl.on(support.pointerEvents ? 'pointerleave' : 'mouseleave', handleMouseLeave);
45643 }
45644 }
45645 };
45646
45647 tooltip.detachEvents = function detachEvents() {
45648 $el.off('transitionend', handleTransitionEnd);
45649
45650 if (tooltip.params.trigger === 'click') {
45651 if (tooltip.params.delegated) {
45652 $(document).on('click', tooltip.params.targetEl, handleClick);
45653 } else {
45654 tooltip.$targetEl.off('click', handleClick);
45655 }
45656
45657 $('html').off('click', handleClickOut);
45658 return;
45659 }
45660
45661 if (tooltip.params.trigger === 'manual') return;
45662
45663 if (support.touch) {
45664 var passive = support.passiveListener ? {
45665 passive: true
45666 } : false;
45667
45668 if (tooltip.params.delegated) {
45669 $(document).off(app.touchEvents.start, tooltip.params.targetEl, handleTouchStart, passive);
45670 } else {
45671 tooltip.$targetEl.off(app.touchEvents.start, handleTouchStart, passive);
45672 }
45673
45674 app.off('touchmove', handleTouchMove);
45675 app.off('touchend:passive', handleTouchEnd);
45676 } else {
45677 // eslint-disable-next-line
45678 if (tooltip.params.delegated) {
45679 $(document).off(support.pointerEvents ? 'pointerenter' : 'mouseenter', tooltip.params.targetEl, handleMouseEnter, true);
45680 $(document).off(support.pointerEvents ? 'pointerleave' : 'mouseleave', tooltip.params.targetEl, handleMouseLeave, true);
45681 } else {
45682 tooltip.$targetEl.off(support.pointerEvents ? 'pointerenter' : 'mouseenter', handleMouseEnter);
45683 tooltip.$targetEl.off(support.pointerEvents ? 'pointerleave' : 'mouseleave', handleMouseLeave);
45684 }
45685 }
45686 }; // Install Modules
45687
45688
45689 tooltip.useModules();
45690 tooltip.init();
45691 return tooltip || _assertThisInitialized(_this);
45692 }
45693
45694 var _proto = Tooltip.prototype;
45695
45696 _proto.setTargetEl = function setTargetEl(targetEl) {
45697 var tooltip = this;
45698 tooltip.detachEvents();
45699 tooltip.$targetEl = $(targetEl);
45700 tooltip.targetEl = tooltip.$targetEl[0];
45701 tooltip.attachEvents();
45702 return tooltip;
45703 };
45704
45705 _proto.position = function position(targetEl) {
45706 var tooltip = this;
45707 var $el = tooltip.$el,
45708 app = tooltip.app,
45709 $containerEl = tooltip.$containerEl;
45710 var hasContainerEl = !!tooltip.params.containerEl;
45711 var tooltipOffset = tooltip.params.offset || 0;
45712 $el.css({
45713 left: '',
45714 top: ''
45715 });
45716 var $targetEl = $(targetEl || tooltip.targetEl);
45717 var _ref = [$el.width(), $el.height()],
45718 width = _ref[0],
45719 height = _ref[1];
45720 $el.css({
45721 left: '',
45722 top: ''
45723 });
45724 var targetWidth;
45725 var targetHeight;
45726 var targetOffsetLeft;
45727 var targetOffsetTop;
45728 var boundaries = hasContainerEl && $containerEl.length ? $containerEl[0].getBoundingClientRect() : app;
45729
45730 if ($targetEl && $targetEl.length > 0) {
45731 targetWidth = $targetEl.outerWidth();
45732 targetHeight = $targetEl.outerHeight();
45733
45734 if (typeof targetWidth === 'undefined' && typeof targetHeight === 'undefined') {
45735 var clientRect = $targetEl[0].getBoundingClientRect();
45736 targetWidth = clientRect.width;
45737 targetHeight = clientRect.height;
45738 }
45739
45740 var targetOffset = $targetEl.offset();
45741 targetOffsetLeft = targetOffset.left - boundaries.left;
45742 targetOffsetTop = targetOffset.top - boundaries.top;
45743 var targetParentPage = $targetEl.parents('.page');
45744
45745 if (targetParentPage.length > 0) {
45746 targetOffsetTop -= targetParentPage[0].scrollTop;
45747 }
45748 }
45749
45750 var _ref2 = [0, 0, 0],
45751 left = _ref2[0],
45752 top = _ref2[1]; // Top Position
45753
45754 var position = 'top';
45755
45756 if (height + tooltipOffset < targetOffsetTop) {
45757 // On top
45758 top = targetOffsetTop - height - tooltipOffset;
45759 } else if (height < boundaries.height - targetOffsetTop - targetHeight) {
45760 // On bottom
45761 position = 'bottom';
45762 top = targetOffsetTop + targetHeight + tooltipOffset;
45763 } else {
45764 // On middle
45765 position = 'middle';
45766 top = targetHeight / 2 + targetOffsetTop - height / 2;
45767
45768 if (top <= 0) {
45769 top = 8;
45770 } else if (top + height >= boundaries.height) {
45771 top = boundaries.height - height - 8;
45772 }
45773 } // Horizontal Position
45774
45775
45776 if (position === 'top' || position === 'bottom') {
45777 left = targetWidth / 2 + targetOffsetLeft - width / 2;
45778 if (left < 8) left = 8;
45779 if (left + width > boundaries.width) left = boundaries.width - width - 8;
45780 if (left < 0) left = 0;
45781 } else if (position === 'middle') {
45782 left = targetOffsetLeft - width;
45783
45784 if (left < 8 || left + width > boundaries.width) {
45785 if (left < 8) left = targetOffsetLeft + targetWidth;
45786 if (left + width > boundaries.width) left = boundaries.width - width - 8;
45787 }
45788 } // Apply Styles
45789
45790
45791 $el.css({
45792 top: top + "px",
45793 left: left + "px"
45794 });
45795 };
45796
45797 _proto.show = function show(aroundEl) {
45798 var tooltip = this;
45799 var $el = tooltip.$el,
45800 $targetEl = tooltip.$targetEl,
45801 $containerEl = tooltip.$containerEl;
45802
45803 if ($containerEl[0] && $el[0] && !$containerEl[0].contains($el[0])) {
45804 $containerEl.append($el);
45805 }
45806
45807 tooltip.position(aroundEl);
45808 var $aroundEl = $(aroundEl);
45809 tooltip.visible = true;
45810 tooltip.opened = true;
45811 $targetEl.trigger('tooltip:show');
45812 $el.trigger('tooltip:show');
45813
45814 if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {
45815 $aroundEl.trigger('tooltip:show');
45816 }
45817
45818 tooltip.emit('local::show tooltipShow', tooltip);
45819 $el.removeClass('tooltip-out').addClass('tooltip-in');
45820 return tooltip;
45821 };
45822
45823 _proto.hide = function hide() {
45824 var tooltip = this;
45825 var $el = tooltip.$el,
45826 $targetEl = tooltip.$targetEl;
45827 tooltip.visible = false;
45828 tooltip.opened = false;
45829 $targetEl.trigger('tooltip:hide');
45830 $el.trigger('tooltip:hide');
45831 tooltip.emit('local::hide tooltipHide', tooltip);
45832 $el.addClass('tooltip-out').removeClass('tooltip-in');
45833 return tooltip;
45834 };
45835
45836 _proto.render = function render() {
45837 var tooltip = this;
45838 if (tooltip.params.render) return tooltip.params.render.call(tooltip, tooltip);
45839 var _tooltip$params2 = tooltip.params,
45840 cssClass = _tooltip$params2.cssClass,
45841 text = _tooltip$params2.text;
45842 return ("\n <div class=\"tooltip " + (cssClass || '') + "\">\n <div class=\"tooltip-content\">" + (text || '') + "</div>\n </div>\n ").trim();
45843 };
45844
45845 _proto.setText = function setText(newText) {
45846 var tooltip = this;
45847
45848 if (typeof newText === 'undefined') {
45849 return tooltip;
45850 }
45851
45852 tooltip.params.text = newText;
45853 tooltip.text = newText;
45854
45855 if (tooltip.$el) {
45856 tooltip.$el.children('.tooltip-content').html(newText);
45857 }
45858
45859 if (tooltip.opened) {
45860 tooltip.position();
45861 }
45862
45863 return tooltip;
45864 };
45865
45866 _proto.init = function init() {
45867 var tooltip = this;
45868 tooltip.attachEvents();
45869 };
45870
45871 _proto.destroy = function destroy() {
45872 var tooltip = this;
45873 if (!tooltip.$targetEl || tooltip.destroyed) return;
45874 tooltip.$targetEl.trigger('tooltip:beforedestroy');
45875 tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);
45876 tooltip.$el.remove();
45877 if (tooltip.$targetEl[0]) delete tooltip.$targetEl[0].f7Tooltip;
45878 tooltip.detachEvents();
45879 deleteProps$1(tooltip);
45880 tooltip.destroyed = true;
45881 };
45882
45883 return Tooltip;
45884 }(Framework7Class);
45885
45886 var Tooltip = {
45887 name: 'tooltip',
45888 static: {
45889 Tooltip: Tooltip$1
45890 },
45891 create: function create() {
45892 var app = this;
45893 app.tooltip = ConstructorMethods({
45894 defaultSelector: '.tooltip',
45895 constructor: Tooltip$1,
45896 app: app,
45897 domProp: 'f7Tooltip'
45898 });
45899
45900 app.tooltip.show = function show(el) {
45901 var $el = $(el);
45902 if ($el.length === 0) return undefined;
45903 var tooltip = $el[0].f7Tooltip;
45904 if (!tooltip) return undefined;
45905 tooltip.show($el[0]);
45906 return tooltip;
45907 };
45908
45909 app.tooltip.hide = function hide(el) {
45910 var $el = $(el);
45911 if ($el.length === 0) return undefined;
45912 var tooltip = $el[0].f7Tooltip;
45913 if (!tooltip) return undefined;
45914 tooltip.hide();
45915 return tooltip;
45916 };
45917
45918 app.tooltip.setText = function text(el, newText) {
45919 var $el = $(el);
45920 if ($el.length === 0) return undefined;
45921 var tooltip = $el[0].f7Tooltip;
45922 if (!tooltip) return undefined;
45923 tooltip.setText(newText);
45924 return tooltip;
45925 };
45926 },
45927 params: {
45928 tooltip: {
45929 targetEl: null,
45930 delegated: false,
45931 text: null,
45932 cssClass: null,
45933 render: null,
45934 offset: 0,
45935 trigger: 'hover',
45936 containerEl: undefined
45937 }
45938 },
45939 on: {
45940 tabMounted: function tabMounted(tabEl) {
45941 var app = this;
45942 $(tabEl).find('.tooltip-init').each(function (el) {
45943 var text = $(el).attr('data-tooltip');
45944 if (!text) return;
45945 app.tooltip.create({
45946 targetEl: el,
45947 text: text
45948 });
45949 });
45950 },
45951 tabBeforeRemove: function tabBeforeRemove(tabEl) {
45952 $(tabEl).find('.tooltip-init').each(function (el) {
45953 if (el.f7Tooltip) el.f7Tooltip.destroy();
45954 });
45955 },
45956 pageInit: function pageInit(page) {
45957 var app = this;
45958 page.$el.find('.tooltip-init').each(function (el) {
45959 var text = $(el).attr('data-tooltip');
45960 if (!text) return;
45961 app.tooltip.create({
45962 targetEl: el,
45963 text: text
45964 });
45965 });
45966
45967 if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
45968 page.$navbarEl.find('.tooltip-init').each(function (el) {
45969 var text = $(el).attr('data-tooltip');
45970 if (!text) return;
45971 app.tooltip.create({
45972 targetEl: el,
45973 text: text
45974 });
45975 });
45976 }
45977 },
45978 pageBeforeRemove: function pageBeforeRemove(page) {
45979 var app = this;
45980 page.$el.find('.tooltip-init').each(function (el) {
45981 if (el.f7Tooltip) el.f7Tooltip.destroy();
45982 });
45983
45984 if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
45985 page.$navbarEl.find('.tooltip-init').each(function (el) {
45986 if (el.f7Tooltip) el.f7Tooltip.destroy();
45987 });
45988 }
45989 }
45990 },
45991 vnode: {
45992 'tooltip-init': {
45993 insert: function insert(vnode) {
45994 var app = this;
45995 var el = vnode.elm;
45996 var text = $(el).attr('data-tooltip');
45997 if (!text) return;
45998 app.tooltip.create({
45999 targetEl: el,
46000 text: text
46001 });
46002 },
46003 update: function update(vnode) {
46004 var el = vnode.elm;
46005 if (!el.f7Tooltip) return;
46006
46007 if (vnode && vnode.data && vnode.data.attrs && vnode.data.attrs['data-tooltip']) {
46008 el.f7Tooltip.setText(vnode.data.attrs['data-tooltip']);
46009 }
46010 },
46011 destroy: function destroy(vnode) {
46012 var el = vnode.elm;
46013 if (el.f7Tooltip) el.f7Tooltip.destroy();
46014 }
46015 }
46016 }
46017 };
46018
46019 var Gauge$1 = /*#__PURE__*/function (_Framework7Class) {
46020 _inheritsLoose(Gauge, _Framework7Class);
46021
46022 function Gauge(app, params) {
46023 var _this;
46024
46025 if (params === void 0) {
46026 params = {};
46027 }
46028
46029 _this = _Framework7Class.call(this, params, [app]) || this;
46030
46031 var self = _assertThisInitialized(_this);
46032
46033 var defaults = extend$1({}, app.params.gauge); // Extend defaults with modules params
46034
46035 self.useModulesParams(defaults);
46036 self.params = extend$1(defaults, params);
46037 var el = self.params.el;
46038 if (!el) return self || _assertThisInitialized(_this);
46039 var $el = $(el);
46040 if ($el.length === 0) return self || _assertThisInitialized(_this);
46041 if ($el[0].f7Gauge) return $el[0].f7Gauge || _assertThisInitialized(_this);
46042 extend$1(self, {
46043 app: app,
46044 $el: $el,
46045 el: $el && $el[0]
46046 });
46047 $el[0].f7Gauge = self; // Install Modules
46048
46049 self.useModules();
46050 self.init();
46051 return self || _assertThisInitialized(_this);
46052 }
46053
46054 var _proto = Gauge.prototype;
46055
46056 _proto.calcRadius = function calcRadius() {
46057 var self = this;
46058 var _self$params = self.params,
46059 size = _self$params.size,
46060 borderWidth = _self$params.borderWidth;
46061 return size / 2 - borderWidth / 2;
46062 };
46063
46064 _proto.calcBorderLength = function calcBorderLength() {
46065 var self = this;
46066 var radius = self.calcRadius();
46067 return 2 * Math.PI * radius;
46068 };
46069
46070 _proto.render = function render() {
46071 var self = this;
46072 if (self.params.render) return self.params.render.call(self, self);
46073 var _self$params2 = self.params,
46074 type = _self$params2.type,
46075 value = _self$params2.value,
46076 size = _self$params2.size,
46077 bgColor = _self$params2.bgColor,
46078 borderBgColor = _self$params2.borderBgColor,
46079 borderColor = _self$params2.borderColor,
46080 borderWidth = _self$params2.borderWidth,
46081 valueText = _self$params2.valueText,
46082 valueTextColor = _self$params2.valueTextColor,
46083 valueFontSize = _self$params2.valueFontSize,
46084 valueFontWeight = _self$params2.valueFontWeight,
46085 labelText = _self$params2.labelText,
46086 labelTextColor = _self$params2.labelTextColor,
46087 labelFontSize = _self$params2.labelFontSize,
46088 labelFontWeight = _self$params2.labelFontWeight;
46089 var semiCircle = type === 'semicircle';
46090 var radius = self.calcRadius();
46091 var length = self.calcBorderLength();
46092 var progress = Math.max(Math.min(value, 1), 0);
46093 return $jsx("svg", {
46094 class: "gauge-svg",
46095 width: size + "px",
46096 height: (semiCircle ? size / 2 : size) + "px",
46097 viewBox: "0 0 " + size + " " + (semiCircle ? size / 2 : size)
46098 }, semiCircle && $jsx("path", {
46099 class: "gauge-back-semi",
46100 d: "M" + (size - borderWidth / 2) + "," + size / 2 + " a1,1 0 0,0 -" + (size - borderWidth) + ",0",
46101 stroke: borderBgColor,
46102 "stroke-width": borderWidth,
46103 fill: bgColor || 'none'
46104 }), semiCircle && $jsx("path", {
46105 class: "gauge-front-semi",
46106 d: "M" + (size - borderWidth / 2) + "," + size / 2 + " a1,1 0 0,0 -" + (size - borderWidth) + ",0",
46107 stroke: borderColor,
46108 "stroke-width": borderWidth,
46109 "stroke-dasharray": length / 2,
46110 "stroke-dashoffset": length / 2 * (1 + progress),
46111 fill: borderBgColor ? 'none' : bgColor || 'none'
46112 }), !semiCircle && borderBgColor && $jsx("circle", {
46113 class: "gauge-back-circle",
46114 stroke: borderBgColor,
46115 "stroke-width": borderWidth,
46116 fill: bgColor || 'none',
46117 cx: size / 2,
46118 cy: size / 2,
46119 r: radius
46120 }), !semiCircle && $jsx("circle", {
46121 class: "gauge-front-circle",
46122 transform: "rotate(-90 " + size / 2 + " " + size / 2 + ")",
46123 stroke: borderColor,
46124 "stroke-width": borderWidth,
46125 "stroke-dasharray": length,
46126 "stroke-dashoffset": length * (1 - progress),
46127 fill: borderBgColor ? 'none' : bgColor || 'none',
46128 cx: size / 2,
46129 cy: size / 2,
46130 r: radius
46131 }), valueText && $jsx("text", {
46132 class: "gauge-value-text",
46133 x: "50%",
46134 y: semiCircle ? '100%' : '50%',
46135 "font-weight": valueFontWeight,
46136 "font-size": valueFontSize,
46137 fill: valueTextColor,
46138 dy: semiCircle ? labelText ? -labelFontSize - 15 : -5 : 0,
46139 "text-anchor": "middle",
46140 "dominant-baseline": !semiCircle && 'middle'
46141 }, valueText), labelText && $jsx("text", {
46142 class: "gauge-label-text",
46143 x: "50%",
46144 y: semiCircle ? '100%' : '50%',
46145 "font-weight": labelFontWeight,
46146 "font-size": labelFontSize,
46147 fill: labelTextColor,
46148 dy: semiCircle ? -5 : valueText ? valueFontSize / 2 + 10 : 0,
46149 "text-anchor": "middle",
46150 "dominant-baseline": !semiCircle && 'middle'
46151 }, labelText));
46152 };
46153
46154 _proto.update = function update(newParams) {
46155 if (newParams === void 0) {
46156 newParams = {};
46157 }
46158
46159 var self = this;
46160 var document = getDocument();
46161 var params = self.params,
46162 $svgEl = self.$svgEl;
46163 Object.keys(newParams).forEach(function (param) {
46164 if (typeof newParams[param] !== 'undefined') {
46165 params[param] = newParams[param];
46166 }
46167 });
46168 if ($svgEl.length === 0) return self;
46169 var value = params.value,
46170 size = params.size,
46171 bgColor = params.bgColor,
46172 borderBgColor = params.borderBgColor,
46173 borderColor = params.borderColor,
46174 borderWidth = params.borderWidth,
46175 valueText = params.valueText,
46176 valueTextColor = params.valueTextColor,
46177 valueFontSize = params.valueFontSize,
46178 valueFontWeight = params.valueFontWeight,
46179 labelText = params.labelText,
46180 labelTextColor = params.labelTextColor,
46181 labelFontSize = params.labelFontSize,
46182 labelFontWeight = params.labelFontWeight;
46183 var length = self.calcBorderLength();
46184 var progress = Math.max(Math.min(value, 1), 0);
46185 var radius = self.calcRadius();
46186 var semiCircle = params.type === 'semicircle';
46187 var svgAttrs = {
46188 width: size + "px",
46189 height: (semiCircle ? size / 2 : size) + "px",
46190 viewBox: "0 0 " + size + " " + (semiCircle ? size / 2 : size)
46191 };
46192 Object.keys(svgAttrs).forEach(function (attr) {
46193 $svgEl.attr(attr, svgAttrs[attr]);
46194 });
46195
46196 if (semiCircle) {
46197 var backAttrs = {
46198 d: "M" + (size - borderWidth / 2) + "," + size / 2 + " a1,1 0 0,0 -" + (size - borderWidth) + ",0",
46199 stroke: borderBgColor,
46200 'stroke-width': borderWidth,
46201 fill: bgColor || 'none'
46202 };
46203 var frontAttrs = {
46204 d: "M" + (size - borderWidth / 2) + "," + size / 2 + " a1,1 0 0,0 -" + (size - borderWidth) + ",0",
46205 stroke: borderColor,
46206 'stroke-width': borderWidth,
46207 'stroke-dasharray': length / 2,
46208 'stroke-dashoffset': length / 2 * (1 + progress),
46209 fill: borderBgColor ? 'none' : bgColor || 'none'
46210 };
46211 Object.keys(backAttrs).forEach(function (attr) {
46212 $svgEl.find('.gauge-back-semi').attr(attr, backAttrs[attr]);
46213 });
46214 Object.keys(frontAttrs).forEach(function (attr) {
46215 $svgEl.find('.gauge-front-semi').attr(attr, frontAttrs[attr]);
46216 });
46217 } else {
46218 var _backAttrs = {
46219 stroke: borderBgColor,
46220 'stroke-width': borderWidth,
46221 fill: bgColor || 'none',
46222 cx: size / 2,
46223 cy: size / 2,
46224 r: radius
46225 };
46226 var _frontAttrs = {
46227 transform: "rotate(-90 " + size / 2 + " " + size / 2 + ")",
46228 stroke: borderColor,
46229 'stroke-width': borderWidth,
46230 'stroke-dasharray': length,
46231 'stroke-dashoffset': length * (1 - progress),
46232 fill: borderBgColor ? 'none' : bgColor || 'none',
46233 cx: size / 2,
46234 cy: size / 2,
46235 r: radius
46236 };
46237 Object.keys(_backAttrs).forEach(function (attr) {
46238 $svgEl.find('.gauge-back-circle').attr(attr, _backAttrs[attr]);
46239 });
46240 Object.keys(_frontAttrs).forEach(function (attr) {
46241 $svgEl.find('.gauge-front-circle').attr(attr, _frontAttrs[attr]);
46242 });
46243 }
46244
46245 if (valueText) {
46246 if (!$svgEl.find('.gauge-value-text').length) {
46247 var textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text');
46248 textEl.classList.add('gauge-value-text');
46249 $svgEl.append(textEl);
46250 }
46251
46252 var textAttrs = {
46253 x: '50%',
46254 y: semiCircle ? '100%' : '50%',
46255 'font-weight': valueFontWeight,
46256 'font-size': valueFontSize,
46257 fill: valueTextColor,
46258 dy: semiCircle ? labelText ? -labelFontSize - 15 : -5 : 0,
46259 'text-anchor': 'middle',
46260 'dominant-baseline': !semiCircle && 'middle'
46261 };
46262 Object.keys(textAttrs).forEach(function (attr) {
46263 $svgEl.find('.gauge-value-text').attr(attr, textAttrs[attr]);
46264 });
46265 $svgEl.find('.gauge-value-text').text(valueText);
46266 } else {
46267 $svgEl.find('.gauge-value-text').remove();
46268 }
46269
46270 if (labelText) {
46271 if (!$svgEl.find('.gauge-label-text').length) {
46272 var _textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text');
46273
46274 _textEl.classList.add('gauge-label-text');
46275
46276 $svgEl.append(_textEl);
46277 }
46278
46279 var labelAttrs = {
46280 x: '50%',
46281 y: semiCircle ? '100%' : '50%',
46282 'font-weight': labelFontWeight,
46283 'font-size': labelFontSize,
46284 fill: labelTextColor,
46285 dy: semiCircle ? -5 : valueText ? valueFontSize / 2 + 10 : 0,
46286 'text-anchor': 'middle',
46287 'dominant-baseline': !semiCircle && 'middle'
46288 };
46289 Object.keys(labelAttrs).forEach(function (attr) {
46290 $svgEl.find('.gauge-label-text').attr(attr, labelAttrs[attr]);
46291 });
46292 $svgEl.find('.gauge-label-text').text(labelText);
46293 } else {
46294 $svgEl.find('.gauge-label-text').remove();
46295 }
46296
46297 return self;
46298 };
46299
46300 _proto.init = function init() {
46301 var self = this;
46302 var $svgEl = $(self.render()).eq(0);
46303 $svgEl.f7Gauge = self;
46304 extend$1(self, {
46305 $svgEl: $svgEl,
46306 svgEl: $svgEl && $svgEl[0]
46307 });
46308 self.$el.append($svgEl);
46309 return self;
46310 };
46311
46312 _proto.destroy = function destroy() {
46313 var self = this;
46314 if (!self.$el || self.destroyed) return;
46315 self.$el.trigger('gauge:beforedestroy');
46316 self.emit('local::beforeDestroy gaugeBeforeDestroy', self);
46317 self.$svgEl.remove();
46318 delete self.$el[0].f7Gauge;
46319 deleteProps$1(self);
46320 self.destroyed = true;
46321 };
46322
46323 return Gauge;
46324 }(Framework7Class);
46325
46326 var Gauge = {
46327 name: 'gauge',
46328 static: {
46329 Gauge: Gauge$1
46330 },
46331 create: function create() {
46332 var app = this;
46333 app.gauge = ConstructorMethods({
46334 defaultSelector: '.gauge',
46335 constructor: Gauge$1,
46336 app: app,
46337 domProp: 'f7Gauge'
46338 });
46339
46340 app.gauge.update = function update(el, newParams) {
46341 var $el = $(el);
46342 if ($el.length === 0) return undefined;
46343 var gauge = app.gauge.get(el);
46344 if (!gauge) return undefined;
46345 gauge.update(newParams);
46346 return gauge;
46347 };
46348 },
46349 params: {
46350 gauge: {
46351 el: null,
46352 type: 'circle',
46353 value: 0,
46354 size: 200,
46355 bgColor: 'transparent',
46356 borderBgColor: '#eeeeee',
46357 borderColor: '#000000',
46358 borderWidth: 10,
46359 valueText: null,
46360 valueTextColor: '#000000',
46361 valueFontSize: 31,
46362 valueFontWeight: 500,
46363 labelText: null,
46364 labelTextColor: '#888888',
46365 labelFontSize: 14,
46366 labelFontWeight: 400
46367 }
46368 },
46369 on: {
46370 tabMounted: function tabMounted(tabEl) {
46371 var app = this;
46372 $(tabEl).find('.gauge-init').each(function (el) {
46373 app.gauge.create(extend$1({
46374 el: el
46375 }, $(el).dataset() || {}));
46376 });
46377 },
46378 tabBeforeRemove: function tabBeforeRemove(tabEl) {
46379 $(tabEl).find('.gauge-init').each(function (el) {
46380 if (el.f7Gauge) el.f7Gauge.destroy();
46381 });
46382 },
46383 pageInit: function pageInit(page) {
46384 var app = this;
46385 page.$el.find('.gauge-init').each(function (el) {
46386 app.gauge.create(extend$1({
46387 el: el
46388 }, $(el).dataset() || {}));
46389 });
46390 },
46391 pageBeforeRemove: function pageBeforeRemove(page) {
46392 page.$el.find('.gauge-init').each(function (el) {
46393 if (el.f7Gauge) el.f7Gauge.destroy();
46394 });
46395 }
46396 },
46397 vnode: {
46398 'gauge-init': {
46399 insert: function insert(vnode) {
46400 var app = this;
46401 var el = vnode.elm;
46402 app.gauge.create(extend$1({
46403 el: el
46404 }, $(el).dataset() || {}));
46405 },
46406 destroy: function destroy(vnode) {
46407 var el = vnode.elm;
46408 if (el.f7Gauge) el.f7Gauge.destroy();
46409 }
46410 }
46411 }
46412 };
46413
46414 var Skeleton = {
46415 name: 'skeleton'
46416 };
46417
46418 var Menu = {
46419 open: function open(el) {
46420 if (el === void 0) {
46421 el = '.menu-item-dropdown';
46422 }
46423
46424 var app = this;
46425 if (!el) return;
46426 var $el = $(el).closest('.menu-item-dropdown');
46427 if (!$el.length) return;
46428 var $menuEl = $el.closest('.menu').eq(0);
46429
46430 if ($menuEl.length) {
46431 var zIndex = $menuEl.css('z-index');
46432 var originalZIndex = $menuEl[0].style.zIndex;
46433 $menuEl.css('z-index', parseInt(zIndex || 0, 10) + 1);
46434 $menuEl[0].f7MenuZIndex = originalZIndex;
46435 }
46436
46437 $el.eq(0).addClass('menu-item-dropdown-opened').trigger('menu:opened');
46438 app.emit('menuOpened', $el.eq(0)[0]);
46439 },
46440 close: function close(el) {
46441 if (el === void 0) {
46442 el = '.menu-item-dropdown-opened';
46443 }
46444
46445 var app = this;
46446 if (!el) return;
46447 var $el = $(el).closest('.menu-item-dropdown-opened');
46448 if (!$el.length) return;
46449 var $menuEl = $el.closest('.menu').eq(0);
46450
46451 if ($menuEl.length) {
46452 var zIndex = $menuEl[0].f7MenuZIndex;
46453 $menuEl.css('z-index', zIndex);
46454 delete $menuEl[0].f7MenuZIndex;
46455 }
46456
46457 $el.eq(0).removeClass('menu-item-dropdown-opened').trigger('menu:closed');
46458 app.emit('menuClosed', $el.eq(0)[0]);
46459 }
46460 };
46461 var Menu$1 = {
46462 name: 'menu',
46463 create: function create() {
46464 var app = this;
46465 bindMethods(app, {
46466 menu: Menu
46467 });
46468 },
46469 on: {
46470 click: function click(e) {
46471 var app = this;
46472 var openedMenus = $('.menu-item-dropdown-opened');
46473 if (!openedMenus.length) return;
46474 openedMenus.each(function (el) {
46475 if (!$(e.target).closest('.menu-item-dropdown-opened').length) {
46476 app.menu.close(el);
46477 }
46478 });
46479 }
46480 },
46481 clicks: {
46482 '.menu-item-dropdown': function onClick($clickedEl, dataset, e) {
46483 var app = this;
46484
46485 if ($clickedEl.hasClass('menu-item-dropdown-opened')) {
46486 if ($(e.target).closest('.menu-dropdown').length) return;
46487 app.menu.close($clickedEl);
46488 } else {
46489 app.menu.open($clickedEl);
46490 }
46491 },
46492 '.menu-close': function onClick() {
46493 var app = this;
46494 app.menu.close();
46495 }
46496 }
46497 };
46498
46499 /** @jsx $jsx */
46500 var moduleAlphaSlider = {
46501 render: function render(self) {
46502 var _self$params = self.params,
46503 sliderLabel = _self$params.sliderLabel,
46504 sliderValue = _self$params.sliderValue,
46505 sliderValueEditable = _self$params.sliderValueEditable,
46506 alphaLabelText = _self$params.alphaLabelText;
46507 return $jsx("div", {
46508 class: "color-picker-module color-picker-module-alpha-slider"
46509 }, $jsx("div", {
46510 class: "color-picker-slider-wrap"
46511 }, sliderLabel && $jsx("div", {
46512 class: "color-picker-slider-label"
46513 }, alphaLabelText), $jsx("div", {
46514 class: "range-slider color-picker-slider color-picker-slider-alpha"
46515 }), sliderValue && $jsx("div", {
46516 class: "color-picker-slider-value"
46517 }, sliderValueEditable ? $jsx("input", {
46518 type: "number",
46519 step: "0.01",
46520 min: "0",
46521 max: "1",
46522 class: "color-picker-value-alpha"
46523 }) : $jsx("span", {
46524 class: "color-picker-value-alpha"
46525 }))));
46526 },
46527 init: function init(self) {
46528 self.alphaRangeSlider = self.app.range.create({
46529 el: self.$el.find('.color-picker-slider-alpha'),
46530 min: 0,
46531 max: 1,
46532 step: 0.01,
46533 value: 1,
46534 on: {
46535 change: function change(range, value) {
46536 var alpha = Math.floor(value * 100) / 100;
46537 self.setValue({
46538 alpha: alpha
46539 });
46540 }
46541 }
46542 });
46543
46544 function handleInputChange(e) {
46545 var alpha = self.value.alpha;
46546 var value = parseFloat(e.target.value);
46547
46548 if (Number.isNaN(value)) {
46549 e.target.value = alpha;
46550 return;
46551 }
46552
46553 value = Math.max(0, Math.min(1, value));
46554 self.setValue({
46555 alpha: value
46556 });
46557 }
46558
46559 self.$el.on('change', '.color-picker-module-alpha-slider input', handleInputChange);
46560
46561 self.destroyAlphaSliderEvents = function destroyAlphaSliderEvents() {
46562 self.$el.off('change', '.color-picker-module-alpha-slider input', handleInputChange);
46563 };
46564 },
46565 update: function update(self) {
46566 var value = self.value;
46567 var _self$params2 = self.params,
46568 sliderValue = _self$params2.sliderValue,
46569 sliderValueEditable = _self$params2.sliderValueEditable;
46570 var alpha = value.alpha;
46571 self.alphaRangeSlider.value = alpha;
46572 self.alphaRangeSlider.layout();
46573
46574 if (sliderValue && sliderValueEditable) {
46575 self.$el.find('input.color-picker-value-alpha').val(alpha);
46576 } else {
46577 self.$el.find('span.color-picker-value-alpha').text(alpha);
46578 }
46579 },
46580 destroy: function destroy(self) {
46581 if (self.alphaRangeSlider && self.alphaRangeSlider.destroy) {
46582 self.alphaRangeSlider.destroy();
46583 }
46584
46585 delete self.alphaRangeSlider;
46586 if (self.destroyAlphaSliderEvents) self.destroyAlphaSliderEvents();
46587 delete self.destroyAlphaSliderEvents;
46588 }
46589 };
46590
46591 /** @jsx $jsx */
46592 var moduleCurrentColor = {
46593 render: function render() {
46594 return $jsx("div", {
46595 class: "color-picker-module color-picker-module-current-color"
46596 }, $jsx("div", {
46597 class: "color-picker-current-color"
46598 }));
46599 },
46600 update: function update(self) {
46601 self.$el.find('.color-picker-module-current-color .color-picker-current-color').css('background-color', self.value.hex);
46602 }
46603 };
46604
46605 /** @jsx $jsx */
46606 var moduleHex = {
46607 render: function render(self) {
46608 var _self$params = self.params,
46609 hexLabel = _self$params.hexLabel,
46610 hexLabelText = _self$params.hexLabelText,
46611 hexValueEditable = _self$params.hexValueEditable;
46612 return $jsx("div", {
46613 class: "color-picker-module color-picker-module-hex"
46614 }, $jsx("div", {
46615 class: "color-picker-hex-wrap"
46616 }, hexLabel && $jsx("div", {
46617 class: "color-picker-hex-label"
46618 }, hexLabelText), $jsx("div", {
46619 class: "color-picker-hex-value"
46620 }, hexValueEditable ? $jsx("input", {
46621 type: "text",
46622 class: "color-picker-value-hex"
46623 }) : $jsx("span", {
46624 class: "color-picker-value-hex"
46625 }))));
46626 },
46627 init: function init(self) {
46628 function handleInputChange(e) {
46629 var hex = self.value.hex;
46630 var value = e.target.value.replace(/#/g, '');
46631
46632 if (Number.isNaN(value) || !value || value.length !== 3 && value.length !== 6) {
46633 e.target.value = hex;
46634 return;
46635 }
46636
46637 var min = 0;
46638 var current = parseInt(value, 16);
46639 var max = parseInt('ffffff', 16); // eslint-disable-line
46640
46641 if (current > max) {
46642 value = 'fff';
46643 }
46644
46645 if (current < min) {
46646 value = '000';
46647 }
46648
46649 self.setValue({
46650 hex: value
46651 });
46652 }
46653
46654 self.$el.on('change', '.color-picker-module-hex input', handleInputChange);
46655
46656 self.destroyHexEvents = function destroyHexEvents() {
46657 self.$el.off('change', '.color-picker-module-hex input', handleInputChange);
46658 };
46659 },
46660 update: function update(self) {
46661 var value = self.value;
46662 var hexValueEditable = self.params.hexValueEditable;
46663 var hex = value.hex;
46664
46665 if (hexValueEditable) {
46666 self.$el.find('input.color-picker-value-hex').val(hex);
46667 } else {
46668 self.$el.find('span.color-picker-value-hex').text(hex);
46669 }
46670 },
46671 destroy: function destroy(self) {
46672 if (self.destroyHexEvents) self.destroyHexEvents();
46673 delete self.destroyHexEvents;
46674 }
46675 };
46676
46677 var moduleHsbSliders = {
46678 render: function render(self) {
46679 var _self$params = self.params,
46680 sliderLabel = _self$params.sliderLabel,
46681 sliderValue = _self$params.sliderValue,
46682 sliderValueEditable = _self$params.sliderValueEditable,
46683 hueLabelText = _self$params.hueLabelText,
46684 saturationLabelText = _self$params.saturationLabelText,
46685 brightnessLabelText = _self$params.brightnessLabelText;
46686 return $jsx("div", {
46687 class: "color-picker-module color-picker-module-hsb-sliders"
46688 }, $jsx("div", {
46689 class: "color-picker-slider-wrap"
46690 }, sliderLabel && $jsx("div", {
46691 class: "color-picker-slider-label"
46692 }, hueLabelText), $jsx("div", {
46693 class: "range-slider color-picker-slider color-picker-slider-hue"
46694 }), sliderValue && $jsx("div", {
46695 class: "color-picker-slider-value"
46696 }, sliderValueEditable ? $jsx("input", {
46697 type: "number",
46698 step: "0.1",
46699 min: "0",
46700 max: "360",
46701 class: "color-picker-value-hue",
46702 "data-color-index": "0"
46703 }) : $jsx("span", {
46704 class: "color-picker-value-hue"
46705 }))), $jsx("div", {
46706 class: "color-picker-slider-wrap"
46707 }, sliderLabel && $jsx("div", {
46708 class: "color-picker-slider-label"
46709 }, saturationLabelText), $jsx("div", {
46710 class: "range-slider color-picker-slider color-picker-slider-saturation"
46711 }), sliderValue && $jsx("div", {
46712 class: "color-picker-slider-value"
46713 }, sliderValueEditable ? $jsx("input", {
46714 type: "number",
46715 step: "0.1",
46716 min: "0",
46717 max: "100",
46718 class: "color-picker-value-saturation",
46719 "data-color-index": "1"
46720 }) : $jsx("span", {
46721 class: "color-picker-value-saturation"
46722 }))), $jsx("div", {
46723 class: "color-picker-slider-wrap"
46724 }, sliderLabel && $jsx("div", {
46725 class: "color-picker-slider-label"
46726 }, brightnessLabelText), $jsx("div", {
46727 class: "range-slider color-picker-slider color-picker-slider-brightness"
46728 }), sliderValue && $jsx("div", {
46729 class: "color-picker-slider-value"
46730 }, sliderValueEditable ? $jsx("input", {
46731 type: "number",
46732 step: "0.1",
46733 min: "0",
46734 max: "100",
46735 class: "color-picker-value-brightness",
46736 "data-color-index": "2"
46737 }) : $jsx("span", {
46738 class: "color-picker-value-brightness"
46739 }))));
46740 },
46741 init: function init(self) {
46742 self.hueRangeSlider = self.app.range.create({
46743 el: self.$el.find('.color-picker-slider-hue'),
46744 min: 0,
46745 max: 360,
46746 step: 0.1,
46747 value: 0,
46748 on: {
46749 change: function change(range, value) {
46750 self.setValue({
46751 hue: value
46752 });
46753 }
46754 }
46755 });
46756 self.saturationRangeSlider = self.app.range.create({
46757 el: self.$el.find('.color-picker-slider-saturation'),
46758 min: 0,
46759 max: 1,
46760 step: 0.001,
46761 value: 0,
46762 on: {
46763 change: function change(range, value) {
46764 var s = Math.floor(value * 1000) / 1000;
46765 self.setValue({
46766 hsb: [self.value.hsb[0], s, self.value.hsb[2]]
46767 });
46768 }
46769 }
46770 });
46771 self.brightnessRangeSlider = self.app.range.create({
46772 el: self.$el.find('.color-picker-slider-brightness'),
46773 min: 0,
46774 max: 1,
46775 step: 0.001,
46776 value: 0,
46777 on: {
46778 change: function change(range, value) {
46779 var b = Math.floor(value * 1000) / 1000;
46780 self.setValue({
46781 hsb: [self.value.hsb[0], self.value.hsb[1], b]
46782 });
46783 }
46784 }
46785 });
46786
46787 function handleInputChange(e) {
46788 var hsb = [].concat(self.value.hsb);
46789 var index = parseInt($(e.target).attr('data-color-index'), 10);
46790 var value = parseFloat(e.target.value);
46791
46792 if (Number.isNaN(value)) {
46793 e.target.value = hsb[index];
46794 return;
46795 }
46796
46797 if (index === 0) {
46798 value = Math.max(0, Math.min(360, value));
46799 } else {
46800 value = Math.max(0, Math.min(100, value)) / 100;
46801 }
46802
46803 hsb[index] = value;
46804 self.setValue({
46805 hsb: hsb
46806 });
46807 }
46808
46809 self.$el.on('change', '.color-picker-module-hsb-sliders input', handleInputChange);
46810
46811 self.destroyHsbSlidersEvents = function destroyHsbSlidersEvents() {
46812 self.$el.off('change', '.color-picker-module-hsb-sliders input', handleInputChange);
46813 };
46814 },
46815 update: function update(self) {
46816 var app = self.app,
46817 value = self.value;
46818 var _self$params2 = self.params,
46819 sliderValue = _self$params2.sliderValue,
46820 sliderValueEditable = _self$params2.sliderValueEditable;
46821 var hsb = value.hsb,
46822 hue = value.hue;
46823 self.hueRangeSlider.value = hue;
46824 self.saturationRangeSlider.value = hsb[1];
46825 self.brightnessRangeSlider.value = hsb[2];
46826 self.hueRangeSlider.layout();
46827 self.saturationRangeSlider.layout();
46828 self.brightnessRangeSlider.layout();
46829 var hslCurrent = colorHsbToHsl(hsb[0], hsb[1], 1);
46830 var hslLeft = colorHsbToHsl(hsb[0], 0, 1);
46831 var hslRight = colorHsbToHsl(hsb[0], 1, 1);
46832 var brightness = hsb[2];
46833 self.hueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "hsl(" + hue + ", 100%, 50%)");
46834 self.saturationRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "hsl(" + hslCurrent[0] + ", " + hslCurrent[1] * 100 + "%, " + hslCurrent[2] * 100 + "%)");
46835 self.brightnessRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "rgb(" + brightness * 255 + ", " + brightness * 255 + ", " + brightness * 255 + ")");
46836 self.saturationRangeSlider.$el.find('.range-bar').css('background-image', "linear-gradient(" + (app.rtl ? 'to left' : 'to right') + ", hsl(" + hslLeft[0] + ", " + hslLeft[1] * 100 + "%, " + hslLeft[2] * 100 + "%), hsl(" + hslRight[0] + ", " + hslRight[1] * 100 + "%, " + hslRight[2] * 100 + "%))");
46837
46838 if (sliderValue && sliderValueEditable) {
46839 self.$el.find('input.color-picker-value-hue').val("" + hue);
46840 self.$el.find('input.color-picker-value-saturation').val("" + hsb[1] * 1000 / 10);
46841 self.$el.find('input.color-picker-value-brightness').val("" + hsb[2] * 1000 / 10);
46842 } else if (sliderValue) {
46843 self.$el.find('span.color-picker-value-hue').text("" + hue);
46844 self.$el.find('span.color-picker-value-saturation').text("" + hsb[1] * 1000 / 10);
46845 self.$el.find('span.color-picker-value-brightness').text("" + hsb[2] * 1000 / 10);
46846 }
46847 },
46848 destroy: function destroy(self) {
46849 if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
46850 self.hueRangeSlider.destroy();
46851 }
46852
46853 if (self.saturationRangeSlider && self.saturationRangeSlider.destroy) {
46854 self.saturationRangeSlider.destroy();
46855 }
46856
46857 if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
46858 self.brightnessRangeSlider.destroy();
46859 }
46860
46861 delete self.hueRangeSlider;
46862 delete self.saturationRangeSlider;
46863 delete self.brightnessRangeSlider;
46864 if (self.destroyHsbSlidersEvents) self.destroyHsbSlidersEvents();
46865 delete self.destroyHsbSlidersEvents;
46866 }
46867 };
46868
46869 /** @jsx $jsx */
46870 var moduleHueSlider = {
46871 render: function render(self) {
46872 var _self$params = self.params,
46873 sliderLabel = _self$params.sliderLabel,
46874 sliderValue = _self$params.sliderValue,
46875 sliderValueEditable = _self$params.sliderValueEditable,
46876 hueLabelText = _self$params.hueLabelText;
46877 return $jsx("div", {
46878 class: "color-picker-module color-picker-module-hue-slider"
46879 }, $jsx("div", {
46880 class: "color-picker-slider-wrap"
46881 }, sliderLabel && $jsx("div", {
46882 class: "color-picker-slider-label"
46883 }, hueLabelText), $jsx("div", {
46884 class: "range-slider color-picker-slider color-picker-slider-hue"
46885 }), sliderValue && $jsx("div", {
46886 class: "color-picker-slider-value"
46887 }, sliderValueEditable ? $jsx("input", {
46888 type: "number",
46889 step: "0.1",
46890 min: "0",
46891 max: "360",
46892 class: "color-picker-value-hue"
46893 }) : $jsx("span", {
46894 class: "color-picker-value-hue"
46895 }))));
46896 },
46897 init: function init(self) {
46898 self.hueRangeSlider = self.app.range.create({
46899 el: self.$el.find('.color-picker-slider-hue'),
46900 min: 0,
46901 max: 360,
46902 step: 0.1,
46903 value: 0,
46904 on: {
46905 change: function change(range, value) {
46906 self.setValue({
46907 hue: value
46908 });
46909 }
46910 }
46911 });
46912 },
46913 update: function update(self) {
46914 var value = self.value;
46915 var _self$params2 = self.params,
46916 sliderValue = _self$params2.sliderValue,
46917 sliderValueEditable = _self$params2.sliderValueEditable;
46918 var hue = value.hue;
46919 self.hueRangeSlider.value = hue;
46920 self.hueRangeSlider.layout();
46921 self.hueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "hsl(" + hue + ", 100%, 50%)");
46922
46923 if (sliderValue && sliderValueEditable) {
46924 self.$el.find('input.color-picker-value-hue').val("" + hue);
46925 } else if (sliderValue) {
46926 self.$el.find('span.color-picker-value-hue').text("" + hue);
46927 }
46928 },
46929 destroy: function destroy(self) {
46930 if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
46931 self.hueRangeSlider.destroy();
46932 }
46933
46934 delete self.hueRangeSlider;
46935 }
46936 };
46937
46938 var moduleBrightnessSlider = {
46939 render: function render(self) {
46940 var _self$params = self.params,
46941 sliderLabel = _self$params.sliderLabel,
46942 sliderValue = _self$params.sliderValue,
46943 sliderValueEditable = _self$params.sliderValueEditable,
46944 brightnessLabelText = _self$params.brightnessLabelText;
46945 return $jsx("div", {
46946 class: "color-picker-module color-picker-module-brightness-slider"
46947 }, $jsx("div", {
46948 class: "color-picker-slider-wrap"
46949 }, sliderLabel && $jsx("div", {
46950 class: "color-picker-slider-label"
46951 }, brightnessLabelText), $jsx("div", {
46952 class: "range-slider color-picker-slider color-picker-slider-brightness"
46953 }), sliderValue && $jsx("div", {
46954 class: "color-picker-slider-value"
46955 }, sliderValueEditable ? $jsx("input", {
46956 type: "number",
46957 step: "0.1",
46958 min: "0",
46959 max: "100",
46960 class: "color-picker-value-brightness"
46961 }) : $jsx("span", {
46962 class: "color-picker-value-brightness"
46963 }))));
46964 },
46965 init: function init(self) {
46966 self.brightnessRangeSlider = self.app.range.create({
46967 el: self.$el.find('.color-picker-slider-brightness'),
46968 min: 0,
46969 max: 1,
46970 step: 0.001,
46971 value: 0,
46972 on: {
46973 change: function change(range, value) {
46974 var b = Math.floor(value * 1000) / 1000;
46975 self.setValue({
46976 hsb: [self.value.hsb[0], self.value.hsb[1], b]
46977 });
46978 }
46979 }
46980 });
46981 },
46982 update: function update(self) {
46983 var value = self.value,
46984 app = self.app;
46985 var _self$params2 = self.params,
46986 sliderValue = _self$params2.sliderValue,
46987 sliderValueEditable = _self$params2.sliderValueEditable;
46988 var hsb = value.hsb;
46989 self.brightnessRangeSlider.value = hsb[2];
46990 self.brightnessRangeSlider.layout();
46991 var hslCurrent = colorHsbToHsl(hsb[0], hsb[1], hsb[2]);
46992 var hslLeft = colorHsbToHsl(hsb[0], hsb[1], 0);
46993 var hslRight = colorHsbToHsl(hsb[0], hsb[1], 1);
46994 self.brightnessRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "hsl(" + hslCurrent[0] + ", " + hslCurrent[1] * 100 + "%, " + hslCurrent[2] * 100 + "%)");
46995 self.brightnessRangeSlider.$el.find('.range-bar').css('background-image', "linear-gradient(" + (app.rtl ? 'to left' : 'to right') + ", hsl(" + hslLeft[0] + ", " + hslLeft[1] * 100 + "%, " + hslLeft[2] * 100 + "%), hsl(" + hslRight[0] + ", " + hslRight[1] * 100 + "%, " + hslRight[2] * 100 + "%))");
46996
46997 if (sliderValue && sliderValueEditable) {
46998 self.$el.find('input.color-picker-value-brightness').val("" + hsb[2] * 1000 / 10);
46999 } else if (sliderValue) {
47000 self.$el.find('span.color-picker-value-brightness').text("" + hsb[2] * 1000 / 10);
47001 }
47002 },
47003 destroy: function destroy(self) {
47004 if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
47005 self.brightnessRangeSlider.destroy();
47006 }
47007
47008 delete self.brightnessRangeSlider;
47009 }
47010 };
47011
47012 /* eslint indent: ["off"] */
47013 var modulePalette = {
47014 render: function render(self) {
47015 return $jsx("div", {
47016 class: "color-picker-module color-picker-module-palette"
47017 }, $jsx("div", {
47018 class: "color-picker-palette"
47019 }, self.params.palette.map(function (p) {
47020 if (Array.isArray(p)) {
47021 var row = '<div class="color-picker-palette-row">'; // prettier-ignore
47022
47023 row += p.map(function (c) {
47024 return "\n <div class=\"color-picker-palette-value\" data-palette-color=\"" + c + "\" style=\"background-color: " + c + "\"></div>\n ";
47025 }).join('');
47026 row += '</div>';
47027 return row;
47028 }
47029
47030 return $jsx("div", {
47031 class: "color-picker-palette-value",
47032 "data-palette-color": p,
47033 style: "background-color: " + p
47034 });
47035 })));
47036 },
47037 init: function init(self) {
47038 function handlePaletteClick(e) {
47039 var hex = $(e.target).attr('data-palette-color');
47040 self.setValue({
47041 hex: hex
47042 });
47043 }
47044
47045 self.$el.on('click', '.color-picker-module-palette .color-picker-palette-value', handlePaletteClick);
47046
47047 self.destroyPaletteEvents = function destroyPaletteEvents() {
47048 self.$el.off('click', '.color-picker-module-hex input', handlePaletteClick);
47049 };
47050 },
47051 destroy: function destroy(self) {
47052 if (self.destroyPaletteEvents) {
47053 self.destroyPaletteEvents();
47054 }
47055
47056 delete self.destroyPaletteEvents;
47057 }
47058 };
47059
47060 /** @jsx $jsx */
47061 var moduleInitialCurrentColors = {
47062 render: function render() {
47063 return $jsx("div", {
47064 class: "color-picker-module color-picker-module-initial-current-colors"
47065 }, $jsx("div", {
47066 class: "color-picker-initial-current-colors"
47067 }, $jsx("div", {
47068 class: "color-picker-initial-color"
47069 }), $jsx("div", {
47070 class: "color-picker-current-color"
47071 })));
47072 },
47073 init: function init(self) {
47074 function handleInitialColorClick() {
47075 if (self.initialValue) {
47076 var _self$initialValue = self.initialValue,
47077 hex = _self$initialValue.hex,
47078 alpha = _self$initialValue.alpha;
47079 self.setValue({
47080 hex: hex,
47081 alpha: alpha
47082 });
47083 }
47084 }
47085
47086 self.$el.on('click', '.color-picker-initial-color', handleInitialColorClick);
47087
47088 self.destroyInitialCurrentEvents = function destroyInitialCurrentEvents() {
47089 self.$el.off('click', '.color-picker-initial-color', handleInitialColorClick);
47090 };
47091 },
47092 update: function update(self) {
47093 self.$el.find('.color-picker-module-initial-current-colors .color-picker-initial-color').css('background-color', self.initialValue.hex);
47094 self.$el.find('.color-picker-module-initial-current-colors .color-picker-current-color').css('background-color', self.value.hex);
47095 },
47096 destroy: function destroy(self) {
47097 if (self.destroyInitialCurrentEvents) {
47098 self.destroyInitialCurrentEvents();
47099 }
47100
47101 delete self.destroyInitialCurrentEvents;
47102 }
47103 };
47104
47105 var moduleRgbBars = {
47106 render: function render(self) {
47107 var _self$params = self.params,
47108 barLabel = _self$params.barLabel,
47109 barValue = _self$params.barValue,
47110 barValueEditable = _self$params.barValueEditable,
47111 redLabelText = _self$params.redLabelText,
47112 greenLabelText = _self$params.greenLabelText,
47113 blueLabelText = _self$params.blueLabelText;
47114 return $jsx("div", {
47115 class: "color-picker-module color-picker-module-rgb-bars"
47116 }, $jsx("div", {
47117 class: "color-picker-bar-wrap"
47118 }, barLabel && $jsx("div", {
47119 class: "color-picker-bar-label"
47120 }, redLabelText), $jsx("div", {
47121 class: "range-slider color-picker-bar color-picker-bar-red"
47122 }), barValue && $jsx("div", {
47123 class: "color-picker-bar-value"
47124 }, barValueEditable ? $jsx("input", {
47125 type: "number",
47126 step: "1",
47127 min: "0",
47128 max: "255",
47129 class: "color-picker-value-bar-red",
47130 "data-color-index": "0"
47131 }) : $jsx("span", {
47132 class: "color-picker-value-bar-red"
47133 }))), $jsx("div", {
47134 class: "color-picker-bar-wrap"
47135 }, barLabel && $jsx("div", {
47136 class: "color-picker-bar-label"
47137 }, greenLabelText), $jsx("div", {
47138 class: "range-slider color-picker-bar color-picker-bar-green"
47139 }), barValue && $jsx("div", {
47140 class: "color-picker-bar-value"
47141 }, barValueEditable ? $jsx("input", {
47142 type: "number",
47143 step: "1",
47144 min: "0",
47145 max: "255",
47146 class: "color-picker-value-bar-green",
47147 "data-color-index": "1"
47148 }) : $jsx("span", {
47149 class: "color-picker-value-bar-green"
47150 }))), $jsx("div", {
47151 class: "color-picker-bar-wrap"
47152 }, barLabel && $jsx("div", {
47153 class: "color-picker-bar-label"
47154 }, blueLabelText), $jsx("div", {
47155 class: "range-slider color-picker-bar color-picker-bar-blue"
47156 }), barValue && $jsx("div", {
47157 class: "color-picker-bar-value"
47158 }, barValueEditable ? $jsx("input", {
47159 type: "number",
47160 step: "1",
47161 min: "0",
47162 max: "255",
47163 class: "color-picker-value-bar-blue",
47164 "data-color-index": "2"
47165 }) : $jsx("span", {
47166 class: "color-picker-value-bar-blue"
47167 }))));
47168 },
47169 init: function init(self) {
47170 self.redBar = self.app.range.create({
47171 el: self.$el.find('.color-picker-bar-red'),
47172 min: 0,
47173 max: 255,
47174 step: 1,
47175 value: 0,
47176 vertical: true,
47177 on: {
47178 change: function change(range, value) {
47179 self.setValue({
47180 rgb: [value, self.value.rgb[1], self.value.rgb[2]]
47181 });
47182 }
47183 }
47184 });
47185 self.greenBar = self.app.range.create({
47186 el: self.$el.find('.color-picker-bar-green'),
47187 min: 0,
47188 max: 255,
47189 step: 1,
47190 value: 0,
47191 vertical: true,
47192 on: {
47193 change: function change(range, value) {
47194 self.setValue({
47195 rgb: [self.value.rgb[0], value, self.value.rgb[2]]
47196 });
47197 }
47198 }
47199 });
47200 self.blueBar = self.app.range.create({
47201 el: self.$el.find('.color-picker-bar-blue'),
47202 min: 0,
47203 max: 255,
47204 step: 1,
47205 value: 0,
47206 vertical: true,
47207 on: {
47208 change: function change(range, value) {
47209 self.setValue({
47210 rgb: [self.value.rgb[0], self.value.rgb[1], value]
47211 });
47212 }
47213 }
47214 });
47215
47216 function handleInputChange(e) {
47217 var rgb = [].concat(self.value.rgb);
47218 var index = parseInt($(e.target).attr('data-color-index'), 10);
47219 var value = parseInt(e.target.value, 10);
47220
47221 if (Number.isNaN(value)) {
47222 e.target.value = rgb[index];
47223 return;
47224 }
47225
47226 value = Math.max(0, Math.min(255, value));
47227 rgb[index] = value;
47228 self.setValue({
47229 rgb: rgb
47230 });
47231 }
47232
47233 self.$el.on('change', '.color-picker-module-rgb-bars input', handleInputChange);
47234
47235 self.destroyRgbBarsEvents = function destroyRgbBarsEvents() {
47236 self.$el.off('change', '.color-picker-module-rgb-bars input', handleInputChange);
47237 };
47238 },
47239 update: function update(self) {
47240 var value = self.value,
47241 redBar = self.redBar,
47242 greenBar = self.greenBar,
47243 blueBar = self.blueBar;
47244 var _self$params2 = self.params,
47245 barValue = _self$params2.barValue,
47246 barValueEditable = _self$params2.barValueEditable;
47247 var rgb = value.rgb;
47248 redBar.value = rgb[0];
47249 greenBar.value = rgb[1];
47250 blueBar.value = rgb[2];
47251 redBar.layout();
47252 greenBar.layout();
47253 blueBar.layout();
47254 redBar.$el.find('.range-bar').css('background-image', "linear-gradient(to top, rgb(0, " + rgb[1] + ", " + rgb[2] + "), rgb(255, " + rgb[1] + ", " + rgb[2] + "))");
47255 greenBar.$el.find('.range-bar').css('background-image', "linear-gradient(to top, rgb(" + rgb[0] + ", 0, " + rgb[2] + "), rgb(" + rgb[0] + ", 255, " + rgb[2] + "))");
47256 blueBar.$el.find('.range-bar').css('background-image', "linear-gradient(to top, rgb(" + rgb[0] + ", " + rgb[1] + ", 0), rgb(" + rgb[0] + ", " + rgb[1] + ", 255))");
47257
47258 if (barValue && barValueEditable) {
47259 self.$el.find('input.color-picker-value-bar-red').val(rgb[0]);
47260 self.$el.find('input.color-picker-value-bar-green').val(rgb[1]);
47261 self.$el.find('input.color-picker-value-bar-blue').val(rgb[2]);
47262 } else if (barValue) {
47263 self.$el.find('span.color-picker-value-bar-red').text(rgb[0]);
47264 self.$el.find('span.color-picker-value-bar-green').text(rgb[1]);
47265 self.$el.find('span.color-picker-value-bar-blue').text(rgb[2]);
47266 }
47267 },
47268 destroy: function destroy(self) {
47269 if (self.redBar && self.redBar.destroy) {
47270 self.redBar.destroy();
47271 }
47272
47273 if (self.greenBar && self.greenBar.destroy) {
47274 self.greenBar.destroy();
47275 }
47276
47277 if (self.blueBar && self.blueBar.destroy) {
47278 self.blueBar.destroy();
47279 }
47280
47281 delete self.redBar;
47282 delete self.greenBar;
47283 delete self.blueBar;
47284 if (self.destroyRgbBarsEvents) self.destroyRgbBarsEvents();
47285 delete self.destroyRgbBarsEvents;
47286 }
47287 };
47288
47289 var moduleRgbSliders = {
47290 render: function render(self) {
47291 var _self$params = self.params,
47292 sliderLabel = _self$params.sliderLabel,
47293 sliderValue = _self$params.sliderValue,
47294 sliderValueEditable = _self$params.sliderValueEditable,
47295 redLabelText = _self$params.redLabelText,
47296 greenLabelText = _self$params.greenLabelText,
47297 blueLabelText = _self$params.blueLabelText;
47298 return $jsx("div", {
47299 class: "color-picker-module color-picker-module-rgb-sliders"
47300 }, $jsx("div", {
47301 class: "color-picker-slider-wrap"
47302 }, sliderLabel && $jsx("div", {
47303 class: "color-picker-slider-label"
47304 }, redLabelText), $jsx("div", {
47305 class: "range-slider color-picker-slider color-picker-slider-red"
47306 }), sliderValue && $jsx("div", {
47307 class: "color-picker-slider-value"
47308 }, sliderValueEditable ? $jsx("input", {
47309 type: "number",
47310 step: "1",
47311 min: "0",
47312 max: "255",
47313 class: "color-picker-value-red",
47314 "data-color-index": "0"
47315 }) : $jsx("span", {
47316 class: "color-picker-value-red"
47317 }))), $jsx("div", {
47318 class: "color-picker-slider-wrap"
47319 }, sliderLabel && $jsx("div", {
47320 class: "color-picker-slider-label"
47321 }, greenLabelText), $jsx("div", {
47322 class: "range-slider color-picker-slider color-picker-slider-green"
47323 }), sliderValue && $jsx("div", {
47324 class: "color-picker-slider-value"
47325 }, sliderValueEditable ? $jsx("input", {
47326 type: "number",
47327 step: "1",
47328 min: "0",
47329 max: "255",
47330 class: "color-picker-value-green",
47331 "data-color-index": "1"
47332 }) : $jsx("span", {
47333 class: "color-picker-value-green"
47334 }))), $jsx("div", {
47335 class: "color-picker-slider-wrap"
47336 }, sliderLabel && $jsx("div", {
47337 class: "color-picker-slider-label"
47338 }, blueLabelText), $jsx("div", {
47339 class: "range-slider color-picker-slider color-picker-slider-blue"
47340 }), sliderValue && $jsx("div", {
47341 class: "color-picker-slider-value"
47342 }, sliderValueEditable ? $jsx("input", {
47343 type: "number",
47344 step: "1",
47345 min: "0",
47346 max: "255",
47347 class: "color-picker-value-blue",
47348 "data-color-index": "2"
47349 }) : $jsx("span", {
47350 class: "color-picker-value-blue"
47351 }))));
47352 },
47353 init: function init(self) {
47354 self.redRangeSlider = self.app.range.create({
47355 el: self.$el.find('.color-picker-slider-red'),
47356 min: 0,
47357 max: 255,
47358 step: 1,
47359 value: 0,
47360 on: {
47361 change: function change(range, value) {
47362 self.setValue({
47363 rgb: [value, self.value.rgb[1], self.value.rgb[2]]
47364 });
47365 }
47366 }
47367 });
47368 self.greenRangeSlider = self.app.range.create({
47369 el: self.$el.find('.color-picker-slider-green'),
47370 min: 0,
47371 max: 255,
47372 step: 1,
47373 value: 0,
47374 on: {
47375 change: function change(range, value) {
47376 self.setValue({
47377 rgb: [self.value.rgb[0], value, self.value.rgb[2]]
47378 });
47379 }
47380 }
47381 });
47382 self.blueRangeSlider = self.app.range.create({
47383 el: self.$el.find('.color-picker-slider-blue'),
47384 min: 0,
47385 max: 255,
47386 step: 1,
47387 value: 0,
47388 on: {
47389 change: function change(range, value) {
47390 self.setValue({
47391 rgb: [self.value.rgb[0], self.value.rgb[1], value]
47392 });
47393 }
47394 }
47395 });
47396
47397 function handleInputChange(e) {
47398 var rgb = [].concat(self.value.rgb);
47399 var index = parseInt($(e.target).attr('data-color-index'), 10);
47400 var value = parseInt(e.target.value, 10);
47401
47402 if (Number.isNaN(value)) {
47403 e.target.value = rgb[index];
47404 return;
47405 }
47406
47407 value = Math.max(0, Math.min(255, value));
47408 rgb[index] = value;
47409 self.setValue({
47410 rgb: rgb
47411 });
47412 }
47413
47414 self.$el.on('change', '.color-picker-module-rgb-sliders input', handleInputChange);
47415
47416 self.destroyRgbSlidersEvents = function destroyRgbSlidersEvents() {
47417 self.$el.off('change', '.color-picker-module-rgb-sliders input', handleInputChange);
47418 };
47419 },
47420 update: function update(self) {
47421 var app = self.app,
47422 value = self.value,
47423 redRangeSlider = self.redRangeSlider,
47424 greenRangeSlider = self.greenRangeSlider,
47425 blueRangeSlider = self.blueRangeSlider;
47426 var _self$params2 = self.params,
47427 sliderValue = _self$params2.sliderValue,
47428 sliderValueEditable = _self$params2.sliderValueEditable;
47429 var rgb = value.rgb;
47430 redRangeSlider.value = rgb[0];
47431 greenRangeSlider.value = rgb[1];
47432 blueRangeSlider.value = rgb[2];
47433 redRangeSlider.layout();
47434 greenRangeSlider.layout();
47435 blueRangeSlider.layout();
47436 redRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "rgb(" + rgb[0] + ", " + rgb[1] + ", " + rgb[2] + ")");
47437 greenRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "rgb(" + rgb[0] + ", " + rgb[1] + ", " + rgb[2] + ")");
47438 blueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', "rgb(" + rgb[0] + ", " + rgb[1] + ", " + rgb[2] + ")");
47439 var direction = app.rtl ? 'to left' : 'to right';
47440 redRangeSlider.$el.find('.range-bar').css('background-image', "linear-gradient(" + direction + ", rgb(0, " + rgb[1] + ", " + rgb[2] + "), rgb(255, " + rgb[1] + ", " + rgb[2] + "))");
47441 greenRangeSlider.$el.find('.range-bar').css('background-image', "linear-gradient(" + direction + ", rgb(" + rgb[0] + ", 0, " + rgb[2] + "), rgb(" + rgb[0] + ", 255, " + rgb[2] + "))");
47442 blueRangeSlider.$el.find('.range-bar').css('background-image', "linear-gradient(" + direction + ", rgb(" + rgb[0] + ", " + rgb[1] + ", 0), rgb(" + rgb[0] + ", " + rgb[1] + ", 255))");
47443
47444 if (sliderValue && sliderValueEditable) {
47445 self.$el.find('input.color-picker-value-red').val(rgb[0]);
47446 self.$el.find('input.color-picker-value-green').val(rgb[1]);
47447 self.$el.find('input.color-picker-value-blue').val(rgb[2]);
47448 } else if (sliderValue) {
47449 self.$el.find('span.color-picker-value-red').text(rgb[0]);
47450 self.$el.find('span.color-picker-value-green').text(rgb[1]);
47451 self.$el.find('span.color-picker-value-blue').text(rgb[2]);
47452 }
47453 },
47454 destroy: function destroy(self) {
47455 if (self.redRangeSlider && self.redRangeSlider.destroy) {
47456 self.redRangeSlider.destroy();
47457 }
47458
47459 if (self.greenRangeSlider && self.greenRangeSlider.destroy) {
47460 self.greenRangeSlider.destroy();
47461 }
47462
47463 if (self.blueRangeSlider && self.blueRangeSlider.destroy) {
47464 self.blueRangeSlider.destroy();
47465 }
47466
47467 delete self.redRangeSlider;
47468 delete self.greenRangeSlider;
47469 delete self.blueRangeSlider;
47470 if (self.destroyRgbSlidersEvents) self.destroyRgbSlidersEvents();
47471 delete self.destroyRgbSlidersEvents;
47472 }
47473 };
47474
47475 var moduleSbSpectrum = {
47476 render: function render() {
47477 return $jsx("div", {
47478 class: "color-picker-module color-picker-module-sb-spectrum"
47479 }, $jsx("div", {
47480 class: "color-picker-sb-spectrum",
47481 style: "background-color: hsl(0, 100%, 50%)"
47482 }, $jsx("div", {
47483 class: "color-picker-sb-spectrum-handle"
47484 })));
47485 },
47486 init: function init(self) {
47487 var app = self.app;
47488 var isTouched;
47489 var isMoved;
47490 var touchStartX;
47491 var touchStartY;
47492 var touchCurrentX;
47493 var touchCurrentY;
47494 var specterRect;
47495 var specterIsTouched;
47496 var specterHandleIsTouched;
47497 var $el = self.$el;
47498
47499 function setSBFromSpecterCoords(x, y) {
47500 var s = (x - specterRect.left) / specterRect.width;
47501 var b = (y - specterRect.top) / specterRect.height;
47502 s = Math.max(0, Math.min(1, s));
47503 b = 1 - Math.max(0, Math.min(1, b));
47504 self.setValue({
47505 hsb: [self.value.hue, s, b]
47506 });
47507 }
47508
47509 function handleTouchStart(e) {
47510 if (isMoved || isTouched) return;
47511 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
47512 touchCurrentX = touchStartX;
47513 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
47514 touchCurrentY = touchStartY;
47515 var $targetEl = $(e.target);
47516 specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
47517
47518 if (!specterHandleIsTouched) {
47519 specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
47520 }
47521
47522 if (specterIsTouched) {
47523 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
47524 setSBFromSpecterCoords(touchStartX, touchStartY);
47525 }
47526
47527 if (specterHandleIsTouched || specterIsTouched) {
47528 $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
47529 }
47530 }
47531
47532 function handleTouchMove(e) {
47533 if (!(specterIsTouched || specterHandleIsTouched)) return;
47534 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
47535 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
47536 e.preventDefault();
47537
47538 if (!isMoved) {
47539 // First move
47540 isMoved = true;
47541
47542 if (specterHandleIsTouched) {
47543 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
47544 }
47545 }
47546
47547 if (specterIsTouched || specterHandleIsTouched) {
47548 setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
47549 }
47550 }
47551
47552 function handleTouchEnd() {
47553 isMoved = false;
47554
47555 if (specterIsTouched || specterHandleIsTouched) {
47556 $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
47557 }
47558
47559 specterIsTouched = false;
47560 specterHandleIsTouched = false;
47561 }
47562
47563 function handleResize() {
47564 self.modules['sb-spectrum'].update(self);
47565 }
47566
47567 var passiveListener = app.touchEvents.start === 'touchstart' && getSupport$1().passiveListener ? {
47568 passive: true,
47569 capture: false
47570 } : false;
47571 self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
47572 app.on('touchmove:active', handleTouchMove);
47573 app.on('touchend:passive', handleTouchEnd);
47574 app.on('resize', handleResize);
47575
47576 self.destroySpectrumEvents = function destroySpectrumEvents() {
47577 self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
47578 app.off('touchmove:active', handleTouchMove);
47579 app.off('touchend:passive', handleTouchEnd);
47580 app.off('resize', handleResize);
47581 };
47582 },
47583 update: function update(self) {
47584 var value = self.value;
47585 var hsl = value.hsl,
47586 hsb = value.hsb;
47587 var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
47588 var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
47589 self.$el.find('.color-picker-sb-spectrum').css('background-color', "hsl(" + hsl[0] + ", 100%, 50%)");
47590 self.$el.find('.color-picker-sb-spectrum-handle').css('background-color', "hsl(" + hsl[0] + ", " + hsl[1] * 100 + "%, " + hsl[2] * 100 + "%)").transform("translate(" + specterWidth * hsb[1] + "px, " + specterHeight * (1 - hsb[2]) + "px)");
47591 },
47592 destroy: function destroy(self) {
47593 if (self.destroySpectrumEvents) self.destroySpectrumEvents();
47594 delete self.destroySpectrumEvents;
47595 }
47596 };
47597
47598 var moduleHsSpectrum = {
47599 render: function render() {
47600 return $jsx("div", {
47601 class: "color-picker-module color-picker-module-hs-spectrum"
47602 }, $jsx("div", {
47603 class: "color-picker-hs-spectrum"
47604 }, $jsx("div", {
47605 class: "color-picker-hs-spectrum-handle"
47606 })));
47607 },
47608 init: function init(self) {
47609 var app = self.app;
47610 var isTouched;
47611 var isMoved;
47612 var touchStartX;
47613 var touchStartY;
47614 var touchCurrentX;
47615 var touchCurrentY;
47616 var specterRect;
47617 var specterIsTouched;
47618 var specterHandleIsTouched;
47619 var $el = self.$el;
47620
47621 function setHSFromSpecterCoords(x, y) {
47622 var h = (x - specterRect.left) / specterRect.width * 360;
47623 var s = (y - specterRect.top) / specterRect.height;
47624 h = Math.max(0, Math.min(360, h));
47625 s = 1 - Math.max(0, Math.min(1, s));
47626 self.setValue({
47627 hsb: [h, s, self.value.hsb[2]]
47628 });
47629 }
47630
47631 function handleTouchStart(e) {
47632 if (isMoved || isTouched) return;
47633 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
47634 touchCurrentX = touchStartX;
47635 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
47636 touchCurrentY = touchStartY;
47637 var $targetEl = $(e.target);
47638 specterHandleIsTouched = $targetEl.closest('.color-picker-hs-spectrum-handle').length > 0;
47639
47640 if (!specterHandleIsTouched) {
47641 specterIsTouched = $targetEl.closest('.color-picker-hs-spectrum').length > 0;
47642 }
47643
47644 if (specterIsTouched) {
47645 specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
47646 setHSFromSpecterCoords(touchStartX, touchStartY);
47647 }
47648
47649 if (specterHandleIsTouched || specterIsTouched) {
47650 $el.find('.color-picker-hs-spectrum-handle').addClass('color-picker-hs-spectrum-handle-pressed');
47651 }
47652 }
47653
47654 function handleTouchMove(e) {
47655 if (!(specterIsTouched || specterHandleIsTouched)) return;
47656 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
47657 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
47658 e.preventDefault();
47659
47660 if (!isMoved) {
47661 // First move
47662 isMoved = true;
47663
47664 if (specterHandleIsTouched) {
47665 specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
47666 }
47667 }
47668
47669 if (specterIsTouched || specterHandleIsTouched) {
47670 setHSFromSpecterCoords(touchCurrentX, touchCurrentY);
47671 }
47672 }
47673
47674 function handleTouchEnd() {
47675 isMoved = false;
47676
47677 if (specterIsTouched || specterHandleIsTouched) {
47678 $el.find('.color-picker-hs-spectrum-handle').removeClass('color-picker-hs-spectrum-handle-pressed');
47679 }
47680
47681 specterIsTouched = false;
47682 specterHandleIsTouched = false;
47683 }
47684
47685 function handleResize() {
47686 self.modules['hs-spectrum'].update(self);
47687 }
47688
47689 var passiveListener = app.touchEvents.start === 'touchstart' && getSupport$1().passiveListener ? {
47690 passive: true,
47691 capture: false
47692 } : false;
47693 self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
47694 app.on('touchmove:active', handleTouchMove);
47695 app.on('touchend:passive', handleTouchEnd);
47696 app.on('resize', handleResize);
47697
47698 self.destroySpectrumEvents = function destroySpectrumEvents() {
47699 self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
47700 app.off('touchmove:active', handleTouchMove);
47701 app.off('touchend:passive', handleTouchEnd);
47702 app.off('resize', handleResize);
47703 };
47704 },
47705 update: function update(self) {
47706 var value = self.value;
47707 var hsb = value.hsb;
47708 var specterWidth = self.$el.find('.color-picker-hs-spectrum')[0].offsetWidth;
47709 var specterHeight = self.$el.find('.color-picker-hs-spectrum')[0].offsetHeight;
47710 var hslBright = colorHsbToHsl(hsb[0], hsb[1], 1);
47711 self.$el.find('.color-picker-hs-spectrum-handle').css('background-color', "hsl(" + hslBright[0] + ", " + hslBright[1] * 100 + "%, " + hslBright[2] * 100 + "%)").transform("translate(" + specterWidth * (hsb[0] / 360) + "px, " + specterHeight * (1 - hsb[1]) + "px)");
47712 },
47713 destroy: function destroy(self) {
47714 if (self.destroySpectrumEvents) self.destroySpectrumEvents();
47715 delete self.destroySpectrumEvents;
47716 }
47717 };
47718
47719 function svgWheelCircles() {
47720 var total = 256;
47721 var circles = '';
47722
47723 for (var i = total; i > 0; i -= 1) {
47724 var angle = i * Math.PI / (total / 2);
47725 var hue = 360 / total * i;
47726 circles += "<circle cx=\"" + (150 - Math.sin(angle) * 125) + "\" cy=\"" + (150 - Math.cos(angle) * 125) + "\" r=\"25\" fill=\"hsl(" + hue + ", 100%, 50%)\"></circle>";
47727 }
47728
47729 return circles;
47730 }
47731
47732 var moduleWheel = {
47733 render: function render() {
47734 return $jsx("div", {
47735 class: "color-picker-module color-picker-module-wheel"
47736 }, $jsx("div", {
47737 class: "color-picker-wheel"
47738 }, $jsx("svg", {
47739 viewBox: "0 0 300 300",
47740 width: "300",
47741 height: "300"
47742 }, svgWheelCircles()), $jsx("div", {
47743 class: "color-picker-wheel-handle"
47744 }), $jsx("div", {
47745 class: "color-picker-sb-spectrum",
47746 style: "background-color: hsl(0, 100%, 50%)"
47747 }, $jsx("div", {
47748 class: "color-picker-sb-spectrum-handle"
47749 }))));
47750 },
47751 init: function init(self) {
47752 var app = self.app;
47753 var isTouched;
47754 var isMoved;
47755 var touchStartX;
47756 var touchStartY;
47757 var touchCurrentX;
47758 var touchCurrentY;
47759 var wheelRect;
47760 var wheelIsTouched;
47761 var wheelHandleIsTouched;
47762 var specterRect;
47763 var specterIsTouched;
47764 var specterHandleIsTouched;
47765 var $el = self.$el;
47766
47767 function setHueFromWheelCoords(x, y) {
47768 var wheelCenterX = wheelRect.left + wheelRect.width / 2;
47769 var wheelCenterY = wheelRect.top + wheelRect.height / 2;
47770 var angleRad = Math.atan2(y - wheelCenterY, x - wheelCenterX);
47771 var angleDeg = angleRad * 180 / Math.PI + 90;
47772 if (angleDeg < 0) angleDeg += 360;
47773 angleDeg = 360 - angleDeg;
47774 self.setValue({
47775 hue: angleDeg
47776 });
47777 }
47778
47779 function setSBFromSpecterCoords(x, y) {
47780 var s = (x - specterRect.left) / specterRect.width;
47781 var b = (y - specterRect.top) / specterRect.height;
47782 s = Math.max(0, Math.min(1, s));
47783 b = 1 - Math.max(0, Math.min(1, b));
47784 self.setValue({
47785 hsb: [self.value.hue, s, b]
47786 });
47787 }
47788
47789 function handleTouchStart(e) {
47790 if (isMoved || isTouched) return;
47791 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
47792 touchCurrentX = touchStartX;
47793 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
47794 touchCurrentY = touchStartY;
47795 var $targetEl = $(e.target);
47796 wheelHandleIsTouched = $targetEl.closest('.color-picker-wheel-handle').length > 0;
47797 wheelIsTouched = $targetEl.closest('circle').length > 0;
47798 specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
47799
47800 if (!specterHandleIsTouched) {
47801 specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
47802 }
47803
47804 if (wheelIsTouched) {
47805 wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
47806 setHueFromWheelCoords(touchStartX, touchStartY);
47807 }
47808
47809 if (specterIsTouched) {
47810 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
47811 setSBFromSpecterCoords(touchStartX, touchStartY);
47812 }
47813
47814 if (specterHandleIsTouched || specterIsTouched) {
47815 $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
47816 }
47817 }
47818
47819 function handleTouchMove(e) {
47820 if (!(wheelIsTouched || wheelHandleIsTouched) && !(specterIsTouched || specterHandleIsTouched)) return;
47821 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
47822 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
47823 e.preventDefault();
47824
47825 if (!isMoved) {
47826 // First move
47827 isMoved = true;
47828
47829 if (wheelHandleIsTouched) {
47830 wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
47831 }
47832
47833 if (specterHandleIsTouched) {
47834 specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
47835 }
47836 }
47837
47838 if (wheelIsTouched || wheelHandleIsTouched) {
47839 setHueFromWheelCoords(touchCurrentX, touchCurrentY);
47840 }
47841
47842 if (specterIsTouched || specterHandleIsTouched) {
47843 setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
47844 }
47845 }
47846
47847 function handleTouchEnd() {
47848 isMoved = false;
47849
47850 if (specterIsTouched || specterHandleIsTouched) {
47851 $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
47852 }
47853
47854 wheelIsTouched = false;
47855 wheelHandleIsTouched = false;
47856 specterIsTouched = false;
47857 specterHandleIsTouched = false;
47858 }
47859
47860 function handleResize() {
47861 self.modules.wheel.update(self);
47862 }
47863
47864 var passiveListener = app.touchEvents.start === 'touchstart' && getSupport$1().passiveListener ? {
47865 passive: true,
47866 capture: false
47867 } : false;
47868 self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
47869 app.on('touchmove:active', handleTouchMove);
47870 app.on('touchend:passive', handleTouchEnd);
47871 app.on('resize', handleResize);
47872
47873 self.destroyWheelEvents = function destroyWheelEvents() {
47874 self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
47875 app.off('touchmove:active', handleTouchMove);
47876 app.off('touchend:passive', handleTouchEnd);
47877 app.off('resize', handleResize);
47878 };
47879 },
47880 update: function update(self) {
47881 var value = self.value;
47882 var hsl = value.hsl,
47883 hsb = value.hsb;
47884 var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
47885 var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
47886 var wheelSize = self.$el.find('.color-picker-wheel')[0].offsetWidth;
47887 var wheelHalfSize = wheelSize / 2;
47888 var angleRad = value.hue * Math.PI / 180;
47889 var handleSize = wheelSize / 6;
47890 var handleHalfSize = handleSize / 2;
47891 var tX = wheelHalfSize - Math.sin(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
47892 var tY = wheelHalfSize - Math.cos(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
47893 self.$el.find('.color-picker-wheel-handle').css('background-color', "hsl(" + hsl[0] + ", 100%, 50%)").transform("translate(" + tX + "px, " + tY + "px)");
47894 self.$el.find('.color-picker-sb-spectrum').css('background-color', "hsl(" + hsl[0] + ", 100%, 50%)");
47895 self.$el.find('.color-picker-sb-spectrum-handle').css('background-color', "hsl(" + hsl[0] + ", " + hsl[1] * 100 + "%, " + hsl[2] * 100 + "%)").transform("translate(" + specterWidth * hsb[1] + "px, " + specterHeight * (1 - hsb[2]) + "px)");
47896 },
47897 destroy: function destroy(self) {
47898 if (self.destroyWheelEvents) self.destroyWheelEvents();
47899 delete self.destroyWheelEvents;
47900 }
47901 };
47902
47903 var ColorPicker$1 = /*#__PURE__*/function (_Framework7Class) {
47904 _inheritsLoose(ColorPicker, _Framework7Class);
47905
47906 function ColorPicker(app, params) {
47907 var _this;
47908
47909 if (params === void 0) {
47910 params = {};
47911 }
47912
47913 _this = _Framework7Class.call(this, params, [app]) || this;
47914
47915 var self = _assertThisInitialized(_this);
47916
47917 self.params = extend$1({}, app.params.colorPicker, params);
47918 var $containerEl;
47919
47920 if (self.params.containerEl) {
47921 $containerEl = $(self.params.containerEl);
47922 if ($containerEl.length === 0) return self || _assertThisInitialized(_this);
47923 }
47924
47925 var $inputEl;
47926
47927 if (self.params.inputEl) {
47928 $inputEl = $(self.params.inputEl);
47929 }
47930
47931 var $targetEl;
47932
47933 if (self.params.targetEl) {
47934 $targetEl = $(self.params.targetEl);
47935 }
47936
47937 extend$1(self, {
47938 app: app,
47939 $containerEl: $containerEl,
47940 containerEl: $containerEl && $containerEl[0],
47941 inline: $containerEl && $containerEl.length > 0,
47942 $inputEl: $inputEl,
47943 inputEl: $inputEl && $inputEl[0],
47944 $targetEl: $targetEl,
47945 targetEl: $targetEl && $targetEl[0],
47946 initialized: false,
47947 opened: false,
47948 url: self.params.url,
47949 modules: {
47950 'alpha-slider': moduleAlphaSlider,
47951 'current-color': moduleCurrentColor,
47952 hex: moduleHex,
47953 // eslint-disable-line
47954 'hsb-sliders': moduleHsbSliders,
47955 'hue-slider': moduleHueSlider,
47956 'brightness-slider': moduleBrightnessSlider,
47957 palette: modulePalette,
47958 // eslint-disable-line
47959 'initial-current-colors': moduleInitialCurrentColors,
47960 'rgb-bars': moduleRgbBars,
47961 'rgb-sliders': moduleRgbSliders,
47962 'sb-spectrum': moduleSbSpectrum,
47963 'hs-spectrum': moduleHsSpectrum,
47964 wheel: moduleWheel // eslint-disable-line
47965
47966 }
47967 });
47968
47969 function onInputClick() {
47970 self.open();
47971 }
47972
47973 function onInputFocus(e) {
47974 e.preventDefault();
47975 }
47976
47977 function onTargetClick() {
47978 self.open();
47979 }
47980
47981 function onHtmlClick(e) {
47982 if (self.destroyed || !self.params) return;
47983 if (self.params.openIn === 'page') return;
47984 var $clickTargetEl = $(e.target);
47985 if (!self.opened || self.closing) return;
47986 if ($clickTargetEl.closest('[class*="backdrop"]').length) return;
47987 if ($clickTargetEl.closest('.color-picker-popup, .color-picker-popover').length) return;
47988
47989 if ($inputEl && $inputEl.length > 0) {
47990 if ($clickTargetEl[0] !== $inputEl[0] && $clickTargetEl.closest('.sheet-modal').length === 0) {
47991 self.close();
47992 }
47993 } else if ($(e.target).closest('.sheet-modal').length === 0) {
47994 self.close();
47995 }
47996 } // Events
47997
47998
47999 extend$1(self, {
48000 attachInputEvents: function attachInputEvents() {
48001 self.$inputEl.on('click', onInputClick);
48002
48003 if (self.params.inputReadOnly) {
48004 self.$inputEl.on('focus mousedown', onInputFocus);
48005
48006 if (self.$inputEl[0]) {
48007 self.$inputEl[0].f7ValidateReadonly = true;
48008 }
48009 }
48010 },
48011 detachInputEvents: function detachInputEvents() {
48012 self.$inputEl.off('click', onInputClick);
48013
48014 if (self.params.inputReadOnly) {
48015 self.$inputEl.off('focus mousedown', onInputFocus);
48016
48017 if (self.$inputEl[0]) {
48018 delete self.$inputEl[0].f7ValidateReadonly;
48019 }
48020 }
48021 },
48022 attachTargetEvents: function attachTargetEvents() {
48023 self.$targetEl.on('click', onTargetClick);
48024 },
48025 detachTargetEvents: function detachTargetEvents() {
48026 self.$targetEl.off('click', onTargetClick);
48027 },
48028 attachHtmlEvents: function attachHtmlEvents() {
48029 app.on('click', onHtmlClick);
48030 },
48031 detachHtmlEvents: function detachHtmlEvents() {
48032 app.off('click', onHtmlClick);
48033 }
48034 });
48035 self.init();
48036 return self || _assertThisInitialized(_this);
48037 }
48038
48039 var _proto = ColorPicker.prototype;
48040
48041 _proto.attachEvents = function attachEvents() {
48042 var self = this;
48043 self.centerModules = self.centerModules.bind(self);
48044
48045 if (self.params.centerModules) {
48046 self.app.on('resize', self.centerModules);
48047 }
48048 };
48049
48050 _proto.detachEvents = function detachEvents() {
48051 var self = this;
48052
48053 if (self.params.centerModules) {
48054 self.app.off('resize', self.centerModules);
48055 }
48056 };
48057
48058 _proto.centerModules = function centerModules() {
48059 var self = this;
48060 if (!self.opened || !self.$el || self.inline) return;
48061 var $pageContentEl = self.$el.find('.page-content');
48062 if (!$pageContentEl.length) return;
48063 var _$pageContentEl$ = $pageContentEl[0],
48064 scrollHeight = _$pageContentEl$.scrollHeight,
48065 offsetHeight = _$pageContentEl$.offsetHeight;
48066
48067 if (scrollHeight <= offsetHeight) {
48068 $pageContentEl.addClass('justify-content-center');
48069 } else {
48070 $pageContentEl.removeClass('justify-content-center');
48071 }
48072 };
48073
48074 _proto.initInput = function initInput() {
48075 var self = this;
48076 if (!self.$inputEl) return;
48077 if (self.params.inputReadOnly) self.$inputEl.prop('readOnly', true);
48078 };
48079
48080 _proto.getModalType = function getModalType() {
48081 var self = this;
48082 var app = self.app,
48083 modal = self.modal,
48084 params = self.params;
48085 var openIn = params.openIn,
48086 openInPhone = params.openInPhone;
48087 var device = getDevice$1();
48088 if (modal && modal.type) return modal.type;
48089 if (openIn !== 'auto') return openIn;
48090 if (self.inline) return null;
48091
48092 if (device.ios) {
48093 return device.ipad ? 'popover' : openInPhone;
48094 }
48095
48096 if (app.width >= 768 || device.desktop && app.theme === 'aurora') {
48097 return 'popover';
48098 }
48099
48100 return openInPhone;
48101 };
48102
48103 _proto.formatValue = function formatValue() {
48104 var self = this;
48105 var value = self.value;
48106
48107 if (self.params.formatValue) {
48108 return self.params.formatValue.call(self, value);
48109 }
48110
48111 return value.hex;
48112 } // eslint-disable-next-line
48113 ;
48114
48115 _proto.normalizeHsValues = function normalizeHsValues(arr) {
48116 return [Math.floor(arr[0] * 10) / 10, Math.floor(arr[1] * 1000) / 1000, Math.floor(arr[2] * 1000) / 1000];
48117 };
48118
48119 _proto.setValue = function setValue(value, updateModules) {
48120 if (value === void 0) {
48121 value = {};
48122 }
48123
48124 if (updateModules === void 0) {
48125 updateModules = true;
48126 }
48127
48128 var self = this;
48129 if (typeof value === 'undefined') return;
48130
48131 var _ref = self.value || {},
48132 hex = _ref.hex,
48133 rgb = _ref.rgb,
48134 hsl = _ref.hsl,
48135 hsb = _ref.hsb,
48136 _ref$alpha = _ref.alpha,
48137 alpha = _ref$alpha === void 0 ? 1 : _ref$alpha,
48138 hue = _ref.hue,
48139 rgba = _ref.rgba,
48140 hsla = _ref.hsla;
48141
48142 var needChangeEvent = self.value || !self.value && !self.params.value;
48143 var valueChanged;
48144 Object.keys(value).forEach(function (k) {
48145 if (!self.value || typeof self.value[k] === 'undefined') {
48146 valueChanged = true;
48147 return;
48148 }
48149
48150 var v = value[k];
48151
48152 if (Array.isArray(v)) {
48153 v.forEach(function (subV, subIndex) {
48154 if (subV !== self.value[k][subIndex]) {
48155 valueChanged = true;
48156 }
48157 });
48158 } else if (v !== self.value[k]) {
48159 valueChanged = true;
48160 }
48161 });
48162 if (!valueChanged) return;
48163
48164 if (value.rgb || value.rgba) {
48165 var _ref2 = value.rgb || value.rgba,
48166 r = _ref2[0],
48167 g = _ref2[1],
48168 b = _ref2[2],
48169 _ref2$ = _ref2[3],
48170 a = _ref2$ === void 0 ? alpha : _ref2$;
48171
48172 rgb = [r, g, b];
48173 hex = colorRgbToHex.apply(void 0, rgb);
48174 hsl = colorRgbToHsl.apply(void 0, rgb);
48175 hsb = colorHslToHsb.apply(void 0, hsl);
48176 hsl = self.normalizeHsValues(hsl);
48177 hsb = self.normalizeHsValues(hsb);
48178 hue = hsb[0];
48179 alpha = a;
48180 rgba = [rgb[0], rgb[1], rgb[2], a];
48181 hsla = [hsl[0], hsl[1], hsl[2], a];
48182 }
48183
48184 if (value.hsl || value.hsla) {
48185 var _ref3 = value.hsl || value.hsla,
48186 h = _ref3[0],
48187 s = _ref3[1],
48188 l = _ref3[2],
48189 _ref3$ = _ref3[3],
48190 _a = _ref3$ === void 0 ? alpha : _ref3$;
48191
48192 hsl = [h, s, l];
48193 rgb = colorHslToRgb.apply(void 0, hsl);
48194 hex = colorRgbToHex.apply(void 0, rgb);
48195 hsb = colorHslToHsb.apply(void 0, hsl);
48196 hsl = self.normalizeHsValues(hsl);
48197 hsb = self.normalizeHsValues(hsb);
48198 hue = hsb[0];
48199 alpha = _a;
48200 rgba = [rgb[0], rgb[1], rgb[2], _a];
48201 hsla = [hsl[0], hsl[1], hsl[2], _a];
48202 }
48203
48204 if (value.hsb) {
48205 var _value$hsb = value.hsb,
48206 _h = _value$hsb[0],
48207 _s = _value$hsb[1],
48208 _b = _value$hsb[2],
48209 _value$hsb$ = _value$hsb[3],
48210 _a2 = _value$hsb$ === void 0 ? alpha : _value$hsb$;
48211
48212 hsb = [_h, _s, _b];
48213 hsl = colorHsbToHsl.apply(void 0, hsb);
48214 rgb = colorHslToRgb.apply(void 0, hsl);
48215 hex = colorRgbToHex.apply(void 0, rgb);
48216 hsl = self.normalizeHsValues(hsl);
48217 hsb = self.normalizeHsValues(hsb);
48218 hue = hsb[0];
48219 alpha = _a2;
48220 rgba = [rgb[0], rgb[1], rgb[2], _a2];
48221 hsla = [hsl[0], hsl[1], hsl[2], _a2];
48222 }
48223
48224 if (value.hex) {
48225 rgb = colorHexToRgb(value.hex);
48226 hex = colorRgbToHex.apply(void 0, rgb);
48227 hsl = colorRgbToHsl.apply(void 0, rgb);
48228 hsb = colorHslToHsb.apply(void 0, hsl);
48229 hsl = self.normalizeHsValues(hsl);
48230 hsb = self.normalizeHsValues(hsb);
48231 hue = hsb[0];
48232 rgba = [rgb[0], rgb[1], rgb[2], alpha];
48233 hsla = [hsl[0], hsl[1], hsl[2], alpha];
48234 }
48235
48236 if (typeof value.alpha !== 'undefined') {
48237 alpha = value.alpha;
48238
48239 if (typeof rgb !== 'undefined') {
48240 rgba = [rgb[0], rgb[1], rgb[2], alpha];
48241 }
48242
48243 if (typeof hsl !== 'undefined') {
48244 hsla = [hsl[0], hsl[1], hsl[2], alpha];
48245 }
48246 }
48247
48248 if (typeof value.hue !== 'undefined') {
48249 var _hsl = hsl,
48250 _h2 = _hsl[0],
48251 _s2 = _hsl[1],
48252 _l = _hsl[2]; // eslint-disable-line
48253
48254 hsl = [value.hue, _s2, _l];
48255 hsb = colorHslToHsb.apply(void 0, hsl);
48256 rgb = colorHslToRgb.apply(void 0, hsl);
48257 hex = colorRgbToHex.apply(void 0, rgb);
48258 hsl = self.normalizeHsValues(hsl);
48259 hsb = self.normalizeHsValues(hsb);
48260 hue = hsb[0];
48261 rgba = [rgb[0], rgb[1], rgb[2], alpha];
48262 hsla = [hsl[0], hsl[1], hsl[2], alpha];
48263 }
48264
48265 self.value = {
48266 hex: hex,
48267 alpha: alpha,
48268 hue: hue,
48269 rgb: rgb,
48270 hsl: hsl,
48271 hsb: hsb,
48272 rgba: rgba,
48273 hsla: hsla
48274 };
48275 if (!self.initialValue) self.initialValue = extend$1({}, self.value);
48276 self.updateValue(needChangeEvent);
48277
48278 if (self.opened && updateModules) {
48279 self.updateModules();
48280 }
48281 };
48282
48283 _proto.getValue = function getValue() {
48284 var self = this;
48285 return self.value;
48286 };
48287
48288 _proto.updateValue = function updateValue(fireEvents) {
48289 if (fireEvents === void 0) {
48290 fireEvents = true;
48291 }
48292
48293 var self = this;
48294 var $inputEl = self.$inputEl,
48295 value = self.value,
48296 $targetEl = self.$targetEl;
48297
48298 if ($targetEl && self.params.targetElSetBackgroundColor) {
48299 var rgba = value.rgba;
48300 $targetEl.css('background-color', "rgba(" + rgba.join(', ') + ")");
48301 }
48302
48303 if (fireEvents) {
48304 self.emit('local::change colorPickerChange', self, value);
48305 }
48306
48307 if ($inputEl && $inputEl.length) {
48308 var inputValue = self.formatValue(value);
48309
48310 if ($inputEl && $inputEl.length) {
48311 $inputEl.val(inputValue);
48312
48313 if (fireEvents) {
48314 $inputEl.trigger('change');
48315 }
48316 }
48317 }
48318 };
48319
48320 _proto.updateModules = function updateModules() {
48321 var self = this;
48322 var modules = self.modules;
48323 self.params.modules.forEach(function (m) {
48324 if (typeof m === 'string' && modules[m] && modules[m].update) {
48325 modules[m].update(self);
48326 } else if (m && m.update) {
48327 m.update(self);
48328 }
48329 });
48330 };
48331
48332 _proto.update = function update() {
48333 var self = this;
48334 self.updateModules();
48335 };
48336
48337 _proto.renderPicker = function renderPicker() {
48338 var self = this;
48339 var params = self.params,
48340 modules = self.modules;
48341 var html = '';
48342 params.modules.forEach(function (m) {
48343 if (typeof m === 'string' && modules[m] && modules[m].render) {
48344 html += modules[m].render(self);
48345 } else if (m && m.render) {
48346 html += m.render(self);
48347 }
48348 });
48349 return html;
48350 };
48351
48352 _proto.renderNavbar = function renderNavbar() {
48353 var self = this;
48354
48355 if (self.params.renderNavbar) {
48356 return self.params.renderNavbar.call(self, self);
48357 }
48358
48359 var _self$params = self.params,
48360 openIn = _self$params.openIn,
48361 navbarTitleText = _self$params.navbarTitleText,
48362 navbarBackLinkText = _self$params.navbarBackLinkText,
48363 navbarCloseText = _self$params.navbarCloseText;
48364 return $jsx("div", {
48365 class: "navbar"
48366 }, $jsx("div", {
48367 class: "navbar-bg"
48368 }), $jsx("div", {
48369 class: "navbar-inner sliding"
48370 }, openIn === 'page' && $jsx("div", {
48371 class: "left"
48372 }, $jsx("a", {
48373 class: "link back"
48374 }, $jsx("i", {
48375 class: "icon icon-back"
48376 }), $jsx("span", {
48377 class: "if-not-md"
48378 }, navbarBackLinkText))), $jsx("div", {
48379 class: "title"
48380 }, navbarTitleText), openIn !== 'page' && $jsx("div", {
48381 class: "right"
48382 }, $jsx("a", {
48383 class: "link popup-close",
48384 "data-popup": ".color-picker-popup"
48385 }, navbarCloseText))));
48386 };
48387
48388 _proto.renderToolbar = function renderToolbar() {
48389 var self = this;
48390
48391 if (self.params.renderToolbar) {
48392 return self.params.renderToolbar.call(self, self);
48393 }
48394
48395 return $jsx("div", {
48396 class: "toolbar toolbar-top no-shadow"
48397 }, $jsx("div", {
48398 class: "toolbar-inner"
48399 }, $jsx("div", {
48400 class: "left"
48401 }), $jsx("div", {
48402 class: "right"
48403 }, $jsx("a", {
48404 class: "link sheet-close popover-close",
48405 "data-sheet": ".color-picker-sheet-modal",
48406 "data-popover": ".color-picker-popover"
48407 }, self.params.toolbarCloseText))));
48408 };
48409
48410 _proto.renderInline = function renderInline() {
48411 var self = this;
48412 var _self$params2 = self.params,
48413 cssClass = _self$params2.cssClass,
48414 groupedModules = _self$params2.groupedModules;
48415 return $jsx("div", {
48416 class: "color-picker color-picker-inline " + (groupedModules ? 'color-picker-grouped-modules' : '') + " " + (cssClass || '')
48417 }, self.renderPicker());
48418 };
48419
48420 _proto.renderSheet = function renderSheet() {
48421 var self = this;
48422 var _self$params3 = self.params,
48423 cssClass = _self$params3.cssClass,
48424 toolbarSheet = _self$params3.toolbarSheet,
48425 groupedModules = _self$params3.groupedModules;
48426 return $jsx("div", {
48427 class: "sheet-modal color-picker color-picker-sheet-modal " + (groupedModules ? 'color-picker-grouped-modules' : '') + " " + (cssClass || '')
48428 }, toolbarSheet && self.renderToolbar(), $jsx("div", {
48429 class: "sheet-modal-inner"
48430 }, $jsx("div", {
48431 class: "page-content"
48432 }, self.renderPicker())));
48433 };
48434
48435 _proto.renderPopover = function renderPopover() {
48436 var self = this;
48437 var _self$params4 = self.params,
48438 cssClass = _self$params4.cssClass,
48439 toolbarPopover = _self$params4.toolbarPopover,
48440 groupedModules = _self$params4.groupedModules;
48441 return $jsx("div", {
48442 class: "popover color-picker-popover " + (cssClass || '')
48443 }, $jsx("div", {
48444 class: "popover-inner"
48445 }, $jsx("div", {
48446 class: "color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '')
48447 }, toolbarPopover && self.renderToolbar(), $jsx("div", {
48448 class: "page-content"
48449 }, self.renderPicker()))));
48450 };
48451
48452 _proto.renderPopup = function renderPopup() {
48453 var self = this;
48454 var _self$params5 = self.params,
48455 cssClass = _self$params5.cssClass,
48456 navbarPopup = _self$params5.navbarPopup,
48457 groupedModules = _self$params5.groupedModules;
48458 return $jsx("div", {
48459 class: "popup color-picker-popup " + (cssClass || '')
48460 }, $jsx("div", {
48461 class: "page"
48462 }, navbarPopup && self.renderNavbar(), $jsx("div", {
48463 class: "color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '')
48464 }, $jsx("div", {
48465 class: "page-content"
48466 }, self.renderPicker()))));
48467 };
48468
48469 _proto.renderPage = function renderPage() {
48470 var self = this;
48471 var _self$params6 = self.params,
48472 cssClass = _self$params6.cssClass,
48473 groupedModules = _self$params6.groupedModules;
48474 return $jsx("div", {
48475 class: "page color-picker-page " + (cssClass || ''),
48476 "data-name": "color-picker-page"
48477 }, self.renderNavbar(), $jsx("div", {
48478 class: "color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '')
48479 }, $jsx("div", {
48480 class: "page-content"
48481 }, self.renderPicker())));
48482 } // eslint-disable-next-line
48483 ;
48484
48485 _proto.render = function render() {
48486 var self = this;
48487 var params = self.params;
48488 if (params.render) return params.render.call(self);
48489 if (self.inline) return self.renderInline();
48490
48491 if (params.openIn === 'page') {
48492 return self.renderPage();
48493 }
48494
48495 var modalType = self.getModalType();
48496 if (modalType === 'popover') return self.renderPopover();
48497 if (modalType === 'sheet') return self.renderSheet();
48498 if (modalType === 'popup') return self.renderPopup();
48499 };
48500
48501 _proto.onOpen = function onOpen() {
48502 var self = this;
48503 var initialized = self.initialized,
48504 $el = self.$el,
48505 app = self.app,
48506 $inputEl = self.$inputEl,
48507 inline = self.inline,
48508 value = self.value,
48509 params = self.params,
48510 modules = self.modules;
48511 self.closing = false;
48512 self.opened = true;
48513 self.opening = true; // Init main events
48514
48515 self.attachEvents();
48516 params.modules.forEach(function (m) {
48517 if (typeof m === 'string' && modules[m] && modules[m].init) {
48518 modules[m].init(self);
48519 } else if (m && m.init) {
48520 m.init(self);
48521 }
48522 });
48523 var updateValue = !value && params.value; // Set value
48524
48525 if (!initialized) {
48526 if (value) self.setValue(value);else if (params.value) {
48527 self.setValue(params.value, false);
48528 } else if (!params.value) {
48529 self.setValue({
48530 hex: '#ff0000'
48531 }, false);
48532 }
48533 } else if (value) {
48534 self.initialValue = extend$1({}, value);
48535 self.setValue(value, false);
48536 } // Update input value
48537
48538
48539 if (updateValue) self.updateValue();
48540 self.updateModules(); // Center modules
48541
48542 if (params.centerModules) {
48543 self.centerModules();
48544 } // Extra focus
48545
48546
48547 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
48548 $inputEl.trigger('focus');
48549 }
48550
48551 self.initialized = true; // Trigger events
48552
48553 if ($el) {
48554 $el.trigger('colorpicker:open');
48555 }
48556
48557 if ($inputEl) {
48558 $inputEl.trigger('colorpicker:open');
48559 }
48560
48561 self.emit('local::open colorPickerOpen', self);
48562 };
48563
48564 _proto.onOpened = function onOpened() {
48565 var self = this;
48566 self.opening = false;
48567
48568 if (self.$el) {
48569 self.$el.trigger('colorpicker:opened');
48570 }
48571
48572 if (self.$inputEl) {
48573 self.$inputEl.trigger('colorpicker:opened');
48574 }
48575
48576 self.emit('local::opened colorPickerOpened', self);
48577 };
48578
48579 _proto.onClose = function onClose() {
48580 var self = this;
48581 var app = self.app,
48582 params = self.params,
48583 modules = self.modules;
48584 self.opening = false;
48585 self.closing = true; // Detach events
48586
48587 self.detachEvents();
48588
48589 if (self.$inputEl) {
48590 if (app.theme === 'md') {
48591 self.$inputEl.trigger('blur');
48592 } else {
48593 var validate = self.$inputEl.attr('validate');
48594 var required = self.$inputEl.attr('required');
48595
48596 if (validate && required) {
48597 app.input.validate(self.$inputEl);
48598 }
48599 }
48600 }
48601
48602 params.modules.forEach(function (m) {
48603 if (typeof m === 'string' && modules[m] && modules[m].destroy) {
48604 modules[m].destroy(self);
48605 } else if (m && m.destroy) {
48606 m.destroy(self);
48607 }
48608 });
48609
48610 if (self.$el) {
48611 self.$el.trigger('colorpicker:close');
48612 }
48613
48614 if (self.$inputEl) {
48615 self.$inputEl.trigger('colorpicker:close');
48616 }
48617
48618 self.emit('local::close colorPickerClose', self);
48619 };
48620
48621 _proto.onClosed = function onClosed() {
48622 var self = this;
48623 self.opened = false;
48624 self.closing = false;
48625
48626 if (!self.inline) {
48627 nextTick$1(function () {
48628 if (self.modal && self.modal.el && self.modal.destroy) {
48629 if (!self.params.routableModals) {
48630 self.modal.destroy();
48631 }
48632 }
48633
48634 delete self.modal;
48635 });
48636 }
48637
48638 if (self.$el) {
48639 self.$el.trigger('colorpicker:closed');
48640 }
48641
48642 if (self.$inputEl) {
48643 self.$inputEl.trigger('colorpicker:closed');
48644 }
48645
48646 self.emit('local::closed colorPickerClosed', self);
48647 };
48648
48649 _proto.open = function open() {
48650 var self = this;
48651 var app = self.app,
48652 opened = self.opened,
48653 inline = self.inline,
48654 $inputEl = self.$inputEl,
48655 $targetEl = self.$targetEl,
48656 params = self.params;
48657 if (opened) return;
48658
48659 if (inline) {
48660 self.$el = $(self.render());
48661 self.$el[0].f7ColorPicker = self;
48662 self.$containerEl.append(self.$el);
48663 self.onOpen();
48664 self.onOpened();
48665 return;
48666 }
48667
48668 var colorPickerContent = self.render();
48669
48670 if (params.openIn === 'page') {
48671 self.view.router.navigate({
48672 url: self.url,
48673 route: {
48674 content: colorPickerContent,
48675 path: self.url,
48676 on: {
48677 pageBeforeIn: function pageBeforeIn(e, page) {
48678 self.$el = page.$el.find('.color-picker');
48679 self.$el[0].f7ColorPicker = self;
48680 self.onOpen();
48681 },
48682 pageAfterIn: function pageAfterIn() {
48683 self.onOpened();
48684 },
48685 pageBeforeOut: function pageBeforeOut() {
48686 self.onClose();
48687 },
48688 pageAfterOut: function pageAfterOut() {
48689 self.onClosed();
48690
48691 if (self.$el && self.$el[0]) {
48692 self.$el[0].f7ColorPicker = null;
48693 delete self.$el[0].f7ColorPicker;
48694 }
48695 }
48696 }
48697 }
48698 });
48699 } else {
48700 var modalType = self.getModalType();
48701 var backdrop = params.backdrop;
48702
48703 if (backdrop === null || typeof backdrop === 'undefined') {
48704 if (modalType === 'popover' && app.params.popover.backdrop !== false) backdrop = true;
48705 if (modalType === 'popup') backdrop = true;
48706 }
48707
48708 var modalParams = {
48709 targetEl: $targetEl || $inputEl,
48710 scrollToEl: params.scrollToInput ? $targetEl || $inputEl : undefined,
48711 content: colorPickerContent,
48712 backdrop: backdrop,
48713 closeByBackdropClick: params.closeByBackdropClick,
48714 on: {
48715 open: function open() {
48716 var modal = this;
48717 self.modal = modal;
48718 self.$el = modalType === 'popover' || modalType === 'popup' ? modal.$el.find('.color-picker') : modal.$el;
48719 self.$el[0].f7ColorPicker = self;
48720 self.onOpen();
48721 },
48722 opened: function opened() {
48723 self.onOpened();
48724 },
48725 close: function close() {
48726 self.onClose();
48727 },
48728 closed: function closed() {
48729 self.onClosed();
48730
48731 if (self.$el && self.$el[0]) {
48732 self.$el[0].f7ColorPicker = null;
48733 delete self.$el[0].f7ColorPicker;
48734 }
48735 }
48736 }
48737 };
48738
48739 if (modalType === 'popup') {
48740 modalParams.push = params.popupPush;
48741 modalParams.swipeToClose = params.popupSwipeToClose;
48742 }
48743
48744 if (modalType === 'sheet') {
48745 modalParams.push = params.sheetPush;
48746 modalParams.swipeToClose = params.sheetSwipeToClose;
48747 }
48748
48749 if (params.routableModals && self.view) {
48750 var _route;
48751
48752 self.view.router.navigate({
48753 url: self.url,
48754 route: (_route = {
48755 path: self.url
48756 }, _route[modalType] = modalParams, _route)
48757 });
48758 } else {
48759 self.modal = app[modalType].create(modalParams);
48760 self.modal.open();
48761 }
48762 }
48763 };
48764
48765 _proto.close = function close() {
48766 var self = this;
48767 var opened = self.opened,
48768 inline = self.inline;
48769 if (!opened) return;
48770
48771 if (inline) {
48772 self.onClose();
48773 self.onClosed();
48774 return;
48775 }
48776
48777 if (self.params.routableModals && self.view || self.params.openIn === 'page') {
48778 self.view.router.back();
48779 } else {
48780 self.modal.close();
48781 }
48782 };
48783
48784 _proto.init = function init() {
48785 var self = this;
48786 self.initInput();
48787
48788 if (self.inline) {
48789 self.open();
48790 self.emit('local::init colorPickerInit', self);
48791 return;
48792 }
48793
48794 if (!self.initialized && self.params.value) {
48795 self.setValue(self.params.value);
48796 } // Attach input Events
48797
48798
48799 if (self.$inputEl) {
48800 self.attachInputEvents();
48801 }
48802
48803 if (self.$targetEl) {
48804 self.attachTargetEvents();
48805 }
48806
48807 if (self.params.closeByOutsideClick) {
48808 self.attachHtmlEvents();
48809 }
48810
48811 self.emit('local::init colorPickerInit', self);
48812 };
48813
48814 _proto.destroy = function destroy() {
48815 var self = this;
48816 if (self.destroyed) return;
48817 var $el = self.$el;
48818 self.emit('local::beforeDestroy colorPickerBeforeDestroy', self);
48819 if ($el) $el.trigger('colorpicker:beforedestroy');
48820 self.close(); // Detach Events
48821
48822 self.detachEvents();
48823
48824 if (self.$inputEl) {
48825 self.detachInputEvents();
48826 }
48827
48828 if (self.$targetEl) {
48829 self.detachTargetEvents();
48830 }
48831
48832 if (self.params.closeByOutsideClick) {
48833 self.detachHtmlEvents();
48834 }
48835
48836 if ($el && $el.length) delete self.$el[0].f7ColorPicker;
48837 deleteProps$1(self);
48838 self.destroyed = true;
48839 };
48840
48841 _createClass$1(ColorPicker, [{
48842 key: "view",
48843 get: function get() {
48844 var $inputEl = this.$inputEl,
48845 $targetEl = this.$targetEl,
48846 app = this.app,
48847 params = this.params;
48848 var view;
48849
48850 if (params.view) {
48851 view = params.view;
48852 } else {
48853 if ($inputEl) {
48854 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
48855 }
48856
48857 if (!view && $targetEl) {
48858 view = $targetEl.parents('.view').length && $targetEl.parents('.view')[0].f7View;
48859 }
48860 }
48861
48862 if (!view) view = app.views.main;
48863 return view;
48864 }
48865 }]);
48866
48867 return ColorPicker;
48868 }(Framework7Class);
48869
48870 var ColorPicker = {
48871 name: 'colorPicker',
48872 static: {
48873 ColorPicker: ColorPicker$1
48874 },
48875 create: function create() {
48876 var app = this;
48877 app.colorPicker = ConstructorMethods({
48878 defaultSelector: '.color-picker',
48879 constructor: ColorPicker$1,
48880 app: app,
48881 domProp: 'f7ColorPicker'
48882 });
48883
48884 app.colorPicker.close = function close(el) {
48885 if (el === void 0) {
48886 el = '.color-picker';
48887 }
48888
48889 var $el = $(el);
48890 if ($el.length === 0) return;
48891 var colorPicker = $el[0].f7ColorPicker;
48892 if (!colorPicker || colorPicker && !colorPicker.opened) return;
48893 colorPicker.close();
48894 };
48895 },
48896 params: {
48897 colorPicker: {
48898 // Color picker settings
48899 value: null,
48900 modules: ['wheel'],
48901 palette: [['#FFEBEE', '#FFCDD2', '#EF9A9A', '#E57373', '#EF5350', '#F44336', '#E53935', '#D32F2F', '#C62828', '#B71C1C'], ['#F3E5F5', '#E1BEE7', '#CE93D8', '#BA68C8', '#AB47BC', '#9C27B0', '#8E24AA', '#7B1FA2', '#6A1B9A', '#4A148C'], ['#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E'], ['#E1F5FE', '#B3E5FC', '#81D4FA', '#4FC3F7', '#29B6F6', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B'], ['#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40'], ['#F1F8E9', '#DCEDC8', '#C5E1A5', '#AED581', '#9CCC65', '#8BC34A', '#7CB342', '#689F38', '#558B2F', '#33691E'], ['#FFFDE7', '#FFF9C4', '#FFF59D', '#FFF176', '#FFEE58', '#FFEB3B', '#FDD835', '#FBC02D', '#F9A825', '#F57F17'], ['#FFF3E0', '#FFE0B2', '#FFCC80', '#FFB74D', '#FFA726', '#FF9800', '#FB8C00', '#F57C00', '#EF6C00', '#E65100']],
48902 groupedModules: false,
48903 centerModules: true,
48904 sliderLabel: false,
48905 sliderValue: false,
48906 sliderValueEdiable: false,
48907 barLabel: false,
48908 barValue: false,
48909 barValueEdiable: false,
48910 hexLabel: false,
48911 hexValueEditable: false,
48912 redLabelText: 'R',
48913 greenLabelText: 'G',
48914 blueLabelText: 'B',
48915 hueLabelText: 'H',
48916 saturationLabelText: 'S',
48917 brightnessLabelText: 'B',
48918 hexLabelText: 'HEX',
48919 alphaLabelText: 'A',
48920 // Common opener settings
48921 containerEl: null,
48922 openIn: 'popover',
48923 // or 'popover' or 'sheet' or 'popup' or 'page' or 'auto'
48924 openInPhone: 'popup',
48925 // or 'popover' or 'sheet' or 'popup' or 'page'
48926 popupPush: false,
48927 popupSwipeToClose: undefined,
48928 sheetPush: false,
48929 sheetSwipeToClose: undefined,
48930 formatValue: null,
48931 targetEl: null,
48932 targetElSetBackgroundColor: false,
48933 inputEl: null,
48934 inputReadOnly: true,
48935 closeByOutsideClick: true,
48936 scrollToInput: true,
48937 toolbarSheet: true,
48938 toolbarPopover: false,
48939 toolbarCloseText: 'Done',
48940 navbarPopup: true,
48941 navbarCloseText: 'Done',
48942 navbarTitleText: 'Color',
48943 navbarBackLinkText: 'Back',
48944 cssClass: null,
48945 routableModals: false,
48946 view: null,
48947 url: 'color/',
48948 backdrop: null,
48949 closeByBackdropClick: true,
48950 // Render functions
48951 renderToolbar: null,
48952 renderNavbar: null,
48953 renderInline: null,
48954 renderPopover: null,
48955 renderSheet: null,
48956 renderPopup: null,
48957 render: null
48958 }
48959 }
48960 };
48961
48962 var Treeview = {
48963 open: function open(itemEl) {
48964 var app = this;
48965 var $itemEl = $(itemEl).eq(0);
48966 if (!$itemEl.length) return;
48967 $itemEl.addClass('treeview-item-opened');
48968 $itemEl.trigger('treeview:open');
48969 app.emit('treeviewOpen', $itemEl[0]);
48970
48971 function done(cancel) {
48972 if (cancel) {
48973 $itemEl.removeClass('treeview-item-opened');
48974 $itemEl.trigger('treeview:close');
48975 app.emit('treeviewClose', $itemEl[0]);
48976 } else {
48977 $itemEl[0].f7TreeviewChildrenLoaded = true;
48978 }
48979
48980 $itemEl.find('.treeview-toggle').removeClass('treeview-toggle-hidden');
48981 $itemEl.find('.treeview-preloader').remove();
48982 }
48983
48984 if ($itemEl.hasClass('treeview-load-children') && !$itemEl[0].f7TreeviewChildrenLoaded) {
48985 var preloaders = {
48986 iosPreloaderContent: iosPreloaderContent,
48987 mdPreloaderContent: mdPreloaderContent,
48988 auroraPreloaderContent: auroraPreloaderContent
48989 };
48990 $itemEl.trigger('treeview:loadchildren', done);
48991 app.emit('treeviewLoadChildren', $itemEl[0], done);
48992 $itemEl.find('.treeview-toggle').addClass('treeview-toggle-hidden');
48993 $itemEl.find('.treeview-item-root').prepend("<div class=\"preloader treeview-preloader\">" + preloaders[app.theme + "PreloaderContent"] + "</div>");
48994 }
48995 },
48996 close: function close(itemEl) {
48997 var app = this;
48998 var $itemEl = $(itemEl).eq(0);
48999 if (!$itemEl.length) return;
49000 $itemEl.removeClass('treeview-item-opened');
49001 $itemEl.trigger('treeview:close');
49002 app.emit('treeviewClose', $itemEl[0]);
49003 },
49004 toggle: function toggle(itemEl) {
49005 var app = this;
49006 var $itemEl = $(itemEl).eq(0);
49007 if (!$itemEl.length) return;
49008 var wasOpened = $itemEl.hasClass('treeview-item-opened');
49009 app.treeview[wasOpened ? 'close' : 'open']($itemEl);
49010 }
49011 };
49012 var Treeview$1 = {
49013 name: 'treeview',
49014 create: function create() {
49015 var app = this;
49016 bindMethods(app, {
49017 treeview: Treeview
49018 });
49019 },
49020 clicks: {
49021 '.treeview-toggle': function toggle($clickedEl, clickedData, e) {
49022 var app = this;
49023 if ($clickedEl.parents('.treeview-item-toggle').length) return;
49024 var $treeviewItemEl = $clickedEl.parents('.treeview-item').eq(0);
49025 if (!$treeviewItemEl.length) return;
49026 e.preventF7Router = true;
49027 app.treeview.toggle($treeviewItemEl[0]);
49028 },
49029 '.treeview-item-toggle': function toggle($clickedEl, clickedData, e) {
49030 var app = this;
49031 var $treeviewItemEl = $clickedEl.closest('.treeview-item').eq(0);
49032 if (!$treeviewItemEl.length) return;
49033 e.preventF7Router = true;
49034 app.treeview.toggle($treeviewItemEl[0]);
49035 }
49036 }
49037 };
49038
49039 var textEditorButtonsMap = {
49040 // f7-icon, material-icon, command
49041 bold: ['bold', 'format_bold', 'bold'],
49042 italic: ['italic', 'format_italic', 'italic'],
49043 underline: ['underline', 'format_underlined', 'underline'],
49044 strikeThrough: ['strikethrough', 'strikethrough_s', 'strikeThrough'],
49045 orderedList: ['list_number', 'format_list_numbered', 'insertOrderedList'],
49046 unorderedList: ['list_bullet', 'format_list_bulleted', 'insertUnorderedList'],
49047 link: ['link', 'link', 'createLink'],
49048 image: ['photo', 'image', 'insertImage'],
49049 paragraph: ['paragraph', '<i class="icon">¶</i>', 'formatBlock.P'],
49050 h1: ['<i class="icon">H<sub>1</sub></i>', '<i class="icon">H<sub>1</sub></i>', 'formatBlock.H1'],
49051 h2: ['<i class="icon">H<sub>2</sub></i>', '<i class="icon">H<sub>2</sub></i>', 'formatBlock.H2'],
49052 h3: ['<i class="icon">H<sub>3</sub></i>', '<i class="icon">H<sub>3</sub></i>', 'formatBlock.H3'],
49053 alignLeft: ['text_alignleft', 'format_align_left', 'justifyLeft'],
49054 alignCenter: ['text_aligncenter', 'format_align_center', 'justifyCenter'],
49055 alignRight: ['text_alignright', 'format_align_right', 'justifyRight'],
49056 alignJustify: ['text_justify', 'format_align_justify', 'justifyFull'],
49057 subscript: ['textformat_subscript', '<i class="icon">A<sub>1</sub></i>', 'subscript'],
49058 superscript: ['textformat_superscript', '<i class="icon">A<sup>1</sup></i>', 'superscript'],
49059 indent: ['increase_indent', 'format_indent_increase', 'indent'],
49060 outdent: ['decrease_indent', 'format_indent_decrease', 'outdent']
49061 };
49062
49063 var TextEditor$1 = /*#__PURE__*/function (_Framework7Class) {
49064 _inheritsLoose(TextEditor, _Framework7Class);
49065
49066 function TextEditor(app, params) {
49067 var _this;
49068
49069 _this = _Framework7Class.call(this, params, [app]) || this;
49070
49071 var self = _assertThisInitialized(_this);
49072
49073 var document = getDocument();
49074 var device = getDevice$1();
49075 var defaults = extend$1({}, app.params.textEditor); // Extend defaults with modules params
49076
49077 self.useModulesParams(defaults);
49078 self.params = extend$1(defaults, params);
49079 var el = self.params.el;
49080 if (!el) return self || _assertThisInitialized(_this);
49081 var $el = $(el);
49082 if ($el.length === 0) return self || _assertThisInitialized(_this);
49083 if ($el[0].f7TextEditor) return $el[0].f7TextEditor || _assertThisInitialized(_this);
49084 var $contentEl = $el.children('.text-editor-content');
49085
49086 if (!$contentEl.length) {
49087 $el.append('<div class="text-editor-content" contenteditable></div>');
49088 $contentEl = $el.children('.text-editor-content');
49089 }
49090
49091 extend$1(self, {
49092 app: app,
49093 $el: $el,
49094 el: $el[0],
49095 $contentEl: $contentEl,
49096 contentEl: $contentEl[0]
49097 });
49098
49099 if ('value' in params) {
49100 self.value = self.params.value;
49101 }
49102
49103 if (self.params.mode === 'keyboard-toolbar') {
49104 if (!(device.cordova || device.capacitor) && !device.android) {
49105 self.params.mode = 'popover';
49106 }
49107 }
49108
49109 if (typeof self.params.buttons === 'string') {
49110 try {
49111 self.params.buttons = JSON.parse(self.params.buttons);
49112 } catch (err) {
49113 throw new Error('Framework7: TextEditor: wrong "buttons" parameter format');
49114 }
49115 }
49116
49117 $el[0].f7TextEditor = self; // Bind
49118
49119 self.onButtonClick = self.onButtonClick.bind(self);
49120 self.onFocus = self.onFocus.bind(self);
49121 self.onBlur = self.onBlur.bind(self);
49122 self.onInput = self.onInput.bind(self);
49123 self.onPaste = self.onPaste.bind(self);
49124 self.onSelectionChange = self.onSelectionChange.bind(self);
49125 self.closeKeyboardToolbar = self.closeKeyboardToolbar.bind(self); // Handle Events
49126
49127 self.attachEvents = function attachEvents() {
49128 if (self.params.mode === 'toolbar') {
49129 self.$el.find('.text-editor-toolbar').on('click', 'button', self.onButtonClick);
49130 }
49131
49132 if (self.params.mode === 'keyboard-toolbar') {
49133 self.$keyboardToolbarEl.on('click', 'button', self.onButtonClick);
49134 self.$el.parents('.page').on('page:beforeout', self.closeKeyboardToolbar);
49135 }
49136
49137 if (self.params.mode === 'popover' && self.popover) {
49138 self.popover.$el.on('click', 'button', self.onButtonClick);
49139 }
49140
49141 self.$contentEl.on('paste', self.onPaste);
49142 self.$contentEl.on('focus', self.onFocus);
49143 self.$contentEl.on('blur', self.onBlur);
49144 self.$contentEl.on('input', self.onInput, true);
49145 $(document).on('selectionchange', self.onSelectionChange);
49146 };
49147
49148 self.detachEvents = function detachEvents() {
49149 if (self.params.mode === 'toolbar') {
49150 self.$el.find('.text-editor-toolbar').off('click', 'button', self.onButtonClick);
49151 }
49152
49153 if (self.params.mode === 'keyboard-toolbar') {
49154 self.$keyboardToolbarEl.off('click', 'button', self.onButtonClick);
49155 self.$el.parents('.page').off('page:beforeout', self.closeKeyboardToolbar);
49156 }
49157
49158 if (self.params.mode === 'popover' && self.popover) {
49159 self.popover.$el.off('click', 'button', self.onButtonClick);
49160 }
49161
49162 self.$contentEl.off('paste', self.onPaste);
49163 self.$contentEl.off('focus', self.onFocus);
49164 self.$contentEl.off('blur', self.onBlur);
49165 self.$contentEl.off('input', self.onInput, true);
49166 $(document).off('selectionchange', self.onSelectionChange);
49167 }; // Install Modules
49168
49169
49170 self.useModules(); // Init
49171
49172 self.init();
49173 return self || _assertThisInitialized(_this);
49174 }
49175
49176 var _proto = TextEditor.prototype;
49177
49178 _proto.setValue = function setValue(newValue) {
49179 var self = this;
49180 var currentValue = self.value;
49181 if (currentValue === newValue) return self;
49182 self.value = newValue;
49183 self.$contentEl.html(newValue);
49184 self.$el.trigger('texteditor:change', self.value);
49185 self.emit('local::change textEditorChange', self, self.value);
49186 return self;
49187 };
49188
49189 _proto.getValue = function getValue() {
49190 var self = this;
49191 return self.value;
49192 };
49193
49194 _proto.clearValue = function clearValue() {
49195 var self = this;
49196 self.setValue('');
49197
49198 if (self.params.placeholder && !self.$contentEl.html()) {
49199 self.insertPlaceholder();
49200 }
49201
49202 return self;
49203 };
49204
49205 _proto.createLink = function createLink() {
49206 var self = this;
49207 var window = getWindow();
49208 var document = getDocument();
49209 var currentSelection = window.getSelection();
49210 var selectedNodes = [];
49211 var $selectedLinks;
49212
49213 if (currentSelection && currentSelection.anchorNode && $(currentSelection.anchorNode).parents(self.$el).length) {
49214 var anchorNode = currentSelection.anchorNode;
49215
49216 while (anchorNode) {
49217 selectedNodes.push(anchorNode);
49218
49219 if (!anchorNode.nextSibling || anchorNode === currentSelection.focusNode) {
49220 anchorNode = null;
49221 }
49222
49223 if (anchorNode) {
49224 anchorNode = anchorNode.nextSibling;
49225 }
49226 }
49227
49228 var selectedNodesLinks = [];
49229 var $selectedNodes = $(selectedNodes);
49230
49231 for (var i = 0; i < $selectedNodes.length; i += 1) {
49232 var childNodes = $selectedNodes[i].children;
49233
49234 if (childNodes) {
49235 for (var j = 0; j < childNodes.length; j += 1) {
49236 if ($(childNodes[j]).is('a')) {
49237 selectedNodesLinks.push(childNodes[j]);
49238 }
49239 }
49240 }
49241 }
49242
49243 $selectedLinks = $selectedNodes.closest('a').add($(selectedNodesLinks));
49244 }
49245
49246 if ($selectedLinks && $selectedLinks.length) {
49247 $selectedLinks.each(function (linkNode) {
49248 var selection = window.getSelection();
49249 var range = document.createRange();
49250 range.selectNodeContents(linkNode);
49251 selection.removeAllRanges();
49252 selection.addRange(range);
49253 document.execCommand('unlink', false);
49254 selection.removeAllRanges();
49255 });
49256 return self;
49257 }
49258
49259 var currentRange = self.getSelectionRange();
49260 if (!currentRange) return self;
49261 var dialog = self.app.dialog.prompt(self.params.linkUrlText, '', function (link) {
49262 if (link && link.trim().length) {
49263 self.setSelectionRange(currentRange);
49264 document.execCommand('createLink', false, link.trim());
49265 self.$el.trigger('texteditor:insertlink', {
49266 url: link.trim()
49267 });
49268 self.emit('local:insertLink textEditorInsertLink', self, link.trim());
49269 }
49270 });
49271 dialog.$el.find('input').focus();
49272 return self;
49273 };
49274
49275 _proto.insertImage = function insertImage() {
49276 var self = this;
49277 var document = getDocument();
49278 var currentRange = self.getSelectionRange();
49279 if (!currentRange) return self;
49280 var dialog = self.app.dialog.prompt(self.params.imageUrlText, '', function (imageUrl) {
49281 if (imageUrl && imageUrl.trim().length) {
49282 self.setSelectionRange(currentRange);
49283 document.execCommand('insertImage', false, imageUrl.trim());
49284 self.$el.trigger('texteditor:insertimage', {
49285 url: imageUrl.trim()
49286 });
49287 self.emit('local:insertImage textEditorInsertImage', self, imageUrl.trim());
49288 }
49289 });
49290 dialog.$el.find('input').focus();
49291 return self;
49292 };
49293
49294 _proto.removePlaceholder = function removePlaceholder() {
49295 var self = this;
49296 self.$contentEl.find('.text-editor-placeholder').remove();
49297 };
49298
49299 _proto.insertPlaceholder = function insertPlaceholder() {
49300 var self = this;
49301 self.$contentEl.append("<div class=\"text-editor-placeholder\">" + self.params.placeholder + "</div>");
49302 };
49303
49304 _proto.onSelectionChange = function onSelectionChange() {
49305 var self = this;
49306 var window = getWindow();
49307 var document = getDocument();
49308 if (self.params.mode === 'toolbar') return;
49309 var selection = window.getSelection();
49310 var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
49311
49312 if (self.params.mode === 'keyboard-toolbar') {
49313 if (!selectionIsInContent) {
49314 self.closeKeyboardToolbar();
49315 } else {
49316 self.openKeyboardToolbar();
49317 }
49318
49319 return;
49320 }
49321
49322 if (self.params.mode === 'popover') {
49323 var selectionIsInPopover = $(selection.anchorNode).parents(self.popover.el).length || selection.anchorNode === self.popover.el;
49324
49325 if (!selectionIsInContent && !selectionIsInPopover) {
49326 self.closePopover();
49327 return;
49328 }
49329
49330 if (!selection.isCollapsed && selection.rangeCount) {
49331 var range = selection.getRangeAt(0);
49332 var rect = range.getBoundingClientRect();
49333 var rootEl = self.app.$el[0] || document.body;
49334 self.openPopover(rect.x + (window.scrollX || 0) - rootEl.offsetLeft, rect.y + (window.scrollY || 0) - rootEl.offsetTop, rect.width, rect.height);
49335 } else if (selection.isCollapsed) {
49336 self.closePopover();
49337 }
49338 }
49339 };
49340
49341 _proto.onPaste = function onPaste(e) {
49342 var self = this;
49343 var document = getDocument();
49344
49345 if (self.params.clearFormattingOnPaste && e.clipboardData && e.clipboardData.getData) {
49346 var text = e.clipboardData.getData('text/plain');
49347 e.preventDefault();
49348 document.execCommand('insertText', false, text);
49349 }
49350 };
49351
49352 _proto.onInput = function onInput() {
49353 var self = this;
49354 var value = self.$contentEl.html();
49355 self.value = value;
49356 self.$el.trigger('texteditor:input');
49357 self.emit('local:input textEditorInput', self, self.value);
49358 self.$el.trigger('texteditor:change', self.value);
49359 self.emit('local::change textEditorChange', self, self.value);
49360 };
49361
49362 _proto.onFocus = function onFocus() {
49363 var self = this;
49364 self.removePlaceholder();
49365 self.$contentEl.focus();
49366 self.$el.trigger('texteditor:focus');
49367 self.emit('local::focus textEditorFocus', self);
49368 };
49369
49370 _proto.onBlur = function onBlur() {
49371 var self = this;
49372 var window = getWindow();
49373 var document = getDocument();
49374
49375 if (self.params.placeholder && self.$contentEl.html() === '') {
49376 self.insertPlaceholder();
49377 }
49378
49379 if (self.params.mode === 'popover') {
49380 var selection = window.getSelection();
49381 var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
49382 var inPopover = document.activeElement && self.popover && $(document.activeElement).closest(self.popover.$el).length;
49383
49384 if (!inPopover && !selectionIsInContent) {
49385 self.closePopover();
49386 }
49387 }
49388
49389 if (self.params.mode === 'keyboard-toolbar') {
49390 var _selection = window.getSelection();
49391
49392 var _selectionIsInContent = $(_selection.anchorNode).parents(self.contentEl).length || _selection.anchorNode === self.contentEl;
49393
49394 if (!_selectionIsInContent) {
49395 self.closeKeyboardToolbar();
49396 }
49397 }
49398
49399 self.$el.trigger('texteditor:blur');
49400 self.emit('local::blur textEditorBlur', self);
49401 };
49402
49403 _proto.onButtonClick = function onButtonClick(e) {
49404 var self = this;
49405 var window = getWindow();
49406 var document = getDocument();
49407 var selection = window.getSelection();
49408 var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
49409 if (!selectionIsInContent) return;
49410 var $buttonEl = $(e.target).closest('button');
49411
49412 if ($buttonEl.parents('form').length) {
49413 e.preventDefault();
49414 }
49415
49416 var button = $buttonEl.attr('data-button');
49417 var buttonData = self.params.customButtons && self.params.customButtons[button];
49418 if (!button || !(textEditorButtonsMap[button] || buttonData)) return;
49419 $buttonEl.trigger('texteditor:buttonclick', button);
49420 self.emit('local::buttonClick textEditorButtonClick', self, button);
49421
49422 if (buttonData) {
49423 if (buttonData.onClick) buttonData.onClick(self, $buttonEl[0]);
49424 return;
49425 }
49426
49427 var command = textEditorButtonsMap[button][2];
49428
49429 if (command === 'createLink') {
49430 self.createLink();
49431 return;
49432 }
49433
49434 if (command === 'insertImage') {
49435 self.insertImage();
49436 return;
49437 }
49438
49439 if (command.indexOf('formatBlock') === 0) {
49440 var tagName = command.split('.')[1];
49441 var $anchorNode = $(selection.anchorNode);
49442
49443 if ($anchorNode.parents(tagName.toLowerCase()).length || $anchorNode.is(tagName)) {
49444 document.execCommand('formatBlock', false, 'div');
49445 } else {
49446 document.execCommand('formatBlock', false, tagName);
49447 }
49448
49449 return;
49450 }
49451
49452 document.execCommand(command, false);
49453 } // eslint-disable-next-line
49454 ;
49455
49456 _proto.getSelectionRange = function getSelectionRange() {
49457 var window = getWindow();
49458 var document = getDocument();
49459
49460 if (window.getSelection) {
49461 var sel = window.getSelection();
49462
49463 if (sel.getRangeAt && sel.rangeCount) {
49464 return sel.getRangeAt(0);
49465 }
49466 } else if (document.selection && document.selection.createRange) {
49467 return document.selection.createRange();
49468 }
49469
49470 return null;
49471 } // eslint-disable-next-line
49472 ;
49473
49474 _proto.setSelectionRange = function setSelectionRange(range) {
49475 var window = getWindow();
49476 var document = getDocument();
49477
49478 if (range) {
49479 if (window.getSelection) {
49480 var sel = window.getSelection();
49481 sel.removeAllRanges();
49482 sel.addRange(range);
49483 } else if (document.selection && range.select) {
49484 range.select();
49485 }
49486 }
49487 };
49488
49489 _proto.renderButtons = function renderButtons() {
49490 var self = this;
49491 var html = '';
49492
49493 function renderButton(button) {
49494 var iconClass = self.app.theme === 'md' ? 'material-icons' : 'f7-icons';
49495
49496 if (self.params.customButtons && self.params.customButtons[button]) {
49497 var buttonData = self.params.customButtons[button];
49498 return "<button type=\"button\" class=\"text-editor-button\" data-button=\"" + button + "\">" + (buttonData.content || '') + "</button>";
49499 }
49500
49501 if (!textEditorButtonsMap[button]) return '';
49502 var iconContent = textEditorButtonsMap[button][self.app.theme === 'md' ? 1 : 0];
49503 return ("<button type=\"button\" class=\"text-editor-button\" data-button=\"" + button + "\">" + (iconContent.indexOf('<') >= 0 ? iconContent : "<i class=\"" + iconClass + "\">" + iconContent + "</i>") + "</button>").trim();
49504 }
49505
49506 self.params.buttons.forEach(function (button, buttonIndex) {
49507 if (Array.isArray(button)) {
49508 button.forEach(function (b) {
49509 html += renderButton(b);
49510 });
49511
49512 if (buttonIndex < self.params.buttons.length - 1 && self.params.dividers) {
49513 html += '<div class="text-editor-button-divider"></div>';
49514 }
49515 } else {
49516 html += renderButton(button);
49517 }
49518 });
49519 return html;
49520 };
49521
49522 _proto.createToolbar = function createToolbar() {
49523 var self = this;
49524 self.$el.prepend("<div class=\"text-editor-toolbar\">" + self.renderButtons() + "</div>");
49525 };
49526
49527 _proto.createKeyboardToolbar = function createKeyboardToolbar() {
49528 var self = this;
49529 self.$keyboardToolbarEl = $("<div class=\"toolbar toolbar-bottom text-editor-keyboard-toolbar\"><div class=\"toolbar-inner\">" + self.renderButtons() + "</div></div>");
49530 };
49531
49532 _proto.createPopover = function createPopover() {
49533 var self = this;
49534 self.popover = self.app.popover.create({
49535 content: "\n <div class=\"popover theme-dark text-editor-popover\">\n <div class=\"popover-inner\">" + self.renderButtons() + "</div>\n </div>\n ",
49536 closeByOutsideClick: false,
49537 backdrop: false
49538 });
49539 };
49540
49541 _proto.openKeyboardToolbar = function openKeyboardToolbar() {
49542 var self = this;
49543 if (self.$keyboardToolbarEl.parent(self.app.$el).length) return;
49544 self.$el.trigger('texteditor:keyboardopen');
49545 self.emit('local::keyboardOpen textEditorKeyboardOpen', self);
49546 self.app.$el.append(self.$keyboardToolbarEl);
49547 };
49548
49549 _proto.closeKeyboardToolbar = function closeKeyboardToolbar() {
49550 var self = this;
49551 self.$keyboardToolbarEl.remove();
49552 self.$el.trigger('texteditor:keyboardclose');
49553 self.emit('local::keyboardClose textEditorKeyboardClose', self);
49554 };
49555
49556 _proto.openPopover = function openPopover(targetX, targetY, targetWidth, targetHeight) {
49557 var self = this;
49558 if (!self.popover) return;
49559 Object.assign(self.popover.params, {
49560 targetX: targetX,
49561 targetY: targetY,
49562 targetWidth: targetWidth,
49563 targetHeight: targetHeight
49564 });
49565 clearTimeout(self.popoverTimeout);
49566 self.popoverTimeout = setTimeout(function () {
49567 if (!self.popover) return;
49568
49569 if (self.popover.opened) {
49570 self.popover.resize();
49571 } else {
49572 self.$el.trigger('texteditor:popoveropen');
49573 self.emit('local::popoverOpen textEditorPopoverOpen', self);
49574 self.popover.open();
49575 }
49576 }, 400);
49577 };
49578
49579 _proto.closePopover = function closePopover() {
49580 var self = this;
49581 clearTimeout(self.popoverTimeout);
49582 if (!self.popover || !self.popover.opened) return;
49583 self.popoverTimeout = setTimeout(function () {
49584 if (!self.popover) return;
49585 self.$el.trigger('texteditor:popoverclose');
49586 self.emit('local::popoverClose textEditorPopoverClose', self);
49587 self.popover.close();
49588 }, 400);
49589 };
49590
49591 _proto.init = function init() {
49592 var self = this;
49593
49594 if (self.value) {
49595 self.$contentEl.html(self.value);
49596 } else {
49597 self.value = self.$contentEl.html();
49598 }
49599
49600 if (self.params.placeholder && self.value === '') {
49601 self.insertPlaceholder();
49602 }
49603
49604 if (self.params.mode === 'toolbar') {
49605 self.createToolbar();
49606 } else if (self.params.mode === 'popover') {
49607 self.createPopover();
49608 } else if (self.params.mode === 'keyboard-toolbar') {
49609 self.createKeyboardToolbar();
49610 }
49611
49612 self.attachEvents();
49613 self.$el.trigger('texteditor:init');
49614 self.emit('local::init textEditorInit', self);
49615 return self;
49616 };
49617
49618 _proto.destroy = function destroy() {
49619 var self = this;
49620 self.$el.trigger('texteditor:beforedestroy');
49621 self.emit('local::beforeDestroy textEditorBeforeDestroy', self);
49622 self.detachEvents();
49623
49624 if (self.params.mode === 'keyboard-toolbar' && self.$keyboardToolbarEl) {
49625 self.$keyboardToolbarEl.remove();
49626 }
49627
49628 if (self.popover) {
49629 self.popover.close(false);
49630 self.popover.destroy();
49631 }
49632
49633 delete self.$el[0].f7TextEditor;
49634 deleteProps$1(self);
49635 self = null;
49636 };
49637
49638 return TextEditor;
49639 }(Framework7Class);
49640
49641 var TextEditor = {
49642 name: 'textEditor',
49643 params: {
49644 textEditor: {
49645 el: null,
49646 mode: 'toolbar',
49647 // or 'popover'
49648 value: undefined,
49649 // will use html content
49650 customButtons: null,
49651 buttons: [['bold', 'italic', 'underline', 'strikeThrough'], ['orderedList', 'unorderedList'], ['link', 'image'], ['paragraph', 'h1', 'h2', 'h3'], ['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'], ['subscript', 'superscript'], ['indent', 'outdent']],
49652 dividers: true,
49653 imageUrlText: 'Insert image URL',
49654 linkUrlText: 'Insert link URL',
49655 placeholder: null,
49656 clearFormattingOnPaste: true
49657 }
49658 },
49659 create: function create() {
49660 var app = this;
49661 app.textEditor = extend$1(ConstructorMethods({
49662 defaultSelector: '.text-editor',
49663 constructor: TextEditor$1,
49664 app: app,
49665 domProp: 'f7TextEditor'
49666 }));
49667 },
49668 static: {
49669 TextEditor: TextEditor$1
49670 },
49671 on: {
49672 tabMounted: function tabMounted(tabEl) {
49673 var app = this;
49674 $(tabEl).find('.text-editor-init').each(function (editorEl) {
49675 var dataset = $(editorEl).dataset();
49676 app.textEditor.create(extend$1({
49677 el: editorEl
49678 }, dataset || {}));
49679 });
49680 },
49681 tabBeforeRemove: function tabBeforeRemove(tabEl) {
49682 $(tabEl).find('.text-editor-init').each(function (editorEl) {
49683 if (editorEl.f7TextEditor) editorEl.f7TextEditor.destroy();
49684 });
49685 },
49686 pageInit: function pageInit(page) {
49687 var app = this;
49688 page.$el.find('.text-editor-init').each(function (editorEl) {
49689 var dataset = $(editorEl).dataset();
49690 app.textEditor.create(extend$1({
49691 el: editorEl
49692 }, dataset || {}));
49693 });
49694 },
49695 pageBeforeRemove: function pageBeforeRemove(page) {
49696 page.$el.find('.text-editor-init').each(function (editorEl) {
49697 if (editorEl.f7TextEditor) editorEl.f7TextEditor.destroy();
49698 });
49699 }
49700 },
49701 vnode: {
49702 'text-editor-init': {
49703 insert: function insert(vnode) {
49704 var app = this;
49705 var editorEl = vnode.elm;
49706 var dataset = $(editorEl).dataset();
49707 app.textEditor.create(extend$1({
49708 el: editorEl
49709 }, dataset || {}));
49710 },
49711 destroy: function destroy(vnode) {
49712 var editorEl = vnode.elm;
49713 if (editorEl.f7TextEditor) editorEl.f7TextEditor.destroy();
49714 }
49715 }
49716 }
49717 };
49718
49719 var PieChart$1 = /*#__PURE__*/function (_Framework7Class) {
49720 _inheritsLoose(PieChart, _Framework7Class);
49721
49722 function PieChart(app, params) {
49723 var _this;
49724
49725 if (params === void 0) {
49726 params = {};
49727 }
49728
49729 _this = _Framework7Class.call(this, params, [app]) || this;
49730
49731 var self = _assertThisInitialized(_this);
49732
49733 var defaults = extend$1({}, app.params.pieChart); // Extend defaults with modules params
49734
49735 self.useModulesParams(defaults);
49736 self.params = extend$1(defaults, params);
49737 var el = self.params.el;
49738 if (!el) return self || _assertThisInitialized(_this);
49739 var $el = $(el);
49740 if ($el.length === 0) return self || _assertThisInitialized(_this);
49741 if ($el[0].f7PieChart) return $el[0].f7PieChart || _assertThisInitialized(_this);
49742 extend$1(self, {
49743 app: app,
49744 $el: $el,
49745 el: $el && $el[0],
49746 currentIndex: null,
49747 f7Tooltip: null
49748 });
49749 $el[0].f7PieChart = self; // Install Modules
49750
49751 self.useModules();
49752 self.showTooltip = self.showTooltip.bind(_assertThisInitialized(_this));
49753 self.hideTooltip = self.hideTooltip.bind(_assertThisInitialized(_this));
49754 self.init();
49755 return self || _assertThisInitialized(_this);
49756 }
49757
49758 var _proto = PieChart.prototype;
49759
49760 _proto.getSummValue = function getSummValue() {
49761 var datasets = this.params.datasets;
49762 var summ = 0;
49763 datasets.map(function (d) {
49764 return d.value || 0;
49765 }).forEach(function (value) {
49766 summ += value;
49767 });
49768 return summ;
49769 };
49770
49771 _proto.getPaths = function getPaths() {
49772 var _this2 = this;
49773
49774 var _this$params = this.params,
49775 datasets = _this$params.datasets,
49776 size = _this$params.size;
49777 var paths = [];
49778 var cumulativePercentage = 0;
49779
49780 function getCoordinatesForPercentage(percentage) {
49781 var x = Math.cos(2 * Math.PI * percentage) * (size / 3);
49782 var y = Math.sin(2 * Math.PI * percentage) * (size / 3);
49783 return [x, y];
49784 }
49785
49786 datasets.forEach(function (_ref) {
49787 var value = _ref.value,
49788 label = _ref.label,
49789 color = _ref.color;
49790
49791 var percentage = value / _this2.getSummValue();
49792
49793 var _getCoordinatesForPer = getCoordinatesForPercentage(cumulativePercentage),
49794 startX = _getCoordinatesForPer[0],
49795 startY = _getCoordinatesForPer[1];
49796
49797 cumulativePercentage += percentage;
49798
49799 var _getCoordinatesForPer2 = getCoordinatesForPercentage(cumulativePercentage),
49800 endX = _getCoordinatesForPer2[0],
49801 endY = _getCoordinatesForPer2[1];
49802
49803 var largeArcFlag = percentage > 0.5 ? 1 : 0;
49804 var points = ["M " + startX + " " + startY, // Move
49805 "A " + size / 3 + " " + size / 3 + " 0 " + largeArcFlag + " 1 " + endX + " " + endY, // Arc
49806 'L 0 0' // Line
49807 ].join(' ');
49808 paths.push({
49809 points: points,
49810 label: label,
49811 color: color
49812 });
49813 });
49814 return paths;
49815 };
49816
49817 _proto.formatTooltipText = function formatTooltipText() {
49818 var datasets = this.params.datasets;
49819 var currentIndex = this.currentIndex;
49820 if (currentIndex === null) return '';
49821 var _datasets$currentInde = datasets[currentIndex],
49822 value = _datasets$currentInde.value,
49823 label = _datasets$currentInde.label,
49824 color = _datasets$currentInde.color;
49825 var percentage = value / this.getSummValue() * 100;
49826
49827 var round = function round(v) {
49828 if (parseInt(v, 10) === v) return v;
49829 return Math.round(v * 100) / 100;
49830 };
49831
49832 if (this.params.formatTooltip) {
49833 return this.params.formatTooltip.call(this, {
49834 index: currentIndex,
49835 value: value,
49836 label: label,
49837 color: color,
49838 percentage: percentage
49839 });
49840 }
49841
49842 var tooltipText = "" + (label ? label + ": " : '') + round(value) + " (" + round(percentage) + "%)";
49843 return "\n <div class=\"pie-chart-tooltip-label\">\n <span class=\"pie-chart-tooltip-color\" style=\"background-color: " + color + ";\"></span> " + tooltipText + "\n </div>\n ";
49844 };
49845
49846 _proto.setTooltip = function setTooltip() {
49847 var self = this;
49848 var currentIndex = self.currentIndex,
49849 el = self.el,
49850 app = self.app,
49851 params = self.params;
49852 var tooltip = params.tooltip;
49853 if (currentIndex === null && !self.f7Tooltip) return;
49854 if (!tooltip || !el) return;
49855
49856 if (currentIndex !== null && !self.f7Tooltip) {
49857 self.f7Tooltip = app.tooltip.create({
49858 trigger: 'manual',
49859 containerEl: el,
49860 targetEl: el.querySelector("path[data-index=\"" + currentIndex + "\"]"),
49861 text: self.formatTooltipText(),
49862 cssClass: 'pie-chart-tooltip'
49863 });
49864 self.f7Tooltip.show();
49865 return;
49866 }
49867
49868 if (!self.f7Tooltip) return;
49869
49870 if (currentIndex !== null) {
49871 self.f7Tooltip.setText(self.formatTooltipText());
49872 self.f7Tooltip.setTargetEl(el.querySelector("path[data-index=\"" + currentIndex + "\"]"));
49873 self.f7Tooltip.show();
49874 } else {
49875 self.f7Tooltip.hide();
49876 }
49877 };
49878
49879 _proto.render = function render() {
49880 var self = this;
49881 var size = self.params.size;
49882 var paths = self.getPaths();
49883 return $jsx("svg", {
49884 xmlns: "http://www.w3.org/2000/svg",
49885 width: size,
49886 viewBox: "-" + size / 3 + " -" + size / 3 + " " + size * 2 / 3 + " " + size * 2 / 3,
49887 style: "transform: rotate(-90deg)"
49888 }, paths.map(function (path, index) {
49889 return $jsx("path", {
49890 d: path.points,
49891 fill: path.color,
49892 "data-index": index
49893 });
49894 }));
49895 };
49896
49897 _proto.update = function update(newParams) {
49898 if (newParams === void 0) {
49899 newParams = {};
49900 }
49901
49902 var self = this;
49903 var params = self.params;
49904 Object.keys(newParams).forEach(function (param) {
49905 if (typeof newParams[param] !== 'undefined') {
49906 params[param] = newParams[param];
49907 }
49908 });
49909 if (self.$svgEl.length === 0) return self;
49910 self.$svgEl.remove();
49911 delete self.$svgEl.f7PieChart;
49912 var $svgEl = $(self.render()).eq(0);
49913 $svgEl.f7PieChart = self;
49914 extend$1(self, {
49915 $svgEl: $svgEl,
49916 svgEl: $svgEl && $svgEl[0]
49917 });
49918 self.$el.append($svgEl);
49919 return self;
49920 };
49921
49922 _proto.setCurrentIndex = function setCurrentIndex(index) {
49923 var self = this;
49924 if (index === self.currentIndex) return;
49925 var datasets = self.params.datasets;
49926 self.currentIndex = index;
49927 self.$el.trigger('piechart:select', {
49928 index: index,
49929 dataset: datasets[index]
49930 });
49931 self.emit('local::select pieChartSelect', self, index, datasets[index]);
49932 };
49933
49934 _proto.showTooltip = function showTooltip(e) {
49935 var _this3 = this;
49936
49937 var newIndex = parseInt(e.target.getAttribute('data-index'), 10);
49938 this.setCurrentIndex(newIndex);
49939 this.$svgEl.find('path').removeClass('pie-chart-hidden').forEach(function (el, index) {
49940 if (index !== _this3.currentIndex) $(el).addClass('pie-chart-hidden');
49941 });
49942 this.setTooltip();
49943 };
49944
49945 _proto.hideTooltip = function hideTooltip() {
49946 this.setCurrentIndex(null);
49947 this.$svgEl.find('path').removeClass('pie-chart-hidden');
49948 this.setTooltip();
49949 };
49950
49951 _proto.init = function init() {
49952 var self = this;
49953 var $svgEl = $(self.render()).eq(0);
49954 $svgEl.f7PieChart = self;
49955 extend$1(self, {
49956 $svgEl: $svgEl,
49957 svgEl: $svgEl && $svgEl[0]
49958 });
49959 self.$el.append($svgEl);
49960 self.$el.on('click mouseenter', 'path', self.showTooltip, true);
49961 self.$el.on('mouseleave', 'path', self.hideTooltip, true);
49962 return self;
49963 };
49964
49965 _proto.destroy = function destroy() {
49966 var self = this;
49967 if (!self.$el || self.destroyed) return;
49968 self.$el.trigger('piechart:beforedestroy');
49969 self.emit('local::beforeDestroy pieChartBeforeDestroy', self);
49970 self.$el.off('click mouseenter', 'path', self.showTooltip, true);
49971 self.$el.off('mouseleave', 'path', self.hideTooltip, true);
49972 self.$svgEl.remove();
49973
49974 if (self.f7Tooltip && self.f7Tooltip.destroy) {
49975 self.f7Tooltip.destroy();
49976 }
49977
49978 delete self.$el[0].f7PieChart;
49979 deleteProps$1(self);
49980 self.destroyed = true;
49981 };
49982
49983 return PieChart;
49984 }(Framework7Class);
49985
49986 var PieChart = {
49987 name: 'pieChart',
49988 params: {
49989 pieChart: {
49990 el: null,
49991 datasets: [],
49992 size: 320,
49993 tooltip: false,
49994 formatTooltip: null
49995 }
49996 },
49997 create: function create() {
49998 var app = this;
49999 app.pieChart = ConstructorMethods({
50000 defaultSelector: '.pie-chart',
50001 constructor: PieChart$1,
50002 app: app,
50003 domProp: 'f7PieChart'
50004 });
50005
50006 app.pieChart.update = function update(el, newParams) {
50007 var $el = $(el);
50008 if ($el.length === 0) return undefined;
50009 var pieChart = app.pieChart.get(el);
50010 if (!pieChart) return undefined;
50011 pieChart.update(newParams);
50012 return pieChart;
50013 };
50014 }
50015 };
50016
50017 var AreaChart$1 = /*#__PURE__*/function (_Framework7Class) {
50018 _inheritsLoose(AreaChart, _Framework7Class);
50019
50020 function AreaChart(app, params) {
50021 var _this;
50022
50023 if (params === void 0) {
50024 params = {};
50025 }
50026
50027 _this = _Framework7Class.call(this, params, [app]) || this;
50028
50029 var self = _assertThisInitialized(_this);
50030
50031 var defaults = extend$1({}, app.params.areaChart); // Extend defaults with modules params
50032
50033 self.useModulesParams(defaults);
50034 self.params = extend$1(defaults, params);
50035 var el = self.params.el;
50036 if (!el) return self || _assertThisInitialized(_this);
50037 var $el = $(el);
50038 if ($el.length === 0) return self || _assertThisInitialized(_this);
50039 if ($el[0].f7AreaChart) return $el[0].f7AreaChart || _assertThisInitialized(_this);
50040 extend$1(self, {
50041 app: app,
50042 $el: $el,
50043 el: $el && $el[0],
50044 currentIndex: null,
50045 hiddenDatasets: [],
50046 f7Tooltip: null,
50047 linesOffsets: null
50048 });
50049 $el[0].f7AreaChart = self; // Install Modules
50050
50051 self.useModules();
50052 self.onMouseEnter = self.onMouseEnter.bind(self);
50053 self.onMouseMove = self.onMouseMove.bind(self);
50054 self.onMouseLeave = self.onMouseLeave.bind(self);
50055 self.onLegendClick = self.onLegendClick.bind(self);
50056 self.init();
50057 return self || _assertThisInitialized(_this);
50058 }
50059
50060 var _proto = AreaChart.prototype;
50061
50062 _proto.getVisibleLabels = function getVisibleLabels() {
50063 var _this$params = this.params,
50064 maxAxisLabels = _this$params.maxAxisLabels,
50065 axisLabels = _this$params.axisLabels;
50066 if (!maxAxisLabels || axisLabels.length <= maxAxisLabels) return axisLabels;
50067 var skipStep = Math.ceil(axisLabels.length / maxAxisLabels);
50068 var filtered = axisLabels.filter(function (label, index) {
50069 return index % skipStep === 0;
50070 });
50071 return filtered;
50072 };
50073
50074 _proto.getSummValues = function getSummValues() {
50075 var datasets = this.params.datasets;
50076 var hiddenDatasets = this.hiddenDatasets;
50077 var summValues = [];
50078 datasets.filter(function (dataset, index) {
50079 return !hiddenDatasets.includes(index);
50080 }).forEach(function (_ref) {
50081 var values = _ref.values;
50082 values.forEach(function (value, valueIndex) {
50083 if (!summValues[valueIndex]) summValues[valueIndex] = 0;
50084 summValues[valueIndex] += value;
50085 });
50086 });
50087 return summValues;
50088 };
50089
50090 _proto.getChartData = function getChartData() {
50091 var _this$params2 = this.params,
50092 datasets = _this$params2.datasets,
50093 lineChart = _this$params2.lineChart,
50094 width = _this$params2.width,
50095 height = _this$params2.height;
50096 var hiddenDatasets = this.hiddenDatasets;
50097 var data = [];
50098
50099 if (!datasets.length) {
50100 return data;
50101 }
50102
50103 var lastValues = datasets[0].values.map(function () {
50104 return 0;
50105 });
50106 var maxValue = 0;
50107
50108 if (lineChart) {
50109 datasets.filter(function (dataset, index) {
50110 return !hiddenDatasets.includes(index);
50111 }).forEach(function (_ref2) {
50112 var values = _ref2.values;
50113 var datasetMaxValue = Math.max.apply(Math, values);
50114 if (datasetMaxValue > maxValue) maxValue = datasetMaxValue;
50115 });
50116 } else {
50117 maxValue = Math.max.apply(Math, this.getSummValues());
50118 }
50119
50120 datasets.filter(function (dataset, index) {
50121 return !hiddenDatasets.includes(index);
50122 }).forEach(function (_ref3) {
50123 var label = _ref3.label,
50124 values = _ref3.values,
50125 color = _ref3.color;
50126 var points = values.map(function (originalValue, valueIndex) {
50127 lastValues[valueIndex] += originalValue;
50128 var value = lineChart ? originalValue : lastValues[valueIndex];
50129 var x = valueIndex / (values.length - 1) * width;
50130 var y = height - value / maxValue * height;
50131
50132 if (lineChart) {
50133 return "" + (valueIndex === 0 ? 'M' : 'L') + x + "," + y;
50134 }
50135
50136 return x + " " + y;
50137 });
50138
50139 if (!lineChart) {
50140 points.push(width + " " + height + " 0 " + height);
50141 }
50142
50143 data.push({
50144 label: label,
50145 points: points.join(' '),
50146 color: color
50147 });
50148 });
50149 return data.reverse();
50150 };
50151
50152 _proto.getVerticalLines = function getVerticalLines() {
50153 var _this$params3 = this.params,
50154 datasets = _this$params3.datasets,
50155 width = _this$params3.width;
50156 var lines = [];
50157
50158 if (!datasets.length) {
50159 return lines;
50160 }
50161
50162 var values = datasets[0].values;
50163 values.forEach(function (value, valueIndex) {
50164 var x = valueIndex / (values.length - 1) * width;
50165 lines.push(x);
50166 });
50167 return lines;
50168 };
50169
50170 _proto.toggleDataset = function toggleDataset(index) {
50171 var _this2 = this;
50172
50173 var hiddenDatasets = this.hiddenDatasets,
50174 toggleDatasets = this.params.toggleDatasets;
50175 if (!toggleDatasets) return;
50176
50177 if (hiddenDatasets.includes(index)) {
50178 hiddenDatasets.splice(hiddenDatasets.indexOf(index), 1);
50179 } else {
50180 hiddenDatasets.push(index);
50181 }
50182
50183 if (this.$legendEl) {
50184 this.$legendEl.find('.area-chart-legend-item').removeClass('area-chart-legend-item-hidden');
50185 hiddenDatasets.forEach(function (i) {
50186 _this2.$legendEl.find(".area-chart-legend-item[data-index=\"" + i + "\"]").addClass('area-chart-legend-item-hidden');
50187 });
50188 }
50189
50190 this.update({}, true);
50191 };
50192
50193 _proto.formatAxisLabel = function formatAxisLabel(label) {
50194 var formatAxisLabel = this.params.formatAxisLabel;
50195 if (formatAxisLabel) return formatAxisLabel.call(this, label);
50196 return label;
50197 };
50198
50199 _proto.formatLegendLabel = function formatLegendLabel(label) {
50200 var formatLegendLabel = this.params.formatLegendLabel;
50201 if (formatLegendLabel) return formatLegendLabel.call(this, label);
50202 return label;
50203 };
50204
50205 _proto.calcLinesOffsets = function calcLinesOffsets() {
50206 var lines = this.svgEl.querySelectorAll('line');
50207 this.linesOffsets = [];
50208
50209 for (var i = 0; i < lines.length; i += 1) {
50210 this.linesOffsets.push(lines[i].getBoundingClientRect().left);
50211 }
50212 };
50213
50214 _proto.formatTooltip = function formatTooltip() {
50215 var self = this;
50216 var currentIndex = self.currentIndex,
50217 hiddenDatasets = self.hiddenDatasets,
50218 _self$params = self.params,
50219 datasets = _self$params.datasets,
50220 axisLabels = _self$params.axisLabels,
50221 formatTooltip = _self$params.formatTooltip,
50222 formatTooltipTotal = _self$params.formatTooltipTotal,
50223 formatTooltipAxisLabel = _self$params.formatTooltipAxisLabel,
50224 formatTooltipDataset = _self$params.formatTooltipDataset;
50225 if (currentIndex === null) return '';
50226 var total = 0;
50227 var currentValues = datasets.filter(function (dataset, index) {
50228 return !hiddenDatasets.includes(index);
50229 }).map(function (dataset) {
50230 return {
50231 color: dataset.color,
50232 label: dataset.label,
50233 value: dataset.values[currentIndex]
50234 };
50235 });
50236 currentValues.forEach(function (dataset) {
50237 total += dataset.value;
50238 });
50239
50240 if (formatTooltip) {
50241 return formatTooltip({
50242 index: currentIndex,
50243 total: total,
50244 datasets: currentValues
50245 });
50246 }
50247
50248 var labelText = formatTooltipAxisLabel ? formatTooltipAxisLabel.call(self, axisLabels[currentIndex]) : this.formatAxisLabel(axisLabels[currentIndex]);
50249 if (!labelText) labelText = '';
50250 var totalText = formatTooltipTotal ? formatTooltipTotal.call(self, total) : total; // prettier-ignore
50251
50252 var datasetsText = currentValues.length > 0 ? "\n <ul class=\"area-chart-tooltip-list\">\n " + currentValues.map(function (_ref4) {
50253 var label = _ref4.label,
50254 color = _ref4.color,
50255 value = _ref4.value;
50256 var valueText = formatTooltipDataset ? formatTooltipDataset.call(self, label, value, color) : "" + (label ? label + ": " : '') + value;
50257 return "\n <li><span style=\"background-color: " + color + ";\"></span>" + valueText + "</li>\n ";
50258 }).join('') + "\n </ul>" : ''; // prettier-ignore
50259
50260 return "\n <div class=\"area-chart-tooltip-label\">" + labelText + "</div>\n <div class=\"area-chart-tooltip-total\">" + totalText + "</div>\n " + datasetsText + "\n ";
50261 };
50262
50263 _proto.setTooltip = function setTooltip() {
50264 var self = this;
50265 var app = self.app,
50266 el = self.el,
50267 svgEl = self.svgEl,
50268 hiddenDatasets = self.hiddenDatasets,
50269 currentIndex = self.currentIndex,
50270 _self$params2 = self.params,
50271 tooltip = _self$params2.tooltip,
50272 datasets = _self$params2.datasets;
50273 if (!tooltip) return;
50274 var hasVisibleDataSets = datasets.filter(function (dataset, index) {
50275 return !hiddenDatasets.includes(index);
50276 }).length > 0;
50277
50278 if (!hasVisibleDataSets) {
50279 if (self.f7Tooltip && self.f7Tooltip.hide) self.f7Tooltip.hide();
50280 return;
50281 }
50282
50283 if (currentIndex !== null && !self.f7Tooltip) {
50284 self.f7Tooltip = app.tooltip.create({
50285 trigger: 'manual',
50286 containerEl: el,
50287 targetEl: svgEl.querySelector("line[data-index=\"" + currentIndex + "\"]"),
50288 text: self.formatTooltip(),
50289 cssClass: 'area-chart-tooltip'
50290 });
50291
50292 if (self.f7Tooltip && self.f7Tooltip.show) {
50293 self.f7Tooltip.show();
50294 }
50295
50296 return;
50297 }
50298
50299 if (!self.f7Tooltip || !self.f7Tooltip.hide || !self.f7Tooltip.show) {
50300 return;
50301 }
50302
50303 if (currentIndex !== null) {
50304 self.f7Tooltip.setText(self.formatTooltip());
50305 self.f7Tooltip.setTargetEl(svgEl.querySelector("line[data-index=\"" + currentIndex + "\"]"));
50306 self.f7Tooltip.show();
50307 } else {
50308 self.f7Tooltip.hide();
50309 }
50310 };
50311
50312 _proto.setCurrentIndex = function setCurrentIndex(index) {
50313 if (index === this.currentIndex) return;
50314 this.currentIndex = index;
50315 this.$el.trigger('areachart:select', {
50316 index: index
50317 });
50318 this.emit('local::select areaChartSelect', this, index);
50319 this.$svgEl.find('line').removeClass('area-chart-current-line');
50320 this.$svgEl.find("line[data-index=\"" + index + "\"]").addClass('area-chart-current-line');
50321 this.setTooltip();
50322 };
50323
50324 _proto.onLegendClick = function onLegendClick(e) {
50325 var index = parseInt($(e.target).closest('.area-chart-legend-item').attr('data-index'), 10);
50326 this.toggleDataset(index);
50327 };
50328
50329 _proto.onMouseEnter = function onMouseEnter() {
50330 this.calcLinesOffsets();
50331 };
50332
50333 _proto.onMouseMove = function onMouseMove(e) {
50334 var self = this;
50335
50336 if (!self.linesOffsets) {
50337 self.calcLinesOffsets();
50338 }
50339
50340 var currentLeft = e.pageX;
50341 if (typeof currentLeft === 'undefined') currentLeft = 0;
50342 var distances = self.linesOffsets.map(function (left) {
50343 return Math.abs(currentLeft - left);
50344 });
50345 var minDistance = Math.min.apply(Math, distances);
50346 var closestIndex = distances.indexOf(minDistance);
50347 self.setCurrentIndex(closestIndex);
50348 };
50349
50350 _proto.onMouseLeave = function onMouseLeave() {
50351 this.setCurrentIndex(null);
50352 };
50353
50354 _proto.attachEvents = function attachEvents() {
50355 var svgEl = this.svgEl,
50356 $el = this.$el;
50357 if (!svgEl) return;
50358 svgEl.addEventListener('mouseenter', this.onMouseEnter);
50359 svgEl.addEventListener('mousemove', this.onMouseMove);
50360 svgEl.addEventListener('mouseleave', this.onMouseLeave);
50361 $el.on('click', '.area-chart-legend-item', this.onLegendClick);
50362 };
50363
50364 _proto.detachEvents = function detachEvents() {
50365 var svgEl = this.svgEl,
50366 $el = this.$el;
50367 if (!svgEl) return;
50368 svgEl.removeEventListener('mouseenter', this.onMouseEnter);
50369 svgEl.removeEventListener('mousemove', this.onMouseMove);
50370 svgEl.removeEventListener('mouseleave', this.onMouseLeave);
50371 $el.off('click', '.area-chart-legend-item', this.onLegendClick);
50372 };
50373
50374 _proto.render = function render() {
50375 var self = this;
50376 var _self$params3 = self.params,
50377 lineChart = _self$params3.lineChart,
50378 toggleDatasets = _self$params3.toggleDatasets,
50379 width = _self$params3.width,
50380 height = _self$params3.height,
50381 axis = _self$params3.axis,
50382 axisLabels = _self$params3.axisLabels,
50383 legend = _self$params3.legend,
50384 datasets = _self$params3.datasets;
50385 var chartData = self.getChartData();
50386 var verticalLines = self.getVerticalLines();
50387 var visibleLegends = self.getVisibleLabels();
50388 var LegendItemTag = toggleDatasets ? 'button' : 'span';
50389 return $jsx("div", null, $jsx("svg", {
50390 xmlns: "http://www.w3.org/2000/svg",
50391 width: width,
50392 height: height,
50393 viewBox: "0 0 " + width + " " + height,
50394 preserveAspectRatio: "none"
50395 }, chartData.map(function (data) {
50396 return lineChart ? $jsx("path", {
50397 stroke: data.color,
50398 "fill-rule": "evenodd",
50399 d: data.points
50400 }) : $jsx("polygon", {
50401 fill: data.color,
50402 "fill-rule": "evenodd",
50403 points: data.points
50404 });
50405 }), verticalLines.map(function (line, index) {
50406 return $jsx("line", {
50407 "data-index": index,
50408 fill: "#000",
50409 x1: line,
50410 y1: 0,
50411 x2: line,
50412 y2: height
50413 });
50414 })), axis && $jsx("div", {
50415 class: "area-chart-axis"
50416 }, axisLabels.map(function (label) {
50417 return $jsx("span", null, visibleLegends.includes(label) && $jsx("span", null, self.formatAxisLabel(label)));
50418 })), legend && $jsx("div", {
50419 class: "area-chart-legend"
50420 }, datasets.map(function (dataset, index) {
50421 return $jsx(LegendItemTag, {
50422 "data-index": index,
50423 class: "area-chart-legend-item " + (toggleDatasets ? 'area-chart-legend-button' : ''),
50424 _type: toggleDatasets ? 'button' : undefined
50425 }, $jsx("span", {
50426 style: "background-color: " + dataset.color
50427 }), self.formatLegendLabel(dataset.label));
50428 })));
50429 };
50430
50431 _proto.update = function update(newParams, onlySvg) {
50432 if (newParams === void 0) {
50433 newParams = {};
50434 }
50435
50436 if (onlySvg === void 0) {
50437 onlySvg = false;
50438 }
50439
50440 var self = this;
50441 var params = self.params;
50442 Object.keys(newParams).forEach(function (param) {
50443 if (typeof newParams[param] !== 'undefined') {
50444 params[param] = newParams[param];
50445 }
50446 });
50447 if (self.$svgEl.length === 0) return self;
50448 self.detachEvents();
50449 self.$svgEl.remove();
50450
50451 if (!onlySvg) {
50452 self.$axisEl.remove();
50453 self.$legendEl.remove();
50454 }
50455
50456 var $rendered = $(self.render());
50457 var $svgEl = $rendered.find('svg');
50458 extend$1(self, {
50459 svgEl: $svgEl && $svgEl[0],
50460 $svgEl: $svgEl
50461 });
50462
50463 if (!onlySvg) {
50464 var $axisEl = $rendered.find('.area-chart-axis');
50465 var $legendEl = $rendered.find('.area-chart-legend');
50466 extend$1(self, {
50467 $axisEl: $axisEl,
50468 $legendEl: $legendEl
50469 });
50470 self.$el.append($axisEl);
50471 self.$el.append($legendEl);
50472 }
50473
50474 self.$el.prepend($svgEl);
50475 self.attachEvents();
50476 return self;
50477 };
50478
50479 _proto.init = function init() {
50480 var self = this;
50481 var $rendered = $(self.render());
50482 var $svgEl = $rendered.find('svg');
50483 var $axisEl = $rendered.find('.area-chart-axis');
50484 var $legendEl = $rendered.find('.area-chart-legend');
50485 extend$1(self, {
50486 svgEl: $svgEl && $svgEl[0],
50487 $svgEl: $svgEl,
50488 $axisEl: $axisEl,
50489 $legendEl: $legendEl
50490 });
50491 self.$el.append($svgEl);
50492 self.$el.append($axisEl);
50493 self.$el.append($legendEl);
50494 self.attachEvents();
50495 return self;
50496 };
50497
50498 _proto.destroy = function destroy() {
50499 var self = this;
50500 if (!self.$el || self.destroyed) return;
50501 self.$el.trigger('piechart:beforedestroy');
50502 self.emit('local::beforeDestroy areaChartBeforeDestroy', self);
50503 self.detachEvents();
50504 self.$svgEl.remove();
50505 self.$axisEl.remove();
50506 self.$legendEl.remove();
50507
50508 if (self.f7Tooltip && self.f7Tooltip.destroy) {
50509 self.f7Tooltip.destroy();
50510 }
50511
50512 delete self.$el[0].f7AreaChart;
50513 deleteProps$1(self);
50514 self.destroyed = true;
50515 };
50516
50517 return AreaChart;
50518 }(Framework7Class);
50519
50520 var AreaChart = {
50521 name: 'areaChart',
50522 params: {
50523 areaChart: {
50524 el: null,
50525 lineChart: false,
50526 datasets: [],
50527 axis: false,
50528 axisLabels: [],
50529 tooltip: false,
50530 legend: false,
50531 toggleDatasets: false,
50532 width: 640,
50533 height: 320,
50534 maxAxisLabels: 8,
50535 formatAxisLabel: null,
50536 formatLegendLabel: null,
50537 formatTooltip: null,
50538 formatTooltipAxisLabel: null,
50539 formatTooltipTotal: null,
50540 formatTooltipDataset: null
50541 }
50542 },
50543 create: function create() {
50544 var app = this;
50545 app.areaChart = ConstructorMethods({
50546 defaultSelector: '.area-chart',
50547 constructor: AreaChart$1,
50548 app: app,
50549 domProp: 'f7AreaChart'
50550 });
50551
50552 app.areaChart.update = function update(el, newParams) {
50553 var $el = $(el);
50554 if ($el.length === 0) return undefined;
50555 var areaChart = app.areaChart.get(el);
50556 if (!areaChart) return undefined;
50557 areaChart.update(newParams);
50558 return areaChart;
50559 };
50560 }
50561 };
50562
50563 var Elevation = {
50564 name: 'elevation'
50565 };
50566
50567 var Typography = {
50568 name: 'typography'
50569 };
50570
50571 if (typeof window !== 'undefined') {
50572 // Dom7
50573 if (!window.Dom7) window.Dom7 = $;
50574 } // UMD_ONLY_END
50575
50576
50577 Router.use([RouterComponentLoaderModule]);
50578 Framework7.use([DeviceModule, SupportModule, UtilsModule, ResizeModule, RequestModule, TouchModule, ClicksModule, RouterModule, HistoryModule, ComponentModule, ServiceWorkerModule, StoreModule, Statusbar$1, View, Navbar$1, Toolbar$1, Subnavbar, TouchRipple, Modal, Appbar, Dialog, Popup, LoginScreen, Popover, Actions, Sheet, Toast, Preloader$1, Progressbar$1, Sortable$1, Swipeout$1, Accordion$1, ContactsList, VirtualList, ListIndex, Timeline, Tabs, Panel, Card, Chip, Form, Input$1, Checkbox, Radio, Toggle, Range, Stepper, SmartSelect, Grid$1, Calendar, Picker, InfiniteScroll$1, PullToRefresh, Lazy$3, DataTable, Fab$1, Searchbar, Messages, Messagebar, Swiper, PhotoBrowser, Notification, Autocomplete, Tooltip, Gauge, Skeleton, Menu$1, ColorPicker, Treeview$1, TextEditor, PieChart, AreaChart, Elevation, Typography]);
50579
50580 return Framework7;
50581
50582})));
50583//# sourceMappingURL=framework7-bundle.js.map