UNPKG

475 kBJavaScriptView Raw
1/**
2 * Framework7 6.0.7
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: February 5, 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(obj) {
33 return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
34 }
35
36 function extend(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(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {
47 extend(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(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(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(subClass, superClass) {
186 subClass.prototype = Object.create(superClass.prototype);
187 subClass.prototype.constructor = subClass;
188 subClass.__proto__ = superClass;
189 }
190
191 function _getPrototypeOf(o) {
192 _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
193 return o.__proto__ || Object.getPrototypeOf(o);
194 };
195 return _getPrototypeOf(o);
196 }
197
198 function _setPrototypeOf(o, p) {
199 _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
200 o.__proto__ = p;
201 return o;
202 };
203
204 return _setPrototypeOf(o, p);
205 }
206
207 function _isNativeReflectConstruct() {
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(Parent, args, Class) {
221 if (_isNativeReflectConstruct()) {
222 _construct = Reflect.construct;
223 } else {
224 _construct = 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(instance, Class.prototype);
230 return instance;
231 };
232 }
233
234 return _construct.apply(null, arguments);
235 }
236
237 function _isNativeFunction(fn) {
238 return Function.toString.call(fn).indexOf("[native code]") !== -1;
239 }
240
241 function _wrapNativeSuper(Class) {
242 var _cache = typeof Map === "function" ? new Map() : undefined;
243
244 _wrapNativeSuper = function _wrapNativeSuper(Class) {
245 if (Class === null || !_isNativeFunction(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(Class, arguments, _getPrototypeOf(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(Wrapper, Class);
270 };
271
272 return _wrapNativeSuper(Class);
273 }
274
275 function _assertThisInitialized(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(Dom7, _Array);
299
300 function Dom7(items) {
301 var _this;
302
303 _this = _Array.call.apply(_Array, [this].concat(items)) || this;
304 makeReactive(_assertThisInitialized(_this));
305 return _this;
306 }
307
308 return Dom7;
309 }( /*#__PURE__*/_wrapNativeSuper(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(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 $(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 $.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(_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(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 ($(target).is(targetSelector)) listener.apply(target, eventData);else {
676 var _parents = $(target).parents(); // eslint-disable-line
677
678
679 for (var k = 0; k < _parents.length; k += 1) {
680 if ($(_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(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 $(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 = $(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 $([]);
1133 }
1134
1135 if (index < 0) {
1136 var returnIndex = length + index;
1137 if (returnIndex < 0) return $([]);
1138 return $([this[returnIndex]]);
1139 }
1140
1141 return $([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 $(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 $(parent).prepend(this);
1204 return this;
1205 }
1206
1207 function insertBefore(selector) {
1208 var before = $(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 = $(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 && $(this[0].nextElementSibling).is(selector)) {
1239 return $([this[0].nextElementSibling]);
1240 }
1241
1242 return $([]);
1243 }
1244
1245 if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);
1246 return $([]);
1247 }
1248
1249 return $([]);
1250 }
1251
1252 function nextAll(selector) {
1253 var nextEls = [];
1254 var el = this[0];
1255 if (!el) return $([]);
1256
1257 while (el.nextElementSibling) {
1258 var _next = el.nextElementSibling; // eslint-disable-line
1259
1260 if (selector) {
1261 if ($(_next).is(selector)) nextEls.push(_next);
1262 } else nextEls.push(_next);
1263
1264 el = _next;
1265 }
1266
1267 return $(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 && $(el.previousElementSibling).is(selector)) {
1276 return $([el.previousElementSibling]);
1277 }
1278
1279 return $([]);
1280 }
1281
1282 if (el.previousElementSibling) return $([el.previousElementSibling]);
1283 return $([]);
1284 }
1285
1286 return $([]);
1287 }
1288
1289 function prevAll(selector) {
1290 var prevEls = [];
1291 var el = this[0];
1292 if (!el) return $([]);
1293
1294 while (el.previousElementSibling) {
1295 var _prev = el.previousElementSibling; // eslint-disable-line
1296
1297 if (selector) {
1298 if ($(_prev).is(selector)) prevEls.push(_prev);
1299 } else prevEls.push(_prev);
1300
1301 el = _prev;
1302 }
1303
1304 return $(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 ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);
1318 } else {
1319 parents.push(this[i].parentNode);
1320 }
1321 }
1322 }
1323
1324 return $(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 ($(_parent).is(selector)) parents.push(_parent);
1336 } else {
1337 parents.push(_parent);
1338 }
1339
1340 _parent = _parent.parentNode;
1341 }
1342 }
1343
1344 return $(parents);
1345 }
1346
1347 function closest(selector) {
1348 var closest = this; // eslint-disable-line
1349
1350 if (typeof selector === 'undefined') {
1351 return $([]);
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 $(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 || $(childNodes[j]).is(selector)) {
1383 children.push(childNodes[j]);
1384 }
1385 }
1386 }
1387
1388 return $(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 = $(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 $(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': $,
1868 $: $,
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,
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,
1947 transitionEnd: transitionEnd,
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 $.fn[methodName] = methods[methodName];
1957 });
1958 var $$1 = $;
1959
1960 function _defineProperties(target, props) {
1961 for (var i = 0; i < props.length; i++) {
1962 var descriptor = props[i];
1963 descriptor.enumerable = descriptor.enumerable || false;
1964 descriptor.configurable = true;
1965 if ("value" in descriptor) descriptor.writable = true;
1966 Object.defineProperty(target, descriptor.key, descriptor);
1967 }
1968 }
1969
1970 function _createClass(Constructor, protoProps, staticProps) {
1971 if (protoProps) _defineProperties(Constructor.prototype, protoProps);
1972 if (staticProps) _defineProperties(Constructor, staticProps);
1973 return Constructor;
1974 }
1975
1976 function _extends() {
1977 _extends = Object.assign || function (target) {
1978 for (var i = 1; i < arguments.length; i++) {
1979 var source = arguments[i];
1980
1981 for (var key in source) {
1982 if (Object.prototype.hasOwnProperty.call(source, key)) {
1983 target[key] = source[key];
1984 }
1985 }
1986 }
1987
1988 return target;
1989 };
1990
1991 return _extends.apply(this, arguments);
1992 }
1993
1994 function _inheritsLoose$1(subClass, superClass) {
1995 subClass.prototype = Object.create(superClass.prototype);
1996 subClass.prototype.constructor = subClass;
1997 subClass.__proto__ = superClass;
1998 }
1999
2000 function _getPrototypeOf$1(o) {
2001 _getPrototypeOf$1 = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
2002 return o.__proto__ || Object.getPrototypeOf(o);
2003 };
2004 return _getPrototypeOf$1(o);
2005 }
2006
2007 function _setPrototypeOf$1(o, p) {
2008 _setPrototypeOf$1 = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
2009 o.__proto__ = p;
2010 return o;
2011 };
2012
2013 return _setPrototypeOf$1(o, p);
2014 }
2015
2016 function _isNativeReflectConstruct$1() {
2017 if (typeof Reflect === "undefined" || !Reflect.construct) return false;
2018 if (Reflect.construct.sham) return false;
2019 if (typeof Proxy === "function") return true;
2020
2021 try {
2022 Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));
2023 return true;
2024 } catch (e) {
2025 return false;
2026 }
2027 }
2028
2029 function _construct$1(Parent, args, Class) {
2030 if (_isNativeReflectConstruct$1()) {
2031 _construct$1 = Reflect.construct;
2032 } else {
2033 _construct$1 = function _construct(Parent, args, Class) {
2034 var a = [null];
2035 a.push.apply(a, args);
2036 var Constructor = Function.bind.apply(Parent, a);
2037 var instance = new Constructor();
2038 if (Class) _setPrototypeOf$1(instance, Class.prototype);
2039 return instance;
2040 };
2041 }
2042
2043 return _construct$1.apply(null, arguments);
2044 }
2045
2046 function _isNativeFunction$1(fn) {
2047 return Function.toString.call(fn).indexOf("[native code]") !== -1;
2048 }
2049
2050 function _wrapNativeSuper$1(Class) {
2051 var _cache = typeof Map === "function" ? new Map() : undefined;
2052
2053 _wrapNativeSuper$1 = function _wrapNativeSuper(Class) {
2054 if (Class === null || !_isNativeFunction$1(Class)) return Class;
2055
2056 if (typeof Class !== "function") {
2057 throw new TypeError("Super expression must either be null or a function");
2058 }
2059
2060 if (typeof _cache !== "undefined") {
2061 if (_cache.has(Class)) return _cache.get(Class);
2062
2063 _cache.set(Class, Wrapper);
2064 }
2065
2066 function Wrapper() {
2067 return _construct$1(Class, arguments, _getPrototypeOf$1(this).constructor);
2068 }
2069
2070 Wrapper.prototype = Object.create(Class.prototype, {
2071 constructor: {
2072 value: Wrapper,
2073 enumerable: false,
2074 writable: true,
2075 configurable: true
2076 }
2077 });
2078 return _setPrototypeOf$1(Wrapper, Class);
2079 };
2080
2081 return _wrapNativeSuper$1(Class);
2082 }
2083
2084 function _assertThisInitialized$1(self) {
2085 if (self === void 0) {
2086 throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
2087 }
2088
2089 return self;
2090 }
2091
2092 function _readOnlyError(name) {
2093 throw new Error("\"" + name + "\" is read-only");
2094 }
2095
2096 var uniqueNum = 0;
2097 function uniqueNumber() {
2098 uniqueNum += 1;
2099 return uniqueNum;
2100 }
2101 function id(mask, map) {
2102 if (mask === void 0) {
2103 mask = 'xxxxxxxxxx';
2104 }
2105
2106 if (map === void 0) {
2107 map = '0123456789abcdef';
2108 }
2109
2110 var length = map.length;
2111 return mask.replace(/x/g, function () {
2112 return map[Math.floor(Math.random() * length)];
2113 });
2114 }
2115 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();
2116 var iosPreloaderContent = ("\n <span class=\"preloader-inner\">\n " + [0, 1, 2, 3, 4, 5, 6, 7].map(function () {
2117 return '<span class="preloader-inner-line"></span>';
2118 }).join('') + "\n </span>\n").trim();
2119 var auroraPreloaderContent = "\n <span class=\"preloader-inner\">\n <span class=\"preloader-inner-circle\"></span>\n </span>\n";
2120 function eventNameToColonCase(eventName) {
2121 var hasColon;
2122 return eventName.split('').map(function (char, index) {
2123 if (char.match(/[A-Z]/) && index !== 0 && !hasColon) {
2124 hasColon = true;
2125 return ":" + char.toLowerCase();
2126 }
2127
2128 return char.toLowerCase();
2129 }).join('');
2130 }
2131 function deleteProps(obj) {
2132 var object = obj;
2133 Object.keys(object).forEach(function (key) {
2134 try {
2135 object[key] = null;
2136 } catch (e) {// no setter for object
2137 }
2138
2139 try {
2140 delete object[key];
2141 } catch (e) {// something got wrong
2142 }
2143 });
2144 }
2145 function requestAnimationFrame(callback) {
2146 var window = getWindow();
2147 return window.requestAnimationFrame(callback);
2148 }
2149 function cancelAnimationFrame(frameId) {
2150 var window = getWindow();
2151 return window.cancelAnimationFrame(frameId);
2152 }
2153 function nextTick(callback, delay) {
2154 if (delay === void 0) {
2155 delay = 0;
2156 }
2157
2158 return setTimeout(callback, delay);
2159 }
2160 function nextFrame(callback) {
2161 return requestAnimationFrame(function () {
2162 requestAnimationFrame(callback);
2163 });
2164 }
2165 function now() {
2166 return Date.now();
2167 }
2168 function parseUrlQuery(url) {
2169 var window = getWindow();
2170 var query = {};
2171 var urlToParse = url || window.location.href;
2172 var i;
2173 var params;
2174 var param;
2175 var length;
2176
2177 if (typeof urlToParse === 'string' && urlToParse.length) {
2178 urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
2179 params = urlToParse.split('&').filter(function (paramsPart) {
2180 return paramsPart !== '';
2181 });
2182 length = params.length;
2183
2184 for (i = 0; i < length; i += 1) {
2185 param = params[i].replace(/#\S+/g, '').split('=');
2186 query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param.slice(1).join('=')) || '';
2187 }
2188 }
2189
2190 return query;
2191 }
2192 function getTranslate(el, axis) {
2193 if (axis === void 0) {
2194 axis = 'x';
2195 }
2196
2197 var window = getWindow();
2198 var matrix;
2199 var curTransform;
2200 var transformMatrix;
2201 var curStyle = window.getComputedStyle(el, null);
2202
2203 if (window.WebKitCSSMatrix) {
2204 curTransform = curStyle.transform || curStyle.webkitTransform;
2205
2206 if (curTransform.split(',').length > 6) {
2207 curTransform = curTransform.split(', ').map(function (a) {
2208 return a.replace(',', '.');
2209 }).join(', ');
2210 } // Some old versions of Webkit choke when 'none' is passed; pass
2211 // empty string instead in this case
2212
2213
2214 transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
2215 } else {
2216 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
2217 matrix = transformMatrix.toString().split(',');
2218 }
2219
2220 if (axis === 'x') {
2221 // Latest Chrome and webkits Fix
2222 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix
2223 else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers
2224 else curTransform = parseFloat(matrix[4]);
2225 }
2226
2227 if (axis === 'y') {
2228 // Latest Chrome and webkits Fix
2229 if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix
2230 else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers
2231 else curTransform = parseFloat(matrix[5]);
2232 }
2233
2234 return curTransform || 0;
2235 }
2236 function serializeObject(obj, parents) {
2237 if (parents === void 0) {
2238 parents = [];
2239 }
2240
2241 if (typeof obj === 'string') return obj;
2242 var resultArray = [];
2243 var separator = '&';
2244 var newParents;
2245
2246 function varName(name) {
2247 if (parents.length > 0) {
2248 var parentParts = '';
2249
2250 for (var j = 0; j < parents.length; j += 1) {
2251 if (j === 0) parentParts += parents[j];else parentParts += "[" + encodeURIComponent(parents[j]) + "]";
2252 }
2253
2254 return parentParts + "[" + encodeURIComponent(name) + "]";
2255 }
2256
2257 return encodeURIComponent(name);
2258 }
2259
2260 function varValue(value) {
2261 return encodeURIComponent(value);
2262 }
2263
2264 Object.keys(obj).forEach(function (prop) {
2265 var toPush;
2266
2267 if (Array.isArray(obj[prop])) {
2268 toPush = [];
2269
2270 for (var i = 0; i < obj[prop].length; i += 1) {
2271 if (!Array.isArray(obj[prop][i]) && typeof obj[prop][i] === 'object') {
2272 newParents = parents.slice();
2273 newParents.push(prop);
2274 newParents.push(String(i));
2275 toPush.push(serializeObject(obj[prop][i], newParents));
2276 } else {
2277 toPush.push(varName(prop) + "[]=" + varValue(obj[prop][i]));
2278 }
2279 }
2280
2281 if (toPush.length > 0) resultArray.push(toPush.join(separator));
2282 } else if (obj[prop] === null || obj[prop] === '') {
2283 resultArray.push(varName(prop) + "=");
2284 } else if (typeof obj[prop] === 'object') {
2285 // Object, convert to named array
2286 newParents = parents.slice();
2287 newParents.push(prop);
2288 toPush = serializeObject(obj[prop], newParents);
2289 if (toPush !== '') resultArray.push(toPush);
2290 } else if (typeof obj[prop] !== 'undefined' && obj[prop] !== '') {
2291 // Should be string or plain value
2292 resultArray.push(varName(prop) + "=" + varValue(obj[prop]));
2293 } else if (obj[prop] === '') resultArray.push(varName(prop));
2294 });
2295 return resultArray.join(separator);
2296 }
2297 function isObject$1(o) {
2298 return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
2299 }
2300 function merge() {
2301 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2302 args[_key] = arguments[_key];
2303 }
2304
2305 var to = args[0];
2306 args.splice(0, 1);
2307 var from = args;
2308
2309 for (var i = 0; i < from.length; i += 1) {
2310 var nextSource = args[i];
2311
2312 if (nextSource !== undefined && nextSource !== null) {
2313 var keysArray = Object.keys(Object(nextSource));
2314
2315 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2316 var nextKey = keysArray[nextIndex];
2317 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2318
2319 if (desc !== undefined && desc.enumerable) {
2320 to[nextKey] = nextSource[nextKey];
2321 }
2322 }
2323 }
2324 }
2325
2326 return to;
2327 }
2328 function extend$1() {
2329 var deep = true;
2330 var to;
2331 var from;
2332
2333 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2334 args[_key2] = arguments[_key2];
2335 }
2336
2337 if (typeof args[0] === 'boolean') {
2338 deep = args[0];
2339 to = args[1];
2340 args.splice(0, 2);
2341 from = args;
2342 } else {
2343 to = args[0];
2344 args.splice(0, 1);
2345 from = args;
2346 }
2347
2348 for (var i = 0; i < from.length; i += 1) {
2349 var nextSource = args[i];
2350
2351 if (nextSource !== undefined && nextSource !== null) {
2352 var keysArray = Object.keys(Object(nextSource));
2353
2354 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2355 var nextKey = keysArray[nextIndex];
2356 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2357
2358 if (desc !== undefined && desc.enumerable) {
2359 if (!deep) {
2360 to[nextKey] = nextSource[nextKey];
2361 } else if (isObject$1(to[nextKey]) && isObject$1(nextSource[nextKey])) {
2362 extend$1(to[nextKey], nextSource[nextKey]);
2363 } else if (!isObject$1(to[nextKey]) && isObject$1(nextSource[nextKey])) {
2364 to[nextKey] = {};
2365 extend$1(to[nextKey], nextSource[nextKey]);
2366 } else {
2367 to[nextKey] = nextSource[nextKey];
2368 }
2369 }
2370 }
2371 }
2372 }
2373
2374 return to;
2375 }
2376 function colorHexToRgb(hex) {
2377 var h = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (m, r, g, b) {
2378 return r + r + g + g + b + b;
2379 });
2380 var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h);
2381 return result ? result.slice(1).map(function (n) {
2382 return parseInt(n, 16);
2383 }) : null;
2384 }
2385 function colorRgbToHex(r, g, b) {
2386 var result = [r, g, b].map(function (n) {
2387 var hex = n.toString(16);
2388 return hex.length === 1 ? "0" + hex : hex;
2389 }).join('');
2390 return "#" + result;
2391 }
2392 function colorRgbToHsl(r, g, b) {
2393 r /= 255; // eslint-disable-line
2394
2395 g /= 255; // eslint-disable-line
2396
2397 b /= 255; // eslint-disable-line
2398
2399 var max = Math.max(r, g, b);
2400 var min = Math.min(r, g, b);
2401 var d = max - min;
2402 var h;
2403 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;
2404 var l = (min + max) / 2;
2405 var s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
2406 if (h < 0) h = 360 / 60 + h;
2407 return [h * 60, s, l];
2408 }
2409 function colorHslToRgb(h, s, l) {
2410 var c = (1 - Math.abs(2 * l - 1)) * s;
2411 var hp = h / 60;
2412 var x = c * (1 - Math.abs(hp % 2 - 1));
2413 var rgb1;
2414
2415 if (Number.isNaN(h) || typeof h === 'undefined') {
2416 rgb1 = [0, 0, 0];
2417 } 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];
2418
2419 var m = l - c / 2;
2420 return rgb1.map(function (n) {
2421 return Math.max(0, Math.min(255, Math.round(255 * (n + m))));
2422 });
2423 }
2424 function colorHsbToHsl(h, s, b) {
2425 var HSL = {
2426 h: h,
2427 s: 0,
2428 l: 0
2429 };
2430 var HSB = {
2431 h: h,
2432 s: s,
2433 b: b
2434 };
2435 HSL.l = (2 - HSB.s) * HSB.b / 2;
2436 HSL.s = HSL.l && HSL.l < 1 ? HSB.s * HSB.b / (HSL.l < 0.5 ? HSL.l * 2 : 2 - HSL.l * 2) : HSL.s;
2437 return [HSL.h, HSL.s, HSL.l];
2438 }
2439 function colorHslToHsb(h, s, l) {
2440 var HSB = {
2441 h: h,
2442 s: 0,
2443 b: 0
2444 };
2445 var HSL = {
2446 h: h,
2447 s: s,
2448 l: l
2449 };
2450 var t = HSL.s * (HSL.l < 0.5 ? HSL.l : 1 - HSL.l);
2451 HSB.b = HSL.l + t;
2452 HSB.s = HSL.l > 0 ? 2 * t / HSB.b : HSB.s;
2453 return [HSB.h, HSB.s, HSB.b];
2454 }
2455 function colorThemeCSSProperties() {
2456 var hex;
2457 var rgb;
2458
2459 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
2460 args[_key3] = arguments[_key3];
2461 }
2462
2463 if (args.length === 1) {
2464 hex = args[0];
2465 rgb = colorHexToRgb(hex);
2466 } else if (args.length === 3) {
2467 rgb = args;
2468 hex = colorRgbToHex.apply(void 0, rgb);
2469 }
2470
2471 if (!rgb) return {};
2472 var hsl = colorRgbToHsl.apply(void 0, rgb);
2473 var hslShade = [hsl[0], hsl[1], Math.max(0, hsl[2] - 0.08)];
2474 var hslTint = [hsl[0], hsl[1], Math.max(0, hsl[2] + 0.08)];
2475 var shade = colorRgbToHex.apply(void 0, colorHslToRgb.apply(void 0, hslShade));
2476 var tint = colorRgbToHex.apply(void 0, colorHslToRgb.apply(void 0, hslTint));
2477 return {
2478 '--f7-theme-color': hex,
2479 '--f7-theme-color-rgb': rgb.join(', '),
2480 '--f7-theme-color-shade': shade,
2481 '--f7-theme-color-tint': tint
2482 };
2483 }
2484 function bindMethods(instance, obj) {
2485 Object.keys(obj).forEach(function (key) {
2486 if (isObject$1(obj[key])) {
2487 Object.keys(obj[key]).forEach(function (subKey) {
2488 if (typeof obj[key][subKey] === 'function') {
2489 obj[key][subKey] = obj[key][subKey].bind(instance);
2490 }
2491 });
2492 }
2493
2494 instance[key] = obj[key];
2495 });
2496 }
2497 function flattenArray() {
2498 var arr = [];
2499
2500 for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
2501 args[_key4] = arguments[_key4];
2502 }
2503
2504 args.forEach(function (arg) {
2505 if (Array.isArray(arg)) arr.push.apply(arr, flattenArray.apply(void 0, arg));else arr.push(arg);
2506 });
2507 return arr;
2508 }
2509
2510 var utils = /*#__PURE__*/Object.freeze({
2511 __proto__: null,
2512 uniqueNumber: uniqueNumber,
2513 id: id,
2514 mdPreloaderContent: mdPreloaderContent,
2515 iosPreloaderContent: iosPreloaderContent,
2516 auroraPreloaderContent: auroraPreloaderContent,
2517 eventNameToColonCase: eventNameToColonCase,
2518 deleteProps: deleteProps,
2519 requestAnimationFrame: requestAnimationFrame,
2520 cancelAnimationFrame: cancelAnimationFrame,
2521 nextTick: nextTick,
2522 nextFrame: nextFrame,
2523 now: now,
2524 parseUrlQuery: parseUrlQuery,
2525 getTranslate: getTranslate,
2526 serializeObject: serializeObject,
2527 isObject: isObject$1,
2528 merge: merge,
2529 extend: extend$1,
2530 colorHexToRgb: colorHexToRgb,
2531 colorRgbToHex: colorRgbToHex,
2532 colorRgbToHsl: colorRgbToHsl,
2533 colorHslToRgb: colorHslToRgb,
2534 colorHsbToHsl: colorHsbToHsl,
2535 colorHslToHsb: colorHslToHsb,
2536 colorThemeCSSProperties: colorThemeCSSProperties,
2537 bindMethods: bindMethods,
2538 flattenArray: flattenArray
2539 });
2540
2541 var support;
2542
2543 function calcSupport() {
2544 var window = getWindow();
2545 var document = getDocument();
2546 return {
2547 touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),
2548 pointerEvents: !!window.PointerEvent && 'maxTouchPoints' in window.navigator && window.navigator.maxTouchPoints >= 0,
2549 passiveListener: function checkPassiveListener() {
2550 var supportsPassive = false;
2551
2552 try {
2553 var opts = Object.defineProperty({}, 'passive', {
2554 // eslint-disable-next-line
2555 get: function get() {
2556 supportsPassive = true;
2557 }
2558 });
2559 window.addEventListener('testPassiveListener', null, opts);
2560 } catch (e) {// No support
2561 }
2562
2563 return supportsPassive;
2564 }(),
2565 intersectionObserver: function checkObserver() {
2566 return 'IntersectionObserver' in window;
2567 }()
2568 };
2569 }
2570
2571 function getSupport() {
2572 if (!support) {
2573 support = calcSupport();
2574 }
2575
2576 return support;
2577 }
2578
2579 var deviceCalculated;
2580
2581 function calcDevice(_temp) {
2582 var _ref = _temp === void 0 ? {} : _temp,
2583 userAgent = _ref.userAgent;
2584
2585 var support = getSupport();
2586 var window = getWindow();
2587 var platform = window.navigator.platform;
2588 var ua = userAgent || window.navigator.userAgent;
2589 var device = {
2590 ios: false,
2591 android: false,
2592 androidChrome: false,
2593 desktop: false,
2594 iphone: false,
2595 ipod: false,
2596 ipad: false,
2597 edge: false,
2598 ie: false,
2599 firefox: false,
2600 macos: false,
2601 windows: false,
2602 cordova: !!(window.cordova || window.phonegap),
2603 phonegap: !!(window.cordova || window.phonegap),
2604 electron: false,
2605 capacitor: !!window.Capacitor,
2606 nwjs: false
2607 };
2608 var screenWidth = window.screen.width;
2609 var screenHeight = window.screen.height;
2610 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2611
2612 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
2613 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
2614 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
2615 var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
2616 var edge = ua.indexOf('Edge/') >= 0;
2617 var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
2618 var windows = platform === 'Win32';
2619 var electron = ua.toLowerCase().indexOf('electron') >= 0;
2620 var nwjs = typeof nw !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.nw !== 'undefined';
2621 var macos = platform === 'MacIntel'; // iPadOs 13 fix
2622
2623 var iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
2624
2625 if (!ipad && macos && support.touch && iPadScreens.indexOf(screenWidth + "x" + screenHeight) >= 0) {
2626 ipad = ua.match(/(Version)\/([\d.]+)/);
2627 if (!ipad) ipad = [0, 1, '13_0_0'];
2628 macos = false;
2629 }
2630
2631 device.ie = ie;
2632 device.edge = edge;
2633 device.firefox = firefox; // Android
2634
2635 if (android && !windows) {
2636 device.os = 'android';
2637 device.osVersion = android[2];
2638 device.android = true;
2639 device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
2640 }
2641
2642 if (ipad || iphone || ipod) {
2643 device.os = 'ios';
2644 device.ios = true;
2645 } // iOS
2646
2647
2648 if (iphone && !ipod) {
2649 device.osVersion = iphone[2].replace(/_/g, '.');
2650 device.iphone = true;
2651 }
2652
2653 if (ipad) {
2654 device.osVersion = ipad[2].replace(/_/g, '.');
2655 device.ipad = true;
2656 }
2657
2658 if (ipod) {
2659 device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
2660 device.ipod = true;
2661 } // iOS 8+ changed UA
2662
2663
2664 if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
2665 if (device.osVersion.split('.')[0] === '10') {
2666 device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
2667 }
2668 } // Webview
2669
2670
2671 device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || window.navigator.standalone)) || window.matchMedia && window.matchMedia('(display-mode: standalone)').matches;
2672 device.webview = device.webView;
2673 device.standalone = device.webView; // Desktop
2674
2675 device.desktop = !(device.ios || device.android) || electron || nwjs;
2676
2677 if (device.desktop) {
2678 device.electron = electron;
2679 device.nwjs = nwjs;
2680 device.macos = macos;
2681 device.windows = windows;
2682
2683 if (device.macos) {
2684 device.os = 'macos';
2685 }
2686
2687 if (device.windows) {
2688 device.os = 'windows';
2689 }
2690 } // Pixel Ratio
2691
2692
2693 device.pixelRatio = window.devicePixelRatio || 1; // Color Scheme
2694
2695 var DARK = '(prefers-color-scheme: dark)';
2696 var LIGHT = '(prefers-color-scheme: light)';
2697
2698 device.prefersColorScheme = function prefersColorTheme() {
2699 var theme;
2700
2701 if (window.matchMedia && window.matchMedia(LIGHT).matches) {
2702 theme = 'light';
2703 }
2704
2705 if (window.matchMedia && window.matchMedia(DARK).matches) {
2706 theme = 'dark';
2707 }
2708
2709 return theme;
2710 }; // Export object
2711
2712
2713 return device;
2714 }
2715
2716 function getDevice(overrides, reset) {
2717 if (overrides === void 0) {
2718 overrides = {};
2719 }
2720
2721 if (!deviceCalculated || reset) {
2722 deviceCalculated = calcDevice(overrides);
2723 }
2724
2725 return deviceCalculated;
2726 }
2727
2728 var EventsClass = /*#__PURE__*/function () {
2729 function EventsClass(parents) {
2730 if (parents === void 0) {
2731 parents = [];
2732 }
2733
2734 var self = this;
2735 self.eventsParents = parents;
2736 self.eventsListeners = {};
2737 }
2738
2739 var _proto = EventsClass.prototype;
2740
2741 _proto.on = function on(events, handler, priority) {
2742 var self = this;
2743 if (typeof handler !== 'function') return self;
2744 var method = priority ? 'unshift' : 'push';
2745 events.split(' ').forEach(function (event) {
2746 if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
2747 self.eventsListeners[event][method](handler);
2748 });
2749 return self;
2750 };
2751
2752 _proto.once = function once(events, handler, priority) {
2753 var self = this;
2754 if (typeof handler !== 'function') return self;
2755
2756 function onceHandler() {
2757 self.off(events, onceHandler);
2758
2759 if (onceHandler.f7proxy) {
2760 delete onceHandler.f7proxy;
2761 }
2762
2763 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
2764 args[_key] = arguments[_key];
2765 }
2766
2767 handler.apply(self, args);
2768 }
2769
2770 onceHandler.f7proxy = handler;
2771 return self.on(events, onceHandler, priority);
2772 };
2773
2774 _proto.off = function off(events, handler) {
2775 var self = this;
2776 if (!self.eventsListeners) return self;
2777 events.split(' ').forEach(function (event) {
2778 if (typeof handler === 'undefined') {
2779 self.eventsListeners[event] = [];
2780 } else if (self.eventsListeners[event]) {
2781 self.eventsListeners[event].forEach(function (eventHandler, index) {
2782 if (eventHandler === handler || eventHandler.f7proxy && eventHandler.f7proxy === handler) {
2783 self.eventsListeners[event].splice(index, 1);
2784 }
2785 });
2786 }
2787 });
2788 return self;
2789 };
2790
2791 _proto.emit = function emit() {
2792 var self = this;
2793 if (!self.eventsListeners) return self;
2794 var events;
2795 var data;
2796 var context;
2797 var eventsParents;
2798
2799 for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
2800 args[_key2] = arguments[_key2];
2801 }
2802
2803 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
2804 events = args[0];
2805 data = args.slice(1, args.length);
2806 context = self;
2807 eventsParents = self.eventsParents;
2808 } else {
2809 events = args[0].events;
2810 data = args[0].data;
2811 context = args[0].context || self;
2812 eventsParents = args[0].local ? [] : args[0].parents || self.eventsParents;
2813 }
2814
2815 var eventsArray = Array.isArray(events) ? events : events.split(' ');
2816 var localEvents = eventsArray.map(function (eventName) {
2817 return eventName.replace('local::', '');
2818 });
2819 var parentEvents = eventsArray.filter(function (eventName) {
2820 return eventName.indexOf('local::') < 0;
2821 });
2822 localEvents.forEach(function (event) {
2823 if (self.eventsListeners && self.eventsListeners[event]) {
2824 var handlers = [];
2825 self.eventsListeners[event].forEach(function (eventHandler) {
2826 handlers.push(eventHandler);
2827 });
2828 handlers.forEach(function (eventHandler) {
2829 eventHandler.apply(context, data);
2830 });
2831 }
2832 });
2833
2834 if (eventsParents && eventsParents.length > 0) {
2835 eventsParents.forEach(function (eventsParent) {
2836 eventsParent.emit.apply(eventsParent, [parentEvents].concat(data));
2837 });
2838 }
2839
2840 return self;
2841 };
2842
2843 return EventsClass;
2844 }();
2845
2846 var Framework7Class = /*#__PURE__*/function (_EventsClass) {
2847 _inheritsLoose$1(Framework7Class, _EventsClass);
2848
2849 function Framework7Class(params, parents) {
2850 var _this;
2851
2852 if (params === void 0) {
2853 params = {};
2854 }
2855
2856 if (parents === void 0) {
2857 parents = [];
2858 }
2859
2860 _this = _EventsClass.call(this, parents) || this;
2861
2862 var self = _assertThisInitialized$1(_this);
2863
2864 self.params = params;
2865
2866 if (self.params && self.params.on) {
2867 Object.keys(self.params.on).forEach(function (eventName) {
2868 self.on(eventName, self.params.on[eventName]);
2869 });
2870 }
2871
2872 return _this;
2873 } // eslint-disable-next-line
2874
2875
2876 var _proto = Framework7Class.prototype;
2877
2878 _proto.useModuleParams = function useModuleParams(module, instanceParams) {
2879 if (module.params) {
2880 var originalParams = {};
2881 Object.keys(module.params).forEach(function (paramKey) {
2882 if (typeof instanceParams[paramKey] === 'undefined') return;
2883 originalParams[paramKey] = extend$1({}, instanceParams[paramKey]);
2884 });
2885 extend$1(instanceParams, module.params);
2886 Object.keys(originalParams).forEach(function (paramKey) {
2887 extend$1(instanceParams[paramKey], originalParams[paramKey]);
2888 });
2889 }
2890 };
2891
2892 _proto.useModulesParams = function useModulesParams(instanceParams) {
2893 var instance = this;
2894 if (!instance.modules) return;
2895 Object.keys(instance.modules).forEach(function (moduleName) {
2896 var module = instance.modules[moduleName]; // Extend params
2897
2898 if (module.params) {
2899 extend$1(instanceParams, module.params);
2900 }
2901 });
2902 };
2903
2904 _proto.useModule = function useModule(moduleName, moduleParams) {
2905 if (moduleName === void 0) {
2906 moduleName = '';
2907 }
2908
2909 if (moduleParams === void 0) {
2910 moduleParams = {};
2911 }
2912
2913 var instance = this;
2914 if (!instance.modules) return;
2915 var module = typeof moduleName === 'string' ? instance.modules[moduleName] : moduleName;
2916 if (!module) return; // Extend instance methods and props
2917
2918 if (module.instance) {
2919 Object.keys(module.instance).forEach(function (modulePropName) {
2920 var moduleProp = module.instance[modulePropName];
2921
2922 if (typeof moduleProp === 'function') {
2923 instance[modulePropName] = moduleProp.bind(instance);
2924 } else {
2925 instance[modulePropName] = moduleProp;
2926 }
2927 });
2928 } // Add event listeners
2929
2930
2931 if (module.on && instance.on) {
2932 Object.keys(module.on).forEach(function (moduleEventName) {
2933 instance.on(moduleEventName, module.on[moduleEventName]);
2934 });
2935 } // Add vnode hooks
2936
2937
2938 if (module.vnode) {
2939 if (!instance.vnodeHooks) instance.vnodeHooks = {};
2940 Object.keys(module.vnode).forEach(function (vnodeId) {
2941 Object.keys(module.vnode[vnodeId]).forEach(function (hookName) {
2942 var handler = module.vnode[vnodeId][hookName];
2943 if (!instance.vnodeHooks[hookName]) instance.vnodeHooks[hookName] = {};
2944 if (!instance.vnodeHooks[hookName][vnodeId]) instance.vnodeHooks[hookName][vnodeId] = [];
2945 instance.vnodeHooks[hookName][vnodeId].push(handler.bind(instance));
2946 });
2947 });
2948 } // Module create callback
2949
2950
2951 if (module.create) {
2952 module.create.bind(instance)(moduleParams);
2953 }
2954 };
2955
2956 _proto.useModules = function useModules(modulesParams) {
2957 if (modulesParams === void 0) {
2958 modulesParams = {};
2959 }
2960
2961 var instance = this;
2962 if (!instance.modules) return;
2963 Object.keys(instance.modules).forEach(function (moduleName) {
2964 var moduleParams = modulesParams[moduleName] || {};
2965 instance.useModule(moduleName, moduleParams);
2966 });
2967 };
2968
2969 Framework7Class.installModule = function installModule(module) {
2970 var Class = this;
2971 if (!Class.prototype.modules) Class.prototype.modules = {};
2972 var name = module.name || Object.keys(Class.prototype.modules).length + "_" + now();
2973 Class.prototype.modules[name] = module; // Prototype
2974
2975 if (module.proto) {
2976 Object.keys(module.proto).forEach(function (key) {
2977 Class.prototype[key] = module.proto[key];
2978 });
2979 } // Class
2980
2981
2982 if (module.static) {
2983 Object.keys(module.static).forEach(function (key) {
2984 Class[key] = module.static[key];
2985 });
2986 } // Callback
2987
2988
2989 if (module.install) {
2990 for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
2991 params[_key - 1] = arguments[_key];
2992 }
2993
2994 module.install.apply(Class, params);
2995 }
2996
2997 return Class;
2998 };
2999
3000 Framework7Class.use = function use(module) {
3001 var Class = this;
3002
3003 if (Array.isArray(module)) {
3004 module.forEach(function (m) {
3005 return Class.installModule(m);
3006 });
3007 return Class;
3008 }
3009
3010 for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
3011 params[_key2 - 1] = arguments[_key2];
3012 }
3013
3014 return Class.installModule.apply(Class, [module].concat(params));
3015 };
3016
3017 _createClass(Framework7Class, null, [{
3018 key: "components",
3019 set: function set(components) {
3020 var Class = this;
3021 if (!Class.use) return;
3022 Class.use(components);
3023 }
3024 }]);
3025
3026 return Framework7Class;
3027 }(EventsClass);
3028
3029 function ConstructorMethods(parameters) {
3030 if (parameters === void 0) {
3031 parameters = {};
3032 }
3033
3034 var _parameters = parameters,
3035 defaultSelector = _parameters.defaultSelector,
3036 Constructor = _parameters.constructor,
3037 domProp = _parameters.domProp,
3038 app = _parameters.app,
3039 addMethods = _parameters.addMethods;
3040 var methods = {
3041 create: function create() {
3042 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3043 args[_key] = arguments[_key];
3044 }
3045
3046 if (app) return _construct$1(Constructor, [app].concat(args));
3047 return _construct$1(Constructor, args);
3048 },
3049 get: function get(el) {
3050 if (el === void 0) {
3051 el = defaultSelector;
3052 }
3053
3054 if (el instanceof Constructor) return el;
3055 var $el = $$1(el);
3056 if ($el.length === 0) return undefined;
3057 return $el[0][domProp];
3058 },
3059 destroy: function destroy(el) {
3060 var instance = methods.get(el);
3061 if (instance && instance.destroy) return instance.destroy();
3062 return undefined;
3063 }
3064 };
3065
3066 if (addMethods && Array.isArray(addMethods)) {
3067 addMethods.forEach(function (methodName) {
3068 methods[methodName] = function (el) {
3069 if (el === void 0) {
3070 el = defaultSelector;
3071 }
3072
3073 var instance = methods.get(el);
3074
3075 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
3076 args[_key2 - 1] = arguments[_key2];
3077 }
3078
3079 if (instance && instance[methodName]) return instance[methodName].apply(instance, args);
3080 return undefined;
3081 };
3082 });
3083 }
3084
3085 return methods;
3086 }
3087
3088 function ModalMethods(parameters) {
3089 if (parameters === void 0) {
3090 parameters = {};
3091 }
3092
3093 var _parameters = parameters,
3094 defaultSelector = _parameters.defaultSelector,
3095 Constructor = _parameters.constructor,
3096 app = _parameters.app;
3097 var methods = extend$1(ConstructorMethods({
3098 defaultSelector: defaultSelector,
3099 constructor: Constructor,
3100 app: app,
3101 domProp: 'f7Modal'
3102 }), {
3103 open: function open(el, animate, targetEl) {
3104 var $el = $$1(el);
3105
3106 if ($el.length > 1 && targetEl) {
3107 // check if same modal in other page
3108 var $targetPage = $$1(targetEl).parents('.page');
3109
3110 if ($targetPage.length) {
3111 $el.each(function (modalEl) {
3112 var $modalEl = $$1(modalEl);
3113
3114 if ($modalEl.parents($targetPage)[0] === $targetPage[0]) {
3115 $el = $modalEl;
3116 }
3117 });
3118 }
3119 }
3120
3121 if ($el.length > 1) {
3122 $el = $el.eq($el.length - 1);
3123 }
3124
3125 if (!$el.length) return undefined;
3126 var instance = $el[0].f7Modal;
3127
3128 if (!instance) {
3129 var params = $el.dataset();
3130 instance = new Constructor(app, _extends({
3131 el: $el
3132 }, params));
3133 }
3134
3135 return instance.open(animate);
3136 },
3137 close: function close(el, animate, targetEl) {
3138 if (el === void 0) {
3139 el = defaultSelector;
3140 }
3141
3142 var $el = $$1(el);
3143 if (!$el.length) return undefined;
3144
3145 if ($el.length > 1) {
3146 // check if close link (targetEl) in this modal
3147 var $parentEl;
3148
3149 if (targetEl) {
3150 var $targetEl = $$1(targetEl);
3151
3152 if ($targetEl.length) {
3153 $parentEl = $targetEl.parents($el);
3154 }
3155 }
3156
3157 if ($parentEl && $parentEl.length > 0) {
3158 $el = $parentEl;
3159 } else {
3160 $el = $el.eq($el.length - 1);
3161 }
3162 }
3163
3164 var instance = $el[0].f7Modal;
3165
3166 if (!instance) {
3167 var params = $el.dataset();
3168 instance = new Constructor(app, _extends({
3169 el: $el
3170 }, params));
3171 }
3172
3173 return instance.close(animate);
3174 }
3175 });
3176 return methods;
3177 }
3178
3179 var fetchedModules = [];
3180
3181 function loadModule(moduleToLoad) {
3182 var Framework7 = this;
3183 var window = getWindow();
3184 var document = getDocument();
3185 return new Promise(function (resolve, reject) {
3186 var app = Framework7.instance;
3187 var modulePath;
3188 var moduleObj;
3189 var moduleFunc;
3190
3191 if (!moduleToLoad) {
3192 reject(new Error('Framework7: Lazy module must be specified'));
3193 return;
3194 }
3195
3196 function install(module) {
3197 Framework7.use(module);
3198
3199 if (app) {
3200 app.useModuleParams(module, app.params);
3201 app.useModule(module);
3202 }
3203 }
3204
3205 if (typeof moduleToLoad === 'string') {
3206 var matchNamePattern = moduleToLoad.match(/([a-z0-9-]*)/i);
3207
3208 if (moduleToLoad.indexOf('.') < 0 && matchNamePattern && matchNamePattern[0].length === moduleToLoad.length) {
3209 if (!app || app && !app.params.lazyModulesPath) {
3210 reject(new Error('Framework7: "lazyModulesPath" app parameter must be specified to fetch module by name'));
3211 return;
3212 }
3213
3214 modulePath = app.params.lazyModulesPath + "/" + moduleToLoad + "/" + moduleToLoad + ".js";
3215 } else {
3216 modulePath = moduleToLoad;
3217 }
3218 } else if (typeof moduleToLoad === 'function') {
3219 moduleFunc = moduleToLoad;
3220 } else {
3221 // considering F7-Plugin object
3222 moduleObj = moduleToLoad;
3223 }
3224
3225 if (moduleFunc) {
3226 var module = moduleFunc(Framework7, false);
3227
3228 if (!module) {
3229 reject(new Error("Framework7: Can't find Framework7 component in specified component function"));
3230 return;
3231 } // Check if it was added
3232
3233
3234 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3235 resolve();
3236 return;
3237 } // Install It
3238
3239
3240 install(module);
3241 resolve();
3242 }
3243
3244 if (moduleObj) {
3245 var _module = moduleObj;
3246
3247 if (!_module) {
3248 reject(new Error("Framework7: Can't find Framework7 component in specified component"));
3249 return;
3250 } // Check if it was added
3251
3252
3253 if (Framework7.prototype.modules && Framework7.prototype.modules[_module.name]) {
3254 resolve();
3255 return;
3256 } // Install It
3257
3258
3259 install(_module);
3260 resolve();
3261 }
3262
3263 if (modulePath) {
3264 if (fetchedModules.indexOf(modulePath) >= 0) {
3265 resolve();
3266 return;
3267 }
3268
3269 fetchedModules.push(modulePath);
3270 var scriptLoad = new Promise(function (resolveScript, rejectScript) {
3271 Framework7.request.get(modulePath, function (scriptContent) {
3272 var callbackId = id();
3273 var callbackLoadName = "f7_component_loader_callback_" + callbackId;
3274 var scriptEl = document.createElement('script');
3275 scriptEl.innerHTML = "window." + callbackLoadName + " = function (Framework7, Framework7AutoInstallComponent) {return " + scriptContent.trim() + "}";
3276 $$1('head').append(scriptEl);
3277 var componentLoader = window[callbackLoadName];
3278 delete window[callbackLoadName];
3279 $$1(scriptEl).remove();
3280 var module = componentLoader(Framework7, false);
3281
3282 if (!module) {
3283 rejectScript(new Error("Framework7: Can't find Framework7 component in " + modulePath + " file"));
3284 return;
3285 } // Check if it was added
3286
3287
3288 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3289 resolveScript();
3290 return;
3291 } // Install It
3292
3293
3294 install(module);
3295 resolveScript();
3296 }, function (xhr, status) {
3297 rejectScript(xhr, status);
3298 });
3299 });
3300 var styleLoad = new Promise(function (resolveStyle) {
3301 Framework7.request.get(modulePath.replace('.js', app.rtl ? '.rtl.css' : '.css'), function (styleContent) {
3302 var styleEl = document.createElement('style');
3303 styleEl.innerHTML = styleContent;
3304 $$1('head').append(styleEl);
3305 resolveStyle();
3306 }, function () {
3307 resolveStyle();
3308 });
3309 });
3310 Promise.all([scriptLoad, styleLoad]).then(function () {
3311 resolve();
3312 }).catch(function (err) {
3313 reject(err);
3314 });
3315 }
3316 });
3317 }
3318
3319 var Framework7 = /*#__PURE__*/function (_Framework7Class) {
3320 _inheritsLoose$1(Framework7, _Framework7Class);
3321
3322 function Framework7(params) {
3323 var _this;
3324
3325 if (params === void 0) {
3326 params = {};
3327 }
3328
3329 _this = _Framework7Class.call(this, params) || this;
3330
3331 if (Framework7.instance) {
3332 throw new Error("Framework7 is already initialized and can't be initialized more than once");
3333 }
3334
3335 var device = getDevice({
3336 userAgent: params.userAgent || undefined
3337 });
3338 var support = getSupport();
3339 var passedParams = extend$1({}, params); // App Instance
3340
3341 var app = _assertThisInitialized$1(_this);
3342
3343 app.device = device;
3344 app.support = support;
3345 var window = getWindow();
3346 var document = getDocument();
3347 Framework7.instance = app; // Default
3348
3349 var defaults = {
3350 version: '1.0.0',
3351 id: 'io.framework7.myapp',
3352 el: 'body',
3353 theme: 'auto',
3354 language: window.navigator.language,
3355 routes: [],
3356 name: 'Framework7',
3357 lazyModulesPath: null,
3358 initOnDeviceReady: true,
3359 init: true,
3360 autoDarkTheme: false,
3361 iosTranslucentBars: true,
3362 iosTranslucentModals: true,
3363 component: undefined,
3364 componentUrl: undefined,
3365 userAgent: null,
3366 url: null
3367 }; // Extend defaults with modules params
3368
3369 app.useModulesParams(defaults); // Extend defaults with passed params
3370
3371 app.params = extend$1(defaults, params);
3372 extend$1(app, {
3373 // App Id
3374 id: app.params.id,
3375 // App Name
3376 name: app.params.name,
3377 // App version
3378 version: app.params.version,
3379 // Routes
3380 routes: app.params.routes,
3381 // Lang
3382 language: app.params.language,
3383 // Theme
3384 theme: function getTheme() {
3385 if (app.params.theme === 'auto') {
3386 if (device.ios) return 'ios';
3387 if (device.desktop && device.electron) return 'aurora';
3388 return 'md';
3389 }
3390
3391 return app.params.theme;
3392 }(),
3393 // Initially passed parameters
3394 passedParams: passedParams,
3395 online: window.navigator.onLine
3396 });
3397 if (params.store) app.params.store = params.store; // Save Root
3398
3399 if (app.$el && app.$el[0]) {
3400 app.$el[0].f7 = app;
3401 } // Install Modules
3402
3403
3404 app.useModules(); // Init Store
3405
3406 app.initStore(); // Init
3407
3408 if (app.params.init) {
3409 if (device.cordova && app.params.initOnDeviceReady) {
3410 $$1(document).on('deviceready', function () {
3411 app.init();
3412 });
3413 } else {
3414 app.init();
3415 }
3416 } // Return app instance
3417
3418
3419 return app || _assertThisInitialized$1(_this);
3420 }
3421
3422 var _proto = Framework7.prototype;
3423
3424 _proto.mount = function mount(rootEl) {
3425 var app = this;
3426 var window = getWindow();
3427 var document = getDocument();
3428 var $rootEl = $$1(rootEl || app.params.el).eq(0);
3429 app.$el = $rootEl;
3430
3431 if (app.$el && app.$el[0]) {
3432 app.el = app.$el[0];
3433 app.el.f7 = app;
3434 app.rtl = $rootEl.css('direction') === 'rtl';
3435 } // Auto Dark Theme
3436
3437
3438 var DARK = '(prefers-color-scheme: dark)';
3439 var LIGHT = '(prefers-color-scheme: light)';
3440 app.mq = {};
3441
3442 if (window.matchMedia) {
3443 app.mq.dark = window.matchMedia(DARK);
3444 app.mq.light = window.matchMedia(LIGHT);
3445 }
3446
3447 app.colorSchemeListener = function colorSchemeListener(_ref) {
3448 var matches = _ref.matches,
3449 media = _ref.media;
3450
3451 if (!matches) {
3452 return;
3453 }
3454
3455 var html = document.querySelector('html');
3456
3457 if (media === DARK) {
3458 html.classList.add('theme-dark');
3459 app.darkTheme = true;
3460 app.emit('darkThemeChange', true);
3461 } else if (media === LIGHT) {
3462 html.classList.remove('theme-dark');
3463 app.darkTheme = false;
3464 app.emit('darkThemeChange', false);
3465 }
3466 };
3467
3468 app.emit('mount');
3469 };
3470
3471 _proto.initStore = function initStore() {
3472 var app = this;
3473
3474 if (typeof app.params.store !== 'undefined' && app.params.store.__store) {
3475 app.store = app.params.store;
3476 } else {
3477 app.store = app.createStore(app.params.store);
3478 }
3479 };
3480
3481 _proto.enableAutoDarkTheme = function enableAutoDarkTheme() {
3482 var window = getWindow();
3483 var document = getDocument();
3484 if (!window.matchMedia) return;
3485 var app = this;
3486 var html = document.querySelector('html');
3487
3488 if (app.mq.dark && app.mq.light) {
3489 app.mq.dark.addListener(app.colorSchemeListener);
3490 app.mq.light.addListener(app.colorSchemeListener);
3491 }
3492
3493 if (app.mq.dark && app.mq.dark.matches) {
3494 html.classList.add('theme-dark');
3495 app.darkTheme = true;
3496 app.emit('darkThemeChange', true);
3497 } else if (app.mq.light && app.mq.light.matches) {
3498 html.classList.remove('theme-dark');
3499 app.darkTheme = false;
3500 app.emit('darkThemeChange', false);
3501 }
3502 };
3503
3504 _proto.disableAutoDarkTheme = function disableAutoDarkTheme() {
3505 var window = getWindow();
3506 if (!window.matchMedia) return;
3507 var app = this;
3508 if (app.mq.dark) app.mq.dark.removeListener(app.colorSchemeListener);
3509 if (app.mq.light) app.mq.light.removeListener(app.colorSchemeListener);
3510 };
3511
3512 _proto.initAppComponent = function initAppComponent(callback) {
3513 var app = this;
3514 app.router.componentLoader(app.params.component, app.params.componentUrl, {
3515 componentOptions: {
3516 el: app.$el[0]
3517 }
3518 }, function (el) {
3519 app.$el = $$1(el);
3520 app.$el[0].f7 = app;
3521 app.$elComponent = el.f7Component;
3522 app.el = app.$el[0];
3523 if (callback) callback();
3524 }, function () {});
3525 };
3526
3527 _proto.init = function init(rootEl) {
3528 var app = this;
3529 app.mount(rootEl);
3530
3531 var init = function init() {
3532 if (app.initialized) return;
3533 app.$el.addClass('framework7-initializing'); // RTL attr
3534
3535 if (app.rtl) {
3536 $$1('html').attr('dir', 'rtl');
3537 } // Auto Dark Theme
3538
3539
3540 if (app.params.autoDarkTheme) {
3541 app.enableAutoDarkTheme();
3542 } // Watch for online/offline state
3543
3544
3545 var window = getWindow();
3546 window.addEventListener('offline', function () {
3547 app.online = false;
3548 app.emit('offline');
3549 app.emit('connection', false);
3550 });
3551 window.addEventListener('online', function () {
3552 app.online = true;
3553 app.emit('online');
3554 app.emit('connection', true);
3555 }); // Root class
3556
3557 app.$el.addClass('framework7-root'); // Theme class
3558
3559 $$1('html').removeClass('ios md aurora').addClass(app.theme); // iOS Translucent
3560
3561 var device = app.device;
3562
3563 if (app.params.iosTranslucentBars && app.theme === 'ios' && device.ios) {
3564 $$1('html').addClass('ios-translucent-bars');
3565 }
3566
3567 if (app.params.iosTranslucentModals && app.theme === 'ios' && device.ios) {
3568 $$1('html').addClass('ios-translucent-modals');
3569 } // Init class
3570
3571
3572 nextFrame(function () {
3573 app.$el.removeClass('framework7-initializing');
3574 }); // Emit, init other modules
3575
3576 app.initialized = true;
3577 app.emit('init');
3578 };
3579
3580 if (app.params.component || app.params.componentUrl) {
3581 app.initAppComponent(function () {
3582 init();
3583 });
3584 } else {
3585 init();
3586 }
3587
3588 return app;
3589 } // eslint-disable-next-line
3590 ;
3591
3592 _proto.loadModule = function loadModule() {
3593 return Framework7.loadModule.apply(Framework7, arguments);
3594 } // eslint-disable-next-line
3595 ;
3596
3597 _proto.loadModules = function loadModules() {
3598 return Framework7.loadModules.apply(Framework7, arguments);
3599 };
3600
3601 _proto.getVnodeHooks = function getVnodeHooks(hook, id) {
3602 var app = this;
3603 if (!app.vnodeHooks || !app.vnodeHooks[hook]) return [];
3604 return app.vnodeHooks[hook][id] || [];
3605 } // eslint-disable-next-line
3606 ;
3607
3608 _createClass(Framework7, [{
3609 key: "$",
3610 get: function get() {
3611 return $$1;
3612 }
3613 }], [{
3614 key: "Dom7",
3615 get: function get() {
3616 return $$1;
3617 }
3618 }, {
3619 key: "$",
3620 get: function get() {
3621 return $$1;
3622 }
3623 }, {
3624 key: "device",
3625 get: function get() {
3626 return getDevice();
3627 }
3628 }, {
3629 key: "support",
3630 get: function get() {
3631 return getSupport();
3632 }
3633 }, {
3634 key: "Class",
3635 get: function get() {
3636 return Framework7Class;
3637 }
3638 }, {
3639 key: "Events",
3640 get: function get() {
3641 return EventsClass;
3642 }
3643 }]);
3644
3645 return Framework7;
3646 }(Framework7Class);
3647
3648 Framework7.ModalMethods = ModalMethods;
3649 Framework7.ConstructorMethods = ConstructorMethods;
3650 Framework7.loadModule = loadModule;
3651
3652 Framework7.loadModules = function loadModules(modules) {
3653 return Promise.all(modules.map(function (module) {
3654 return Framework7.loadModule(module);
3655 }));
3656 };
3657
3658 var DeviceModule = {
3659 name: 'device',
3660 static: {
3661 getDevice: getDevice
3662 },
3663 on: {
3664 init: function init() {
3665 var document = getDocument();
3666 var device = getDevice();
3667 var classNames = [];
3668 var html = document.querySelector('html');
3669 var metaStatusbar = document.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
3670 if (!html) return;
3671
3672 if (device.standalone && device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
3673 classNames.push('device-full-viewport');
3674 } // Pixel Ratio
3675
3676
3677 classNames.push("device-pixel-ratio-" + Math.floor(device.pixelRatio)); // OS classes
3678
3679 if (device.os && !device.desktop) {
3680 classNames.push("device-" + device.os);
3681 } else if (device.desktop) {
3682 classNames.push('device-desktop');
3683
3684 if (device.os) {
3685 classNames.push("device-" + device.os);
3686 }
3687 }
3688
3689 if (device.cordova || device.phonegap) {
3690 classNames.push('device-cordova');
3691 }
3692
3693 if (device.capacitor) {
3694 classNames.push('device-capacitor');
3695 } // Add html classes
3696
3697
3698 classNames.forEach(function (className) {
3699 html.classList.add(className);
3700 });
3701 }
3702 }
3703 };
3704
3705 var SupportModule = {
3706 name: 'support',
3707 static: {
3708 getSupport: getSupport
3709 }
3710 };
3711
3712 var UtilsModule = {
3713 name: 'utils',
3714 proto: {
3715 utils: utils
3716 },
3717 static: {
3718 utils: utils
3719 }
3720 };
3721
3722 var ResizeModule = {
3723 name: 'resize',
3724 create: function create() {
3725 var app = this;
3726
3727 app.getSize = function () {
3728 if (!app.el) return {
3729 width: 0,
3730 height: 0,
3731 left: 0,
3732 top: 0
3733 };
3734 var offset = app.$el.offset();
3735 var _ref = [app.el.offsetWidth, app.el.offsetHeight, offset.left, offset.top],
3736 width = _ref[0],
3737 height = _ref[1],
3738 left = _ref[2],
3739 top = _ref[3];
3740 app.width = width;
3741 app.height = height;
3742 app.left = left;
3743 app.top = top;
3744 return {
3745 width: width,
3746 height: height,
3747 left: left,
3748 top: top
3749 };
3750 };
3751 },
3752 on: {
3753 init: function init() {
3754 var app = this;
3755 var window = getWindow(); // Get Size
3756
3757 app.getSize(); // Emit resize
3758
3759 window.addEventListener('resize', function () {
3760 app.emit('resize');
3761 }, false); // Emit orientationchange
3762
3763 window.addEventListener('orientationchange', function () {
3764 app.emit('orientationchange');
3765 });
3766 },
3767 orientationchange: function orientationchange() {
3768 var document = getDocument();
3769 var device = getDevice(); // Fix iPad weird body scroll
3770
3771 if (device.ipad) {
3772 document.body.scrollLeft = 0;
3773 setTimeout(function () {
3774 document.body.scrollLeft = 0;
3775 }, 0);
3776 }
3777 },
3778 resize: function resize() {
3779 var app = this;
3780 app.getSize();
3781 }
3782 }
3783 };
3784
3785 var globals = {};
3786 var jsonpRequests = 0;
3787
3788 var RequestResponse = function RequestResponse(obj) {
3789 Object.assign(this, obj);
3790 };
3791
3792 var RequestError = /*#__PURE__*/function (_Error) {
3793 _inheritsLoose$1(RequestError, _Error);
3794
3795 function RequestError(obj) {
3796 var _this;
3797
3798 _this = _Error.call(this) || this;
3799 Object.assign(_assertThisInitialized$1(_this), obj);
3800 return _this;
3801 }
3802
3803 return RequestError;
3804 }( /*#__PURE__*/_wrapNativeSuper$1(Error));
3805
3806 var request = function request(requestOptions) {
3807 return new Promise(function (resolve, reject) {
3808 var window = getWindow();
3809 var document = getDocument();
3810 var globalsNoCallbacks = extend$1({}, globals);
3811 'beforeCreate beforeOpen beforeSend error complete success statusCode'.split(' ').forEach(function (callbackName) {
3812 delete globalsNoCallbacks[callbackName];
3813 });
3814 var defaults = extend$1({
3815 url: window.location.toString(),
3816 method: 'GET',
3817 data: false,
3818 async: true,
3819 cache: true,
3820 user: '',
3821 password: '',
3822 headers: {},
3823 xhrFields: {},
3824 statusCode: {},
3825 processData: true,
3826 dataType: 'text',
3827 contentType: 'application/x-www-form-urlencoded',
3828 timeout: 0
3829 }, globalsNoCallbacks);
3830 var proceedRequest;
3831 var options = extend$1({}, defaults, requestOptions);
3832
3833 if (requestOptions.abortController) {
3834 options.abortController = requestOptions.abortController;
3835 }
3836
3837 if (options.abortController && options.abortController.canceled) {
3838 reject(new RequestError({
3839 options: options,
3840 status: 'canceled',
3841 message: 'canceled'
3842 }));
3843 return;
3844 } // Function to run XHR callbacks and events
3845
3846
3847 function fireCallback(callbackName) {
3848 /*
3849 Callbacks:
3850 beforeCreate (options),
3851 beforeOpen (xhr, options),
3852 beforeSend (xhr, options),
3853 error (xhr, status, message),
3854 complete (xhr, status),
3855 success (response, status, xhr),
3856 statusCode ()
3857 */
3858 var globalCallbackValue;
3859 var optionCallbackValue;
3860
3861 for (var _len = arguments.length, data = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
3862 data[_key - 1] = arguments[_key];
3863 }
3864
3865 if (globals[callbackName]) {
3866 globalCallbackValue = globals[callbackName].apply(globals, data);
3867 }
3868
3869 if (options[callbackName]) {
3870 optionCallbackValue = options[callbackName].apply(options, data);
3871 }
3872
3873 if (typeof globalCallbackValue !== 'boolean') globalCallbackValue = true;
3874 if (typeof optionCallbackValue !== 'boolean') optionCallbackValue = true;
3875
3876 if (options.abortController && options.abortController.canceled && (callbackName === 'beforeCreate' || callbackName === 'beforeOpen' || callbackName === 'beforeSend')) {
3877 return false;
3878 }
3879
3880 return globalCallbackValue && optionCallbackValue;
3881 } // Before create callback
3882
3883
3884 proceedRequest = fireCallback('beforeCreate', options);
3885
3886 if (proceedRequest === false) {
3887 reject(new RequestError({
3888 options: options,
3889 status: 'canceled',
3890 message: 'canceled'
3891 }));
3892 return;
3893 } // For jQuery guys
3894
3895
3896 if (options.type) options.method = options.type; // Parameters Prefix
3897
3898 var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?'; // UC method
3899
3900 var method = options.method.toUpperCase(); // Data to modify GET URL
3901
3902 if ((method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') && options.data) {
3903 var stringData;
3904
3905 if (typeof options.data === 'string') {
3906 // Should be key=value string
3907 if (options.data.indexOf('?') >= 0) stringData = options.data.split('?')[1];else stringData = options.data;
3908 } else {
3909 // Should be key=value object
3910 stringData = serializeObject(options.data);
3911 }
3912
3913 if (stringData.length) {
3914 options.url += paramsPrefix + stringData;
3915 if (paramsPrefix === '?') paramsPrefix = '&';
3916 }
3917 } // JSONP
3918
3919
3920 if (options.dataType === 'json' && options.url.indexOf('callback=') >= 0) {
3921 var callbackName = "f7jsonp_" + (Date.now() + (jsonpRequests += 1));
3922 var abortTimeout;
3923 var callbackSplit = options.url.split('callback=');
3924 var requestUrl = callbackSplit[0] + "callback=" + callbackName;
3925
3926 if (callbackSplit[1].indexOf('&') >= 0) {
3927 var addVars = callbackSplit[1].split('&').filter(function (el) {
3928 return el.indexOf('=') > 0;
3929 }).join('&');
3930 if (addVars.length > 0) requestUrl += "&" + addVars;
3931 } // Create script
3932
3933
3934 var script = document.createElement('script');
3935 script.type = 'text/javascript';
3936
3937 script.onerror = function onerror() {
3938 clearTimeout(abortTimeout);
3939 fireCallback('error', null, 'scripterror', 'scripterror');
3940 reject(new RequestError({
3941 options: options,
3942 status: 'scripterror',
3943 message: 'scripterror'
3944 }));
3945 fireCallback('complete', null, 'scripterror');
3946 };
3947
3948 script.src = requestUrl; // Handler
3949
3950 window[callbackName] = function jsonpCallback(data) {
3951 clearTimeout(abortTimeout);
3952 fireCallback('success', data);
3953 script.parentNode.removeChild(script);
3954 script = null;
3955 delete window[callbackName];
3956 resolve(new RequestResponse({
3957 options: options,
3958 data: data
3959 }));
3960 };
3961
3962 document.querySelector('head').appendChild(script);
3963
3964 if (options.timeout > 0) {
3965 abortTimeout = setTimeout(function () {
3966 script.parentNode.removeChild(script);
3967 script = null;
3968 fireCallback('error', null, 'timeout', 'timeout');
3969 reject(new RequestError({
3970 options: options,
3971 status: 'timeout',
3972 message: 'timeout'
3973 }));
3974 }, options.timeout);
3975 }
3976
3977 return;
3978 } // Cache for GET/HEAD requests
3979
3980
3981 if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') {
3982 if (options.cache === false) {
3983 options.url += paramsPrefix + "_nocache" + Date.now();
3984 }
3985 } // Create XHR
3986
3987
3988 var xhr = new XMLHttpRequest();
3989
3990 if (options.abortController) {
3991 var aborted = false;
3992
3993 options.abortController.onAbort = function () {
3994 if (aborted) return;
3995 aborted = true;
3996 xhr.abort();
3997 reject(new RequestError({
3998 options: options,
3999 xhr: xhr,
4000 status: 'canceled',
4001 message: 'canceled'
4002 }));
4003 };
4004 } // Save Request URL
4005
4006
4007 xhr.requestUrl = options.url;
4008 xhr.requestParameters = options; // Before open callback
4009
4010 proceedRequest = fireCallback('beforeOpen', xhr, options);
4011
4012 if (proceedRequest === false) {
4013 reject(new RequestError({
4014 options: options,
4015 xhr: xhr,
4016 status: 'canceled',
4017 message: 'canceled'
4018 }));
4019 return;
4020 } // Open XHR
4021
4022
4023 xhr.open(method, options.url, options.async, options.user, options.password); // Create POST Data
4024
4025 var postData = null;
4026
4027 if ((method === 'POST' || method === 'PUT' || method === 'PATCH') && options.data) {
4028 if (options.processData) {
4029 var postDataInstances = [ArrayBuffer, Blob, Document, FormData]; // Post Data
4030
4031 if (postDataInstances.indexOf(options.data.constructor) >= 0) {
4032 postData = options.data;
4033 } else {
4034 // POST Headers
4035 var boundary = "---------------------------" + Date.now().toString(16);
4036
4037 if (options.contentType === 'multipart/form-data') {
4038 xhr.setRequestHeader('Content-Type', "multipart/form-data; boundary=" + boundary);
4039 } else {
4040 xhr.setRequestHeader('Content-Type', options.contentType);
4041 }
4042
4043 postData = '';
4044 var data = serializeObject(options.data);
4045
4046 if (options.contentType === 'multipart/form-data') {
4047 data = data.split('&');
4048 var newData = [];
4049
4050 for (var i = 0; i < data.length; i += 1) {
4051 newData.push("Content-Disposition: form-data; name=\"" + data[i].split('=')[0] + "\"\r\n\r\n" + data[i].split('=')[1] + "\r\n");
4052 }
4053
4054 postData = "--" + boundary + "\r\n" + newData.join("--" + boundary + "\r\n") + "--" + boundary + "--\r\n";
4055 } else if (options.contentType === 'application/json') {
4056 postData = JSON.stringify(options.data);
4057 } else {
4058 postData = data;
4059 }
4060 }
4061 } else {
4062 postData = options.data;
4063 xhr.setRequestHeader('Content-Type', options.contentType);
4064 }
4065 }
4066
4067 if (options.dataType === 'json' && (!options.headers || !options.headers.Accept)) {
4068 xhr.setRequestHeader('Accept', 'application/json');
4069 } // Additional headers
4070
4071
4072 if (options.headers) {
4073 Object.keys(options.headers).forEach(function (headerName) {
4074 if (typeof options.headers[headerName] === 'undefined') return;
4075 xhr.setRequestHeader(headerName, options.headers[headerName]);
4076 });
4077 } // Check for crossDomain
4078
4079
4080 if (typeof options.crossDomain === 'undefined') {
4081 options.crossDomain = // eslint-disable-next-line
4082 /^([\w-]+:)?\/\/([^\/]+)/.test(options.url) && RegExp.$2 !== window.location.host;
4083 }
4084
4085 if (!options.crossDomain) {
4086 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
4087 }
4088
4089 if (options.xhrFields) {
4090 extend$1(xhr, options.xhrFields);
4091 } // Handle XHR
4092
4093
4094 xhr.onload = function onload() {
4095 if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 0) {
4096 var responseData;
4097
4098 if (options.dataType === 'json') {
4099 var parseError;
4100
4101 try {
4102 responseData = JSON.parse(xhr.responseText);
4103 } catch (err) {
4104 parseError = true;
4105 }
4106
4107 if (!parseError) {
4108 fireCallback('success', responseData, xhr.status, xhr);
4109 resolve(new RequestResponse({
4110 options: options,
4111 data: responseData,
4112 status: xhr.status,
4113 xhr: xhr
4114 }));
4115 } else {
4116 fireCallback('error', xhr, 'parseerror', 'parseerror');
4117 reject(new RequestError({
4118 options: options,
4119 xhr: xhr,
4120 status: 'parseerror',
4121 message: 'parseerror'
4122 }));
4123 }
4124 } else {
4125 responseData = xhr.responseType === 'text' || xhr.responseType === '' ? xhr.responseText : xhr.response;
4126 fireCallback('success', responseData, xhr.status, xhr);
4127 resolve(new RequestResponse({
4128 options: options,
4129 data: responseData,
4130 status: xhr.status,
4131 xhr: xhr
4132 }));
4133 }
4134 } else {
4135 fireCallback('error', xhr, xhr.status, xhr.statusText);
4136 reject(new RequestError({
4137 options: options,
4138 xhr: xhr,
4139 status: xhr.status,
4140 message: xhr.statusText
4141 }));
4142 }
4143
4144 if (options.statusCode) {
4145 if (globals.statusCode && globals.statusCode[xhr.status]) globals.statusCode[xhr.status](xhr);
4146 if (options.statusCode[xhr.status]) options.statusCode[xhr.status](xhr);
4147 }
4148
4149 fireCallback('complete', xhr, xhr.status);
4150 };
4151
4152 xhr.onerror = function onerror() {
4153 fireCallback('error', xhr, xhr.status, xhr.status);
4154 reject(new RequestError({
4155 options: options,
4156 xhr: xhr,
4157 status: xhr.status,
4158 message: xhr.statusText
4159 }));
4160 fireCallback('complete', xhr, 'error');
4161 }; // Timeout
4162
4163
4164 if (options.timeout > 0) {
4165 xhr.timeout = options.timeout;
4166
4167 xhr.ontimeout = function () {
4168 fireCallback('error', xhr, 'timeout', 'timeout');
4169 reject(new RequestError({
4170 options: options,
4171 xhr: xhr,
4172 status: 'timeout',
4173 message: 'timeout'
4174 }));
4175 fireCallback('complete', xhr, 'timeout');
4176 };
4177 } // Ajax start callback
4178
4179
4180 proceedRequest = fireCallback('beforeSend', xhr, options);
4181
4182 if (proceedRequest === false) {
4183 reject(new RequestError({
4184 options: options,
4185 xhr: xhr,
4186 status: 'canceled',
4187 message: 'canceled'
4188 }));
4189 return;
4190 } // Send XHR
4191
4192
4193 xhr.send(postData);
4194 });
4195 };
4196
4197 function requestShortcut(method) {
4198 var _ref = [],
4199 url = _ref[0],
4200 data = _ref[1],
4201 success = _ref[2],
4202 error = _ref[3],
4203 dataType = _ref[4];
4204
4205 for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
4206 args[_key2 - 1] = arguments[_key2];
4207 }
4208
4209 if (typeof args[1] === 'function') {
4210 url = args[0];
4211 success = args[1];
4212 error = args[2];
4213 dataType = args[3];
4214 } else {
4215 url = args[0];
4216 data = args[1];
4217 success = args[2];
4218 error = args[3];
4219 dataType = args[4];
4220 }
4221
4222 [success, error].forEach(function (callback) {
4223 if (typeof callback === 'string') {
4224 dataType = callback;
4225 if (callback === success) success = undefined;else error = undefined;
4226 }
4227 });
4228 dataType = dataType || (method === 'json' || method === 'postJSON' ? 'json' : undefined);
4229 var requestOptions = {
4230 url: url,
4231 method: method === 'post' || method === 'postJSON' ? 'POST' : 'GET',
4232 data: data,
4233 success: success,
4234 error: error,
4235 dataType: dataType
4236 };
4237
4238 if (method === 'postJSON') {
4239 extend$1(requestOptions, {
4240 contentType: 'application/json',
4241 processData: false,
4242 crossDomain: true,
4243 data: typeof data === 'string' ? data : JSON.stringify(data)
4244 });
4245 }
4246
4247 return request(requestOptions);
4248 }
4249
4250 Object.assign(request, {
4251 get: function get() {
4252 for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
4253 args[_key3] = arguments[_key3];
4254 }
4255
4256 return requestShortcut.apply(void 0, ['get'].concat(args));
4257 },
4258 post: function post() {
4259 for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
4260 args[_key4] = arguments[_key4];
4261 }
4262
4263 return requestShortcut.apply(void 0, ['post'].concat(args));
4264 },
4265 json: function json() {
4266 for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
4267 args[_key5] = arguments[_key5];
4268 }
4269
4270 return requestShortcut.apply(void 0, ['json'].concat(args));
4271 },
4272 getJSON: function getJSON() {
4273 for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
4274 args[_key6] = arguments[_key6];
4275 }
4276
4277 return requestShortcut.apply(void 0, ['json'].concat(args));
4278 },
4279 postJSON: function postJSON() {
4280 for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
4281 args[_key7] = arguments[_key7];
4282 }
4283
4284 return requestShortcut.apply(void 0, ['postJSON'].concat(args));
4285 }
4286 });
4287
4288 request.abortController = function () {
4289 var contoller = {
4290 canceled: false,
4291 onAbort: null,
4292 abort: function abort() {
4293 contoller.canceled = true;
4294 if (contoller.onAbort) contoller.onAbort();
4295 }
4296 };
4297 return contoller;
4298 };
4299
4300 request.setup = function setup(options) {
4301 if (options.type && !options.method) {
4302 extend$1(options, {
4303 method: options.type
4304 });
4305 }
4306
4307 extend$1(globals, options);
4308 };
4309
4310 /* eslint no-param-reassign: "off" */
4311 var RequestModule = {
4312 name: 'request',
4313 proto: {
4314 request: request
4315 },
4316 static: {
4317 request: request
4318 }
4319 };
4320
4321 /* eslint-disable no-nested-ternary */
4322
4323 function initTouch() {
4324 var app = this;
4325 var device = getDevice();
4326 var support = getSupport();
4327 var window = getWindow();
4328 var document = getDocument();
4329 var params = app.params.touch;
4330 var useRipple = params[app.theme + "TouchRipple"];
4331
4332 if (device.ios && device.webView) {
4333 // Strange hack required for iOS 8 webview to work on inputs
4334 window.addEventListener('touchstart', function () {});
4335 }
4336
4337 var touchStartX;
4338 var touchStartY;
4339 var targetElement;
4340 var isMoved;
4341 var tapHoldFired;
4342 var tapHoldTimeout;
4343 var preventClick;
4344 var activableElement;
4345 var activeTimeout;
4346 var rippleWave;
4347 var rippleTarget;
4348 var rippleTimeout;
4349
4350 function findActivableElement(el) {
4351 var target = $$1(el);
4352 var parents = target.parents(params.activeStateElements);
4353
4354 if (target.closest('.no-active-state').length) {
4355 return null;
4356 }
4357
4358 var activable;
4359
4360 if (target.is(params.activeStateElements)) {
4361 activable = target;
4362 }
4363
4364 if (parents.length > 0) {
4365 activable = activable ? activable.add(parents) : parents;
4366 }
4367
4368 if (activable && activable.length > 1) {
4369 var newActivable = [];
4370 var preventPropagation;
4371
4372 for (var i = 0; i < activable.length; i += 1) {
4373 if (!preventPropagation) {
4374 newActivable.push(activable[i]);
4375
4376 if (activable.eq(i).hasClass('prevent-active-state-propagation') || activable.eq(i).hasClass('no-active-state-propagation')) {
4377 preventPropagation = true;
4378 }
4379 }
4380 }
4381
4382 activable = $$1(newActivable);
4383 }
4384
4385 return activable || target;
4386 }
4387
4388 function isInsideScrollableView(el) {
4389 var pageContent = el.parents('.page-content');
4390 return pageContent.length > 0;
4391 }
4392
4393 function addActive() {
4394 if (!activableElement) return;
4395 activableElement.addClass('active-state');
4396 }
4397
4398 function removeActive() {
4399 if (!activableElement) return;
4400 activableElement.removeClass('active-state');
4401 activableElement = null;
4402 } // Ripple handlers
4403
4404
4405 function findRippleElement(el) {
4406 var rippleElements = params.touchRippleElements;
4407 var $el = $$1(el);
4408
4409 if ($el.is(rippleElements)) {
4410 if ($el.hasClass('no-ripple')) {
4411 return false;
4412 }
4413
4414 return $el;
4415 }
4416
4417 if ($el.parents(rippleElements).length > 0) {
4418 var rippleParent = $el.parents(rippleElements).eq(0);
4419
4420 if (rippleParent.hasClass('no-ripple')) {
4421 return false;
4422 }
4423
4424 return rippleParent;
4425 }
4426
4427 return false;
4428 }
4429
4430 function createRipple($el, x, y) {
4431 if (!$el) return;
4432 rippleWave = app.touchRipple.create(app, $el, x, y);
4433 }
4434
4435 function removeRipple() {
4436 if (!rippleWave) return;
4437 rippleWave.remove();
4438 rippleWave = undefined;
4439 rippleTarget = undefined;
4440 }
4441
4442 function rippleTouchStart(el) {
4443 rippleTarget = findRippleElement(el);
4444
4445 if (!rippleTarget || rippleTarget.length === 0) {
4446 rippleTarget = undefined;
4447 return;
4448 }
4449
4450 var inScrollable = isInsideScrollableView(rippleTarget);
4451
4452 if (!inScrollable) {
4453 removeRipple();
4454 createRipple(rippleTarget, touchStartX, touchStartY);
4455 } else {
4456 clearTimeout(rippleTimeout);
4457 rippleTimeout = setTimeout(function () {
4458 removeRipple();
4459 createRipple(rippleTarget, touchStartX, touchStartY);
4460 }, 80);
4461 }
4462 }
4463
4464 function rippleTouchMove() {
4465 clearTimeout(rippleTimeout);
4466 removeRipple();
4467 }
4468
4469 function rippleTouchEnd() {
4470 if (!rippleWave && rippleTarget && !isMoved) {
4471 clearTimeout(rippleTimeout);
4472 createRipple(rippleTarget, touchStartX, touchStartY);
4473 setTimeout(removeRipple, 0);
4474 } else {
4475 removeRipple();
4476 }
4477 } // Mouse Handlers
4478
4479
4480 function handleMouseDown(e) {
4481 var $activableEl = findActivableElement(e.target);
4482
4483 if ($activableEl) {
4484 $activableEl.addClass('active-state');
4485
4486 if ('which' in e && e.which === 3) {
4487 setTimeout(function () {
4488 $$1('.active-state').removeClass('active-state');
4489 }, 0);
4490 }
4491 }
4492
4493 if (useRipple) {
4494 touchStartX = e.pageX;
4495 touchStartY = e.pageY;
4496 rippleTouchStart(e.target, e.pageX, e.pageY);
4497 }
4498 }
4499
4500 function handleMouseMove() {
4501 if (!params.activeStateOnMouseMove) {
4502 $$1('.active-state').removeClass('active-state');
4503 }
4504
4505 if (useRipple) {
4506 rippleTouchMove();
4507 }
4508 }
4509
4510 function handleMouseUp() {
4511 $$1('.active-state').removeClass('active-state');
4512
4513 if (useRipple) {
4514 rippleTouchEnd();
4515 }
4516 }
4517
4518 function handleTouchCancel() {
4519 targetElement = null; // Remove Active State
4520
4521 clearTimeout(activeTimeout);
4522 clearTimeout(tapHoldTimeout);
4523
4524 if (params.activeState) {
4525 removeActive();
4526 } // Remove Ripple
4527
4528
4529 if (useRipple) {
4530 rippleTouchEnd();
4531 }
4532 }
4533
4534 function handleTouchStart(e) {
4535 isMoved = false;
4536 tapHoldFired = false;
4537 preventClick = false;
4538
4539 if (e.targetTouches.length > 1) {
4540 if (activableElement) removeActive();
4541 return true;
4542 }
4543
4544 if (e.touches.length > 1 && activableElement) {
4545 removeActive();
4546 }
4547
4548 if (params.tapHold) {
4549 if (tapHoldTimeout) clearTimeout(tapHoldTimeout);
4550 tapHoldTimeout = setTimeout(function () {
4551 if (e && e.touches && e.touches.length > 1) return;
4552 tapHoldFired = true;
4553 e.preventDefault();
4554 preventClick = true;
4555 $$1(e.target).trigger('taphold', e);
4556 app.emit('taphold', e);
4557 }, params.tapHoldDelay);
4558 }
4559
4560 targetElement = e.target;
4561 touchStartX = e.targetTouches[0].pageX;
4562 touchStartY = e.targetTouches[0].pageY;
4563
4564 if (params.activeState) {
4565 activableElement = findActivableElement(targetElement);
4566
4567 if (activableElement && !isInsideScrollableView(activableElement)) {
4568 addActive();
4569 } else if (activableElement) {
4570 activeTimeout = setTimeout(addActive, 80);
4571 }
4572 }
4573
4574 if (useRipple) {
4575 rippleTouchStart(targetElement);
4576 }
4577
4578 return true;
4579 }
4580
4581 function handleTouchMove(e) {
4582 var touch;
4583 var distance;
4584
4585 if (e.type === 'touchmove') {
4586 touch = e.targetTouches[0];
4587 distance = params.touchClicksDistanceThreshold;
4588 }
4589
4590 if (distance && touch) {
4591 var pageX = touch.pageX;
4592 var pageY = touch.pageY;
4593
4594 if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
4595 isMoved = true;
4596 }
4597 } else {
4598 isMoved = true;
4599 }
4600
4601 if (isMoved) {
4602 preventClick = true;
4603
4604 if (params.tapHold) {
4605 clearTimeout(tapHoldTimeout);
4606 }
4607
4608 if (params.activeState) {
4609 clearTimeout(activeTimeout);
4610 removeActive();
4611 }
4612
4613 if (useRipple) {
4614 rippleTouchMove();
4615 }
4616 }
4617 }
4618
4619 function handleTouchEnd(e) {
4620 clearTimeout(activeTimeout);
4621 clearTimeout(tapHoldTimeout);
4622
4623 if (document.activeElement === e.target) {
4624 if (params.activeState) removeActive();
4625
4626 if (useRipple) {
4627 rippleTouchEnd();
4628 }
4629
4630 return true;
4631 }
4632
4633 if (params.activeState) {
4634 addActive();
4635 setTimeout(removeActive, 0);
4636 }
4637
4638 if (useRipple) {
4639 rippleTouchEnd();
4640 }
4641
4642 if (params.tapHoldPreventClicks && tapHoldFired || preventClick) {
4643 if (e.cancelable) e.preventDefault();
4644 preventClick = true;
4645 return false;
4646 }
4647
4648 return true;
4649 }
4650
4651 function handleClick(e) {
4652 var isOverswipe = e && e.detail && e.detail === 'f7Overswipe';
4653 var localPreventClick = preventClick;
4654
4655 if (targetElement && e.target !== targetElement) {
4656 if (isOverswipe) {
4657 localPreventClick = false;
4658 } else {
4659 localPreventClick = true;
4660 }
4661 }
4662
4663 if (params.tapHold && params.tapHoldPreventClicks && tapHoldFired) {
4664 localPreventClick = true;
4665 }
4666
4667 if (localPreventClick) {
4668 e.stopImmediatePropagation();
4669 e.stopPropagation();
4670 e.preventDefault();
4671 }
4672
4673 if (params.tapHold) {
4674 tapHoldTimeout = setTimeout(function () {
4675 tapHoldFired = false;
4676 }, device.ios || device.androidChrome ? 100 : 400);
4677 }
4678
4679 preventClick = false;
4680 targetElement = null;
4681 return !localPreventClick;
4682 }
4683
4684 function emitAppTouchEvent(name, e) {
4685 app.emit({
4686 events: name,
4687 data: [e]
4688 });
4689 }
4690
4691 function appClick(e) {
4692 emitAppTouchEvent('click', e);
4693 }
4694
4695 function appTouchStartActive(e) {
4696 emitAppTouchEvent('touchstart touchstart:active', e);
4697 }
4698
4699 function appTouchMoveActive(e) {
4700 emitAppTouchEvent('touchmove touchmove:active', e);
4701 }
4702
4703 function appTouchEndActive(e) {
4704 emitAppTouchEvent('touchend touchend:active', e);
4705 }
4706
4707 function appTouchStartPassive(e) {
4708 emitAppTouchEvent('touchstart:passive', e);
4709 }
4710
4711 function appTouchMovePassive(e) {
4712 emitAppTouchEvent('touchmove:passive', e);
4713 }
4714
4715 function appTouchEndPassive(e) {
4716 emitAppTouchEvent('touchend:passive', e);
4717 }
4718
4719 var passiveListener = support.passiveListener ? {
4720 passive: true
4721 } : false;
4722 var passiveListenerCapture = support.passiveListener ? {
4723 passive: true,
4724 capture: true
4725 } : true;
4726 var activeListener = support.passiveListener ? {
4727 passive: false
4728 } : false;
4729 var activeListenerCapture = support.passiveListener ? {
4730 passive: false,
4731 capture: true
4732 } : true;
4733 document.addEventListener('click', appClick, true);
4734
4735 if (support.passiveListener) {
4736 document.addEventListener(app.touchEvents.start, appTouchStartActive, activeListenerCapture);
4737 document.addEventListener(app.touchEvents.move, appTouchMoveActive, activeListener);
4738 document.addEventListener(app.touchEvents.end, appTouchEndActive, activeListener);
4739 document.addEventListener(app.touchEvents.start, appTouchStartPassive, passiveListenerCapture);
4740 document.addEventListener(app.touchEvents.move, appTouchMovePassive, passiveListener);
4741 document.addEventListener(app.touchEvents.end, appTouchEndPassive, passiveListener);
4742 } else {
4743 document.addEventListener(app.touchEvents.start, function (e) {
4744 appTouchStartActive(e);
4745 appTouchStartPassive(e);
4746 }, true);
4747 document.addEventListener(app.touchEvents.move, function (e) {
4748 appTouchMoveActive(e);
4749 appTouchMovePassive(e);
4750 }, false);
4751 document.addEventListener(app.touchEvents.end, function (e) {
4752 appTouchEndActive(e);
4753 appTouchEndPassive(e);
4754 }, false);
4755 }
4756
4757 if (support.touch) {
4758 app.on('click', handleClick);
4759 app.on('touchstart', handleTouchStart);
4760 app.on('touchmove', handleTouchMove);
4761 app.on('touchend', handleTouchEnd);
4762 document.addEventListener('touchcancel', handleTouchCancel, {
4763 passive: true
4764 });
4765 } else if (params.activeState) {
4766 app.on('touchstart', handleMouseDown);
4767 app.on('touchmove', handleMouseMove);
4768 app.on('touchend', handleMouseUp);
4769 document.addEventListener('pointercancel', handleMouseUp, {
4770 passive: true
4771 });
4772 }
4773
4774 document.addEventListener('contextmenu', function (e) {
4775 if (params.disableContextMenu && (device.ios || device.android || device.cordova || window.Capacitor && window.Capacitor.isNative)) {
4776 e.preventDefault();
4777 }
4778
4779 if (useRipple) {
4780 if (activableElement) removeActive();
4781 rippleTouchEnd();
4782 }
4783 });
4784 }
4785
4786 var TouchModule = {
4787 name: 'touch',
4788 params: {
4789 touch: {
4790 // Clicks
4791 touchClicksDistanceThreshold: 5,
4792 // ContextMenu
4793 disableContextMenu: false,
4794 // Tap Hold
4795 tapHold: false,
4796 tapHoldDelay: 750,
4797 tapHoldPreventClicks: true,
4798 // Active State
4799 activeState: true,
4800 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',
4801 activeStateOnMouseMove: false,
4802 mdTouchRipple: true,
4803 iosTouchRipple: false,
4804 auroraTouchRipple: false,
4805 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',
4806 touchRippleInsetElements: '.ripple-inset, .icon-only, .searchbar-disable-button, .input-clear-button, .notification-close-button, .md .navbar .link.back'
4807 }
4808 },
4809 create: function create() {
4810 var app = this;
4811 var support = getSupport();
4812 extend$1(app, {
4813 touchEvents: {
4814 start: support.touch ? 'touchstart' : support.pointerEvents ? 'pointerdown' : 'mousedown',
4815 move: support.touch ? 'touchmove' : support.pointerEvents ? 'pointermove' : 'mousemove',
4816 end: support.touch ? 'touchend' : support.pointerEvents ? 'pointerup' : 'mouseup'
4817 }
4818 });
4819 },
4820 on: {
4821 init: initTouch
4822 }
4823 };
4824
4825 /**
4826 * Tokenize input string.
4827 */
4828 function lexer(str) {
4829 var tokens = [];
4830 var i = 0;
4831
4832 while (i < str.length) {
4833 var char = str[i];
4834
4835 if (char === "*" || char === "+" || char === "?") {
4836 tokens.push({
4837 type: "MODIFIER",
4838 index: i,
4839 value: str[i++]
4840 });
4841 continue;
4842 }
4843
4844 if (char === "\\") {
4845 tokens.push({
4846 type: "ESCAPED_CHAR",
4847 index: i++,
4848 value: str[i++]
4849 });
4850 continue;
4851 }
4852
4853 if (char === "{") {
4854 tokens.push({
4855 type: "OPEN",
4856 index: i,
4857 value: str[i++]
4858 });
4859 continue;
4860 }
4861
4862 if (char === "}") {
4863 tokens.push({
4864 type: "CLOSE",
4865 index: i,
4866 value: str[i++]
4867 });
4868 continue;
4869 }
4870
4871 if (char === ":") {
4872 var name = "";
4873 var j = i + 1;
4874
4875 while (j < str.length) {
4876 var code = str.charCodeAt(j);
4877
4878 if ( // `0-9`
4879 code >= 48 && code <= 57 || // `A-Z`
4880 code >= 65 && code <= 90 || // `a-z`
4881 code >= 97 && code <= 122 || // `_`
4882 code === 95) {
4883 name += str[j++];
4884 continue;
4885 }
4886
4887 break;
4888 }
4889
4890 if (!name) throw new TypeError("Missing parameter name at " + i);
4891 tokens.push({
4892 type: "NAME",
4893 index: i,
4894 value: name
4895 });
4896 i = j;
4897 continue;
4898 }
4899
4900 if (char === "(") {
4901 var count = 1;
4902 var pattern = "";
4903 var j = i + 1;
4904
4905 if (str[j] === "?") {
4906 throw new TypeError("Pattern cannot start with \"?\" at " + j);
4907 }
4908
4909 while (j < str.length) {
4910 if (str[j] === "\\") {
4911 pattern += str[j++] + str[j++];
4912 continue;
4913 }
4914
4915 if (str[j] === ")") {
4916 count--;
4917
4918 if (count === 0) {
4919 j++;
4920 break;
4921 }
4922 } else if (str[j] === "(") {
4923 count++;
4924
4925 if (str[j + 1] !== "?") {
4926 throw new TypeError("Capturing groups are not allowed at " + j);
4927 }
4928 }
4929
4930 pattern += str[j++];
4931 }
4932
4933 if (count) throw new TypeError("Unbalanced pattern at " + i);
4934 if (!pattern) throw new TypeError("Missing pattern at " + i);
4935 tokens.push({
4936 type: "PATTERN",
4937 index: i,
4938 value: pattern
4939 });
4940 i = j;
4941 continue;
4942 }
4943
4944 tokens.push({
4945 type: "CHAR",
4946 index: i,
4947 value: str[i++]
4948 });
4949 }
4950
4951 tokens.push({
4952 type: "END",
4953 index: i,
4954 value: ""
4955 });
4956 return tokens;
4957 }
4958 /**
4959 * Parse a string for the raw tokens.
4960 */
4961
4962
4963 function parse(str, options) {
4964 if (options === void 0) {
4965 options = {};
4966 }
4967
4968 var tokens = lexer(str);
4969 var _a = options.prefixes,
4970 prefixes = _a === void 0 ? "./" : _a;
4971 var defaultPattern = "[^" + escapeString(options.delimiter || "/#?") + "]+?";
4972 var result = [];
4973 var key = 0;
4974 var i = 0;
4975 var path = "";
4976
4977 var tryConsume = function tryConsume(type) {
4978 if (i < tokens.length && tokens[i].type === type) return tokens[i++].value;
4979 };
4980
4981 var mustConsume = function mustConsume(type) {
4982 var value = tryConsume(type);
4983 if (value !== undefined) return value;
4984 var _a = tokens[i],
4985 nextType = _a.type,
4986 index = _a.index;
4987 throw new TypeError("Unexpected " + nextType + " at " + index + ", expected " + type);
4988 };
4989
4990 var consumeText = function consumeText() {
4991 var result = "";
4992 var value; // tslint:disable-next-line
4993
4994 while (value = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR")) {
4995 result += value;
4996 }
4997
4998 return result;
4999 };
5000
5001 while (i < tokens.length) {
5002 var char = tryConsume("CHAR");
5003 var name = tryConsume("NAME");
5004 var pattern = tryConsume("PATTERN");
5005
5006 if (name || pattern) {
5007 var prefix = char || "";
5008
5009 if (prefixes.indexOf(prefix) === -1) {
5010 path += prefix;
5011 prefix = "";
5012 }
5013
5014 if (path) {
5015 result.push(path);
5016 path = "";
5017 }
5018
5019 result.push({
5020 name: name || key++,
5021 prefix: prefix,
5022 suffix: "",
5023 pattern: pattern || defaultPattern,
5024 modifier: tryConsume("MODIFIER") || ""
5025 });
5026 continue;
5027 }
5028
5029 var value = char || tryConsume("ESCAPED_CHAR");
5030
5031 if (value) {
5032 path += value;
5033 continue;
5034 }
5035
5036 if (path) {
5037 result.push(path);
5038 path = "";
5039 }
5040
5041 var open = tryConsume("OPEN");
5042
5043 if (open) {
5044 var prefix = consumeText();
5045 var name_1 = tryConsume("NAME") || "";
5046 var pattern_1 = tryConsume("PATTERN") || "";
5047 var suffix = consumeText();
5048 mustConsume("CLOSE");
5049 result.push({
5050 name: name_1 || (pattern_1 ? key++ : ""),
5051 pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1,
5052 prefix: prefix,
5053 suffix: suffix,
5054 modifier: tryConsume("MODIFIER") || ""
5055 });
5056 continue;
5057 }
5058
5059 mustConsume("END");
5060 }
5061
5062 return result;
5063 }
5064 /**
5065 * Compile a string to a template function for the path.
5066 */
5067
5068 function compile(str, options) {
5069 return tokensToFunction(parse(str, options), options);
5070 }
5071 /**
5072 * Expose a method for transforming tokens into the path function.
5073 */
5074
5075 function tokensToFunction(tokens, options) {
5076 if (options === void 0) {
5077 options = {};
5078 }
5079
5080 var reFlags = flags(options);
5081 var _a = options.encode,
5082 encode = _a === void 0 ? function (x) {
5083 return x;
5084 } : _a,
5085 _b = options.validate,
5086 validate = _b === void 0 ? true : _b; // Compile all the tokens into regexps.
5087
5088 var matches = tokens.map(function (token) {
5089 if (typeof token === "object") {
5090 return new RegExp("^(?:" + token.pattern + ")$", reFlags);
5091 }
5092 });
5093 return function (data) {
5094 var path = "";
5095
5096 for (var i = 0; i < tokens.length; i++) {
5097 var token = tokens[i];
5098
5099 if (typeof token === "string") {
5100 path += token;
5101 continue;
5102 }
5103
5104 var value = data ? data[token.name] : undefined;
5105 var optional = token.modifier === "?" || token.modifier === "*";
5106 var repeat = token.modifier === "*" || token.modifier === "+";
5107
5108 if (Array.isArray(value)) {
5109 if (!repeat) {
5110 throw new TypeError("Expected \"" + token.name + "\" to not repeat, but got an array");
5111 }
5112
5113 if (value.length === 0) {
5114 if (optional) continue;
5115 throw new TypeError("Expected \"" + token.name + "\" to not be empty");
5116 }
5117
5118 for (var j = 0; j < value.length; j++) {
5119 var segment = encode(value[j], token);
5120
5121 if (validate && !matches[i].test(segment)) {
5122 throw new TypeError("Expected all \"" + token.name + "\" to match \"" + token.pattern + "\", but got \"" + segment + "\"");
5123 }
5124
5125 path += token.prefix + segment + token.suffix;
5126 }
5127
5128 continue;
5129 }
5130
5131 if (typeof value === "string" || typeof value === "number") {
5132 var segment = encode(String(value), token);
5133
5134 if (validate && !matches[i].test(segment)) {
5135 throw new TypeError("Expected \"" + token.name + "\" to match \"" + token.pattern + "\", but got \"" + segment + "\"");
5136 }
5137
5138 path += token.prefix + segment + token.suffix;
5139 continue;
5140 }
5141
5142 if (optional) continue;
5143 var typeOfMessage = repeat ? "an array" : "a string";
5144 throw new TypeError("Expected \"" + token.name + "\" to be " + typeOfMessage);
5145 }
5146
5147 return path;
5148 };
5149 }
5150 /**
5151 * Escape a regular expression string.
5152 */
5153
5154 function escapeString(str) {
5155 return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
5156 }
5157 /**
5158 * Get the flags for a regexp from the options.
5159 */
5160
5161
5162 function flags(options) {
5163 return options && options.sensitive ? "" : "i";
5164 }
5165 /**
5166 * Pull out keys from a regexp.
5167 */
5168
5169
5170 function regexpToRegexp(path, keys) {
5171 if (!keys) return path;
5172 var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g;
5173 var index = 0;
5174 var execResult = groupsRegex.exec(path.source);
5175
5176 while (execResult) {
5177 keys.push({
5178 // Use parenthesized substring match if available, index otherwise
5179 name: execResult[1] || index++,
5180 prefix: "",
5181 suffix: "",
5182 modifier: "",
5183 pattern: ""
5184 });
5185 execResult = groupsRegex.exec(path.source);
5186 }
5187
5188 return path;
5189 }
5190 /**
5191 * Transform an array into a regexp.
5192 */
5193
5194
5195 function arrayToRegexp(paths, keys, options) {
5196 var parts = paths.map(function (path) {
5197 return pathToRegexp(path, keys, options).source;
5198 });
5199 return new RegExp("(?:" + parts.join("|") + ")", flags(options));
5200 }
5201 /**
5202 * Create a path regexp from string input.
5203 */
5204
5205
5206 function stringToRegexp(path, keys, options) {
5207 return tokensToRegexp(parse(path, options), keys, options);
5208 }
5209 /**
5210 * Expose a function for taking tokens and returning a RegExp.
5211 */
5212
5213
5214 function tokensToRegexp(tokens, keys, options) {
5215 if (options === void 0) {
5216 options = {};
5217 }
5218
5219 var _a = options.strict,
5220 strict = _a === void 0 ? false : _a,
5221 _b = options.start,
5222 start = _b === void 0 ? true : _b,
5223 _c = options.end,
5224 end = _c === void 0 ? true : _c,
5225 _d = options.encode,
5226 encode = _d === void 0 ? function (x) {
5227 return x;
5228 } : _d;
5229 var endsWith = "[" + escapeString(options.endsWith || "") + "]|$";
5230 var delimiter = "[" + escapeString(options.delimiter || "/#?") + "]";
5231 var route = start ? "^" : ""; // Iterate over the tokens and create our regexp string.
5232
5233 for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
5234 var token = tokens_1[_i];
5235
5236 if (typeof token === "string") {
5237 route += escapeString(encode(token));
5238 } else {
5239 var prefix = escapeString(encode(token.prefix));
5240 var suffix = escapeString(encode(token.suffix));
5241
5242 if (token.pattern) {
5243 if (keys) keys.push(token);
5244
5245 if (prefix || suffix) {
5246 if (token.modifier === "+" || token.modifier === "*") {
5247 var mod = token.modifier === "*" ? "?" : "";
5248 route += "(?:" + prefix + "((?:" + token.pattern + ")(?:" + suffix + prefix + "(?:" + token.pattern + "))*)" + suffix + ")" + mod;
5249 } else {
5250 route += "(?:" + prefix + "(" + token.pattern + ")" + suffix + ")" + token.modifier;
5251 }
5252 } else {
5253 route += "(" + token.pattern + ")" + token.modifier;
5254 }
5255 } else {
5256 route += "(?:" + prefix + suffix + ")" + token.modifier;
5257 }
5258 }
5259 }
5260
5261 if (end) {
5262 if (!strict) route += delimiter + "?";
5263 route += !options.endsWith ? "$" : "(?=" + endsWith + ")";
5264 } else {
5265 var endToken = tokens[tokens.length - 1];
5266 var isEndDelimited = typeof endToken === "string" ? delimiter.indexOf(endToken[endToken.length - 1]) > -1 : // tslint:disable-next-line
5267 endToken === undefined;
5268
5269 if (!strict) {
5270 route += "(?:" + delimiter + "(?=" + endsWith + "))?";
5271 }
5272
5273 if (!isEndDelimited) {
5274 route += "(?=" + delimiter + "|" + endsWith + ")";
5275 }
5276 }
5277
5278 return new RegExp(route, flags(options));
5279 }
5280 /**
5281 * Normalize the given path string, returning a regular expression.
5282 *
5283 * An empty array can be passed in for the keys, which will hold the
5284 * placeholder key descriptions. For example, using `/user/:id`, `keys` will
5285 * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
5286 */
5287
5288 function pathToRegexp(path, keys, options) {
5289 if (path instanceof RegExp) return regexpToRegexp(path, keys);
5290 if (Array.isArray(path)) return arrayToRegexp(path, keys, options);
5291 return stringToRegexp(path, keys, options);
5292 }
5293
5294 var History = {
5295 queue: [],
5296 clearQueue: function clearQueue() {
5297 if (History.queue.length === 0) return;
5298 var currentQueue = History.queue.shift();
5299 currentQueue();
5300 },
5301 routerQueue: [],
5302 clearRouterQueue: function clearRouterQueue() {
5303 if (History.routerQueue.length === 0) return;
5304 var currentQueue = History.routerQueue.pop();
5305 var router = currentQueue.router,
5306 stateUrl = currentQueue.stateUrl,
5307 action = currentQueue.action;
5308 var animate = router.params.animate;
5309 if (router.params.browserHistoryAnimate === false) animate = false;
5310
5311 if (action === 'back') {
5312 router.back({
5313 animate: animate,
5314 browserHistory: false
5315 });
5316 }
5317
5318 if (action === 'load') {
5319 router.navigate(stateUrl, {
5320 animate: animate,
5321 browserHistory: false
5322 });
5323 }
5324 },
5325 handle: function handle(e) {
5326 if (History.blockPopstate) return;
5327 var app = this; // const mainView = app.views.main;
5328
5329 var state = e.state;
5330 History.previousState = History.state;
5331 History.state = state;
5332 History.allowChange = true;
5333 History.clearQueue();
5334 state = History.state;
5335 if (!state) state = {};
5336 app.views.forEach(function (view) {
5337 var router = view.router;
5338 var viewState = state[view.id];
5339
5340 if (!viewState && view.params.browserHistory) {
5341 viewState = {
5342 url: view.router.history[0]
5343 };
5344 }
5345
5346 if (!viewState) return;
5347 var stateUrl = viewState.url || undefined;
5348 var animate = router.params.animate;
5349 if (router.params.browserHistoryAnimate === false) animate = false;
5350
5351 if (stateUrl !== router.url) {
5352 if (router.history.indexOf(stateUrl) >= 0) {
5353 // Go Back
5354 if (router.allowPageChange) {
5355 router.back({
5356 animate: animate,
5357 browserHistory: false
5358 });
5359 } else {
5360 History.routerQueue.push({
5361 action: 'back',
5362 router: router
5363 });
5364 }
5365 } else if (router.allowPageChange) {
5366 // Load page
5367 router.navigate(stateUrl, {
5368 animate: animate,
5369 browserHistory: false
5370 });
5371 } else {
5372 History.routerQueue.unshift({
5373 action: 'load',
5374 stateUrl: stateUrl,
5375 router: router
5376 });
5377 }
5378 }
5379 });
5380 },
5381 initViewState: function initViewState(viewId, viewState) {
5382 var _extend;
5383
5384 var window = getWindow();
5385 var newState = extend$1({}, History.state || {}, (_extend = {}, _extend[viewId] = viewState, _extend));
5386 History.state = newState;
5387 window.history.replaceState(newState, '');
5388 },
5389 push: function push(viewId, viewState, url) {
5390 var _extend2;
5391
5392 var window = getWindow();
5393
5394 if (url.substr(-3) === '#!/') {
5395 // eslint-disable-next-line
5396 url = url.replace('#!/', '');
5397 }
5398
5399 if (!History.allowChange) {
5400 History.queue.push(function () {
5401 History.push(viewId, viewState, url);
5402 });
5403 return;
5404 }
5405
5406 History.previousState = History.state;
5407 var newState = extend$1({}, History.previousState || {}, (_extend2 = {}, _extend2[viewId] = viewState, _extend2));
5408 History.state = newState;
5409 window.history.pushState(newState, '', url);
5410 },
5411 replace: function replace(viewId, viewState, url) {
5412 var _extend3;
5413
5414 var window = getWindow();
5415
5416 if (url.substr(-3) === '#!/') {
5417 // eslint-disable-next-line
5418 url = url.replace('#!/', '');
5419 }
5420
5421 if (!History.allowChange) {
5422 History.queue.push(function () {
5423 History.replace(viewId, viewState, url);
5424 });
5425 return;
5426 }
5427
5428 History.previousState = History.state;
5429 var newState = extend$1({}, History.previousState || {}, (_extend3 = {}, _extend3[viewId] = viewState, _extend3));
5430 History.state = newState;
5431 window.history.replaceState(newState, '', url);
5432 },
5433 go: function go(index) {
5434 var window = getWindow();
5435 History.allowChange = false;
5436 window.history.go(index);
5437 },
5438 back: function back() {
5439 var window = getWindow();
5440 History.allowChange = false;
5441 window.history.back();
5442 },
5443 allowChange: true,
5444 previousState: {},
5445 state: {},
5446 blockPopstate: true,
5447 init: function init(app) {
5448 var window = getWindow();
5449 var document = getDocument();
5450 History.state = window.history.state;
5451 $$1(window).on('load', function () {
5452 setTimeout(function () {
5453 History.blockPopstate = false;
5454 }, 0);
5455 });
5456
5457 if (document.readyState && document.readyState === 'complete') {
5458 History.blockPopstate = false;
5459 }
5460
5461 $$1(window).on('popstate', History.handle.bind(app));
5462 }
5463 };
5464
5465 function SwipeBack(r) {
5466 var router = r;
5467 var $el = router.$el,
5468 $navbarsEl = router.$navbarsEl,
5469 app = router.app,
5470 params = router.params;
5471 var support = getSupport();
5472 var device = getDevice();
5473 var isTouched = false;
5474 var isMoved = false;
5475 var touchesStart = {};
5476 var isScrolling;
5477 var $currentPageEl = [];
5478 var $previousPageEl = [];
5479 var viewContainerWidth;
5480 var touchesDiff;
5481 var allowViewTouchMove = true;
5482 var touchStartTime;
5483 var $currentNavbarEl = [];
5484 var $previousNavbarEl = [];
5485 var dynamicNavbar;
5486 var $pageShadowEl;
5487 var $pageOpacityEl;
5488 var animatableNavEls;
5489 var paramsSwipeBackAnimateShadow = params[app.theme + "SwipeBackAnimateShadow"];
5490 var paramsSwipeBackAnimateOpacity = params[app.theme + "SwipeBackAnimateOpacity"];
5491 var paramsSwipeBackActiveArea = params[app.theme + "SwipeBackActiveArea"];
5492 var paramsSwipeBackThreshold = params[app.theme + "SwipeBackThreshold"];
5493 var transformOrigin = app.rtl ? 'right center' : 'left center';
5494 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';
5495
5496 function animatableNavElements() {
5497 var els = [];
5498 var inverter = app.rtl ? -1 : 1;
5499 var currentNavIsTransparent = $currentNavbarEl.hasClass('navbar-transparent') && !$currentNavbarEl.hasClass('navbar-large') && !$currentNavbarEl.hasClass('navbar-transparent-visible');
5500 var currentNavIsLarge = $currentNavbarEl.hasClass('navbar-large');
5501 var currentNavIsCollapsed = $currentNavbarEl.hasClass('navbar-large-collapsed');
5502 var currentNavIsLargeTransparent = $currentNavbarEl.hasClass('navbar-large-transparent') || $currentNavbarEl.hasClass('navbar-large') && $currentNavbarEl.hasClass('navbar-transparent');
5503 var previousNavIsTransparent = $previousNavbarEl.hasClass('navbar-transparent') && !$previousNavbarEl.hasClass('navbar-large') && !$previousNavbarEl.hasClass('navbar-transparent-visible');
5504 var previousNavIsLarge = $previousNavbarEl.hasClass('navbar-large');
5505 var previousNavIsCollapsed = $previousNavbarEl.hasClass('navbar-large-collapsed');
5506 var previousNavIsLargeTransparent = $previousNavbarEl.hasClass('navbar-large-transparent') || $previousNavbarEl.hasClass('navbar-large') && $previousNavbarEl.hasClass('navbar-transparent');
5507 var fromLarge = currentNavIsLarge && !currentNavIsCollapsed;
5508 var toLarge = previousNavIsLarge && !previousNavIsCollapsed;
5509 var $currentNavElements = $currentNavbarEl.find('.left, .title, .right, .subnavbar, .fading, .title-large, .navbar-bg');
5510 var $previousNavElements = $previousNavbarEl.find('.left, .title, .right, .subnavbar, .fading, .title-large, .navbar-bg');
5511 var activeNavBackIconText;
5512 var previousNavBackIconText;
5513
5514 if (params.iosAnimateNavbarBackIcon) {
5515 if ($currentNavbarEl.hasClass('sliding') || $currentNavbarEl.find('.navbar-inner.sliding').length) {
5516 activeNavBackIconText = $currentNavbarEl.find('.left').find('.back .icon + span').eq(0);
5517 } else {
5518 activeNavBackIconText = $currentNavbarEl.find('.left.sliding').find('.back .icon + span').eq(0);
5519 }
5520
5521 if ($previousNavbarEl.hasClass('sliding') || $previousNavbarEl.find('.navbar-inner.sliding').length) {
5522 previousNavBackIconText = $previousNavbarEl.find('.left').find('.back .icon + span').eq(0);
5523 } else {
5524 previousNavBackIconText = $previousNavbarEl.find('.left.sliding').find('.back .icon + span').eq(0);
5525 }
5526
5527 if (activeNavBackIconText.length) {
5528 $previousNavElements.each(function (el) {
5529 if (!$$1(el).hasClass('title')) return;
5530 el.f7NavbarLeftOffset += activeNavBackIconText.prev('.icon')[0].offsetWidth;
5531 });
5532 }
5533 }
5534
5535 $currentNavElements.each(function (navEl) {
5536 var $navEl = $$1(navEl);
5537 var isSubnavbar = $navEl.hasClass('subnavbar');
5538 var isLeft = $navEl.hasClass('left');
5539 var isTitle = $navEl.hasClass('title');
5540 var isBg = $navEl.hasClass('navbar-bg');
5541 if ((isTitle || isBg) && currentNavIsTransparent) return;
5542 if (!fromLarge && $navEl.hasClass('.title-large')) return;
5543 var el = {
5544 el: navEl
5545 };
5546
5547 if (fromLarge) {
5548 if (isTitle) return;
5549
5550 if ($navEl.hasClass('title-large')) {
5551 if (els.indexOf(el) < 0) els.push(el);
5552 el.overflow = 'visible';
5553 $navEl.find('.title-large-text').each(function (subNavEl) {
5554 els.push({
5555 el: subNavEl,
5556 transform: function transform(progress) {
5557 return "translateX(" + progress * 100 * inverter + "%)";
5558 }
5559 });
5560 });
5561 return;
5562 }
5563 }
5564
5565 if (toLarge) {
5566 if (!fromLarge) {
5567 if ($navEl.hasClass('title-large')) {
5568 if (els.indexOf(el) < 0) els.push(el);
5569 el.opacity = 0;
5570 }
5571 }
5572
5573 if (isLeft) {
5574 if (els.indexOf(el) < 0) els.push(el);
5575
5576 el.opacity = function (progress) {
5577 return 1 - Math.pow(progress, 0.33);
5578 };
5579
5580 $navEl.find('.back span').each(function (subNavEl) {
5581 els.push({
5582 el: subNavEl,
5583 'transform-origin': transformOrigin,
5584 transform: function transform(progress) {
5585 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) + ")";
5586 }
5587 });
5588 });
5589 return;
5590 }
5591 }
5592
5593 if (isBg) {
5594 if (els.indexOf(el) < 0) els.push(el);
5595
5596 if (!fromLarge && !toLarge) {
5597 if (currentNavIsCollapsed) {
5598 if (currentNavIsLargeTransparent) {
5599 el.className = 'ios-swipeback-navbar-bg-large';
5600 }
5601
5602 el.transform = function (progress) {
5603 return "translateX(" + 100 * progress * inverter + "%) translateY(calc(-1 * var(--f7-navbar-large-title-height)))";
5604 };
5605 } else {
5606 el.transform = function (progress) {
5607 return "translateX(" + 100 * progress * inverter + "%)";
5608 };
5609 }
5610 }
5611
5612 if (!fromLarge && toLarge) {
5613 el.className = 'ios-swipeback-navbar-bg-large';
5614
5615 el.transform = function (progress) {
5616 return "translateX(" + 100 * progress * inverter + "%) translateY(calc(-1 * " + (1 - progress) + " * var(--f7-navbar-large-title-height)))";
5617 };
5618 }
5619
5620 if (fromLarge && toLarge) {
5621 el.transform = function (progress) {
5622 return "translateX(" + 100 * progress * inverter + "%)";
5623 };
5624 }
5625
5626 if (fromLarge && !toLarge) {
5627 el.transform = function (progress) {
5628 return "translateX(" + 100 * progress * inverter + "%) translateY(calc(-" + progress + " * var(--f7-navbar-large-title-height)))";
5629 };
5630 }
5631
5632 return;
5633 }
5634
5635 if ($navEl.hasClass('title-large')) return;
5636 var isSliding = $navEl.hasClass('sliding') || $navEl.parents('.navbar-inner.sliding').length;
5637 if (els.indexOf(el) < 0) els.push(el);
5638
5639 if (!isSubnavbar || isSubnavbar && !isSliding) {
5640 el.opacity = function (progress) {
5641 return 1 - Math.pow(progress, 0.33);
5642 };
5643 }
5644
5645 if (isSliding) {
5646 var transformTarget = el;
5647
5648 if (isLeft && activeNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
5649 var textEl = {
5650 el: activeNavBackIconText[0]
5651 };
5652 transformTarget = textEl;
5653 els.push(textEl);
5654 }
5655
5656 transformTarget.transform = function (progress) {
5657 var activeNavTranslate = progress * transformTarget.el.f7NavbarRightOffset;
5658 if (device.pixelRatio === 1) activeNavTranslate = Math.round(activeNavTranslate);
5659
5660 if (isSubnavbar && currentNavIsLarge) {
5661 return "translate3d(" + activeNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)";
5662 }
5663
5664 return "translate3d(" + activeNavTranslate + "px,0,0)";
5665 };
5666 }
5667 });
5668 $previousNavElements.each(function (navEl) {
5669 var $navEl = $$1(navEl);
5670 var isSubnavbar = $navEl.hasClass('subnavbar');
5671 var isLeft = $navEl.hasClass('left');
5672 var isTitle = $navEl.hasClass('title');
5673 var isBg = $navEl.hasClass('navbar-bg');
5674 if ((isTitle || isBg) && previousNavIsTransparent) return;
5675 var el = {
5676 el: navEl
5677 };
5678
5679 if (toLarge) {
5680 if (isTitle) return;
5681 if (els.indexOf(el) < 0) els.push(el);
5682
5683 if ($navEl.hasClass('title-large')) {
5684 el.opacity = 1;
5685 el.overflow = 'visible';
5686 $navEl.find('.title-large-text').each(function (subNavEl) {
5687 els.push({
5688 el: subNavEl,
5689 'transform-origin': transformOriginTitleLarge,
5690 opacity: function opacity(progress) {
5691 return Math.pow(progress, 3);
5692 },
5693 transform: function transform(progress) {
5694 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) + ")";
5695 }
5696 });
5697 });
5698 return;
5699 }
5700 }
5701
5702 if (isBg) {
5703 if (els.indexOf(el) < 0) els.push(el);
5704
5705 if (!fromLarge && !toLarge) {
5706 if (previousNavIsCollapsed) {
5707 if (previousNavIsLargeTransparent) {
5708 el.className = 'ios-swipeback-navbar-bg-large';
5709 }
5710
5711 el.transform = function (progress) {
5712 return "translateX(" + (-100 + 100 * progress) * inverter + "%) translateY(calc(-1 * var(--f7-navbar-large-title-height)))";
5713 };
5714 } else {
5715 el.transform = function (progress) {
5716 return "translateX(" + (-100 + 100 * progress) * inverter + "%)";
5717 };
5718 }
5719 }
5720
5721 if (!fromLarge && toLarge) {
5722 el.transform = function (progress) {
5723 return "translateX(" + (-100 + 100 * progress) * inverter + "%) translateY(calc(-1 * " + (1 - progress) + " * var(--f7-navbar-large-title-height)))";
5724 };
5725 }
5726
5727 if (fromLarge && !toLarge) {
5728 el.className = 'ios-swipeback-navbar-bg-large';
5729
5730 el.transform = function (progress) {
5731 return "translateX(" + (-100 + 100 * progress) * inverter + "%) translateY(calc(-" + progress + " * var(--f7-navbar-large-title-height)))";
5732 };
5733 }
5734
5735 if (fromLarge && toLarge) {
5736 el.transform = function (progress) {
5737 return "translateX(" + (-100 + 100 * progress) * inverter + "%)";
5738 };
5739 }
5740
5741 return;
5742 }
5743
5744 if ($navEl.hasClass('title-large')) return;
5745 var isSliding = $navEl.hasClass('sliding') || $previousNavbarEl.children('.navbar-inner.sliding').length;
5746 if (els.indexOf(el) < 0) els.push(el);
5747
5748 if (!isSubnavbar || isSubnavbar && !isSliding) {
5749 el.opacity = function (progress) {
5750 return Math.pow(progress, 3);
5751 };
5752 }
5753
5754 if (isSliding) {
5755 var transformTarget = el;
5756
5757 if (isLeft && previousNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
5758 var textEl = {
5759 el: previousNavBackIconText[0]
5760 };
5761 transformTarget = textEl;
5762 els.push(textEl);
5763 }
5764
5765 transformTarget.transform = function (progress) {
5766 var previousNavTranslate = transformTarget.el.f7NavbarLeftOffset * (1 - progress);
5767 if (device.pixelRatio === 1) previousNavTranslate = Math.round(previousNavTranslate);
5768
5769 if (isSubnavbar && previousNavIsLarge) {
5770 return "translate3d(" + previousNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)";
5771 }
5772
5773 return "translate3d(" + previousNavTranslate + "px,0,0)";
5774 };
5775 }
5776 });
5777 return els;
5778 }
5779
5780 function setAnimatableNavElements(_temp) {
5781 var _ref = _temp === void 0 ? {} : _temp,
5782 progress = _ref.progress,
5783 reset = _ref.reset,
5784 transition = _ref.transition,
5785 reflow = _ref.reflow;
5786
5787 var styles = ['overflow', 'transform', 'transform-origin', 'opacity'];
5788
5789 if (transition === true || transition === false) {
5790 for (var i = 0; i < animatableNavEls.length; i += 1) {
5791 var el = animatableNavEls[i];
5792
5793 if (el && el.el) {
5794 if (transition === true) el.el.classList.add('navbar-page-transitioning');
5795 if (transition === false) el.el.classList.remove('navbar-page-transitioning');
5796 }
5797 }
5798 }
5799
5800 if (reflow && animatableNavEls.length && animatableNavEls[0] && animatableNavEls[0].el) {
5801 // eslint-disable-next-line
5802 animatableNavEls[0].el._clientLeft = animatableNavEls[0].el.clientLeft;
5803 }
5804
5805 for (var _i = 0; _i < animatableNavEls.length; _i += 1) {
5806 var _el = animatableNavEls[_i];
5807
5808 if (_el && _el.el) {
5809 if (_el.className && !_el.classNameSet && !reset) {
5810 _el.el.classList.add(_el.className);
5811
5812 _el.classNameSet = true;
5813 }
5814
5815 if (_el.className && reset) {
5816 _el.el.classList.remove(_el.className);
5817 }
5818
5819 for (var j = 0; j < styles.length; j += 1) {
5820 var styleProp = styles[j];
5821
5822 if (_el[styleProp]) {
5823 if (reset) {
5824 _el.el.style[styleProp] = '';
5825 } else if (typeof _el[styleProp] === 'function') {
5826 _el.el.style[styleProp] = _el[styleProp](progress);
5827 } else {
5828 _el.el.style[styleProp] = _el[styleProp];
5829 }
5830 }
5831 }
5832 }
5833 }
5834 }
5835
5836 function handleTouchStart(e) {
5837 var swipeBackEnabled = params[app.theme + "SwipeBack"];
5838 if (!allowViewTouchMove || !swipeBackEnabled || isTouched || app.swipeout && app.swipeout.el || !router.allowPageChange) return;
5839 if ($$1(e.target).closest('.range-slider, .calendar-months').length > 0) return;
5840 if ($$1(e.target).closest('.page-master, .page-master-detail').length > 0 && params.masterDetailBreakpoint > 0 && app.width >= params.masterDetailBreakpoint) return;
5841 isMoved = false;
5842 isTouched = true;
5843 isScrolling = undefined;
5844 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
5845 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
5846 touchStartTime = now();
5847 dynamicNavbar = router.dynamicNavbar;
5848 }
5849
5850 function handleTouchMove(e) {
5851 if (!isTouched) return;
5852 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
5853 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
5854
5855 if (typeof isScrolling === 'undefined') {
5856 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x)) || pageX < touchesStart.x && !app.rtl || pageX > touchesStart.x && app.rtl;
5857 }
5858
5859 if (isScrolling || e.f7PreventSwipeBack || app.preventSwipeBack) {
5860 isTouched = false;
5861 return;
5862 }
5863
5864 if (!isMoved) {
5865 // Calc values during first move fired
5866 var cancel = false;
5867 var target = $$1(e.target);
5868 var swipeout = target.closest('.swipeout');
5869
5870 if (swipeout.length > 0) {
5871 if (!app.rtl && swipeout.find('.swipeout-actions-left').length > 0) cancel = true;
5872 if (app.rtl && swipeout.find('.swipeout-actions-right').length > 0) cancel = true;
5873 }
5874
5875 $currentPageEl = target.closest('.page');
5876 if ($currentPageEl.hasClass('no-swipeback') || target.closest('.no-swipeback, .card-opened').length > 0) cancel = true;
5877 $previousPageEl = $el.find('.page-previous:not(.stacked)');
5878
5879 if ($previousPageEl.length > 1) {
5880 $previousPageEl = $previousPageEl.eq($previousPageEl.length - 1);
5881 }
5882
5883 var notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
5884 viewContainerWidth = $el.width();
5885
5886 if (app.rtl) {
5887 notFromBorder = touchesStart.x < $el.offset().left - $el[0].scrollLeft + (viewContainerWidth - paramsSwipeBackActiveArea);
5888 } else {
5889 notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
5890 }
5891
5892 if (notFromBorder) cancel = true;
5893 if ($previousPageEl.length === 0 || $currentPageEl.length === 0) cancel = true;
5894
5895 if (cancel) {
5896 isTouched = false;
5897 return;
5898 }
5899
5900 if (paramsSwipeBackAnimateShadow) {
5901 $pageShadowEl = $currentPageEl.find('.page-shadow-effect');
5902
5903 if ($pageShadowEl.length === 0) {
5904 $pageShadowEl = $$1('<div class="page-shadow-effect"></div>');
5905 $currentPageEl.append($pageShadowEl);
5906 }
5907 }
5908
5909 if (paramsSwipeBackAnimateOpacity) {
5910 $pageOpacityEl = $previousPageEl.find('.page-opacity-effect');
5911
5912 if ($pageOpacityEl.length === 0) {
5913 $pageOpacityEl = $$1('<div class="page-opacity-effect"></div>');
5914 $previousPageEl.append($pageOpacityEl);
5915 }
5916 }
5917
5918 if (dynamicNavbar) {
5919 $currentNavbarEl = $navbarsEl.find('.navbar-current:not(.stacked)');
5920 $previousNavbarEl = $navbarsEl.find('.navbar-previous:not(.stacked)');
5921
5922 if ($previousNavbarEl.length > 1) {
5923 $previousNavbarEl = $previousNavbarEl.eq($previousNavbarEl.length - 1);
5924 }
5925
5926 animatableNavEls = animatableNavElements();
5927 } // Close/Hide Any Picker
5928
5929
5930 if ($$1('.sheet.modal-in').length > 0 && app.sheet) {
5931 app.sheet.close($$1('.sheet.modal-in'));
5932 }
5933 }
5934
5935 e.f7PreventSwipePanel = true;
5936 isMoved = true;
5937 app.preventSwipePanelBySwipeBack = true;
5938 e.preventDefault(); // RTL inverter
5939
5940 var inverter = app.rtl ? -1 : 1; // Touches diff
5941
5942 touchesDiff = (pageX - touchesStart.x - paramsSwipeBackThreshold) * inverter;
5943 if (touchesDiff < 0) touchesDiff = 0;
5944 var percentage = Math.min(Math.max(touchesDiff / viewContainerWidth, 0), 1); // Swipe Back Callback
5945
5946 var callbackData = {
5947 percentage: percentage,
5948 progress: percentage,
5949 currentPageEl: $currentPageEl[0],
5950 previousPageEl: $previousPageEl[0],
5951 currentNavbarEl: $currentNavbarEl[0],
5952 previousNavbarEl: $previousNavbarEl[0]
5953 };
5954 $el.trigger('swipeback:move', callbackData);
5955 router.emit('swipebackMove', callbackData); // Transform pages
5956
5957 var currentPageTranslate = touchesDiff * inverter;
5958 var previousPageTranslate = (touchesDiff / 5 - viewContainerWidth / 5) * inverter;
5959
5960 if (!app.rtl) {
5961 currentPageTranslate = Math.min(currentPageTranslate, viewContainerWidth);
5962 previousPageTranslate = Math.min(previousPageTranslate, 0);
5963 } else {
5964 currentPageTranslate = Math.max(currentPageTranslate, -viewContainerWidth);
5965 previousPageTranslate = Math.max(previousPageTranslate, 0);
5966 }
5967
5968 if (device.pixelRatio === 1) {
5969 currentPageTranslate = Math.round(currentPageTranslate);
5970 previousPageTranslate = Math.round(previousPageTranslate);
5971 }
5972
5973 router.swipeBackActive = true;
5974 $$1([$currentPageEl[0], $previousPageEl[0]]).addClass('page-swipeback-active');
5975 $currentPageEl.transform("translate3d(" + currentPageTranslate + "px,0,0)");
5976 if (paramsSwipeBackAnimateShadow) $pageShadowEl[0].style.opacity = 1 - 1 * percentage;
5977
5978 if (app.theme === 'ios') {
5979 $previousPageEl.transform("translate3d(" + previousPageTranslate + "px,0,0)");
5980 }
5981
5982 if (paramsSwipeBackAnimateOpacity) $pageOpacityEl[0].style.opacity = 1 - 1 * percentage; // Dynamic Navbars Animation
5983
5984 if (!dynamicNavbar) return;
5985 setAnimatableNavElements({
5986 progress: percentage
5987 });
5988 }
5989
5990 function handleTouchEnd() {
5991 app.preventSwipePanelBySwipeBack = false;
5992
5993 if (!isTouched || !isMoved) {
5994 isTouched = false;
5995 isMoved = false;
5996 return;
5997 }
5998
5999 isTouched = false;
6000 isMoved = false;
6001 router.swipeBackActive = false;
6002 var $pages = $$1([$currentPageEl[0], $previousPageEl[0]]);
6003 $pages.removeClass('page-swipeback-active');
6004
6005 if (touchesDiff === 0) {
6006 $pages.transform('');
6007 if ($pageShadowEl && $pageShadowEl.length > 0) $pageShadowEl.remove();
6008 if ($pageOpacityEl && $pageOpacityEl.length > 0) $pageOpacityEl.remove();
6009
6010 if (dynamicNavbar) {
6011 setAnimatableNavElements({
6012 reset: true
6013 });
6014 }
6015
6016 return;
6017 }
6018
6019 var timeDiff = now() - touchStartTime;
6020 var pageChanged = false; // Swipe back to previous page
6021
6022 if (timeDiff < 300 && touchesDiff > 10 || timeDiff >= 300 && touchesDiff > viewContainerWidth / 2) {
6023 $currentPageEl.removeClass('page-current').addClass("page-next" + (app.theme !== 'ios' ? ' page-next-on-right' : ''));
6024 $previousPageEl.removeClass('page-previous').addClass('page-current').removeAttr('aria-hidden');
6025 if ($pageShadowEl) $pageShadowEl[0].style.opacity = '';
6026 if ($pageOpacityEl) $pageOpacityEl[0].style.opacity = '';
6027
6028 if (dynamicNavbar) {
6029 router.setNavbarPosition($currentNavbarEl, 'next');
6030 router.setNavbarPosition($previousNavbarEl, 'current', false);
6031 }
6032
6033 pageChanged = true;
6034 } // Reset custom styles
6035 // Add transitioning class for transition-duration
6036
6037
6038 $pages.addClass('page-transitioning page-transitioning-swipeback');
6039
6040 if (device.ios) {
6041 // eslint-disable-next-line
6042 $currentPageEl[0]._clientLeft = $currentPageEl[0].clientLeft;
6043 }
6044
6045 $pages.transform('');
6046
6047 if (dynamicNavbar) {
6048 setAnimatableNavElements({
6049 progress: pageChanged ? 1 : 0,
6050 transition: true,
6051 reflow: !!device.ios
6052 });
6053 }
6054
6055 allowViewTouchMove = false;
6056 router.allowPageChange = false; // Swipe Back Callback
6057
6058 var callbackData = {
6059 currentPageEl: $currentPageEl[0],
6060 previousPageEl: $previousPageEl[0],
6061 currentNavbarEl: $currentNavbarEl[0],
6062 previousNavbarEl: $previousNavbarEl[0]
6063 };
6064
6065 if (pageChanged) {
6066 // Update Route
6067 router.currentRoute = $previousPageEl[0].f7Page.route;
6068 router.currentPage = $previousPageEl[0]; // Page before animation callback
6069
6070 router.pageCallback('beforeOut', $currentPageEl, $currentNavbarEl, 'current', 'next', {
6071 route: $currentPageEl[0].f7Page.route,
6072 swipeBack: true
6073 });
6074 router.pageCallback('beforeIn', $previousPageEl, $previousNavbarEl, 'previous', 'current', {
6075 route: $previousPageEl[0].f7Page.route,
6076 swipeBack: true
6077 }, $currentPageEl[0]);
6078 $el.trigger('swipeback:beforechange', callbackData);
6079 router.emit('swipebackBeforeChange', callbackData);
6080 } else {
6081 $el.trigger('swipeback:beforereset', callbackData);
6082 router.emit('swipebackBeforeReset', callbackData);
6083 }
6084
6085 $currentPageEl.transitionEnd(function () {
6086 $pages.removeClass('page-transitioning page-transitioning-swipeback');
6087
6088 if (dynamicNavbar) {
6089 setAnimatableNavElements({
6090 reset: true,
6091 transition: false
6092 });
6093 }
6094
6095 allowViewTouchMove = true;
6096 router.allowPageChange = true;
6097
6098 if (pageChanged) {
6099 // Update History
6100 if (router.history.length === 1) {
6101 router.history.unshift(router.url);
6102 }
6103
6104 router.history.pop();
6105 router.saveHistory(); // Update push state
6106
6107 if (params.browserHistory) {
6108 History.back();
6109 } // Page after animation callback
6110
6111
6112 router.pageCallback('afterOut', $currentPageEl, $currentNavbarEl, 'current', 'next', {
6113 route: $currentPageEl[0].f7Page.route,
6114 swipeBack: true
6115 });
6116 router.pageCallback('afterIn', $previousPageEl, $previousNavbarEl, 'previous', 'current', {
6117 route: $previousPageEl[0].f7Page.route,
6118 swipeBack: true
6119 }); // Remove Old Page
6120
6121 if (params.stackPages && router.initialPages.indexOf($currentPageEl[0]) >= 0) {
6122 $currentPageEl.addClass('stacked');
6123
6124 if (dynamicNavbar) {
6125 $currentNavbarEl.addClass('stacked');
6126 }
6127 } else {
6128 router.pageCallback('beforeRemove', $currentPageEl, $currentNavbarEl, 'next', {
6129 swipeBack: true
6130 });
6131 router.removePage($currentPageEl);
6132
6133 if (dynamicNavbar) {
6134 router.removeNavbar($currentNavbarEl);
6135 }
6136 }
6137
6138 $el.trigger('swipeback:afterchange', callbackData);
6139 router.emit('swipebackAfterChange', callbackData);
6140 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
6141
6142 if (params.preloadPreviousPage) {
6143 router.back(router.history[router.history.length - 2], {
6144 preload: true
6145 });
6146 }
6147 } else {
6148 $el.trigger('swipeback:afterreset', callbackData);
6149 router.emit('swipebackAfterReset', callbackData);
6150 }
6151
6152 if ($pageShadowEl && $pageShadowEl.length > 0) $pageShadowEl.remove();
6153 if ($pageOpacityEl && $pageOpacityEl.length > 0) $pageOpacityEl.remove();
6154 });
6155 }
6156
6157 function attachEvents() {
6158 var passiveListener = app.touchEvents.start === 'touchstart' && support.passiveListener ? {
6159 passive: true,
6160 capture: false
6161 } : false;
6162 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
6163 app.on('touchmove:active', handleTouchMove);
6164 app.on('touchend:passive', handleTouchEnd);
6165 }
6166
6167 function detachEvents() {
6168 var passiveListener = app.touchEvents.start === 'touchstart' && support.passiveListener ? {
6169 passive: true,
6170 capture: false
6171 } : false;
6172 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
6173 app.off('touchmove:active', handleTouchMove);
6174 app.off('touchend:passive', handleTouchEnd);
6175 }
6176
6177 attachEvents();
6178 router.on('routerDestroy', detachEvents);
6179 }
6180
6181 function redirect(direction, route, options) {
6182 var router = this;
6183 var r = route.route.redirect;
6184 var method = direction === 'forward' ? 'navigate' : 'back';
6185
6186 if (options.initial && router.params.browserHistory) {
6187 options.replaceState = true; // eslint-disable-line
6188
6189 options.history = true; // eslint-disable-line
6190 }
6191
6192 function redirectResolve(redirectUrl, redirectOptions) {
6193 if (redirectOptions === void 0) {
6194 redirectOptions = {};
6195 }
6196
6197 router.allowPageChange = true;
6198 router[method](redirectUrl, extend$1({}, options, redirectOptions));
6199 }
6200
6201 function redirectReject() {
6202 router.allowPageChange = true;
6203 }
6204
6205 if (typeof r === 'function') {
6206 router.allowPageChange = false;
6207 var redirectUrl = r.call(router, {
6208 router: router,
6209 to: route,
6210 resolve: redirectResolve,
6211 reject: redirectReject,
6212 direction: direction,
6213 app: router.app
6214 });
6215
6216 if (redirectUrl && typeof redirectUrl === 'string') {
6217 router.allowPageChange = true;
6218 return router[method](redirectUrl, options);
6219 }
6220
6221 return router;
6222 }
6223
6224 return router[method](r, options);
6225 }
6226
6227 function processQueue(router, routerQueue, routeQueue, to, from, resolve, _reject, direction) {
6228 var queue = [];
6229
6230 if (Array.isArray(routeQueue)) {
6231 queue.push.apply(queue, routeQueue);
6232 } else if (routeQueue && typeof routeQueue === 'function') {
6233 queue.push(routeQueue);
6234 }
6235
6236 if (routerQueue) {
6237 if (Array.isArray(routerQueue)) {
6238 queue.push.apply(queue, routerQueue);
6239 } else {
6240 queue.push(routerQueue);
6241 }
6242 }
6243
6244 function next() {
6245 if (queue.length === 0) {
6246 resolve();
6247 return;
6248 }
6249
6250 var queueItem = queue.shift();
6251 queueItem.call(router, {
6252 router: router,
6253 to: to,
6254 from: from,
6255 resolve: function resolve() {
6256 next();
6257 },
6258 reject: function reject() {
6259 _reject();
6260 },
6261 direction: direction,
6262 app: router.app
6263 });
6264 }
6265
6266 next();
6267 }
6268
6269 function processRouteQueue(to, from, resolve, reject, direction) {
6270 var router = this;
6271
6272 function enterNextRoute() {
6273 if (to && to.route && (router.params.routesBeforeEnter || to.route.beforeEnter)) {
6274 router.allowPageChange = false;
6275 processQueue(router, router.params.routesBeforeEnter, to.route.beforeEnter, to, from, function () {
6276 router.allowPageChange = true;
6277 resolve();
6278 }, function () {
6279 reject();
6280 }, direction);
6281 } else {
6282 resolve();
6283 }
6284 }
6285
6286 function leaveCurrentRoute() {
6287 if (from && from.route && (router.params.routesBeforeLeave || from.route.beforeLeave)) {
6288 router.allowPageChange = false;
6289 processQueue(router, router.params.routesBeforeLeave, from.route.beforeLeave, to, from, function () {
6290 router.allowPageChange = true;
6291 enterNextRoute();
6292 }, function () {
6293 reject();
6294 }, direction);
6295 } else {
6296 enterNextRoute();
6297 }
6298 }
6299
6300 leaveCurrentRoute();
6301 }
6302
6303 function appRouterCheck(router, method) {
6304 if (!router.view) {
6305 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 + "(...)");
6306 }
6307 }
6308
6309 function asyncComponent(router, component, resolve, reject) {
6310 function resolvePromise(componentPromise) {
6311 componentPromise.then(function (c) {
6312 // eslint-disable-next-line
6313 resolve({
6314 component: c.default || c._default || c
6315 });
6316 }).catch(function (err) {
6317 reject();
6318 throw new Error(err);
6319 });
6320 }
6321
6322 if (component instanceof Promise) {
6323 resolvePromise(component);
6324 return;
6325 }
6326
6327 var asyncComponentResult = component.call(router);
6328
6329 if (asyncComponentResult instanceof Promise) {
6330 resolvePromise(asyncComponentResult);
6331 } else {
6332 resolve({
6333 component: asyncComponentResult
6334 });
6335 }
6336 }
6337
6338 function refreshPage() {
6339 var router = this;
6340 appRouterCheck(router, 'refreshPage');
6341 return router.navigate(router.currentRoute.url, {
6342 ignoreCache: true,
6343 reloadCurrent: true
6344 });
6345 }
6346
6347 function forward(router, el, forwardOptions) {
6348 if (forwardOptions === void 0) {
6349 forwardOptions = {};
6350 }
6351
6352 var document = getDocument();
6353 var $el = $$1(el);
6354 var app = router.app;
6355 var view = router.view;
6356 var options = extend$1(false, {
6357 animate: router.params.animate,
6358 browserHistory: true,
6359 replaceState: false,
6360 history: true,
6361 reloadCurrent: router.params.reloadPages,
6362 reloadPrevious: false,
6363 reloadAll: false,
6364 clearPreviousHistory: false,
6365 reloadDetail: router.params.reloadDetail,
6366 on: {}
6367 }, forwardOptions);
6368 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
6369 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));
6370 var masterPageEl;
6371 var otherDetailPageEl;
6372 var detailsInBetweenRemoved = 0;
6373 var currentRouteIsModal = router.currentRoute.modal;
6374 var modalType;
6375
6376 if (!currentRouteIsModal) {
6377 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
6378 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route[modalLoadProp]) {
6379 currentRouteIsModal = true;
6380 modalType = modalLoadProp;
6381 }
6382 });
6383 }
6384
6385 if (currentRouteIsModal) {
6386 var modalToClose = router.currentRoute.modal || router.currentRoute.route.modalInstance || app[modalType].get();
6387 var previousUrl = router.history[router.history.length - 2];
6388 var previousRoute = router.findMatchingRoute(previousUrl);
6389
6390 if (!previousRoute && previousUrl) {
6391 previousRoute = {
6392 url: previousUrl,
6393 path: previousUrl.split('?')[0],
6394 query: parseUrlQuery(previousUrl),
6395 route: {
6396 path: previousUrl.split('?')[0],
6397 url: previousUrl
6398 }
6399 };
6400 }
6401
6402 router.modalRemove(modalToClose);
6403 }
6404
6405 var dynamicNavbar = router.dynamicNavbar;
6406 var $viewEl = router.$el;
6407 var $newPage = $el;
6408 var reload = options.reloadPrevious || options.reloadCurrent || options.reloadAll;
6409 var $oldPage;
6410 var $navbarsEl;
6411 var $newNavbarEl;
6412 var $oldNavbarEl;
6413 router.allowPageChange = false;
6414
6415 if ($newPage.length === 0) {
6416 router.allowPageChange = true;
6417 return router;
6418 }
6419
6420 if ($newPage.length) {
6421 // Remove theme elements
6422 router.removeThemeElements($newPage);
6423 }
6424
6425 if (dynamicNavbar) {
6426 $newNavbarEl = $newPage.children('.navbar');
6427 $navbarsEl = router.$navbarsEl;
6428
6429 if ($newNavbarEl.length === 0 && $newPage[0] && $newPage[0].f7Page) {
6430 // Try from pageData
6431 $newNavbarEl = $newPage[0].f7Page.$navbarEl;
6432 }
6433 } // Save Keep Alive Cache
6434
6435
6436 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
6437 options.route.route.keepAliveData = {
6438 pageEl: $el[0]
6439 };
6440 } // Pages In View
6441
6442
6443 var $pagesInView = $viewEl.children('.page:not(.stacked)').filter(function (pageInView) {
6444 return pageInView !== $newPage[0];
6445 }); // Navbars In View
6446
6447 var $navbarsInView;
6448
6449 if (dynamicNavbar) {
6450 $navbarsInView = $navbarsEl.children('.navbar:not(.stacked)').filter(function (navbarInView) {
6451 return navbarInView !== $newNavbarEl[0];
6452 });
6453 } // Exit when reload previous and only 1 page in view so nothing ro reload
6454
6455
6456 if (options.reloadPrevious && $pagesInView.length < 2) {
6457 router.allowPageChange = true;
6458 return router;
6459 } // Find Detail' master page
6460
6461
6462 var isDetail;
6463 var reloadDetail;
6464 var isDetailRoot;
6465
6466 if (masterDetailEnabled && !options.reloadAll) {
6467 for (var i = 0; i < $pagesInView.length; i += 1) {
6468 if (!masterPageEl && $pagesInView[i].classList.contains('page-master')) {
6469 masterPageEl = $pagesInView[i];
6470 continue; // eslint-disable-line
6471 }
6472 }
6473
6474 isDetail = !isMaster && masterPageEl;
6475
6476 if (isDetail) {
6477 // Find Other Detail
6478 if (masterPageEl) {
6479 for (var _i = 0; _i < $pagesInView.length; _i += 1) {
6480 if ($pagesInView[_i].classList.contains('page-master-detail')) {
6481 otherDetailPageEl = $pagesInView[_i];
6482 continue; // eslint-disable-line
6483 }
6484 }
6485 }
6486 }
6487
6488 reloadDetail = isDetail && options.reloadDetail && app.width >= router.params.masterDetailBreakpoint && masterPageEl;
6489 }
6490
6491 if (isDetail) {
6492 isDetailRoot = !otherDetailPageEl || reloadDetail || options.reloadAll || options.reloadCurrent;
6493 } // New Page
6494
6495
6496 var newPagePosition = 'next';
6497
6498 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
6499 newPagePosition = 'current';
6500 } else if (options.reloadPrevious) {
6501 newPagePosition = 'previous';
6502 }
6503
6504 $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', {
6505 position: newPagePosition
6506 });
6507 router.emit('pageUnstack', $newPage[0]);
6508 router.emit('pagePosition', $newPage[0], newPagePosition);
6509
6510 if (isMaster || isDetail) {
6511 $newPage.trigger('page:role', {
6512 role: isMaster ? 'master' : 'detail',
6513 root: !!isDetailRoot
6514 });
6515 router.emit('pageRole', $newPage[0], {
6516 role: isMaster ? 'master' : 'detail',
6517 detailRoot: !!isDetailRoot
6518 });
6519 }
6520
6521 if (dynamicNavbar && $newNavbarEl.length) {
6522 $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');
6523 $newNavbarEl.trigger('navbar:position', {
6524 position: newPagePosition
6525 });
6526 router.emit('navbarPosition', $newNavbarEl[0], newPagePosition);
6527
6528 if (isMaster || isDetail) {
6529 router.emit('navbarRole', $newNavbarEl[0], {
6530 role: isMaster ? 'master' : 'detail',
6531 detailRoot: !!isDetailRoot
6532 });
6533 }
6534 } // Find Old Page
6535
6536
6537 if (options.reloadCurrent || reloadDetail) {
6538 if (reloadDetail) {
6539 $oldPage = $pagesInView.filter(function (pageEl) {
6540 return !pageEl.classList.contains('page-master');
6541 });
6542
6543 if (dynamicNavbar) {
6544 $oldNavbarEl = $$1($oldPage.map(function (pageEl) {
6545 return app.navbar.getElByPage(pageEl);
6546 }));
6547 }
6548
6549 if ($oldPage.length > 1 && masterPageEl) {
6550 detailsInBetweenRemoved = $oldPage.length - 1;
6551 $$1(masterPageEl).removeClass('page-master-stacked').trigger('page:masterunstack');
6552 router.emit('pageMasterUnstack', masterPageEl);
6553
6554 if (dynamicNavbar) {
6555 $$1(app.navbar.getElByPage(masterPageEl)).removeClass('navbar-master-stacked');
6556 router.emit('navbarMasterUnstack', app.navbar.getElByPage(masterPageEl));
6557 }
6558 }
6559 } else {
6560 $oldPage = $pagesInView.eq($pagesInView.length - 1);
6561
6562 if (dynamicNavbar) {
6563 $oldNavbarEl = $$1(app.navbar.getElByPage($oldPage));
6564 }
6565 }
6566 } else if (options.reloadPrevious) {
6567 $oldPage = $pagesInView.eq($pagesInView.length - 2);
6568
6569 if (dynamicNavbar) {
6570 // $oldNavbarEl = $navbarsInView.eq($pagesInView.length - 2);
6571 $oldNavbarEl = $$1(app.navbar.getElByPage($oldPage));
6572 }
6573 } else if (options.reloadAll) {
6574 $oldPage = $pagesInView.filter(function (pageEl) {
6575 return pageEl !== $newPage[0];
6576 });
6577
6578 if (dynamicNavbar) {
6579 $oldNavbarEl = $navbarsInView.filter(function (navbarEl) {
6580 return navbarEl !== $newNavbarEl[0];
6581 });
6582 }
6583 } else {
6584 var removedPageEls = [];
6585 var removedNavbarEls = [];
6586
6587 if ($pagesInView.length > 1) {
6588 var _i2 = 0;
6589
6590 for (_i2 = 0; _i2 < $pagesInView.length - 1; _i2 += 1) {
6591 if (masterPageEl && $pagesInView[_i2] === masterPageEl) {
6592 $pagesInView.eq(_i2).addClass('page-master-stacked');
6593 $pagesInView.eq(_i2).trigger('page:masterstack');
6594 router.emit('pageMasterStack', $pagesInView[_i2]);
6595
6596 if (dynamicNavbar) {
6597 $$1(app.navbar.getElByPage(masterPageEl)).addClass('navbar-master-stacked');
6598 router.emit('navbarMasterStack', app.navbar.getElByPage(masterPageEl));
6599 }
6600
6601 continue; // eslint-disable-line
6602 }
6603
6604 var oldNavbarEl = app.navbar.getElByPage($pagesInView.eq(_i2));
6605
6606 if (router.params.stackPages) {
6607 $pagesInView.eq(_i2).addClass('stacked');
6608 $pagesInView.eq(_i2).trigger('page:stack');
6609 router.emit('pageStack', $pagesInView[_i2]);
6610
6611 if (dynamicNavbar) {
6612 $$1(oldNavbarEl).addClass('stacked');
6613 }
6614 } else {
6615 // Page remove event
6616 removedPageEls.push($pagesInView[_i2]);
6617 router.pageCallback('beforeRemove', $pagesInView[_i2], $navbarsInView && $navbarsInView[_i2], 'previous', undefined, options);
6618 router.removePage($pagesInView[_i2]);
6619
6620 if (dynamicNavbar && oldNavbarEl) {
6621 removedNavbarEls.push(oldNavbarEl);
6622 router.removeNavbar(oldNavbarEl);
6623 }
6624 }
6625 }
6626 }
6627
6628 $oldPage = $viewEl.children('.page:not(.stacked)').filter(function (pageEl) {
6629 return pageEl !== $newPage[0] && removedPageEls.indexOf(pageEl) < 0;
6630 });
6631
6632 if (dynamicNavbar) {
6633 $oldNavbarEl = $navbarsEl.children('.navbar:not(.stacked)').filter(function (navbarEl) {
6634 return navbarEl !== $newNavbarEl[0] && removedNavbarEls.indexOf(removedNavbarEls) < 0;
6635 });
6636 }
6637
6638 removedPageEls = [];
6639 removedNavbarEls = [];
6640 }
6641
6642 if (isDetail && !options.reloadAll) {
6643 if ($oldPage.length > 1 || reloadDetail) {
6644 $oldPage = $oldPage.filter(function (pageEl) {
6645 return !pageEl.classList.contains('page-master');
6646 });
6647 }
6648
6649 if ($oldNavbarEl && ($oldNavbarEl.length > 1 || reloadDetail)) {
6650 $oldNavbarEl = $oldNavbarEl.filter(function (navbarEl) {
6651 return !navbarEl.classList.contains('navbar-master');
6652 });
6653 }
6654 } // Push State
6655
6656
6657 if (router.params.browserHistory && (options.browserHistory || options.replaceState) && !options.reloadPrevious) {
6658 var browserHistoryRoot = router.params.browserHistoryRoot || '';
6659 History[options.reloadCurrent || reloadDetail && otherDetailPageEl || options.reloadAll || options.replaceState ? 'replace' : 'push'](view.id, {
6660 url: options.route.url
6661 }, browserHistoryRoot + router.params.browserHistorySeparator + options.route.url);
6662 }
6663
6664 if (!options.reloadPrevious) {
6665 // Current Page & Navbar
6666 router.currentPageEl = $newPage[0];
6667
6668 if (dynamicNavbar && $newNavbarEl.length) {
6669 router.currentNavbarEl = $newNavbarEl[0];
6670 } else {
6671 delete router.currentNavbarEl;
6672 } // Current Route
6673
6674
6675 router.currentRoute = options.route;
6676 } // Update router history
6677
6678
6679 var url = options.route.url;
6680
6681 if (options.history) {
6682 if (((options.reloadCurrent || reloadDetail && otherDetailPageEl) && router.history.length) > 0 || options.replaceState) {
6683 if (reloadDetail && detailsInBetweenRemoved > 0) {
6684 router.history = router.history.slice(0, router.history.length - detailsInBetweenRemoved);
6685 }
6686
6687 router.history[router.history.length - (options.reloadPrevious ? 2 : 1)] = url;
6688 } else if (options.reloadPrevious) {
6689 router.history[router.history.length - 2] = url;
6690 } else if (options.reloadAll) {
6691 router.history = [url];
6692 } else {
6693 router.history.push(url);
6694 }
6695 }
6696
6697 router.saveHistory(); // Insert new page and navbar
6698
6699 var newPageInDom = $newPage.parents(document).length > 0;
6700 var f7Component = $newPage[0].f7Component;
6701
6702 if (options.reloadPrevious) {
6703 if (f7Component && !newPageInDom) {
6704 f7Component.mount(function (componentEl) {
6705 $$1(componentEl).insertBefore($oldPage);
6706 });
6707 } else {
6708 $newPage.insertBefore($oldPage);
6709 }
6710
6711 if (dynamicNavbar && $newNavbarEl.length) {
6712 if ($newNavbarEl.find('.title-large').length) {
6713 $newNavbarEl.addClass('navbar-large');
6714 }
6715
6716 if ($oldNavbarEl.length) {
6717 $newNavbarEl.insertBefore($oldNavbarEl);
6718 } else {
6719 if (!router.$navbarsEl.parents(document).length) {
6720 router.$el.prepend(router.$navbarsEl);
6721 }
6722
6723 $navbarsEl.append($newNavbarEl);
6724 }
6725 }
6726 } else {
6727 if ($oldPage.next('.page')[0] !== $newPage[0]) {
6728 if (f7Component && !newPageInDom) {
6729 f7Component.mount(function (componentEl) {
6730 $viewEl.append(componentEl);
6731 });
6732 } else {
6733 $viewEl.append($newPage[0]);
6734 }
6735 }
6736
6737 if (dynamicNavbar && $newNavbarEl.length) {
6738 if ($newNavbarEl.find('.title-large').length) {
6739 $newNavbarEl.addClass('navbar-large');
6740 }
6741
6742 if (!router.$navbarsEl.parents(document).length) {
6743 router.$el.prepend(router.$navbarsEl);
6744 }
6745
6746 $navbarsEl.append($newNavbarEl[0]);
6747 }
6748 }
6749
6750 if (!newPageInDom) {
6751 router.pageCallback('mounted', $newPage, $newNavbarEl, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6752 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
6753 $newPage[0].f7PageMounted = true;
6754 router.pageCallback('mounted', $newPage, $newNavbarEl, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6755 } // Remove old page
6756
6757
6758 if ((options.reloadCurrent || reloadDetail) && $oldPage.length > 0) {
6759 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
6760 $oldPage.addClass('stacked');
6761 $oldPage.trigger('page:stack');
6762 router.emit('pageStack', $oldPage[0]);
6763
6764 if (dynamicNavbar) {
6765 $oldNavbarEl.addClass('stacked');
6766 }
6767 } else {
6768 // Page remove event
6769 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
6770 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
6771 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'current', undefined, options);
6772 router.removePage($oldPage);
6773
6774 if (dynamicNavbar && $oldNavbarEl && $oldNavbarEl.length) {
6775 router.removeNavbar($oldNavbarEl);
6776 }
6777 }
6778 } else if (options.reloadAll) {
6779 $oldPage.each(function (pageEl, index) {
6780 var $oldPageEl = $$1(pageEl);
6781 var $oldNavbarElEl = $$1(app.navbar.getElByPage($oldPageEl));
6782
6783 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
6784 $oldPageEl.addClass('stacked');
6785 $oldPageEl.trigger('page:stack');
6786 router.emit('pageStack', $oldPageEl[0]);
6787
6788 if (dynamicNavbar) {
6789 $oldNavbarElEl.addClass('stacked');
6790 }
6791 } else {
6792 // Page remove event
6793 if ($oldPageEl.hasClass('page-current')) {
6794 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
6795 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
6796 }
6797
6798 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarEl && $oldNavbarEl.eq(index), 'previous', undefined, options);
6799 router.removePage($oldPageEl);
6800
6801 if (dynamicNavbar && $oldNavbarElEl.length) {
6802 router.removeNavbar($oldNavbarElEl);
6803 }
6804 }
6805 });
6806 } else if (options.reloadPrevious) {
6807 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
6808 $oldPage.addClass('stacked');
6809 $oldPage.trigger('page:stack');
6810 router.emit('pageStack', $oldPage[0]);
6811
6812 if (dynamicNavbar) {
6813 $oldNavbarEl.addClass('stacked');
6814 }
6815 } else {
6816 // Page remove event
6817 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'previous', undefined, options);
6818 router.removePage($oldPage);
6819
6820 if (dynamicNavbar && $oldNavbarEl && $oldNavbarEl.length) {
6821 router.removeNavbar($oldNavbarEl);
6822 }
6823 }
6824 } // Load Tab
6825
6826
6827 if (options.route.route.tab) {
6828 router.tabLoad(options.route.route.tab, extend$1({}, options, {
6829 history: false,
6830 browserHistory: false
6831 }));
6832 } // Check master detail
6833
6834
6835 if (masterDetailEnabled) {
6836 view.checkMasterDetailBreakpoint();
6837 } // Page init and before init events
6838
6839
6840 router.pageCallback('init', $newPage, $newNavbarEl, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
6841
6842 if (options.reloadCurrent || options.reloadAll || reloadDetail) {
6843 router.allowPageChange = true;
6844 router.pageCallback('beforeIn', $newPage, $newNavbarEl, newPagePosition, 'current', options);
6845 $newPage.removeAttr('aria-hidden');
6846
6847 if (dynamicNavbar && $newNavbarEl) {
6848 $newNavbarEl.removeAttr('aria-hidden');
6849 }
6850
6851 router.pageCallback('afterIn', $newPage, $newNavbarEl, newPagePosition, 'current', options);
6852 if (options.reloadCurrent && options.clearPreviousHistory) router.clearPreviousHistory();
6853
6854 if (reloadDetail) {
6855 router.setPagePosition($$1(masterPageEl), 'previous');
6856
6857 if (masterPageEl.f7Page && masterPageEl.f7Page.navbarEl) {
6858 router.setNavbarPosition($$1(masterPageEl.f7Page.navbarEl), 'previous');
6859 }
6860 }
6861
6862 return router;
6863 }
6864
6865 if (options.reloadPrevious) {
6866 router.allowPageChange = true;
6867 return router;
6868 } // Before animation event
6869
6870
6871 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', 'previous', options);
6872 router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'next', 'current', options); // Animation
6873
6874 function afterAnimation() {
6875 router.setPagePosition($newPage, 'current', false);
6876 router.setPagePosition($oldPage, 'previous', !$oldPage.hasClass('page-master'));
6877
6878 if (dynamicNavbar) {
6879 router.setNavbarPosition($newNavbarEl, 'current', false);
6880 router.setNavbarPosition($oldNavbarEl, 'previous', !$oldNavbarEl.hasClass('navbar-master'));
6881 } // After animation event
6882
6883
6884 router.allowPageChange = true;
6885 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', 'previous', options);
6886 router.pageCallback('afterIn', $newPage, $newNavbarEl, 'next', 'current', options);
6887 var keepOldPage = (router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"]) && !isMaster;
6888
6889 if (!keepOldPage) {
6890 if ($newPage.hasClass('smart-select-page') || $newPage.hasClass('photo-browser-page') || $newPage.hasClass('autocomplete-page') || $newPage.hasClass('color-picker-page')) {
6891 keepOldPage = true;
6892 }
6893 }
6894
6895 if (!keepOldPage) {
6896 if (router.params.stackPages) {
6897 $oldPage.addClass('stacked');
6898 $oldPage.trigger('page:stack');
6899 router.emit('pageStack', $oldPage[0]);
6900
6901 if (dynamicNavbar) {
6902 $oldNavbarEl.addClass('stacked');
6903 }
6904 } else if (!($newPage.attr('data-name') && $newPage.attr('data-name') === 'smart-select-page')) {
6905 // Remove event
6906 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'previous', undefined, options);
6907 router.removePage($oldPage);
6908
6909 if (dynamicNavbar && $oldNavbarEl.length) {
6910 router.removeNavbar($oldNavbarEl);
6911 }
6912 }
6913 }
6914
6915 if (options.clearPreviousHistory) router.clearPreviousHistory();
6916 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
6917
6918 if (router.params.browserHistory) {
6919 History.clearRouterQueue();
6920 }
6921 }
6922
6923 function setPositionClasses() {
6924 router.setPagePosition($oldPage, 'current', false);
6925 router.setPagePosition($newPage, 'next', false);
6926
6927 if (dynamicNavbar) {
6928 router.setNavbarPosition($oldNavbarEl, 'current', false);
6929 router.setNavbarPosition($newNavbarEl, 'next', false);
6930 }
6931 }
6932
6933 if (options.animate && !(isMaster && app.width >= router.params.masterDetailBreakpoint)) {
6934 var delay = router.params[router.app.theme + "PageLoadDelay"];
6935 var transition = router.params.transition;
6936 if (options.transition) transition = options.transition;
6937
6938 if (!transition && router.currentRoute && router.currentRoute.route) {
6939 transition = router.currentRoute.route.transition;
6940 }
6941
6942 if (!transition && router.currentRoute && router.currentRoute.route.options) {
6943 transition = router.currentRoute.route.options.transition;
6944 }
6945
6946 if (transition) {
6947 $newPage[0].f7PageTransition = transition;
6948 }
6949
6950 if (delay) {
6951 setTimeout(function () {
6952 setPositionClasses();
6953 router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'forward', transition, function () {
6954 afterAnimation();
6955 });
6956 }, delay);
6957 } else {
6958 setPositionClasses();
6959 router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'forward', transition, function () {
6960 afterAnimation();
6961 });
6962 }
6963 } else {
6964 afterAnimation();
6965 }
6966
6967 return router;
6968 }
6969
6970 function load(router, loadParams, loadOptions, ignorePageChange) {
6971 if (loadParams === void 0) {
6972 loadParams = {};
6973 }
6974
6975 if (loadOptions === void 0) {
6976 loadOptions = {};
6977 }
6978
6979 if (!router.allowPageChange && !ignorePageChange) return router;
6980 var params = loadParams;
6981 var options = loadOptions;
6982 var url = params.url,
6983 content = params.content,
6984 el = params.el,
6985 pageName = params.pageName,
6986 component = params.component,
6987 componentUrl = params.componentUrl;
6988
6989 if (!options.reloadCurrent && options.route && options.route.route && options.route.route.parentPath && router.currentRoute.route && router.currentRoute.route.parentPath === options.route.route.parentPath) {
6990 // Do something nested
6991 if (options.route.url === router.url) {
6992 router.allowPageChange = true;
6993 return false;
6994 } // Check for same params
6995
6996
6997 var sameParams = Object.keys(options.route.params).length === Object.keys(router.currentRoute.params).length;
6998
6999 if (sameParams) {
7000 // Check for equal params name
7001 Object.keys(options.route.params).forEach(function (paramName) {
7002 if (!(paramName in router.currentRoute.params) || router.currentRoute.params[paramName] !== options.route.params[paramName]) {
7003 sameParams = false;
7004 }
7005 });
7006 }
7007
7008 if (sameParams) {
7009 if (options.route.route.tab) {
7010 return router.tabLoad(options.route.route.tab, options);
7011 }
7012
7013 return false;
7014 }
7015
7016 if (!sameParams && options.route.route.tab && router.currentRoute.route.tab && router.currentRoute.parentPath === options.route.parentPath) {
7017 return router.tabLoad(options.route.route.tab, options);
7018 }
7019 }
7020
7021 if (options.route && options.route.url && router.url === options.route.url && !(options.reloadCurrent || options.reloadPrevious) && !router.params.allowDuplicateUrls) {
7022 router.allowPageChange = true;
7023 return false;
7024 }
7025
7026 if (!options.route && url) {
7027 options.route = router.parseRouteUrl(url);
7028 extend$1(options.route, {
7029 route: {
7030 url: url,
7031 path: url
7032 }
7033 });
7034 } // Component Callbacks
7035
7036
7037 function resolve(pageEl, newOptions) {
7038 return forward(router, pageEl, extend$1(options, newOptions));
7039 }
7040
7041 function reject() {
7042 router.allowPageChange = true;
7043 return router;
7044 }
7045
7046 if (url || componentUrl || component) {
7047 router.allowPageChange = false;
7048 } // Proceed
7049
7050
7051 if (content) {
7052 forward(router, router.getPageEl(content), options);
7053 } else if (el) {
7054 // Load page from specified HTMLElement or by page name in pages container
7055 forward(router, router.getPageEl(el), options);
7056 } else if (pageName) {
7057 // Load page by page name in pages container
7058 forward(router, router.$el.children(".page[data-name=\"" + pageName + "\"]").eq(0), options);
7059 } else if (component || componentUrl) {
7060 // Load from component (F7/Vue/React/...)
7061 try {
7062 router.pageComponentLoader({
7063 routerEl: router.el,
7064 component: component,
7065 componentUrl: componentUrl,
7066 options: options,
7067 resolve: resolve,
7068 reject: reject
7069 });
7070 } catch (err) {
7071 router.allowPageChange = true;
7072 throw err;
7073 }
7074 } else if (url) {
7075 // Load using XHR
7076 if (router.xhrAbortController) {
7077 router.xhrAbortController.abort();
7078 router.xhrAbortController = false;
7079 }
7080
7081 router.xhrRequest(url, options).then(function (pageContent) {
7082 forward(router, router.getPageEl(pageContent), options);
7083 }).catch(function () {
7084 router.allowPageChange = true;
7085 });
7086 }
7087
7088 return router;
7089 }
7090
7091 function openIn(router, url, options) {
7092 var navigateOptions = {
7093 url: url,
7094 route: {
7095 path: url,
7096 options: _extends({}, options, {
7097 openIn: undefined
7098 })
7099 }
7100 };
7101
7102 var params = _extends({}, options);
7103
7104 if (options.openIn === 'popup') {
7105 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>";
7106 navigateOptions.route.popup = params;
7107 }
7108
7109 if (options.openIn === 'loginScreen') {
7110 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>";
7111 navigateOptions.route.loginScreen = params;
7112 }
7113
7114 if (options.openIn === 'sheet') {
7115 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>";
7116 navigateOptions.route.sheet = params;
7117 }
7118
7119 if (options.openIn === 'popover') {
7120 params.targetEl = options.clickedEl || options.targetEl;
7121 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>";
7122 navigateOptions.route.popover = params;
7123 }
7124
7125 if (options.openIn.indexOf('panel') >= 0) {
7126 var parts = options.openIn.split(':');
7127 var side = parts[1] || 'left';
7128 var effect = parts[2] || 'cover';
7129 params.targetEl = options.clickedEl || options.targetEl;
7130 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>";
7131 navigateOptions.route.panel = params;
7132 }
7133
7134 return router.navigate(navigateOptions);
7135 }
7136
7137 function navigate(navigateParams, navigateOptions) {
7138 if (navigateOptions === void 0) {
7139 navigateOptions = {};
7140 }
7141
7142 var router = this;
7143 if (router.swipeBackActive) return router;
7144 var url;
7145 var createRoute;
7146 var name;
7147 var path;
7148 var query;
7149 var params;
7150 var route;
7151
7152 if (typeof navigateParams === 'string') {
7153 url = navigateParams;
7154 } else {
7155 url = navigateParams.url;
7156 createRoute = navigateParams.route;
7157 name = navigateParams.name;
7158 path = navigateParams.path;
7159 query = navigateParams.query;
7160 params = navigateParams.params;
7161 }
7162
7163 if (name || path) {
7164 url = router.generateUrl({
7165 path: path,
7166 name: name,
7167 params: params,
7168 query: query
7169 });
7170
7171 if (url) {
7172 return router.navigate(url, navigateOptions);
7173 }
7174
7175 return router;
7176 }
7177
7178 var app = router.app;
7179 appRouterCheck(router, 'navigate');
7180
7181 if (url === '#' || url === '') {
7182 return router;
7183 }
7184
7185 var navigateUrl = url.replace('./', '');
7186
7187 if (navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
7188 var currentPath = router.currentRoute.parentPath || router.currentRoute.path;
7189 navigateUrl = ((currentPath ? currentPath + "/" : '/') + navigateUrl).replace('///', '/').replace('//', '/');
7190 }
7191
7192 if (createRoute) {
7193 route = extend$1(router.parseRouteUrl(navigateUrl), {
7194 route: extend$1({}, createRoute)
7195 });
7196 } else {
7197 route = router.findMatchingRoute(navigateUrl);
7198 }
7199
7200 if (!route) {
7201 return router;
7202 }
7203
7204 if (route.route && route.route.viewName) {
7205 var anotherViewName = route.route.viewName;
7206 var anotherView = app.views[anotherViewName];
7207
7208 if (!anotherView) {
7209 throw new Error("Framework7: There is no View with \"" + anotherViewName + "\" name that was specified in this route");
7210 }
7211
7212 if (anotherView !== router.view) {
7213 return anotherView.router.navigate(navigateParams, navigateOptions);
7214 }
7215 }
7216
7217 if (route.route.redirect) {
7218 return redirect.call(router, 'forward', route, navigateOptions);
7219 }
7220
7221 var options = {};
7222
7223 if (route.route.options) {
7224 extend$1(options, route.route.options, navigateOptions);
7225 } else {
7226 extend$1(options, navigateOptions);
7227 }
7228
7229 if (options.openIn && (!router.params.ignoreOpenIn || router.params.ignoreOpenIn && router.history.length > 0)) {
7230 return openIn(router, navigateUrl, options);
7231 }
7232
7233 options.route = route;
7234
7235 function resolve() {
7236 var routerLoaded = false;
7237 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
7238 if (route.route[modalLoadProp] && !routerLoaded) {
7239 routerLoaded = true;
7240 router.modalLoad(modalLoadProp, route, options, 'forward');
7241 }
7242 });
7243
7244 if (route.route.keepAlive && route.route.keepAliveData) {
7245 load(router, {
7246 el: route.route.keepAliveData.pageEl
7247 }, options, false);
7248 routerLoaded = true;
7249 }
7250
7251 'url content component pageName el componentUrl'.split(' ').forEach(function (pageLoadProp) {
7252 if (route.route[pageLoadProp] && !routerLoaded) {
7253 var _load;
7254
7255 routerLoaded = true;
7256 load(router, (_load = {}, _load[pageLoadProp] = route.route[pageLoadProp], _load), options, false);
7257 }
7258 });
7259 if (routerLoaded) return; // Async
7260
7261 function asyncResolve(resolveParams, resolveOptions) {
7262 router.allowPageChange = false;
7263 var resolvedAsModal = false;
7264 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
7265 if (resolveParams[modalLoadProp]) {
7266 resolvedAsModal = true;
7267 var modalRoute = extend$1({}, route, {
7268 route: resolveParams
7269 });
7270 router.allowPageChange = true;
7271 router.modalLoad(modalLoadProp, modalRoute, extend$1(options, resolveOptions), 'forward');
7272 }
7273 });
7274 if (resolvedAsModal) return;
7275 load(router, resolveParams, extend$1(options, resolveOptions), true);
7276 }
7277
7278 function asyncReject() {
7279 router.allowPageChange = true;
7280 }
7281
7282 if (route.route.async) {
7283 router.allowPageChange = false;
7284 route.route.async.call(router, {
7285 router: router,
7286 to: options.route,
7287 from: router.currentRoute,
7288 resolve: asyncResolve,
7289 reject: asyncReject,
7290 direction: 'forward',
7291 app: app
7292 });
7293 }
7294
7295 if (route.route.asyncComponent) {
7296 asyncComponent(router, route.route.asyncComponent, asyncResolve, asyncReject);
7297 }
7298 }
7299
7300 function reject() {
7301 router.allowPageChange = true;
7302 }
7303
7304 if (router.params.masterDetailBreakpoint > 0 && route.route.masterRoute) {
7305 // load detail route
7306 var preloadMaster = true;
7307 var masterLoaded = false;
7308
7309 if (router.currentRoute && router.currentRoute.route) {
7310 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)) {
7311 preloadMaster = false;
7312 }
7313
7314 if (router.currentRoute.route.masterRoute && (router.currentRoute.route.masterRoute === route.route.masterRoute || router.currentRoute.route.masterRoute.path === route.route.masterRoute.path)) {
7315 preloadMaster = false;
7316 masterLoaded = true;
7317 }
7318 }
7319
7320 if (preloadMaster || masterLoaded && navigateOptions.reloadAll) {
7321 router.navigate({
7322 path: route.route.masterRoute.path,
7323 params: route.params || {}
7324 }, {
7325 animate: false,
7326 reloadAll: navigateOptions.reloadAll,
7327 reloadCurrent: navigateOptions.reloadCurrent,
7328 reloadPrevious: navigateOptions.reloadPrevious,
7329 browserHistory: !navigateOptions.initial,
7330 history: !navigateOptions.initial,
7331 once: {
7332 pageAfterIn: function pageAfterIn() {
7333 router.navigate(navigateParams, extend$1({}, navigateOptions, {
7334 animate: false,
7335 reloadAll: false,
7336 reloadCurrent: false,
7337 reloadPrevious: false,
7338 history: !navigateOptions.initial,
7339 browserHistory: !navigateOptions.initial
7340 }));
7341 }
7342 }
7343 });
7344 return router;
7345 }
7346 }
7347
7348 processRouteQueue.call(router, route, router.currentRoute, function () {
7349 if (route.route.modules) {
7350 app.loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules]).then(function () {
7351 resolve();
7352 }).catch(function () {
7353 reject();
7354 });
7355 } else {
7356 resolve();
7357 }
7358 }, function () {
7359 reject();
7360 }, 'forward'); // Return Router
7361
7362 return router;
7363 }
7364
7365 function tabLoad(tabRoute, loadOptions) {
7366 if (loadOptions === void 0) {
7367 loadOptions = {};
7368 }
7369
7370 var router = this;
7371 var options = extend$1({
7372 animate: router.params.animate,
7373 browserHistory: true,
7374 history: true,
7375 parentPageEl: null,
7376 preload: false,
7377 on: {}
7378 }, loadOptions);
7379 var currentRoute;
7380 var previousRoute;
7381
7382 if (options.route) {
7383 // Set Route
7384 if (!options.preload && options.route !== router.currentRoute) {
7385 previousRoute = router.previousRoute;
7386 router.currentRoute = options.route;
7387 }
7388
7389 if (options.preload) {
7390 currentRoute = options.route;
7391 previousRoute = router.currentRoute;
7392 } else {
7393 currentRoute = router.currentRoute;
7394 if (!previousRoute) previousRoute = router.previousRoute;
7395 } // Update Browser History
7396
7397
7398 if (router.params.browserHistory && options.browserHistory && !options.reloadPrevious) {
7399 History.replace(router.view.id, {
7400 url: options.route.url
7401 }, (router.params.browserHistoryRoot || '') + router.params.browserHistorySeparator + options.route.url);
7402 } // Update Router History
7403
7404
7405 if (options.history) {
7406 router.history[Math.max(router.history.length - 1, 0)] = options.route.url;
7407 router.saveHistory();
7408 }
7409 } // Show Tab
7410
7411
7412 var $parentPageEl = $$1(options.parentPageEl || router.currentPageEl);
7413 var tabEl;
7414
7415 if ($parentPageEl.length && $parentPageEl.find("#" + tabRoute.id).length) {
7416 tabEl = $parentPageEl.find("#" + tabRoute.id).eq(0);
7417 } else if (router.view.selector) {
7418 tabEl = router.view.selector + " #" + tabRoute.id;
7419 } else {
7420 tabEl = "#" + tabRoute.id;
7421 }
7422
7423 var tabShowResult = router.app.tab.show({
7424 tabEl: tabEl,
7425 animate: options.animate,
7426 tabRoute: options.route
7427 });
7428 var $newTabEl = tabShowResult.$newTabEl,
7429 $oldTabEl = tabShowResult.$oldTabEl,
7430 animated = tabShowResult.animated,
7431 onTabsChanged = tabShowResult.onTabsChanged;
7432
7433 if ($newTabEl && $newTabEl.parents('.page').length > 0 && options.route) {
7434 var tabParentPageData = $newTabEl.parents('.page')[0].f7Page;
7435
7436 if (tabParentPageData && options.route) {
7437 tabParentPageData.route = options.route;
7438 }
7439 } // Tab Content Loaded
7440
7441
7442 function onTabLoaded(contentEl) {
7443 // Remove theme elements
7444 router.removeThemeElements($newTabEl);
7445 var tabEventTarget = $newTabEl;
7446 if (typeof contentEl !== 'string') tabEventTarget = $$1(contentEl);
7447 tabEventTarget.trigger('tab:init tab:mounted', tabRoute);
7448 router.emit('tabInit tabMounted', $newTabEl[0], tabRoute);
7449
7450 if ($oldTabEl && $oldTabEl.length) {
7451 if (animated) {
7452 onTabsChanged(function () {
7453 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7454
7455 if (router.params.unloadTabContent) {
7456 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
7457 }
7458 });
7459 } else {
7460 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7461
7462 if (router.params.unloadTabContent) {
7463 router.tabRemove($oldTabEl, $newTabEl, tabRoute);
7464 }
7465 }
7466 }
7467 }
7468
7469 if ($newTabEl[0].f7RouterTabLoaded) {
7470 if (!$oldTabEl || !$oldTabEl.length) return router;
7471
7472 if (animated) {
7473 onTabsChanged(function () {
7474 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7475 });
7476 } else {
7477 router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
7478 }
7479
7480 return router;
7481 } // Load Tab Content
7482
7483
7484 function loadTab(loadTabParams, loadTabOptions) {
7485 // Load Tab Props
7486 var url = loadTabParams.url,
7487 content = loadTabParams.content,
7488 el = loadTabParams.el,
7489 component = loadTabParams.component,
7490 componentUrl = loadTabParams.componentUrl; // Component/Template Callbacks
7491
7492 function resolve(contentEl) {
7493 router.allowPageChange = true;
7494 if (!contentEl) return;
7495
7496 if (typeof contentEl === 'string') {
7497 $newTabEl.html(contentEl);
7498 } else {
7499 $newTabEl.html('');
7500
7501 if (contentEl.f7Component) {
7502 contentEl.f7Component.mount(function (componentEl) {
7503 $newTabEl.append(componentEl);
7504 });
7505 } else {
7506 $newTabEl.append(contentEl);
7507 }
7508 }
7509
7510 $newTabEl[0].f7RouterTabLoaded = true;
7511 onTabLoaded(contentEl);
7512 }
7513
7514 function reject() {
7515 router.allowPageChange = true;
7516 return router;
7517 }
7518
7519 if (content) {
7520 resolve(content);
7521 } else if (el) {
7522 resolve(el);
7523 } else if (component || componentUrl) {
7524 // Load from component (F7/Vue/React/...)
7525 try {
7526 router.tabComponentLoader({
7527 tabEl: $newTabEl[0],
7528 component: component,
7529 componentUrl: componentUrl,
7530 options: loadTabOptions,
7531 resolve: resolve,
7532 reject: reject
7533 });
7534 } catch (err) {
7535 router.allowPageChange = true;
7536 throw err;
7537 }
7538 } else if (url) {
7539 // Load using XHR
7540 if (router.xhrAbortController) {
7541 router.xhrAbortController.abort();
7542 router.xhrAbortController = false;
7543 }
7544
7545 router.xhrRequest(url, loadTabOptions).then(function (tabContent) {
7546 resolve(tabContent);
7547 }).catch(function () {
7548 router.allowPageChange = true;
7549 });
7550 }
7551 }
7552
7553 var hasContentLoadProp;
7554 'url content component el componentUrl'.split(' ').forEach(function (tabLoadProp) {
7555 if (tabRoute[tabLoadProp]) {
7556 var _loadTab;
7557
7558 hasContentLoadProp = true;
7559 loadTab((_loadTab = {}, _loadTab[tabLoadProp] = tabRoute[tabLoadProp], _loadTab), options);
7560 }
7561 }); // Async
7562
7563 function asyncResolve(resolveParams, resolveOptions) {
7564 loadTab(resolveParams, extend$1(options, resolveOptions));
7565 }
7566
7567 function asyncReject() {
7568 router.allowPageChange = true;
7569 }
7570
7571 if (tabRoute.async) {
7572 tabRoute.async.call(router, {
7573 router: router,
7574 to: currentRoute,
7575 from: previousRoute,
7576 resolve: asyncResolve,
7577 reject: asyncReject,
7578 app: router.app
7579 });
7580 } else if (tabRoute.asyncComponent) {
7581 asyncComponent(router, tabRoute.asyncComponent, asyncResolve, asyncReject);
7582 } else if (!hasContentLoadProp) {
7583 router.allowPageChange = true;
7584 }
7585
7586 return router;
7587 }
7588
7589 function tabRemove($oldTabEl, $newTabEl, tabRoute) {
7590 var router = this;
7591 var hasTabComponentChild;
7592
7593 if ($oldTabEl[0]) {
7594 $oldTabEl[0].f7RouterTabLoaded = false;
7595 delete $oldTabEl[0].f7RouterTabLoaded;
7596 }
7597
7598 $oldTabEl.children().each(function (tabChild) {
7599 if (tabChild.f7Component) {
7600 hasTabComponentChild = true;
7601 $$1(tabChild).trigger('tab:beforeremove', tabRoute);
7602 tabChild.f7Component.destroy();
7603 }
7604 });
7605
7606 if (!hasTabComponentChild) {
7607 $oldTabEl.trigger('tab:beforeremove', tabRoute);
7608 }
7609
7610 router.emit('tabBeforeRemove', $oldTabEl[0], $newTabEl[0], tabRoute);
7611 router.removeTabContent($oldTabEl[0], tabRoute);
7612 }
7613
7614 function modalLoad(modalType, route, loadOptions, direction) {
7615 if (loadOptions === void 0) {
7616 loadOptions = {};
7617 }
7618
7619 var router = this;
7620 var app = router.app;
7621 var isPanel = modalType === 'panel';
7622 var modalOrPanel = isPanel ? 'panel' : 'modal';
7623 var options = extend$1({
7624 animate: router.params.animate,
7625 browserHistory: true,
7626 history: true,
7627 on: {},
7628 once: {}
7629 }, loadOptions);
7630 var modalParams = extend$1({}, route.route[modalType]);
7631 var modalRoute = route.route;
7632
7633 var routeCallback = function routeCallback(modal, name) {
7634 var on = options.on,
7635 once = options.once;
7636 var callback;
7637
7638 if (name === 'open') {
7639 callback = on.modalOpen || once.modalOpen || on.panelOpen || once.panelOpen;
7640 }
7641
7642 if (name === 'close') {
7643 callback = on.modalClose || once.modalClose || on.panelClose || once.panelClose;
7644 }
7645
7646 if (name === 'closed') {
7647 callback = on.modalClosed || once.modalClosed || on.panelClosed || once.panelClosed;
7648 }
7649
7650 if (callback) callback(modal);
7651 };
7652
7653 function onModalLoaded() {
7654 // Create Modal
7655 var modal = app[modalType].create(modalParams);
7656 modalRoute.modalInstance = modal;
7657 var hasEl = modal.el;
7658
7659 function closeOnSwipeBack() {
7660 modal.close();
7661 }
7662
7663 modal.on(modalOrPanel + "Open", function () {
7664 if (!hasEl) {
7665 // Remove theme elements
7666 router.removeThemeElements(modal.el); // Emit events
7667
7668 modal.$el.trigger(modalType.toLowerCase() + ":init " + modalType.toLowerCase() + ":mounted", route, modal);
7669 router.emit((!isPanel ? 'modalInit' : '') + " " + modalType + "Init " + modalType + "Mounted", modal.el, route, modal);
7670 }
7671
7672 router.once('swipeBackMove', closeOnSwipeBack);
7673 routeCallback(modal, 'open');
7674 });
7675 modal.on(modalOrPanel + "Close", function () {
7676 router.off('swipeBackMove', closeOnSwipeBack);
7677
7678 if (!modal.closeByRouter) {
7679 router.back();
7680 }
7681
7682 routeCallback(modal, 'close');
7683 });
7684 modal.on(modalOrPanel + "Closed", function () {
7685 modal.$el.trigger(modalType.toLowerCase() + ":beforeremove", route, modal);
7686 modal.emit("" + (!isPanel ? 'modalBeforeRemove ' : '') + modalType + "BeforeRemove", modal.el, route, modal);
7687 var modalComponent = modal.el.f7Component;
7688 routeCallback(modal, 'closed');
7689
7690 if (modalComponent) {
7691 modalComponent.destroy();
7692 }
7693
7694 nextTick(function () {
7695 if (modalComponent || modalParams.component) {
7696 router.removeModal(modal.el);
7697 }
7698
7699 modal.destroy();
7700 delete modal.route;
7701 delete modalRoute.modalInstance;
7702 });
7703 });
7704
7705 if (options.route) {
7706 // Update Browser History
7707 if (router.params.browserHistory && options.browserHistory) {
7708 History.push(router.view.id, {
7709 url: options.route.url,
7710 modal: modalType
7711 }, (router.params.browserHistoryRoot || '') + router.params.browserHistorySeparator + options.route.url);
7712 } // Set Route
7713
7714
7715 if (options.route !== router.currentRoute) {
7716 modal.route = extend$1(options.route, {
7717 modal: modal
7718 });
7719 router.currentRoute = modal.route;
7720 } // Update Router History
7721
7722
7723 if (options.history && !options.reloadCurrent) {
7724 router.history.push(options.route.url);
7725 router.saveHistory();
7726 }
7727 }
7728
7729 if (hasEl) {
7730 // Remove theme elements
7731 router.removeThemeElements(modal.el); // Emit events
7732
7733 modal.$el.trigger(modalType.toLowerCase() + ":init " + modalType.toLowerCase() + ":mounted", route, modal);
7734 router.emit(modalOrPanel + "Init " + modalType + "Init " + modalType + "Mounted", modal.el, route, modal);
7735 } // Open
7736
7737
7738 modal.open(options.animate === false || options.animate === true ? options.animate : undefined);
7739 } // Load Modal Content
7740
7741
7742 function loadModal(loadModalParams, loadModalOptions) {
7743 // Load Modal Props
7744 var url = loadModalParams.url,
7745 content = loadModalParams.content,
7746 component = loadModalParams.component,
7747 componentUrl = loadModalParams.componentUrl; // Component/Template Callbacks
7748
7749 function resolve(contentEl) {
7750 if (contentEl) {
7751 if (typeof contentEl === 'string') {
7752 modalParams.content = contentEl;
7753 } else if (contentEl.f7Component) {
7754 contentEl.f7Component.mount(function (componentEl) {
7755 modalParams.el = componentEl;
7756 app.$el.append(componentEl);
7757 });
7758 } else {
7759 modalParams.el = contentEl;
7760 }
7761
7762 onModalLoaded();
7763 }
7764 }
7765
7766 function reject() {
7767 router.allowPageChange = true;
7768 return router;
7769 }
7770
7771 if (content) {
7772 resolve(content);
7773 } else if (component || componentUrl) {
7774 // Load from component (F7/Vue/React/...)
7775 try {
7776 router.modalComponentLoader({
7777 rootEl: app.el,
7778 component: component,
7779 componentUrl: componentUrl,
7780 options: loadModalOptions,
7781 resolve: resolve,
7782 reject: reject
7783 });
7784 } catch (err) {
7785 router.allowPageChange = true;
7786 throw err;
7787 }
7788 } else if (url) {
7789 // Load using XHR
7790 if (router.xhrAbortController) {
7791 router.xhrAbortController.abort();
7792 router.xhrAbortController = false;
7793 }
7794
7795 router.xhrRequest(url, loadModalOptions).then(function (modalContent) {
7796 modalParams.content = modalContent;
7797 onModalLoaded();
7798 }).catch(function () {
7799 router.allowPageChange = true;
7800 });
7801 } else {
7802 onModalLoaded();
7803 }
7804 }
7805
7806 var foundLoadProp;
7807 'url content component el componentUrl template'.split(' ').forEach(function (modalLoadProp) {
7808 if (modalParams[modalLoadProp] && !foundLoadProp) {
7809 var _loadModal;
7810
7811 foundLoadProp = true;
7812 loadModal((_loadModal = {}, _loadModal[modalLoadProp] = modalParams[modalLoadProp], _loadModal), options);
7813 }
7814 });
7815
7816 if (!foundLoadProp && modalType === 'actions') {
7817 onModalLoaded();
7818 } // Async
7819
7820
7821 function asyncResolve(resolveParams, resolveOptions) {
7822 loadModal(resolveParams, extend$1(options, resolveOptions));
7823 }
7824
7825 function asyncReject() {
7826 router.allowPageChange = true;
7827 }
7828
7829 if (modalParams.async) {
7830 modalParams.async.call(router, {
7831 router: router,
7832 to: options.route,
7833 from: router.currentRoute,
7834 resolve: asyncResolve,
7835 reject: asyncReject,
7836 direction: direction,
7837 app: app
7838 });
7839 }
7840
7841 if (modalParams.asyncComponent) {
7842 asyncComponent(router, modalParams.asyncComponent, asyncResolve, asyncReject);
7843 }
7844
7845 return router;
7846 }
7847
7848 function modalRemove(modal) {
7849 extend$1(modal, {
7850 closeByRouter: true
7851 });
7852 modal.close();
7853 }
7854
7855 function backward(router, el, backwardOptions) {
7856 var device = getDevice();
7857 var document = getDocument();
7858 var $el = $$1(el);
7859 var app = router.app;
7860 var view = router.view;
7861 var options = extend$1({
7862 animate: router.params.animate,
7863 browserHistory: true,
7864 replaceState: false
7865 }, backwardOptions);
7866 var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
7867 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));
7868 var masterPageEl;
7869 var masterPageRemoved;
7870 var dynamicNavbar = router.dynamicNavbar;
7871 var $newPage = $el;
7872 var $oldPage = router.$el.children('.page-current');
7873 var initialPreload = $oldPage.length === 0 && options.preload;
7874 var currentIsMaster = masterDetailEnabled && $oldPage.hasClass('page-master');
7875
7876 if ($newPage.length) {
7877 // Remove theme elements
7878 router.removeThemeElements($newPage);
7879 }
7880
7881 var $navbarsEl;
7882 var $newNavbarEl;
7883 var $oldNavbarEl;
7884
7885 if (dynamicNavbar) {
7886 $newNavbarEl = $newPage.children('.navbar');
7887 $navbarsEl = router.$navbarsEl;
7888
7889 if ($newNavbarEl.length === 0 && $newPage[0] && $newPage[0].f7Page) {
7890 // Try from pageData
7891 $newNavbarEl = $newPage[0].f7Page.$navbarEl;
7892 }
7893
7894 $oldNavbarEl = $navbarsEl.find('.navbar-current');
7895 }
7896
7897 router.allowPageChange = false;
7898
7899 if ($newPage.length === 0 || $oldPage.length === 0 && !options.preload) {
7900 router.allowPageChange = true;
7901 return router;
7902 } // Remove theme elements
7903
7904
7905 router.removeThemeElements($newPage); // Save Keep Alive Cache
7906
7907 if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
7908 options.route.route.keepAliveData = {
7909 pageEl: $el[0]
7910 };
7911 } // Pages In View
7912
7913
7914 var isDetail;
7915 var isDetailRoot;
7916
7917 if (masterDetailEnabled) {
7918 var $pagesInView = router.$el.children('.page:not(.stacked)').filter(function (pageInView) {
7919 return pageInView !== $newPage[0];
7920 }); // Find Detail' master page
7921
7922 for (var i = 0; i < $pagesInView.length; i += 1) {
7923 if (!masterPageEl && $pagesInView[i].classList.contains('page-master')) {
7924 masterPageEl = $pagesInView[i];
7925 continue; // eslint-disable-line
7926 }
7927 }
7928
7929 isDetail = !isMaster && masterPageEl && router.history.indexOf(options.route.url) > router.history.indexOf(masterPageEl.f7Page.route.url);
7930
7931 if (!isDetail && !isMaster && masterPageEl && masterPageEl.f7Page && options.route.route.masterRoute) {
7932 isDetail = options.route.route.masterRoute.path === masterPageEl.f7Page.route.route.path;
7933 }
7934 }
7935
7936 if (isDetail && masterPageEl && masterPageEl.f7Page) {
7937 isDetailRoot = router.history.indexOf(options.route.url) - router.history.indexOf(masterPageEl.f7Page.route.url) === 1;
7938 } // New Page
7939
7940
7941 $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', {
7942 position: initialPreload ? 'current' : 'previous'
7943 });
7944 router.emit('pageUnstack', $newPage[0]);
7945 router.emit('pagePosition', $newPage[0], initialPreload ? 'current' : 'previous');
7946
7947 if (isMaster || isDetail) {
7948 $newPage.trigger('page:role', {
7949 role: isMaster ? 'master' : 'detail',
7950 root: !!isDetailRoot
7951 });
7952 router.emit('pageRole', $newPage[0], {
7953 role: isMaster ? 'master' : 'detail',
7954 detailRoot: !!isDetailRoot
7955 });
7956 }
7957
7958 if (dynamicNavbar && $newNavbarEl.length > 0) {
7959 $newNavbarEl.addClass("navbar-" + (initialPreload ? 'current' : 'previous') + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '') + (isDetailRoot ? ' navbar-master-detail-root' : '')).removeClass('stacked').removeAttr('aria-hidden');
7960 $newNavbarEl.trigger('navbar:position', {
7961 position: initialPreload ? 'current' : 'previous'
7962 });
7963 router.emit('navbarPosition', $newNavbarEl[0], initialPreload ? 'current' : 'previous');
7964
7965 if (isMaster || isDetailRoot) {
7966 router.emit('navbarRole', $newNavbarEl[0], {
7967 role: isMaster ? 'master' : 'detail',
7968 detailRoot: !!isDetailRoot
7969 });
7970 }
7971 } // Remove previous page in case of "forced"
7972
7973
7974 var backIndex;
7975
7976 if (options.force) {
7977 if ($oldPage.prev('.page-previous:not(.stacked)').length > 0 || $oldPage.prev('.page-previous').length === 0) {
7978 if (router.history.indexOf(options.route.url) >= 0) {
7979 backIndex = router.history.length - router.history.indexOf(options.route.url) - 1;
7980 router.history = router.history.slice(0, router.history.indexOf(options.route.url) + 2);
7981 view.history = router.history;
7982 } else if (router.history[[router.history.length - 2]]) {
7983 router.history[router.history.length - 2] = options.route.url;
7984 } else {
7985 router.history.unshift(router.url);
7986 }
7987
7988 if (backIndex && router.params.stackPages) {
7989 $oldPage.prevAll('.page-previous').each(function (pageToRemove) {
7990 var $pageToRemove = $$1(pageToRemove);
7991 var $navbarToRemove;
7992
7993 if (dynamicNavbar) {
7994 // $navbarToRemove = $oldNavbarEl.prevAll('.navbar-previous').eq(index);
7995 $navbarToRemove = $$1(app.navbar.getElByPage($pageToRemove));
7996 }
7997
7998 if ($pageToRemove[0] !== $newPage[0] && $pageToRemove.index() > $newPage.index()) {
7999 if (router.initialPages.indexOf($pageToRemove[0]) >= 0) {
8000 $pageToRemove.addClass('stacked');
8001 $pageToRemove.trigger('page:stack');
8002 router.emit('pageStack', $pageToRemove[0]);
8003
8004 if (dynamicNavbar) {
8005 $navbarToRemove.addClass('stacked');
8006 }
8007 } else {
8008 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
8009
8010 if ($pageToRemove[0] === masterPageEl) {
8011 masterPageRemoved = true;
8012 }
8013
8014 router.removePage($pageToRemove);
8015
8016 if (dynamicNavbar && $navbarToRemove.length > 0) {
8017 router.removeNavbar($navbarToRemove);
8018 }
8019 }
8020 }
8021 });
8022 } else {
8023 var $pageToRemove = $oldPage.prev('.page-previous:not(.stacked)');
8024 var $navbarToRemove;
8025
8026 if (dynamicNavbar) {
8027 // $navbarToRemove = $oldNavbarEl.prev('.navbar-inner:not(.stacked)');
8028 $navbarToRemove = $$1(app.navbar.getElByPage($pageToRemove));
8029 }
8030
8031 if (router.params.stackPages && router.initialPages.indexOf($pageToRemove[0]) >= 0) {
8032 $pageToRemove.addClass('stacked');
8033 $pageToRemove.trigger('page:stack');
8034 router.emit('pageStack', $pageToRemove[0]);
8035 $navbarToRemove.addClass('stacked');
8036 } else if ($pageToRemove.length > 0) {
8037 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
8038
8039 if ($pageToRemove[0] === masterPageEl) {
8040 masterPageRemoved = true;
8041 }
8042
8043 router.removePage($pageToRemove);
8044
8045 if (dynamicNavbar && $navbarToRemove.length) {
8046 router.removeNavbar($navbarToRemove);
8047 }
8048 }
8049 }
8050 }
8051 } // Insert new page
8052
8053
8054 var newPageInDom = $newPage.parents(document).length > 0;
8055 var f7Component = $newPage[0].f7Component;
8056
8057 function insertPage() {
8058 if (initialPreload) {
8059 if (!newPageInDom && f7Component) {
8060 f7Component.mount(function (componentEl) {
8061 router.$el.append(componentEl);
8062 });
8063 } else {
8064 router.$el.append($newPage);
8065 }
8066 }
8067
8068 if ($newPage.next($oldPage).length === 0) {
8069 if (!newPageInDom && f7Component) {
8070 f7Component.mount(function (componentEl) {
8071 $$1(componentEl).insertBefore($oldPage);
8072 });
8073 } else {
8074 $newPage.insertBefore($oldPage);
8075 }
8076 }
8077
8078 if (dynamicNavbar && $newNavbarEl.length) {
8079 if ($newNavbarEl.find('.title-large').length) {
8080 $newNavbarEl.addClass('navbar-large');
8081 }
8082
8083 $newNavbarEl.insertBefore($oldNavbarEl);
8084
8085 if ($oldNavbarEl.length > 0) {
8086 $newNavbarEl.insertBefore($oldNavbarEl);
8087 } else {
8088 if (!router.$navbarsEl.parents(document).length) {
8089 router.$el.prepend(router.$navbarsEl);
8090 }
8091
8092 $navbarsEl.append($newNavbarEl);
8093 }
8094 }
8095
8096 if (!newPageInDom) {
8097 router.pageCallback('mounted', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
8098 } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
8099 $newPage[0].f7PageMounted = true;
8100 router.pageCallback('mounted', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
8101 }
8102 }
8103
8104 if (options.preload) {
8105 // Insert Page
8106 insertPage(); // Tab route
8107
8108 if (options.route.route.tab) {
8109 router.tabLoad(options.route.route.tab, extend$1({}, options, {
8110 history: false,
8111 browserHistory: false,
8112 preload: true
8113 }));
8114 }
8115
8116 if (isMaster) {
8117 $newPage.removeClass('page-master-stacked').trigger('page:masterunstack');
8118 router.emit('pageMasterUnstack', $newPage[0]);
8119
8120 if (dynamicNavbar) {
8121 $$1(app.navbar.getElByPage($newPage)).removeClass('navbar-master-stacked');
8122 router.emit('navbarMasterUnstack', app.navbar.getElByPage($newPage));
8123 }
8124 } // Page init and before init events
8125
8126
8127 router.pageCallback('init', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
8128
8129 if (initialPreload) {
8130 router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'current', undefined, options);
8131 router.pageCallback('afterIn', $newPage, $newNavbarEl, 'current', undefined, options);
8132 }
8133
8134 var $previousPages = $newPage.prevAll('.page-previous:not(.stacked):not(.page-master)');
8135
8136 if ($previousPages.length > 0) {
8137 $previousPages.each(function (pageToRemove) {
8138 var $pageToRemove = $$1(pageToRemove);
8139 var $navbarToRemove;
8140
8141 if (dynamicNavbar) {
8142 // $navbarToRemove = $newNavbarEl.prevAll('.navbar-previous:not(.stacked)').eq(index);
8143 $navbarToRemove = $$1(app.navbar.getElByPage($pageToRemove));
8144 }
8145
8146 if (router.params.stackPages && router.initialPages.indexOf(pageToRemove) >= 0) {
8147 $pageToRemove.addClass('stacked');
8148 $pageToRemove.trigger('page:stack');
8149 router.emit('pageStack', $pageToRemove[0]);
8150
8151 if (dynamicNavbar) {
8152 $navbarToRemove.addClass('stacked');
8153 }
8154 } else {
8155 router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined);
8156 router.removePage($pageToRemove);
8157
8158 if (dynamicNavbar && $navbarToRemove.length) {
8159 router.removeNavbar($navbarToRemove);
8160 }
8161 }
8162 });
8163 }
8164
8165 router.allowPageChange = true;
8166 return router;
8167 } // History State
8168
8169
8170 if (!(device.ie || device.edge || device.firefox && !device.ios)) {
8171 if (router.params.browserHistory && options.browserHistory) {
8172 if (options.replaceState) {
8173 var browserHistoryRoot = router.params.browserHistoryRoot || '';
8174 History.replace(view.id, {
8175 url: options.route.url
8176 }, browserHistoryRoot + router.params.browserHistorySeparator + options.route.url);
8177 } else if (backIndex) {
8178 History.go(-backIndex);
8179 } else {
8180 History.back();
8181 }
8182 }
8183 } // Update History
8184
8185
8186 if (options.replaceState) {
8187 router.history[router.history.length - 1] = options.route.url;
8188 } else {
8189 if (router.history.length === 1) {
8190 router.history.unshift(router.url);
8191 }
8192
8193 router.history.pop();
8194 }
8195
8196 router.saveHistory(); // Current Page & Navbar
8197
8198 router.currentPageEl = $newPage[0];
8199
8200 if (dynamicNavbar && $newNavbarEl.length) {
8201 router.currentNavbarEl = $newNavbarEl[0];
8202 } else {
8203 delete router.currentNavbarEl;
8204 } // Current Route
8205
8206
8207 router.currentRoute = options.route; // History State
8208
8209 if (device.ie || device.edge || device.firefox && !device.ios) {
8210 if (router.params.browserHistory && options.browserHistory) {
8211 if (options.replaceState) {
8212 var _browserHistoryRoot = router.params.browserHistoryRoot || '';
8213
8214 History.replace(view.id, {
8215 url: options.route.url
8216 }, _browserHistoryRoot + router.params.browserHistorySeparator + options.route.url);
8217 } else if (backIndex) {
8218 History.go(-backIndex);
8219 } else {
8220 History.back();
8221 }
8222 }
8223 } // Insert Page
8224
8225
8226 insertPage(); // Load Tab
8227
8228 if (options.route.route.tab) {
8229 router.tabLoad(options.route.route.tab, extend$1({}, options, {
8230 history: false,
8231 browserHistory: false
8232 }));
8233 } // Check master detail
8234
8235
8236 if (masterDetailEnabled && (currentIsMaster || masterPageRemoved)) {
8237 view.checkMasterDetailBreakpoint(false);
8238 } // Page init and before init events
8239
8240
8241 router.pageCallback('init', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage); // Before animation callback
8242
8243 router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', 'next', options);
8244 router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'previous', 'current', options); // Animation
8245
8246 function afterAnimation() {
8247 // Set classes
8248 router.setPagePosition($newPage, 'current', false);
8249 router.setPagePosition($oldPage, 'next', true);
8250
8251 if (dynamicNavbar) {
8252 router.setNavbarPosition($newNavbarEl, 'current', false);
8253 router.setNavbarPosition($oldNavbarEl, 'next', true);
8254 } // After animation event
8255
8256
8257 router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', 'next', options);
8258 router.pageCallback('afterIn', $newPage, $newNavbarEl, 'previous', 'current', options); // Remove Old Page
8259
8260 if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
8261 $oldPage.addClass('stacked');
8262 $oldPage.trigger('page:stack');
8263 router.emit('pageStack', $oldPage[0]);
8264
8265 if (dynamicNavbar) {
8266 $oldNavbarEl.addClass('stacked');
8267 }
8268 } else {
8269 router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'next', undefined, options);
8270 router.removePage($oldPage);
8271
8272 if (dynamicNavbar && $oldNavbarEl.length) {
8273 router.removeNavbar($oldNavbarEl);
8274 }
8275 }
8276
8277 router.allowPageChange = true;
8278 router.emit('routeChanged', router.currentRoute, router.previousRoute, router); // Preload previous page
8279
8280 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
8281
8282 if (preloadPreviousPage && router.history[router.history.length - 2] && !isMaster) {
8283 router.back(router.history[router.history.length - 2], {
8284 preload: true
8285 });
8286 }
8287
8288 if (router.params.browserHistory) {
8289 History.clearRouterQueue();
8290 }
8291 }
8292
8293 function setPositionClasses() {
8294 router.setPagePosition($oldPage, 'current');
8295 router.setPagePosition($newPage, 'previous', false);
8296
8297 if (dynamicNavbar) {
8298 router.setNavbarPosition($oldNavbarEl, 'current');
8299 router.setNavbarPosition($newNavbarEl, 'previous', false);
8300 }
8301 }
8302
8303 if (options.animate && !(currentIsMaster && app.width >= router.params.masterDetailBreakpoint)) {
8304 var transition = router.params.transition;
8305
8306 if ($oldPage[0] && $oldPage[0].f7PageTransition) {
8307 transition = $oldPage[0].f7PageTransition;
8308 delete $oldPage[0].f7PageTransition;
8309 }
8310
8311 if (options.transition) transition = options.transition;
8312
8313 if (!transition && router.previousRoute && router.previousRoute.route) {
8314 transition = router.previousRoute.route.transition;
8315 }
8316
8317 if (!transition && router.previousRoute && router.previousRoute.route && router.previousRoute.route.options) {
8318 transition = router.previousRoute.route.options.transition;
8319 }
8320
8321 setPositionClasses();
8322 router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'backward', transition, function () {
8323 afterAnimation();
8324 });
8325 } else {
8326 afterAnimation();
8327 }
8328
8329 return router;
8330 }
8331
8332 function loadBack(router, backParams, backOptions, ignorePageChange) {
8333 if (!router.allowPageChange && !ignorePageChange) return router;
8334 var params = backParams;
8335 var options = backOptions;
8336 var url = params.url,
8337 content = params.content,
8338 el = params.el,
8339 pageName = params.pageName,
8340 component = params.component,
8341 componentUrl = params.componentUrl;
8342
8343 if (options.route.url && router.url === options.route.url && !(options.reloadCurrent || options.reloadPrevious) && !router.params.allowDuplicateUrls) {
8344 return false;
8345 }
8346
8347 if (!options.route && url) {
8348 options.route = router.parseRouteUrl(url);
8349 } // Component Callbacks
8350
8351
8352 function resolve(pageEl, newOptions) {
8353 return backward(router, pageEl, extend$1(options, newOptions));
8354 }
8355
8356 function reject() {
8357 router.allowPageChange = true;
8358 return router;
8359 }
8360
8361 if (url || componentUrl || component) {
8362 router.allowPageChange = false;
8363 } // Proceed
8364
8365
8366 if (content) {
8367 backward(router, router.getPageEl(content), options);
8368 } else if (el) {
8369 // Load page from specified HTMLElement or by page name in pages container
8370 backward(router, router.getPageEl(el), options);
8371 } else if (pageName) {
8372 // Load page by page name in pages container
8373 backward(router, router.$el.children(".page[data-name=\"" + pageName + "\"]").eq(0), options);
8374 } else if (component || componentUrl) {
8375 // Load from component (F7/Vue/React/...)
8376 try {
8377 router.pageComponentLoader({
8378 routerEl: router.el,
8379 component: component,
8380 componentUrl: componentUrl,
8381 options: options,
8382 resolve: resolve,
8383 reject: reject
8384 });
8385 } catch (err) {
8386 router.allowPageChange = true;
8387 throw err;
8388 }
8389 } else if (url) {
8390 // Load using XHR
8391 if (router.xhrAbortController) {
8392 router.xhrAbortController.abort();
8393 router.xhrAbortController = false;
8394 }
8395
8396 router.xhrRequest(url, options).then(function (pageContent) {
8397 backward(router, router.getPageEl(pageContent), options);
8398 }).catch(function () {
8399 router.allowPageChange = true;
8400 });
8401 }
8402
8403 return router;
8404 }
8405
8406 function back() {
8407 var router = this;
8408 var device = getDevice();
8409 if (router.swipeBackActive) return router;
8410 var navigateUrl;
8411 var navigateOptions;
8412 var route;
8413
8414 if (typeof (arguments.length <= 0 ? undefined : arguments[0]) === 'object') {
8415 navigateOptions = (arguments.length <= 0 ? undefined : arguments[0]) || {};
8416 } else {
8417 navigateUrl = arguments.length <= 0 ? undefined : arguments[0];
8418 navigateOptions = (arguments.length <= 1 ? undefined : arguments[1]) || {};
8419 }
8420
8421 var _navigateOptions = navigateOptions,
8422 name = _navigateOptions.name,
8423 params = _navigateOptions.params,
8424 query = _navigateOptions.query;
8425
8426 if (name) {
8427 navigateUrl = router.generateUrl({
8428 name: name,
8429 params: params,
8430 query: query
8431 });
8432
8433 if (navigateUrl) {
8434 return router.back(navigateUrl, extend$1({}, navigateOptions, {
8435 name: null,
8436 params: null,
8437 query: null
8438 }));
8439 }
8440
8441 return router;
8442 }
8443
8444 var app = router.app;
8445 appRouterCheck(router, 'back');
8446 var currentRouteIsModal = router.currentRoute.modal;
8447 var modalType;
8448
8449 if (!currentRouteIsModal) {
8450 'popup popover sheet loginScreen actions customModal panel'.split(' ').forEach(function (modalLoadProp) {
8451 if (router.currentRoute.route[modalLoadProp]) {
8452 currentRouteIsModal = true;
8453 modalType = modalLoadProp;
8454 }
8455 });
8456 }
8457
8458 if (currentRouteIsModal && !navigateOptions.preload) {
8459 var modalToClose = router.currentRoute.modal || router.currentRoute.route.modalInstance || app[modalType].get();
8460 var previousUrl = router.history[router.history.length - 2];
8461 var previousRoute; // check if previous route is modal too
8462
8463 if (modalToClose && modalToClose.$el) {
8464 var prevOpenedModals = modalToClose.$el.prevAll('.modal-in');
8465
8466 if (prevOpenedModals.length && prevOpenedModals[0].f7Modal) {
8467 var modalEl = prevOpenedModals[0]; // check if current router not inside of the modalEl
8468
8469 if (!router.$el.parents(modalEl).length) {
8470 previousRoute = modalEl.f7Modal.route;
8471 }
8472 }
8473 }
8474
8475 if (!previousRoute) {
8476 previousRoute = router.findMatchingRoute(previousUrl);
8477 }
8478
8479 if (!previousRoute && previousUrl) {
8480 previousRoute = {
8481 url: previousUrl,
8482 path: previousUrl.split('?')[0],
8483 query: parseUrlQuery(previousUrl),
8484 route: {
8485 path: previousUrl.split('?')[0],
8486 url: previousUrl
8487 }
8488 };
8489 }
8490
8491 if (!navigateUrl || navigateUrl.replace(/[# ]/g, '').trim().length === 0) {
8492 if (!previousRoute || !modalToClose) {
8493 return router;
8494 }
8495 }
8496
8497 var forceOtherUrl = navigateOptions.force && previousRoute && navigateUrl;
8498
8499 if (previousRoute && modalToClose) {
8500 var isBrokenBrowserHistory = device.ie || device.edge || device.firefox && !device.ios;
8501 var needHistoryBack = router.params.browserHistory && navigateOptions.browserHistory !== false;
8502 var currentRouteWithoutBrowserHistory = router.currentRoute && router.currentRoute.route && router.currentRoute.route.options && router.currentRoute.route.options.browserHistory === false;
8503
8504 if (needHistoryBack && !isBrokenBrowserHistory && !currentRouteWithoutBrowserHistory) {
8505 History.back();
8506 }
8507
8508 router.currentRoute = previousRoute;
8509 router.history.pop();
8510 router.saveHistory();
8511
8512 if (needHistoryBack && isBrokenBrowserHistory && !currentRouteWithoutBrowserHistory) {
8513 History.back();
8514 }
8515
8516 router.modalRemove(modalToClose);
8517
8518 if (forceOtherUrl) {
8519 router.navigate(navigateUrl, {
8520 reloadCurrent: true
8521 });
8522 }
8523 } else if (modalToClose) {
8524 router.modalRemove(modalToClose);
8525
8526 if (navigateUrl) {
8527 router.navigate(navigateUrl, {
8528 reloadCurrent: true
8529 });
8530 }
8531 }
8532
8533 return router;
8534 }
8535
8536 var $previousPage = router.$el.children('.page-current').prevAll('.page-previous:not(.page-master)').eq(0);
8537 var skipMaster;
8538
8539 if (router.params.masterDetailBreakpoint > 0) {
8540 var classes = [];
8541 router.$el.children('.page').each(function (pageEl) {
8542 classes.push(pageEl.className);
8543 });
8544 var $previousMaster = router.$el.children('.page-current').prevAll('.page-master').eq(0);
8545
8546 if ($previousMaster.length) {
8547 var expectedPreviousPageUrl = router.history[router.history.length - 2];
8548 var expectedPreviousPageRoute = router.findMatchingRoute(expectedPreviousPageUrl);
8549
8550 if (expectedPreviousPageRoute && $previousMaster[0].f7Page && expectedPreviousPageRoute.route === $previousMaster[0].f7Page.route.route) {
8551 $previousPage = $previousMaster;
8552
8553 if (!navigateOptions.preload) {
8554 skipMaster = app.width >= router.params.masterDetailBreakpoint;
8555 }
8556 }
8557 }
8558 }
8559
8560 if (!navigateOptions.force && $previousPage.length && !skipMaster) {
8561 if (router.params.browserHistory && $previousPage[0].f7Page && router.history[router.history.length - 2] !== $previousPage[0].f7Page.route.url) {
8562 router.back(router.history[router.history.length - 2], extend$1(navigateOptions, {
8563 force: true
8564 }));
8565 return router;
8566 }
8567
8568 var previousPageRoute = $previousPage[0].f7Page.route;
8569 processRouteQueue.call(router, previousPageRoute, router.currentRoute, function () {
8570 loadBack(router, {
8571 el: $previousPage
8572 }, extend$1(navigateOptions, {
8573 route: previousPageRoute
8574 }));
8575 }, function () {}, 'backward');
8576 return router;
8577 } // Navigate URL
8578
8579
8580 if (navigateUrl === '#') {
8581 navigateUrl = undefined;
8582 }
8583
8584 if (navigateUrl && navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
8585 navigateUrl = ((router.path || '/') + navigateUrl).replace('//', '/');
8586 }
8587
8588 if (!navigateUrl && router.history.length > 1) {
8589 navigateUrl = router.history[router.history.length - 2];
8590 }
8591
8592 if (skipMaster && !navigateOptions.force && router.history[router.history.length - 3]) {
8593 return router.back(router.history[router.history.length - 3], extend$1({}, navigateOptions || {}, {
8594 force: true,
8595 animate: false
8596 }));
8597 }
8598
8599 if (skipMaster && !navigateOptions.force) {
8600 return router;
8601 } // Find route to load
8602
8603
8604 route = router.findMatchingRoute(navigateUrl);
8605
8606 if (!route) {
8607 if (navigateUrl) {
8608 route = {
8609 url: navigateUrl,
8610 path: navigateUrl.split('?')[0],
8611 query: parseUrlQuery(navigateUrl),
8612 route: {
8613 path: navigateUrl.split('?')[0],
8614 url: navigateUrl
8615 }
8616 };
8617 }
8618 }
8619
8620 if (!route) {
8621 return router;
8622 }
8623
8624 if (route.route.redirect) {
8625 return redirect.call(router, 'backward', route, navigateOptions);
8626 }
8627
8628 var options = {};
8629
8630 if (route.route.options) {
8631 extend$1(options, route.route.options, navigateOptions);
8632 } else {
8633 extend$1(options, navigateOptions);
8634 }
8635
8636 options.route = route;
8637 var backForceLoaded;
8638
8639 if (options.force && router.params.stackPages) {
8640 router.$el.children('.page-previous.stacked').each(function (pageEl) {
8641 if (pageEl.f7Page && pageEl.f7Page.route && pageEl.f7Page.route.url === route.url) {
8642 backForceLoaded = true;
8643 loadBack(router, {
8644 el: pageEl
8645 }, options);
8646 }
8647 });
8648
8649 if (backForceLoaded) {
8650 return router;
8651 }
8652 }
8653
8654 function resolve() {
8655 var routerLoaded = false;
8656
8657 if (route.route.keepAlive && route.route.keepAliveData) {
8658 loadBack(router, {
8659 el: route.route.keepAliveData.pageEl
8660 }, options);
8661 routerLoaded = true;
8662 }
8663
8664 'url content component pageName el componentUrl'.split(' ').forEach(function (pageLoadProp) {
8665 if (route.route[pageLoadProp] && !routerLoaded) {
8666 var _loadBack;
8667
8668 routerLoaded = true;
8669 loadBack(router, (_loadBack = {}, _loadBack[pageLoadProp] = route.route[pageLoadProp], _loadBack), options);
8670 }
8671 });
8672 if (routerLoaded) return; // Async
8673
8674 function asyncResolve(resolveParams, resolveOptions) {
8675 router.allowPageChange = false;
8676 loadBack(router, resolveParams, extend$1(options, resolveOptions), true);
8677 }
8678
8679 function asyncReject() {
8680 router.allowPageChange = true;
8681 }
8682
8683 if (route.route.async) {
8684 router.allowPageChange = false;
8685 route.route.async.call(router, {
8686 router: router,
8687 to: route,
8688 from: router.currentRoute,
8689 resolve: asyncResolve,
8690 reject: asyncReject,
8691 direction: 'backward',
8692 app: app
8693 });
8694 }
8695
8696 if (route.route.asyncComponent) {
8697 asyncComponent(router, route.route.asyncComponent, asyncResolve, asyncReject);
8698 }
8699 }
8700
8701 function reject() {
8702 router.allowPageChange = true;
8703 }
8704
8705 if (options.preload) {
8706 resolve();
8707 } else {
8708 processRouteQueue.call(router, route, router.currentRoute, function () {
8709 if (route.route.modules) {
8710 app.loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules]).then(function () {
8711 resolve();
8712 }).catch(function () {
8713 reject();
8714 });
8715 } else {
8716 resolve();
8717 }
8718 }, function () {
8719 reject();
8720 }, 'backward');
8721 } // Return Router
8722
8723
8724 return router;
8725 }
8726
8727 function clearPreviousPages(router) {
8728 appRouterCheck(router, 'clearPreviousPages');
8729 var app = router.app;
8730 var dynamicNavbar = router.dynamicNavbar;
8731 var $pagesToRemove = router.$el.children('.page').filter(function (pageInView) {
8732 if (router.currentRoute && (router.currentRoute.modal || router.currentRoute.panel)) return true;
8733 return pageInView !== router.currentPageEl;
8734 });
8735 $pagesToRemove.each(function (pageEl) {
8736 var $oldPageEl = $$1(pageEl);
8737 var $oldNavbarEl = $$1(app.navbar.getElByPage($oldPageEl));
8738
8739 if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
8740 $oldPageEl.addClass('stacked');
8741
8742 if (dynamicNavbar) {
8743 $oldNavbarEl.addClass('stacked');
8744 }
8745 } else {
8746 // Page remove event
8747 router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarEl, 'previous', undefined, {});
8748 router.removePage($oldPageEl);
8749
8750 if (dynamicNavbar && $oldNavbarEl.length) {
8751 router.removeNavbar($oldNavbarEl);
8752 }
8753 }
8754 });
8755 }
8756
8757 function clearPreviousHistory() {
8758 var router = this;
8759 appRouterCheck(router, 'clearPreviousHistory');
8760 var url = router.history[router.history.length - 1];
8761 clearPreviousPages(router);
8762 router.history = [url];
8763 router.view.history = [url];
8764 router.saveHistory();
8765 }
8766 // eslint-disable-line
8767
8768 var Router = /*#__PURE__*/function (_Framework7Class) {
8769 _inheritsLoose$1(Router, _Framework7Class);
8770
8771 function Router(app, view) {
8772 var _this;
8773
8774 _this = _Framework7Class.call(this, {}, [typeof view === 'undefined' ? app : view]) || this;
8775
8776 var router = _assertThisInitialized$1(_this); // Is App Router
8777
8778
8779 router.isAppRouter = typeof view === 'undefined';
8780
8781 if (router.isAppRouter) {
8782 // App Router
8783 extend$1(false, router, {
8784 app: app,
8785 params: app.params.view,
8786 routes: app.routes || [],
8787 cache: app.cache
8788 });
8789 } else {
8790 // View Router
8791 extend$1(false, router, {
8792 app: app,
8793 view: view,
8794 viewId: view.id,
8795 id: view.params.routerId,
8796 params: view.params,
8797 routes: view.routes,
8798 history: view.history,
8799 scrollHistory: view.scrollHistory,
8800 cache: app.cache,
8801 dynamicNavbar: app.theme === 'ios' && view.params.iosDynamicNavbar,
8802 initialPages: [],
8803 initialNavbars: []
8804 });
8805 } // Install Modules
8806
8807
8808 router.useModules(); // AllowPageChage
8809
8810 router.allowPageChange = true; // Current Route
8811
8812 var currentRoute = {};
8813 var previousRoute = {};
8814 Object.defineProperty(router, 'currentRoute', {
8815 enumerable: true,
8816 configurable: true,
8817 set: function set(newRoute) {
8818 if (newRoute === void 0) {
8819 newRoute = {};
8820 }
8821
8822 previousRoute = extend$1({}, currentRoute);
8823 currentRoute = newRoute;
8824 if (!currentRoute) return;
8825 router.url = currentRoute.url;
8826 router.emit('routeChange', newRoute, previousRoute, router);
8827 },
8828 get: function get() {
8829 return currentRoute;
8830 }
8831 });
8832 Object.defineProperty(router, 'previousRoute', {
8833 enumerable: true,
8834 configurable: true,
8835 get: function get() {
8836 return previousRoute;
8837 },
8838 set: function set(newRoute) {
8839 previousRoute = newRoute;
8840 }
8841 });
8842 return router || _assertThisInitialized$1(_this);
8843 }
8844
8845 var _proto = Router.prototype;
8846
8847 _proto.mount = function mount() {
8848 var router = this;
8849 var view = router.view;
8850 var document = getDocument();
8851 extend$1(false, router, {
8852 tempDom: document.createElement('div'),
8853 $el: view.$el,
8854 el: view.el,
8855 $navbarsEl: view.$navbarsEl,
8856 navbarsEl: view.navbarsEl
8857 });
8858 router.emit('local::mount routerMount', router);
8859 };
8860
8861 _proto.animatableNavElements = function animatableNavElements($newNavbarEl, $oldNavbarEl, toLarge, fromLarge, direction) {
8862 var router = this;
8863 var dynamicNavbar = router.dynamicNavbar;
8864 var animateIcon = router.params.iosAnimateNavbarBackIcon;
8865 var newNavEls;
8866 var oldNavEls;
8867
8868 function animatableNavEl($el, $navbarInner) {
8869 var isSliding = $el.hasClass('sliding') || $navbarInner.hasClass('sliding');
8870 var isSubnavbar = $el.hasClass('subnavbar');
8871 var needsOpacityTransition = isSliding ? !isSubnavbar : true;
8872 var $iconEl = $el.find('.back .icon');
8873 var isIconLabel;
8874
8875 if (isSliding && animateIcon && $el.hasClass('left') && $iconEl.length > 0 && $iconEl.next('span').length) {
8876 $el = $iconEl.next('span'); // eslint-disable-line
8877
8878 isIconLabel = true;
8879 }
8880
8881 return {
8882 $el: $el,
8883 isIconLabel: isIconLabel,
8884 leftOffset: $el[0].f7NavbarLeftOffset,
8885 rightOffset: $el[0].f7NavbarRightOffset,
8886 isSliding: isSliding,
8887 isSubnavbar: isSubnavbar,
8888 needsOpacityTransition: needsOpacityTransition
8889 };
8890 }
8891
8892 if (dynamicNavbar) {
8893 newNavEls = [];
8894 oldNavEls = [];
8895 $newNavbarEl.children('.navbar-inner').children('.left, .right, .title, .subnavbar').each(function (navEl) {
8896 var $navEl = $$1(navEl);
8897 if ($navEl.hasClass('left') && fromLarge && direction === 'forward') return;
8898 if ($navEl.hasClass('title') && toLarge) return;
8899 newNavEls.push(animatableNavEl($navEl, $newNavbarEl.children('.navbar-inner')));
8900 });
8901
8902 if (!($oldNavbarEl.hasClass('navbar-master') && router.params.masterDetailBreakpoint > 0 && router.app.width >= router.params.masterDetailBreakpoint)) {
8903 $oldNavbarEl.children('.navbar-inner').children('.left, .right, .title, .subnavbar').each(function (navEl) {
8904 var $navEl = $$1(navEl);
8905 if ($navEl.hasClass('left') && toLarge && !fromLarge && direction === 'forward') return;
8906 if ($navEl.hasClass('left') && toLarge && direction === 'backward') return;
8907
8908 if ($navEl.hasClass('title') && fromLarge) {
8909 return;
8910 }
8911
8912 oldNavEls.push(animatableNavEl($navEl, $oldNavbarEl.children('.navbar-inner')));
8913 });
8914 }
8915
8916 [oldNavEls, newNavEls].forEach(function (navEls) {
8917 navEls.forEach(function (navEl) {
8918 var n = navEl;
8919 var isSliding = navEl.isSliding,
8920 $el = navEl.$el;
8921 var otherEls = navEls === oldNavEls ? newNavEls : oldNavEls;
8922 if (!(isSliding && $el.hasClass('title') && otherEls)) return;
8923 otherEls.forEach(function (otherNavEl) {
8924 if (otherNavEl.isIconLabel) {
8925 var iconTextEl = otherNavEl.$el[0];
8926 n.leftOffset += iconTextEl ? iconTextEl.offsetLeft || 0 : 0;
8927 }
8928 });
8929 });
8930 });
8931 }
8932
8933 return {
8934 newNavEls: newNavEls,
8935 oldNavEls: oldNavEls
8936 };
8937 };
8938
8939 _proto.animate = function animate($oldPageEl, $newPageEl, $oldNavbarEl, $newNavbarEl, direction, transition, callback) {
8940 var router = this;
8941
8942 if (router.params.animateCustom) {
8943 router.params.animateCustom.apply(router, [$oldPageEl, $newPageEl, $oldNavbarEl, $newNavbarEl, direction, callback]);
8944 return;
8945 }
8946
8947 var dynamicNavbar = router.dynamicNavbar;
8948 var ios = router.app.theme === 'ios';
8949
8950 if (transition) {
8951 var routerCustomTransitionClass = "router-transition-custom router-transition-" + transition + "-" + direction; // Animate
8952
8953 var onCustomTransitionDone = function onCustomTransitionDone() {
8954 router.$el.removeClass(routerCustomTransitionClass);
8955
8956 if (dynamicNavbar && router.$navbarsEl.length) {
8957 if ($newNavbarEl) {
8958 router.$navbarsEl.prepend($newNavbarEl);
8959 }
8960
8961 if ($oldNavbarEl) {
8962 router.$navbarsEl.prepend($oldNavbarEl);
8963 }
8964 }
8965
8966 if (callback) callback();
8967 };
8968
8969 (direction === 'forward' ? $newPageEl : $oldPageEl).animationEnd(onCustomTransitionDone);
8970
8971 if (dynamicNavbar) {
8972 if ($newNavbarEl && $newPageEl) {
8973 router.setNavbarPosition($newNavbarEl, '');
8974 $newNavbarEl.removeClass('navbar-next navbar-previous navbar-current');
8975 $newPageEl.prepend($newNavbarEl);
8976 }
8977
8978 if ($oldNavbarEl && $oldPageEl) {
8979 router.setNavbarPosition($oldNavbarEl, '');
8980 $oldNavbarEl.removeClass('navbar-next navbar-previous navbar-current');
8981 $oldPageEl.prepend($oldNavbarEl);
8982 }
8983 }
8984
8985 router.$el.addClass(routerCustomTransitionClass);
8986 return;
8987 } // Router Animation class
8988
8989
8990 var routerTransitionClass = "router-transition-" + direction + " router-transition";
8991 var newNavEls;
8992 var oldNavEls;
8993 var fromLarge;
8994 var toLarge;
8995 var toDifferent;
8996 var oldIsLarge;
8997 var newIsLarge;
8998
8999 if (ios && dynamicNavbar) {
9000 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'));
9001
9002 if (!betweenMasterAndDetail) {
9003 oldIsLarge = $oldNavbarEl && $oldNavbarEl.hasClass('navbar-large');
9004 newIsLarge = $newNavbarEl && $newNavbarEl.hasClass('navbar-large');
9005 fromLarge = oldIsLarge && !$oldNavbarEl.hasClass('navbar-large-collapsed');
9006 toLarge = newIsLarge && !$newNavbarEl.hasClass('navbar-large-collapsed');
9007 toDifferent = fromLarge && !toLarge || toLarge && !fromLarge;
9008 }
9009
9010 var navEls = router.animatableNavElements($newNavbarEl, $oldNavbarEl, toLarge, fromLarge, direction);
9011 newNavEls = navEls.newNavEls;
9012 oldNavEls = navEls.oldNavEls;
9013 }
9014
9015 function animateNavbars(progress) {
9016 if (!(ios && dynamicNavbar)) return;
9017
9018 if (progress === 1) {
9019 if (toLarge) {
9020 $newNavbarEl.addClass('router-navbar-transition-to-large');
9021 $oldNavbarEl.addClass('router-navbar-transition-to-large');
9022 }
9023
9024 if (fromLarge) {
9025 $newNavbarEl.addClass('router-navbar-transition-from-large');
9026 $oldNavbarEl.addClass('router-navbar-transition-from-large');
9027 }
9028 }
9029
9030 newNavEls.forEach(function (navEl) {
9031 var $el = navEl.$el;
9032 var offset = direction === 'forward' ? navEl.rightOffset : navEl.leftOffset;
9033
9034 if (navEl.isSliding) {
9035 if (navEl.isSubnavbar && newIsLarge) {
9036 // prettier-ignore
9037 $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');
9038 } else {
9039 $el.transform("translate3d(" + offset * (1 - progress) + "px,0,0)");
9040 }
9041 }
9042 });
9043 oldNavEls.forEach(function (navEl) {
9044 var $el = navEl.$el;
9045 var offset = direction === 'forward' ? navEl.leftOffset : navEl.rightOffset;
9046
9047 if (navEl.isSliding) {
9048 if (navEl.isSubnavbar && oldIsLarge) {
9049 $el.transform("translate3d(" + offset * progress + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
9050 } else {
9051 $el.transform("translate3d(" + offset * progress + "px,0,0)");
9052 }
9053 }
9054 });
9055 } // AnimationEnd Callback
9056
9057
9058 function onDone() {
9059 if (router.dynamicNavbar) {
9060 if ($newNavbarEl) {
9061 $newNavbarEl.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
9062 $newNavbarEl.addClass('navbar-no-title-large-transition');
9063 nextFrame(function () {
9064 $newNavbarEl.removeClass('navbar-no-title-large-transition');
9065 });
9066 }
9067
9068 if ($oldNavbarEl) {
9069 $oldNavbarEl.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
9070 }
9071
9072 if ($newNavbarEl.hasClass('sliding') || $newNavbarEl.children('.navbar-inner.sliding').length) {
9073 $newNavbarEl.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
9074 } else {
9075 $newNavbarEl.find('.sliding').transform('');
9076 }
9077
9078 if ($oldNavbarEl.hasClass('sliding') || $oldNavbarEl.children('.navbar-inner.sliding').length) {
9079 $oldNavbarEl.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
9080 } else {
9081 $oldNavbarEl.find('.sliding').transform('');
9082 }
9083 }
9084
9085 router.$el.removeClass(routerTransitionClass);
9086 if (callback) callback();
9087 }
9088
9089 (direction === 'forward' ? $newPageEl : $oldPageEl).animationEnd(function () {
9090 onDone();
9091 }); // Animate
9092
9093 if (dynamicNavbar) {
9094 // Prepare Navbars
9095 animateNavbars(0);
9096 nextFrame(function () {
9097 // Add class, start animation
9098 router.$el.addClass(routerTransitionClass);
9099
9100 if (toDifferent) {
9101 // eslint-disable-next-line
9102 router.el._clientLeft = router.el.clientLeft;
9103 }
9104
9105 animateNavbars(1);
9106 });
9107 } else {
9108 // Add class, start animation
9109 router.$el.addClass(routerTransitionClass);
9110 }
9111 };
9112
9113 _proto.removeModal = function removeModal(modalEl) {
9114 var router = this;
9115 router.removeEl(modalEl);
9116 } // eslint-disable-next-line
9117 ;
9118
9119 _proto.removeTabContent = function removeTabContent(tabEl) {
9120 var $tabEl = $$1(tabEl);
9121 $tabEl.html('');
9122 };
9123
9124 _proto.removeNavbar = function removeNavbar(el) {
9125 var router = this;
9126 router.removeEl(el);
9127 };
9128
9129 _proto.removePage = function removePage(el) {
9130 var $el = $$1(el);
9131 var f7Page = $el && $el[0] && $el[0].f7Page;
9132 var router = this;
9133
9134 if (f7Page && f7Page.route && f7Page.route.route && f7Page.route.route.keepAlive) {
9135 $el.remove();
9136 return;
9137 }
9138
9139 router.removeEl(el);
9140 };
9141
9142 _proto.removeEl = function removeEl(el) {
9143 if (!el) return;
9144 var router = this;
9145 var $el = $$1(el);
9146 if ($el.length === 0) return;
9147 $el.find('.tab').each(function (tabEl) {
9148 $$1(tabEl).children().each(function (tabChild) {
9149 if (tabChild.f7Component) {
9150 $$1(tabChild).trigger('tab:beforeremove');
9151 tabChild.f7Component.destroy();
9152 }
9153 });
9154 });
9155
9156 if ($el[0].f7Component && $el[0].f7Component.destroy) {
9157 $el[0].f7Component.destroy();
9158 }
9159
9160 if (!router.params.removeElements) {
9161 return;
9162 }
9163
9164 if (router.params.removeElementsWithTimeout) {
9165 setTimeout(function () {
9166 $el.remove();
9167 }, router.params.removeElementsTimeout);
9168 } else {
9169 $el.remove();
9170 }
9171 };
9172
9173 _proto.getPageEl = function getPageEl(content) {
9174 var router = this;
9175
9176 if (typeof content === 'string') {
9177 router.tempDom.innerHTML = content;
9178 } else {
9179 if ($$1(content).hasClass('page')) {
9180 return content;
9181 }
9182
9183 router.tempDom.innerHTML = '';
9184 $$1(router.tempDom).append(content);
9185 }
9186
9187 return router.findElement('.page', router.tempDom);
9188 };
9189
9190 _proto.findElement = function findElement(stringSelector, container, notStacked) {
9191 var router = this;
9192 var view = router.view;
9193 var app = router.app; // Modals Selector
9194
9195 var modalsSelector = '.popup, .dialog, .popover, .actions-modal, .sheet-modal, .login-screen, .page';
9196 var $container = $$1(container);
9197 var selector = stringSelector;
9198 if (notStacked) selector += ':not(.stacked)';
9199 var found = $container.find(selector).filter(function (el) {
9200 return $$1(el).parents(modalsSelector).length === 0;
9201 });
9202
9203 if (found.length > 1) {
9204 if (typeof view.selector === 'string') {
9205 // Search in related view
9206 found = $container.find(view.selector + " " + selector);
9207 }
9208
9209 if (found.length > 1) {
9210 // Search in main view
9211 found = $container.find("." + app.params.viewMainClass + " " + selector);
9212 }
9213 }
9214
9215 if (found.length === 1) return found; // Try to find not stacked
9216
9217 if (!notStacked) found = router.findElement(selector, $container, true);
9218 if (found && found.length === 1) return found;
9219 if (found && found.length > 1) return $$1(found[0]);
9220 return undefined;
9221 };
9222
9223 _proto.flattenRoutes = function flattenRoutes(routes) {
9224 if (routes === void 0) {
9225 routes = this.routes;
9226 }
9227
9228 var router = this;
9229 var flattenedRoutes = [];
9230 routes.forEach(function (route) {
9231 var hasTabRoutes = false;
9232
9233 if ('tabs' in route && route.tabs) {
9234 var mergedPathsRoutes = route.tabs.map(function (tabRoute) {
9235 var tRoute = extend$1({}, route, {
9236 path: (route.path + "/" + tabRoute.path).replace('///', '/').replace('//', '/'),
9237 parentPath: route.path,
9238 tab: tabRoute
9239 });
9240 delete tRoute.tabs;
9241 delete tRoute.routes;
9242 return tRoute;
9243 });
9244 hasTabRoutes = true;
9245 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes));
9246 }
9247
9248 if ('detailRoutes' in route) {
9249 var _mergedPathsRoutes = route.detailRoutes.map(function (detailRoute) {
9250 var dRoute = extend$1({}, detailRoute);
9251 dRoute.masterRoute = route;
9252 dRoute.masterRoutePath = route.path;
9253 return dRoute;
9254 });
9255
9256 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(_mergedPathsRoutes));
9257 }
9258
9259 if ('routes' in route) {
9260 var _mergedPathsRoutes2 = route.routes.map(function (childRoute) {
9261 var cRoute = extend$1({}, childRoute);
9262 cRoute.path = (route.path + "/" + cRoute.path).replace('///', '/').replace('//', '/');
9263 return cRoute;
9264 });
9265
9266 if (hasTabRoutes) {
9267 flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(_mergedPathsRoutes2));
9268 } else {
9269 flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(_mergedPathsRoutes2));
9270 }
9271 }
9272
9273 if (!('routes' in route) && !('tabs' in route && route.tabs) && !('detailRoutes' in route)) {
9274 flattenedRoutes.push(route);
9275 }
9276 });
9277 return flattenedRoutes;
9278 } // eslint-disable-next-line
9279 ;
9280
9281 _proto.parseRouteUrl = function parseRouteUrl(url) {
9282 if (!url) return {};
9283 var query = parseUrlQuery(url);
9284 var hash = url.split('#')[1];
9285 var params = {};
9286 var path = url.split('#')[0].split('?')[0];
9287 return {
9288 query: query,
9289 hash: hash,
9290 params: params,
9291 url: url,
9292 path: path
9293 };
9294 };
9295
9296 _proto.generateUrl = function generateUrl(parameters) {
9297 if (parameters === void 0) {
9298 parameters = {};
9299 }
9300
9301 if (typeof parameters === 'string') {
9302 return parameters;
9303 }
9304
9305 var _parameters = parameters,
9306 name = _parameters.name,
9307 path = _parameters.path,
9308 params = _parameters.params,
9309 query = _parameters.query;
9310
9311 if (!name && !path) {
9312 throw new Error('Framework7: "name" or "path" parameter is required');
9313 }
9314
9315 var router = this;
9316 var route = name ? router.findRouteByKey('name', name) : router.findRouteByKey('path', path);
9317
9318 if (!route) {
9319 if (name) {
9320 throw new Error("Framework7: route with name \"" + name + "\" not found");
9321 } else {
9322 throw new Error("Framework7: route with path \"" + path + "\" not found");
9323 }
9324 }
9325
9326 var url = router.constructRouteUrl(route, {
9327 params: params,
9328 query: query
9329 });
9330
9331 if (!url) {
9332 throw new Error("Framework7: can't construct URL for route with name \"" + name + "\"");
9333 }
9334
9335 return url;
9336 } // eslint-disable-next-line
9337 ;
9338
9339 _proto.constructRouteUrl = function constructRouteUrl(route, _temp) {
9340 var _ref = _temp === void 0 ? {} : _temp,
9341 params = _ref.params,
9342 query = _ref.query;
9343
9344 var path = route.path;
9345 var toUrl = compile(path);
9346 var url;
9347
9348 try {
9349 url = toUrl(params || {});
9350 } catch (error) {
9351 throw new Error("Framework7: error constructing route URL from passed params:\nRoute: " + path + "\n" + error.toString());
9352 }
9353
9354 if (query) {
9355 if (typeof query === 'string') url += "?" + query;else url += "?" + serializeObject(query);
9356 }
9357
9358 return url;
9359 };
9360
9361 _proto.findTabRoute = function findTabRoute(tabEl) {
9362 var router = this;
9363 var $tabEl = $$1(tabEl);
9364 var parentPath = router.currentRoute.route.parentPath;
9365 var tabId = $tabEl.attr('id');
9366 var flattenedRoutes = router.flattenRoutes(router.routes);
9367 var foundTabRoute;
9368 flattenedRoutes.forEach(function (route) {
9369 if (route.parentPath === parentPath && route.tab && route.tab.id === tabId) {
9370 foundTabRoute = route;
9371 }
9372 });
9373 return foundTabRoute;
9374 };
9375
9376 _proto.findRouteByKey = function findRouteByKey(key, value) {
9377 var router = this;
9378 var routes = router.routes;
9379 var flattenedRoutes = router.flattenRoutes(routes);
9380 var matchingRoute;
9381 flattenedRoutes.forEach(function (route) {
9382 if (matchingRoute) return;
9383
9384 if (route[key] === value) {
9385 matchingRoute = route;
9386 }
9387 });
9388 return matchingRoute;
9389 };
9390
9391 _proto.findMatchingRoute = function findMatchingRoute(url) {
9392 if (!url) return undefined;
9393 var router = this;
9394 var routes = router.routes;
9395 var flattenedRoutes = router.flattenRoutes(routes);
9396
9397 var _router$parseRouteUrl = router.parseRouteUrl(url),
9398 path = _router$parseRouteUrl.path,
9399 query = _router$parseRouteUrl.query,
9400 hash = _router$parseRouteUrl.hash,
9401 params = _router$parseRouteUrl.params;
9402
9403 var matchingRoute;
9404 flattenedRoutes.forEach(function (route) {
9405 if (matchingRoute) return;
9406 var keys = [];
9407 var pathsToMatch = [route.path];
9408
9409 if (route.alias) {
9410 if (typeof route.alias === 'string') pathsToMatch.push(route.alias);else if (Array.isArray(route.alias)) {
9411 route.alias.forEach(function (aliasPath) {
9412 pathsToMatch.push(aliasPath);
9413 });
9414 }
9415 }
9416
9417 var matched;
9418 pathsToMatch.forEach(function (pathToMatch) {
9419 if (matched) return;
9420 matched = pathToRegexp(pathToMatch, keys).exec(path);
9421 });
9422
9423 if (matched) {
9424 keys.forEach(function (keyObj, index) {
9425 if (typeof keyObj.name === 'number') return;
9426 var paramValue = matched[index + 1];
9427
9428 if (typeof paramValue === 'undefined' || paramValue === null) {
9429 params[keyObj.name] = paramValue;
9430 } else {
9431 params[keyObj.name] = decodeURIComponent(paramValue);
9432 }
9433 });
9434 var parentPath;
9435
9436 if (route.parentPath) {
9437 parentPath = path.split('/').slice(0, route.parentPath.split('/').length - 1).join('/');
9438 }
9439
9440 matchingRoute = {
9441 query: query,
9442 hash: hash,
9443 params: params,
9444 url: url,
9445 path: path,
9446 parentPath: parentPath,
9447 route: route,
9448 name: route.name
9449 };
9450 }
9451 });
9452 return matchingRoute;
9453 } // eslint-disable-next-line
9454 ;
9455
9456 _proto.replaceRequestUrlParams = function replaceRequestUrlParams(url, options) {
9457 if (url === void 0) {
9458 url = '';
9459 }
9460
9461 if (options === void 0) {
9462 options = {};
9463 }
9464
9465 var compiledUrl = url;
9466
9467 if (typeof compiledUrl === 'string' && compiledUrl.indexOf('{{') >= 0 && options && options.route && options.route.params && Object.keys(options.route.params).length) {
9468 Object.keys(options.route.params).forEach(function (paramName) {
9469 var regExp = new RegExp("{{" + paramName + "}}", 'g');
9470 compiledUrl = compiledUrl.replace(regExp, options.route.params[paramName] || '');
9471 });
9472 }
9473
9474 return compiledUrl;
9475 };
9476
9477 _proto.removeFromXhrCache = function removeFromXhrCache(url) {
9478 var router = this;
9479 var xhrCache = router.cache.xhr;
9480 var index = false;
9481
9482 for (var i = 0; i < xhrCache.length; i += 1) {
9483 if (xhrCache[i].url === url) index = i;
9484 }
9485
9486 if (index !== false) xhrCache.splice(index, 1);
9487 };
9488
9489 _proto.xhrRequest = function xhrRequest(requestUrl, options) {
9490 var router = this;
9491 var params = router.params;
9492 var ignoreCache = options.ignoreCache;
9493 var url = requestUrl;
9494 var hasQuery = url.indexOf('?') >= 0;
9495
9496 if (params.passRouteQueryToRequest && options && options.route && options.route.query && Object.keys(options.route.query).length) {
9497 url += "" + (hasQuery ? '&' : '?') + serializeObject(options.route.query);
9498 hasQuery = true;
9499 }
9500
9501 if (params.passRouteParamsToRequest && options && options.route && options.route.params && Object.keys(options.route.params).length) {
9502 url += "" + (hasQuery ? '&' : '?') + serializeObject(options.route.params);
9503 hasQuery = true;
9504 }
9505
9506 if (url.indexOf('{{') >= 0) {
9507 url = router.replaceRequestUrlParams(url, options);
9508 } // should we ignore get params or not
9509
9510
9511 if (params.xhrCacheIgnoreGetParameters && url.indexOf('?') >= 0) {
9512 url = url.split('?')[0];
9513 }
9514
9515 return new Promise(function (resolve, reject) {
9516 if (params.xhrCache && !ignoreCache && url.indexOf('nocache') < 0 && params.xhrCacheIgnore.indexOf(url) < 0) {
9517 for (var i = 0; i < router.cache.xhr.length; i += 1) {
9518 var cachedUrl = router.cache.xhr[i];
9519
9520 if (cachedUrl.url === url) {
9521 // Check expiration
9522 if (now() - cachedUrl.time < params.xhrCacheDuration) {
9523 // Load from cache
9524 resolve(cachedUrl.content);
9525 return;
9526 }
9527 }
9528 }
9529 }
9530
9531 router.xhrAbortController = router.app.request.abortController();
9532 router.app.request({
9533 abortController: router.xhrAbortController,
9534 url: url,
9535 method: 'GET',
9536 beforeSend: function beforeSend(xhr) {
9537 router.emit('routerAjaxStart', xhr, options);
9538 },
9539 complete: function complete(xhr, status) {
9540 router.emit('routerAjaxComplete', xhr);
9541
9542 if (status !== 'error' && status !== 'timeout' && xhr.status >= 200 && xhr.status < 300 || xhr.status === 0) {
9543 if (params.xhrCache && xhr.responseText !== '') {
9544 router.removeFromXhrCache(url);
9545 router.cache.xhr.push({
9546 url: url,
9547 time: now(),
9548 content: xhr.responseText
9549 });
9550 }
9551
9552 router.emit('routerAjaxSuccess', xhr, options);
9553 resolve(xhr.responseText);
9554 } else {
9555 router.emit('routerAjaxError', xhr, options);
9556 reject(xhr);
9557 }
9558 },
9559 error: function error(xhr) {
9560 router.emit('routerAjaxError', xhr, options);
9561 reject(xhr);
9562 }
9563 });
9564 });
9565 };
9566
9567 _proto.setNavbarPosition = function setNavbarPosition($el, position, ariaHidden) {
9568 var router = this;
9569 $el.removeClass('navbar-previous navbar-current navbar-next');
9570
9571 if (position) {
9572 $el.addClass("navbar-" + position);
9573 }
9574
9575 if (ariaHidden === false) {
9576 $el.removeAttr('aria-hidden');
9577 } else if (ariaHidden === true) {
9578 $el.attr('aria-hidden', 'true');
9579 }
9580
9581 $el.trigger('navbar:position', {
9582 position: position
9583 });
9584 router.emit('navbarPosition', $el[0], position);
9585 };
9586
9587 _proto.setPagePosition = function setPagePosition($el, position, ariaHidden) {
9588 var router = this;
9589 $el.removeClass('page-previous page-current page-next');
9590 $el.addClass("page-" + position);
9591
9592 if (ariaHidden === false) {
9593 $el.removeAttr('aria-hidden');
9594 } else if (ariaHidden === true) {
9595 $el.attr('aria-hidden', 'true');
9596 }
9597
9598 $el.trigger('page:position', {
9599 position: position
9600 });
9601 router.emit('pagePosition', $el[0], position);
9602 } // Remove theme elements
9603 ;
9604
9605 _proto.removeThemeElements = function removeThemeElements(el) {
9606 var router = this;
9607 var theme = router.app.theme;
9608 var toRemove;
9609
9610 if (theme === 'ios') {
9611 toRemove = '.md-only, .aurora-only, .if-md, .if-aurora, .if-not-ios, .not-ios';
9612 } else if (theme === 'md') {
9613 toRemove = '.ios-only, .aurora-only, .if-ios, .if-aurora, .if-not-md, .not-md';
9614 } else if (theme === 'aurora') {
9615 toRemove = '.ios-only, .md-only, .if-ios, .if-md, .if-not-aurora, .not-aurora';
9616 }
9617
9618 $$1(el).find(toRemove).remove();
9619 };
9620
9621 _proto.getPageData = function getPageData(pageEl, navbarEl, from, to, route, pageFromEl) {
9622 if (route === void 0) {
9623 route = {};
9624 }
9625
9626 var router = this;
9627 var $pageEl = $$1(pageEl).eq(0);
9628 var $navbarEl = $$1(navbarEl).eq(0);
9629 var currentPage = $pageEl[0].f7Page || {};
9630 var direction;
9631 var pageFrom;
9632 if (from === 'next' && to === 'current' || from === 'current' && to === 'previous') direction = 'forward';
9633 if (from === 'current' && to === 'next' || from === 'previous' && to === 'current') direction = 'backward';
9634
9635 if (currentPage && !currentPage.fromPage) {
9636 var $pageFromEl = $$1(pageFromEl);
9637
9638 if ($pageFromEl.length) {
9639 pageFrom = $pageFromEl[0].f7Page;
9640 }
9641 }
9642
9643 pageFrom = currentPage.pageFrom || pageFrom;
9644
9645 if (pageFrom && pageFrom.pageFrom) {
9646 pageFrom.pageFrom = null;
9647 }
9648
9649 var page = {
9650 app: router.app,
9651 view: router.view,
9652 router: router,
9653 $el: $pageEl,
9654 el: $pageEl[0],
9655 $pageEl: $pageEl,
9656 pageEl: $pageEl[0],
9657 $navbarEl: $navbarEl,
9658 navbarEl: $navbarEl[0],
9659 name: $pageEl.attr('data-name'),
9660 position: from,
9661 from: from,
9662 to: to,
9663 direction: direction,
9664 route: currentPage.route ? currentPage.route : route,
9665 pageFrom: pageFrom
9666 };
9667 $pageEl[0].f7Page = page;
9668 return page;
9669 } // Callbacks
9670 ;
9671
9672 _proto.pageCallback = function pageCallback(callback, pageEl, navbarEl, from, to, options, pageFromEl) {
9673 if (options === void 0) {
9674 options = {};
9675 }
9676
9677 if (!pageEl) return;
9678 var router = this;
9679 var $pageEl = $$1(pageEl);
9680 if (!$pageEl.length) return;
9681 var $navbarEl = $$1(navbarEl);
9682 var _options = options,
9683 route = _options.route;
9684 var restoreScrollTopOnBack = router.params.restoreScrollTopOnBack && !(router.params.masterDetailBreakpoint > 0 && $pageEl.hasClass('page-master') && router.app.width >= router.params.masterDetailBreakpoint);
9685 var keepAlive = $pageEl[0].f7Page && $pageEl[0].f7Page.route && $pageEl[0].f7Page.route.route && $pageEl[0].f7Page.route.route.keepAlive;
9686
9687 if (callback === 'beforeRemove' && keepAlive) {
9688 callback = 'beforeUnmount'; // eslint-disable-line
9689 }
9690
9691 var camelName = "page" + (callback[0].toUpperCase() + callback.slice(1, callback.length));
9692 var colonName = "page:" + callback.toLowerCase();
9693 var page = {};
9694
9695 if (callback === 'beforeRemove' && $pageEl[0].f7Page) {
9696 page = extend$1($pageEl[0].f7Page, {
9697 from: from,
9698 to: to,
9699 position: from
9700 });
9701 } else {
9702 page = router.getPageData($pageEl[0], $navbarEl[0], from, to, route, pageFromEl);
9703 }
9704
9705 page.swipeBack = !!options.swipeBack;
9706
9707 var _ref2 = options.route ? options.route.route : {},
9708 _ref2$on = _ref2.on,
9709 on = _ref2$on === void 0 ? {} : _ref2$on,
9710 _ref2$once = _ref2.once,
9711 once = _ref2$once === void 0 ? {} : _ref2$once;
9712
9713 if (options.on) {
9714 extend$1(on, options.on);
9715 }
9716
9717 if (options.once) {
9718 extend$1(once, options.once);
9719 }
9720
9721 function attachEvents() {
9722 if ($pageEl[0].f7RouteEventsAttached) return;
9723 $pageEl[0].f7RouteEventsAttached = true;
9724
9725 if (on && Object.keys(on).length > 0) {
9726 $pageEl[0].f7RouteEventsOn = on;
9727 Object.keys(on).forEach(function (eventName) {
9728 on[eventName] = on[eventName].bind(router);
9729 $pageEl.on(eventNameToColonCase(eventName), on[eventName]);
9730 });
9731 }
9732
9733 if (once && Object.keys(once).length > 0) {
9734 $pageEl[0].f7RouteEventsOnce = once;
9735 Object.keys(once).forEach(function (eventName) {
9736 once[eventName] = once[eventName].bind(router);
9737 $pageEl.once(eventNameToColonCase(eventName), once[eventName]);
9738 });
9739 }
9740 }
9741
9742 function detachEvents() {
9743 if (!$pageEl[0].f7RouteEventsAttached) return;
9744
9745 if ($pageEl[0].f7RouteEventsOn) {
9746 Object.keys($pageEl[0].f7RouteEventsOn).forEach(function (eventName) {
9747 $pageEl.off(eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOn[eventName]);
9748 });
9749 }
9750
9751 if ($pageEl[0].f7RouteEventsOnce) {
9752 Object.keys($pageEl[0].f7RouteEventsOnce).forEach(function (eventName) {
9753 $pageEl.off(eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOnce[eventName]);
9754 });
9755 }
9756
9757 $pageEl[0].f7RouteEventsAttached = null;
9758 $pageEl[0].f7RouteEventsOn = null;
9759 $pageEl[0].f7RouteEventsOnce = null;
9760 delete $pageEl[0].f7RouteEventsAttached;
9761 delete $pageEl[0].f7RouteEventsOn;
9762 delete $pageEl[0].f7RouteEventsOnce;
9763 }
9764
9765 if (callback === 'mounted') {
9766 attachEvents();
9767 }
9768
9769 if (callback === 'init') {
9770 if (restoreScrollTopOnBack && (from === 'previous' || !from) && to === 'current' && router.scrollHistory[page.route.url] && !$pageEl.hasClass('no-restore-scroll')) {
9771 var $pageContent = $pageEl.find('.page-content');
9772
9773 if ($pageContent.length > 0) {
9774 // eslint-disable-next-line
9775 $pageContent = $pageContent.filter(function (pageContentEl) {
9776 return $$1(pageContentEl).parents('.tab:not(.tab-active)').length === 0 && !$$1(pageContentEl).is('.tab:not(.tab-active)');
9777 });
9778 }
9779
9780 $pageContent.scrollTop(router.scrollHistory[page.route.url]);
9781 }
9782
9783 attachEvents();
9784
9785 if ($pageEl[0].f7PageInitialized) {
9786 $pageEl.trigger('page:reinit', page);
9787 router.emit('pageReinit', page);
9788 return;
9789 }
9790
9791 $pageEl[0].f7PageInitialized = true;
9792 }
9793
9794 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'previous') {
9795 // Save scroll position
9796 var _$pageContent = $pageEl.find('.page-content');
9797
9798 if (_$pageContent.length > 0) {
9799 // eslint-disable-next-line
9800 _$pageContent = _$pageContent.filter(function (pageContentEl) {
9801 return $$1(pageContentEl).parents('.tab:not(.tab-active)').length === 0 && !$$1(pageContentEl).is('.tab:not(.tab-active)');
9802 });
9803 }
9804
9805 router.scrollHistory[page.route.url] = _$pageContent.scrollTop();
9806 }
9807
9808 if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'next') {
9809 // Delete scroll position
9810 delete router.scrollHistory[page.route.url];
9811 }
9812
9813 $pageEl.trigger(colonName, page);
9814 router.emit(camelName, page);
9815
9816 if (callback === 'beforeRemove' || callback === 'beforeUnmount') {
9817 detachEvents();
9818
9819 if (!keepAlive) {
9820 if ($pageEl[0].f7Page && $pageEl[0].f7Page.navbarEl) {
9821 delete $pageEl[0].f7Page.navbarEl.f7Page;
9822 }
9823
9824 $pageEl[0].f7Page = null;
9825 }
9826 }
9827 };
9828
9829 _proto.saveHistory = function saveHistory() {
9830 var router = this;
9831 var window = getWindow();
9832 router.view.history = router.history;
9833
9834 if (router.params.browserHistory && router.params.browserHistoryStoreHistory && window.localStorage) {
9835 window.localStorage["f7router-" + router.view.id + "-history"] = JSON.stringify(router.history);
9836 }
9837 };
9838
9839 _proto.restoreHistory = function restoreHistory() {
9840 var router = this;
9841 var window = getWindow();
9842
9843 if (router.params.browserHistory && router.params.browserHistoryStoreHistory && window.localStorage && window.localStorage["f7router-" + router.view.id + "-history"]) {
9844 router.history = JSON.parse(window.localStorage["f7router-" + router.view.id + "-history"]);
9845 router.view.history = router.history;
9846 }
9847 };
9848
9849 _proto.clearHistory = function clearHistory() {
9850 var router = this;
9851 router.history = [];
9852 if (router.view) router.view.history = [];
9853 router.saveHistory();
9854 };
9855
9856 _proto.updateCurrentUrl = function updateCurrentUrl(newUrl) {
9857 var router = this;
9858 appRouterCheck(router, 'updateCurrentUrl'); // Update history
9859
9860 if (router.history.length) {
9861 router.history[router.history.length - 1] = newUrl;
9862 } else {
9863 router.history.push(newUrl);
9864 } // Update current route params
9865
9866
9867 var _router$parseRouteUrl2 = router.parseRouteUrl(newUrl),
9868 query = _router$parseRouteUrl2.query,
9869 hash = _router$parseRouteUrl2.hash,
9870 params = _router$parseRouteUrl2.params,
9871 url = _router$parseRouteUrl2.url,
9872 path = _router$parseRouteUrl2.path;
9873
9874 if (router.currentRoute) {
9875 extend$1(router.currentRoute, {
9876 query: query,
9877 hash: hash,
9878 params: params,
9879 url: url,
9880 path: path
9881 });
9882 }
9883
9884 if (router.params.browserHistory) {
9885 var browserHistoryRoot = router.params.browserHistoryRoot || '';
9886 History.replace(router.view.id, {
9887 url: newUrl
9888 }, browserHistoryRoot + router.params.browserHistorySeparator + newUrl);
9889 } // Save History
9890
9891
9892 router.saveHistory();
9893 router.emit('routeUrlUpdate', router.currentRoute, router);
9894 };
9895
9896 _proto.getInitialUrl = function getInitialUrl() {
9897 var router = this;
9898
9899 if (router.initialUrl) {
9900 return {
9901 initialUrl: router.initialUrl,
9902 historyRestored: router.historyRestored
9903 };
9904 }
9905
9906 var app = router.app,
9907 view = router.view;
9908 var document = getDocument();
9909 var window = getWindow();
9910 var location = app.params.url && typeof app.params.url === 'string' && typeof URL !== 'undefined' ? new URL(app.params.url) : document.location;
9911 var initialUrl = router.params.url;
9912 var documentUrl = location.href.split(location.origin)[1];
9913 var historyRestored;
9914 var _router$params = router.params,
9915 browserHistory = _router$params.browserHistory,
9916 browserHistoryOnLoad = _router$params.browserHistoryOnLoad,
9917 browserHistorySeparator = _router$params.browserHistorySeparator;
9918 var browserHistoryRoot = router.params.browserHistoryRoot;
9919
9920 if ((window.cordova || window.Capacitor && window.Capacitor.isNative) && browserHistory && !browserHistorySeparator && !browserHistoryRoot && location.pathname.indexOf('index.html')) {
9921 // eslint-disable-next-line
9922 console.warn('Framework7: wrong or not complete browserHistory configuration, trying to guess browserHistoryRoot');
9923 browserHistoryRoot = location.pathname.split('index.html')[0];
9924 }
9925
9926 if (!browserHistory || !browserHistoryOnLoad) {
9927 if (!initialUrl) {
9928 initialUrl = documentUrl;
9929 }
9930
9931 if (location.search && initialUrl.indexOf('?') < 0) {
9932 initialUrl += location.search;
9933 }
9934
9935 if (location.hash && initialUrl.indexOf('#') < 0) {
9936 initialUrl += location.hash;
9937 }
9938 } else {
9939 if (browserHistoryRoot && documentUrl.indexOf(browserHistoryRoot) >= 0) {
9940 documentUrl = documentUrl.split(browserHistoryRoot)[1];
9941 if (documentUrl === '') documentUrl = '/';
9942 }
9943
9944 if (browserHistorySeparator.length > 0 && documentUrl.indexOf(browserHistorySeparator) >= 0) {
9945 initialUrl = documentUrl.split(browserHistorySeparator)[1];
9946 } else {
9947 initialUrl = documentUrl;
9948 }
9949
9950 router.restoreHistory();
9951
9952 if (router.history.indexOf(initialUrl) >= 0) {
9953 router.history = router.history.slice(0, router.history.indexOf(initialUrl) + 1);
9954 } else if (router.params.url === initialUrl) {
9955 router.history = [initialUrl];
9956 } else if (History.state && History.state[view.id] && History.state[view.id].url === router.history[router.history.length - 1]) {
9957 initialUrl = router.history[router.history.length - 1];
9958 } else {
9959 router.history = [documentUrl.split(browserHistorySeparator)[0] || '/', initialUrl];
9960 }
9961
9962 if (router.history.length > 1) {
9963 historyRestored = true;
9964 } else {
9965 router.history = [];
9966 }
9967
9968 router.saveHistory();
9969 }
9970
9971 router.initialUrl = initialUrl;
9972 router.historyRestored = historyRestored;
9973 return {
9974 initialUrl: initialUrl,
9975 historyRestored: historyRestored
9976 };
9977 };
9978
9979 _proto.init = function init() {
9980 var router = this;
9981 var app = router.app,
9982 view = router.view;
9983 var document = getDocument();
9984 router.mount();
9985
9986 var _router$getInitialUrl = router.getInitialUrl(),
9987 initialUrl = _router$getInitialUrl.initialUrl,
9988 historyRestored = _router$getInitialUrl.historyRestored; // Init Swipeback
9989
9990
9991 if (view && router.params.iosSwipeBack && app.theme === 'ios' || view && router.params.mdSwipeBack && app.theme === 'md' || view && router.params.auroraSwipeBack && app.theme === 'aurora') {
9992 SwipeBack(router);
9993 }
9994
9995 var _router$params2 = router.params,
9996 browserHistory = _router$params2.browserHistory,
9997 browserHistoryOnLoad = _router$params2.browserHistoryOnLoad,
9998 browserHistoryAnimateOnLoad = _router$params2.browserHistoryAnimateOnLoad,
9999 browserHistoryInitialMatch = _router$params2.browserHistoryInitialMatch;
10000 var currentRoute;
10001
10002 if (router.history.length > 1) {
10003 // Will load page
10004 var initUrl = browserHistoryInitialMatch ? initialUrl : router.history[0];
10005 currentRoute = router.findMatchingRoute(initUrl);
10006
10007 if (!currentRoute) {
10008 currentRoute = extend$1(router.parseRouteUrl(initUrl), {
10009 route: {
10010 url: initUrl,
10011 path: initUrl.split('?')[0]
10012 }
10013 });
10014 }
10015 } else {
10016 // Don't load page
10017 currentRoute = router.findMatchingRoute(initialUrl);
10018
10019 if (!currentRoute) {
10020 currentRoute = extend$1(router.parseRouteUrl(initialUrl), {
10021 route: {
10022 url: initialUrl,
10023 path: initialUrl.split('?')[0]
10024 }
10025 });
10026 }
10027 }
10028
10029 if (router.params.stackPages) {
10030 router.$el.children('.page').each(function (pageEl) {
10031 var $pageEl = $$1(pageEl);
10032 router.initialPages.push($pageEl[0]);
10033
10034 if (router.dynamicNavbar && $pageEl.children('.navbar').length > 0) {
10035 router.initialNavbars.push($pageEl.children('.navbar')[0]);
10036 }
10037 });
10038 }
10039
10040 if (router.$el.children('.page:not(.stacked)').length === 0 && initialUrl && router.params.loadInitialPage) {
10041 // No pages presented in DOM, reload new page
10042 router.navigate(initialUrl, {
10043 initial: true,
10044 reloadCurrent: true,
10045 browserHistory: false,
10046 animate: false,
10047 once: {
10048 modalOpen: function modalOpen() {
10049 if (!historyRestored) return;
10050 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
10051
10052 if (preloadPreviousPage && router.history.length > 1) {
10053 router.back({
10054 preload: true
10055 });
10056 }
10057 },
10058 pageAfterIn: function pageAfterIn() {
10059 if (!historyRestored) return;
10060 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
10061
10062 if (preloadPreviousPage && router.history.length > 1) {
10063 router.back({
10064 preload: true
10065 });
10066 }
10067 }
10068 }
10069 });
10070 } else if (router.$el.children('.page:not(.stacked)').length) {
10071 // Init current DOM page
10072 var hasTabRoute;
10073 router.currentRoute = currentRoute;
10074 router.$el.children('.page:not(.stacked)').each(function (pageEl) {
10075 var $pageEl = $$1(pageEl);
10076 var $navbarEl;
10077 router.setPagePosition($pageEl, 'current');
10078
10079 if (router.dynamicNavbar) {
10080 $navbarEl = $pageEl.children('.navbar');
10081
10082 if ($navbarEl.length > 0) {
10083 if (!router.$navbarsEl.parents(document).length) {
10084 router.$el.prepend(router.$navbarsEl);
10085 }
10086
10087 router.setNavbarPosition($navbarEl, 'current');
10088 router.$navbarsEl.append($navbarEl);
10089
10090 if ($navbarEl.children('.title-large').length) {
10091 $navbarEl.addClass('navbar-large');
10092 }
10093
10094 $pageEl.children('.navbar').remove();
10095 } else {
10096 router.$navbarsEl.addClass('navbar-hidden');
10097
10098 if ($navbarEl.children('.title-large').length) {
10099 router.$navbarsEl.addClass('navbar-hidden navbar-large-hidden');
10100 }
10101 }
10102 }
10103
10104 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) {
10105 $pageEl.addClass('page-master');
10106 $pageEl.trigger('page:role', {
10107 role: 'master'
10108 });
10109
10110 if ($navbarEl && $navbarEl.length) {
10111 $navbarEl.addClass('navbar-master');
10112 }
10113
10114 view.checkMasterDetailBreakpoint();
10115 }
10116
10117 var initOptions = {
10118 route: router.currentRoute
10119 };
10120
10121 if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.options) {
10122 extend$1(initOptions, router.currentRoute.route.options);
10123 }
10124
10125 router.currentPageEl = $pageEl[0];
10126
10127 if (router.dynamicNavbar && $navbarEl.length) {
10128 router.currentNavbarEl = $navbarEl[0];
10129 }
10130
10131 router.removeThemeElements($pageEl);
10132
10133 if (router.dynamicNavbar && $navbarEl.length) {
10134 router.removeThemeElements($navbarEl);
10135 }
10136
10137 if (initOptions.route.route.tab) {
10138 hasTabRoute = true;
10139 router.tabLoad(initOptions.route.route.tab, extend$1({}, initOptions));
10140 }
10141
10142 router.pageCallback('init', $pageEl, $navbarEl, 'current', undefined, initOptions);
10143 router.pageCallback('beforeIn', $pageEl, $navbarEl, 'current', undefined, initOptions);
10144 router.pageCallback('afterIn', $pageEl, $navbarEl, 'current', undefined, initOptions);
10145 });
10146
10147 if (historyRestored) {
10148 if (browserHistoryInitialMatch) {
10149 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
10150
10151 if (preloadPreviousPage && router.history.length > 1) {
10152 router.back({
10153 preload: true
10154 });
10155 }
10156 } else {
10157 router.navigate(initialUrl, {
10158 initial: true,
10159 browserHistory: false,
10160 history: false,
10161 animate: browserHistoryAnimateOnLoad,
10162 once: {
10163 pageAfterIn: function pageAfterIn() {
10164 var preloadPreviousPage = router.params.preloadPreviousPage || router.params[app.theme + "SwipeBack"];
10165
10166 if (preloadPreviousPage && router.history.length > 2) {
10167 router.back({
10168 preload: true
10169 });
10170 }
10171 }
10172 }
10173 });
10174 }
10175 }
10176
10177 if (!historyRestored && !hasTabRoute) {
10178 router.history.push(initialUrl);
10179 router.saveHistory();
10180 }
10181 }
10182
10183 if (initialUrl && browserHistory && browserHistoryOnLoad && (!History.state || !History.state[view.id])) {
10184 History.initViewState(view.id, {
10185 url: initialUrl
10186 });
10187 }
10188
10189 router.emit('local::init routerInit', router);
10190 };
10191
10192 _proto.destroy = function destroy() {
10193 var router = this;
10194 router.emit('local::destroy routerDestroy', router); // Delete props & methods
10195
10196 Object.keys(router).forEach(function (routerProp) {
10197 router[routerProp] = null;
10198 delete router[routerProp];
10199 });
10200 router = null;
10201 };
10202
10203 return Router;
10204 }(Framework7Class); // Load
10205
10206
10207 Router.prototype.navigate = navigate;
10208 Router.prototype.refreshPage = refreshPage; // Tab
10209
10210 Router.prototype.tabLoad = tabLoad;
10211 Router.prototype.tabRemove = tabRemove; // Modal
10212
10213 Router.prototype.modalLoad = modalLoad;
10214 Router.prototype.modalRemove = modalRemove; // Back
10215
10216 Router.prototype.back = back; // Clear history
10217
10218 Router.prototype.clearPreviousHistory = clearPreviousHistory;
10219
10220 var RouterModule = {
10221 name: 'router',
10222 static: {
10223 Router: Router
10224 },
10225 instance: {
10226 cache: {
10227 xhr: [],
10228 templates: [],
10229 components: []
10230 }
10231 },
10232 create: function create() {
10233 var instance = this;
10234
10235 if (instance.app) {
10236 // View Router
10237 if (instance.params.router) {
10238 instance.router = new Router(instance.app, instance);
10239 }
10240 } else {
10241 // App Router
10242 instance.router = new Router(instance);
10243 }
10244 }
10245 };
10246
10247 function resizableView(view) {
10248 var app = view.app;
10249 var support = getSupport();
10250 if (view.resizableInitialized) return;
10251 extend$1(view, {
10252 resizable: true,
10253 resizableWidth: null,
10254 resizableInitialized: true
10255 });
10256 var $htmlEl = $$1('html');
10257 var $el = view.$el;
10258 if (!$el) return;
10259 var $resizeHandlerEl;
10260 var isTouched;
10261 var isMoved;
10262 var touchesStart = {};
10263 var touchesDiff;
10264 var width;
10265 var minWidth;
10266 var maxWidth;
10267
10268 function transformCSSWidth(v) {
10269 if (!v) return null;
10270
10271 if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {
10272 return parseInt(v, 10) / 100 * app.width;
10273 }
10274
10275 var newV = parseInt(v, 10);
10276 if (Number.isNaN(newV)) return null;
10277 return newV;
10278 }
10279
10280 function isResizable() {
10281 return view.resizable && $el.hasClass('view-resizable') && $el.hasClass('view-master-detail');
10282 }
10283
10284 function handleTouchStart(e) {
10285 if (!isResizable()) return;
10286 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
10287 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
10288 isMoved = false;
10289 isTouched = true;
10290 var $pageMasterEl = $el.children('.page-master');
10291 minWidth = transformCSSWidth($pageMasterEl.css('min-width'));
10292 maxWidth = transformCSSWidth($pageMasterEl.css('max-width'));
10293 }
10294
10295 function handleTouchMove(e) {
10296 if (!isTouched) return;
10297 e.f7PreventSwipePanel = true;
10298 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
10299
10300 if (!isMoved) {
10301 width = $resizeHandlerEl[0].offsetLeft + $resizeHandlerEl[0].offsetWidth;
10302 $el.addClass('view-resizing');
10303 $htmlEl.css('cursor', 'col-resize');
10304 }
10305
10306 isMoved = true;
10307 e.preventDefault();
10308 touchesDiff = pageX - touchesStart.x;
10309 var newWidth = width + touchesDiff;
10310
10311 if (minWidth && !Number.isNaN(minWidth)) {
10312 newWidth = Math.max(newWidth, minWidth);
10313 }
10314
10315 if (maxWidth && !Number.isNaN(maxWidth)) {
10316 newWidth = Math.min(newWidth, maxWidth);
10317 }
10318
10319 newWidth = Math.min(Math.max(newWidth, 0), app.width);
10320 view.resizableWidth = newWidth;
10321 $htmlEl[0].style.setProperty('--f7-page-master-width', newWidth + "px");
10322 $el.trigger('view:resize', newWidth);
10323 view.emit('local::resize viewResize', view, newWidth);
10324 }
10325
10326 function handleTouchEnd() {
10327 $$1('html').css('cursor', '');
10328
10329 if (!isTouched || !isMoved) {
10330 isTouched = false;
10331 isMoved = false;
10332 return;
10333 }
10334
10335 isTouched = false;
10336 isMoved = false;
10337 $htmlEl[0].style.setProperty('--f7-page-master-width', view.resizableWidth + "px");
10338 $el.removeClass('view-resizing');
10339 }
10340
10341 function handleResize() {
10342 if (!view.resizableWidth) return;
10343 minWidth = transformCSSWidth($resizeHandlerEl.css('min-width'));
10344 maxWidth = transformCSSWidth($resizeHandlerEl.css('max-width'));
10345
10346 if (minWidth && !Number.isNaN(minWidth) && view.resizableWidth < minWidth) {
10347 view.resizableWidth = Math.max(view.resizableWidth, minWidth);
10348 }
10349
10350 if (maxWidth && !Number.isNaN(maxWidth) && view.resizableWidth > maxWidth) {
10351 view.resizableWidth = Math.min(view.resizableWidth, maxWidth);
10352 }
10353
10354 view.resizableWidth = Math.min(Math.max(view.resizableWidth, 0), app.width);
10355 $htmlEl[0].style.setProperty('--f7-page-master-width', view.resizableWidth + "px");
10356 }
10357
10358 $resizeHandlerEl = view.$el.children('.view-resize-handler');
10359
10360 if (!$resizeHandlerEl.length) {
10361 view.$el.append('<div class="view-resize-handler"></div>');
10362 $resizeHandlerEl = view.$el.children('.view-resize-handler');
10363 }
10364
10365 view.$resizeHandlerEl = $resizeHandlerEl;
10366 $el.addClass('view-resizable'); // Add Events
10367
10368 var passive = support.passiveListener ? {
10369 passive: true
10370 } : false;
10371 view.$el.on(app.touchEvents.start, '.view-resize-handler', handleTouchStart, passive);
10372 app.on('touchmove:active', handleTouchMove);
10373 app.on('touchend:passive', handleTouchEnd);
10374 app.on('resize', handleResize);
10375 view.on('beforeOpen', handleResize);
10376 view.once('viewDestroy', function () {
10377 $el.removeClass('view-resizable');
10378 view.$resizeHandlerEl.remove();
10379 view.$el.off(app.touchEvents.start, '.view-resize-handler', handleTouchStart, passive);
10380 app.off('touchmove:active', handleTouchMove);
10381 app.off('touchend:passive', handleTouchEnd);
10382 app.off('resize', handleResize);
10383 view.off('beforeOpen', handleResize);
10384 });
10385 }
10386
10387 var View = /*#__PURE__*/function (_Framework7Class) {
10388 _inheritsLoose$1(View, _Framework7Class);
10389
10390 function View(app, el, viewParams) {
10391 var _this;
10392
10393 if (viewParams === void 0) {
10394 viewParams = {};
10395 }
10396
10397 _this = _Framework7Class.call(this, viewParams, [app]) || this;
10398
10399 var view = _assertThisInitialized$1(_this);
10400
10401 var ssr = view.params.routerId;
10402 var defaults = {
10403 routes: [],
10404 routesAdd: []
10405 };
10406
10407 if (!ssr) {
10408 var $el = $$1(el);
10409
10410 if (!$el.length) {
10411 var message = "Framework7: can't create a View instance because ";
10412 message += typeof el === 'string' ? "the selector \"" + el + "\" didn't match any element" : 'el must be an HTMLElement or Dom7 object';
10413 throw new Error(message);
10414 }
10415 } // Default View params
10416
10417
10418 view.params = extend$1({
10419 el: el
10420 }, defaults, app.params.view, viewParams); // Routes
10421
10422 if (view.params.routes.length > 0) {
10423 view.routes = view.params.routes;
10424 } else {
10425 view.routes = [].concat(app.routes, view.params.routesAdd);
10426 } // View Props
10427
10428
10429 extend$1(false, view, {
10430 app: app,
10431 name: view.params.name,
10432 main: view.params.main,
10433 history: [],
10434 scrollHistory: {}
10435 }); // Install Modules
10436
10437 view.useModules(); // Add to app
10438
10439 app.views.push(view);
10440
10441 if (view.main) {
10442 app.views.main = view;
10443 }
10444
10445 if (view.name) {
10446 app.views[view.name] = view;
10447 } // Index
10448
10449
10450 view.index = app.views.indexOf(view); // View ID
10451
10452 var viewId;
10453
10454 if (view.name) {
10455 viewId = "view_" + view.name;
10456 } else if (view.main) {
10457 viewId = 'view_main';
10458 } else {
10459 viewId = "view_" + view.index;
10460 }
10461
10462 view.id = viewId;
10463
10464 if (!view.params.init) {
10465 return view || _assertThisInitialized$1(_this);
10466 } // Init View
10467
10468
10469 if (app.initialized) {
10470 view.init();
10471 } else {
10472 app.on('init', function () {
10473 view.init();
10474 });
10475 }
10476
10477 return view || _assertThisInitialized$1(_this);
10478 }
10479
10480 var _proto = View.prototype;
10481
10482 _proto.destroy = function destroy() {
10483 var view = this;
10484 var app = view.app;
10485 view.$el.trigger('view:beforedestroy');
10486 view.emit('local::beforeDestroy viewBeforeDestroy', view);
10487 app.off('resize', view.checkMasterDetailBreakpoint);
10488
10489 if (view.main) {
10490 app.views.main = null;
10491 delete app.views.main;
10492 } else if (view.name) {
10493 app.views[view.name] = null;
10494 delete app.views[view.name];
10495 }
10496
10497 view.$el[0].f7View = null;
10498 delete view.$el[0].f7View;
10499 app.views.splice(app.views.indexOf(view), 1); // Destroy Router
10500
10501 if (view.params.router && view.router) {
10502 view.router.destroy();
10503 }
10504
10505 view.emit('local::destroy viewDestroy', view); // Delete props & methods
10506
10507 Object.keys(view).forEach(function (viewProp) {
10508 view[viewProp] = null;
10509 delete view[viewProp];
10510 });
10511 view = null;
10512 };
10513
10514 _proto.checkMasterDetailBreakpoint = function checkMasterDetailBreakpoint(force) {
10515 var view = this;
10516 var app = view.app;
10517 var wasMasterDetail = view.$el.hasClass('view-master-detail');
10518 var isMasterDetail = app.width >= view.params.masterDetailBreakpoint && view.$el.children('.page-master').length;
10519
10520 if (typeof force === 'undefined' && isMasterDetail || force === true) {
10521 view.$el.addClass('view-master-detail');
10522
10523 if (!wasMasterDetail) {
10524 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint', view);
10525 view.$el.trigger('view:masterDetailBreakpoint');
10526 }
10527 } else {
10528 view.$el.removeClass('view-master-detail');
10529
10530 if (wasMasterDetail) {
10531 view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint', view);
10532 view.$el.trigger('view:masterDetailBreakpoint');
10533 }
10534 }
10535 };
10536
10537 _proto.initMasterDetail = function initMasterDetail() {
10538 var view = this;
10539 var app = view.app;
10540 view.checkMasterDetailBreakpoint = view.checkMasterDetailBreakpoint.bind(view);
10541 view.checkMasterDetailBreakpoint();
10542
10543 if (view.params.masterDetailResizable) {
10544 resizableView(view);
10545 }
10546
10547 app.on('resize', view.checkMasterDetailBreakpoint);
10548 };
10549
10550 _proto.mount = function mount(viewEl) {
10551 var view = this;
10552 var app = view.app;
10553 var el = view.params.el || viewEl;
10554 var $el = $$1(el); // Selector
10555
10556 var selector;
10557 if (typeof el === 'string') selector = el;else {
10558 // Supposed to be HTMLElement or Dom7
10559 selector = ($el.attr('id') ? "#" + $el.attr('id') : '') + ($el.attr('class') ? "." + $el.attr('class').replace(/ /g, '.').replace('.active', '') : '');
10560 } // DynamicNavbar
10561
10562 var $navbarsEl;
10563
10564 if (app.theme === 'ios' && view.params.iosDynamicNavbar) {
10565 $navbarsEl = $el.children('.navbars').eq(0);
10566
10567 if ($navbarsEl.length === 0) {
10568 $navbarsEl = $$1('<div class="navbars"></div>');
10569 }
10570 }
10571
10572 extend$1(view, {
10573 $el: $el,
10574 el: $el[0],
10575 main: view.main || $el.hasClass('view-main'),
10576 $navbarsEl: $navbarsEl,
10577 navbarsEl: $navbarsEl ? $navbarsEl[0] : undefined,
10578 selector: selector
10579 });
10580
10581 if (view.main) {
10582 app.views.main = view;
10583 } // Save in DOM
10584
10585
10586 if ($el && $el[0]) {
10587 $el[0].f7View = view;
10588 }
10589
10590 view.emit('local::mount viewMount', view);
10591 };
10592
10593 _proto.init = function init(viewEl) {
10594 var view = this;
10595 view.mount(viewEl);
10596
10597 if (view.params.router) {
10598 if (view.params.masterDetailBreakpoint > 0) {
10599 view.initMasterDetail();
10600 }
10601
10602 view.router.init();
10603 view.$el.trigger('view:init');
10604 view.emit('local::init viewInit', view);
10605 }
10606 };
10607
10608 return View;
10609 }(Framework7Class); // Use Router
10610
10611
10612 View.use(RouterModule);
10613
10614 function initClicks(app) {
10615 function handleClicks(e) {
10616 var window = getWindow();
10617 var $clickedEl = $$1(e.target);
10618 var $clickedLinkEl = $clickedEl.closest('a');
10619 var isLink = $clickedLinkEl.length > 0;
10620 var url = isLink && $clickedLinkEl.attr('href'); // Check if link is external
10621
10622 if (isLink) {
10623 if ($clickedLinkEl.is(app.params.clicks.externalLinks) || // eslint-disable-next-line
10624 url && url.indexOf('javascript:') >= 0) {
10625 var target = $clickedLinkEl.attr('target');
10626
10627 if (url && window.cordova && window.cordova.InAppBrowser && (target === '_system' || target === '_blank')) {
10628 e.preventDefault();
10629 window.cordova.InAppBrowser.open(url, target);
10630 } else if (url && window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Browser && (target === '_system' || target === '_blank')) {
10631 e.preventDefault();
10632 window.Capacitor.Plugins.Browser.open({
10633 url: url
10634 });
10635 }
10636
10637 return;
10638 }
10639 } // Modules Clicks
10640
10641
10642 Object.keys(app.modules).forEach(function (moduleName) {
10643 var moduleClicks = app.modules[moduleName].clicks;
10644 if (!moduleClicks) return;
10645 if (e.preventF7Router) return;
10646 Object.keys(moduleClicks).forEach(function (clickSelector) {
10647 var matchingClickedElement = $clickedEl.closest(clickSelector).eq(0);
10648
10649 if (matchingClickedElement.length > 0) {
10650 moduleClicks[clickSelector].call(app, matchingClickedElement, matchingClickedElement.dataset(), e);
10651 }
10652 });
10653 }); // Load Page
10654
10655 var clickedLinkData = {};
10656
10657 if (isLink) {
10658 e.preventDefault();
10659 clickedLinkData = $clickedLinkEl.dataset();
10660 }
10661
10662 clickedLinkData.clickedEl = $clickedLinkEl[0]; // Prevent Router
10663
10664 if (e.preventF7Router) return;
10665 if ($clickedLinkEl.hasClass('prevent-router') || $clickedLinkEl.hasClass('router-prevent')) return;
10666 var validUrl = url && url.length > 0 && url[0] !== '#';
10667
10668 if (validUrl || $clickedLinkEl.hasClass('back')) {
10669 var view;
10670
10671 if (clickedLinkData.view && clickedLinkData.view === 'current') {
10672 view = app.views.current;
10673 } else if (clickedLinkData.view) {
10674 view = $$1(clickedLinkData.view)[0].f7View;
10675 } else {
10676 view = $clickedEl.parents('.view')[0] && $clickedEl.parents('.view')[0].f7View;
10677
10678 if (!$clickedLinkEl.hasClass('back') && view && view.params.linksView) {
10679 if (typeof view.params.linksView === 'string') view = $$1(view.params.linksView)[0].f7View;else if (view.params.linksView instanceof View) view = view.params.linksView;
10680 }
10681 }
10682
10683 if (!view) {
10684 if (app.views.main) view = app.views.main;
10685 }
10686
10687 if (!view || !view.router) return;
10688
10689 if ($clickedLinkEl[0].f7RouteProps) {
10690 clickedLinkData.props = $clickedLinkEl[0].f7RouteProps;
10691 }
10692
10693 if ($clickedLinkEl.hasClass('back')) view.router.back(url, clickedLinkData);else view.router.navigate(url, clickedLinkData);
10694 }
10695 }
10696
10697 app.on('click', handleClicks);
10698 }
10699
10700 var ClicksModule = {
10701 name: 'clicks',
10702 params: {
10703 clicks: {
10704 // External Links
10705 externalLinks: '.external'
10706 }
10707 },
10708 on: {
10709 init: function init() {
10710 var app = this;
10711 initClicks(app);
10712 }
10713 }
10714 };
10715
10716 var RouterComponentLoaderModule = {
10717 name: 'routerComponentLoader',
10718 proto: {
10719 componentLoader: function componentLoader(component, componentUrl, options, resolve, reject) {
10720 if (options === void 0) {
10721 options = {};
10722 }
10723
10724 var router = this;
10725 var app = router.app;
10726 var url = typeof component === 'string' ? component : componentUrl;
10727 var compiledUrl = router.replaceRequestUrlParams(url, options);
10728
10729 function compile(componentFunction) {
10730 var context = options.context || {};
10731 if (typeof context === 'function') context = context.call(router);else if (typeof context === 'string') {
10732 try {
10733 context = JSON.parse(context);
10734 } catch (err) {
10735 reject(err);
10736 throw err;
10737 }
10738 }
10739 var componentContext = merge({}, context, {
10740 f7route: options.route,
10741 f7router: router
10742 });
10743 var componentProps = merge(options.route ? options.route.params || {} : {}, options.props || {}, options.routeProps || {});
10744 var componentEl;
10745 var componentRoot;
10746
10747 if (options.componentOptions && options.componentOptions.el) {
10748 componentEl = options.componentOptions.el;
10749 }
10750
10751 if (options.componentOptions && options.componentOptions.root) {
10752 componentRoot = options.componentOptions.root;
10753 }
10754
10755 app.component.create(componentFunction, componentProps, {
10756 context: componentContext,
10757 el: componentEl,
10758 root: componentRoot
10759 }).then(function (createdComponent) {
10760 resolve(createdComponent.el);
10761 }).catch(function (err) {
10762 reject(err);
10763 throw new Error(err);
10764 });
10765 }
10766
10767 var cachedComponent;
10768
10769 if (compiledUrl && router.params.componentCache) {
10770 router.cache.components.forEach(function (cached) {
10771 if (cached.url === compiledUrl) cachedComponent = cached.component;
10772 });
10773 }
10774
10775 if (compiledUrl && cachedComponent) {
10776 compile(cachedComponent);
10777 } else if (compiledUrl && !cachedComponent) {
10778 // Load via XHR
10779 if (router.xhrAbortController) {
10780 router.xhrAbortController.abort();
10781 router.xhrAbortController = false;
10782 }
10783
10784 router.xhrRequest(url, options).then(function (loadedComponent) {
10785 var parsedComponent = app.component.parse(loadedComponent);
10786
10787 if (router.params.componentCache) {
10788 router.cache.components.push({
10789 url: compiledUrl,
10790 component: parsedComponent
10791 });
10792 }
10793
10794 compile(parsedComponent);
10795 }).catch(function (err) {
10796 reject();
10797 throw err;
10798 });
10799 } else {
10800 compile(component);
10801 }
10802 },
10803 modalComponentLoader: function modalComponentLoader(_temp) {
10804 var _ref = _temp === void 0 ? {} : _temp,
10805 component = _ref.component,
10806 componentUrl = _ref.componentUrl,
10807 options = _ref.options,
10808 resolve = _ref.resolve,
10809 reject = _ref.reject;
10810
10811 var router = this;
10812 router.componentLoader(component, componentUrl, options, function (el) {
10813 resolve(el);
10814 }, reject);
10815 },
10816 tabComponentLoader: function tabComponentLoader(_temp2) {
10817 var _ref2 = _temp2 === void 0 ? {} : _temp2,
10818 component = _ref2.component,
10819 componentUrl = _ref2.componentUrl,
10820 options = _ref2.options,
10821 resolve = _ref2.resolve,
10822 reject = _ref2.reject;
10823
10824 var router = this;
10825 router.componentLoader(component, componentUrl, options, function (el) {
10826 resolve(el);
10827 }, reject);
10828 },
10829 pageComponentLoader: function pageComponentLoader(_temp3) {
10830 var _ref3 = _temp3 === void 0 ? {} : _temp3,
10831 component = _ref3.component,
10832 componentUrl = _ref3.componentUrl,
10833 options = _ref3.options,
10834 resolve = _ref3.resolve,
10835 reject = _ref3.reject;
10836
10837 var router = this;
10838 router.componentLoader(component, componentUrl, options, function (el, newOptions) {
10839 if (newOptions === void 0) {
10840 newOptions = {};
10841 }
10842
10843 resolve(el, newOptions);
10844 }, reject);
10845 }
10846 }
10847 };
10848
10849 var n = function n(t, s, r, e) {
10850 var u;
10851 s[0] = 0;
10852
10853 for (var h = 1; h < s.length; h++) {
10854 var p = s[h++],
10855 a = s[h] ? (s[0] |= p ? 1 : 2, r[s[h++]]) : s[++h];
10856 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);
10857 }
10858
10859 return e;
10860 },
10861 t = new Map();
10862
10863 function htm (s) {
10864 var r = t.get(this);
10865 return r || (r = new Map(), t.set(this, r)), (r = n(this, r.get(s) || (r.set(s, r = function (n) {
10866 for (var t, s, r = 1, e = "", u = "", h = [0], p = function p(n) {
10867 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 = "";
10868 }, a = 0; a < n.length; a++) {
10869 a && (1 === r && p(), p(a));
10870
10871 for (var l = 0; l < n[a].length; l++) {
10872 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]);
10873 }
10874 }
10875
10876 return p(), h;
10877 }(s)), r), arguments, [])).length > 1 ? r : r[0];
10878 }
10879
10880 var ignoreChildren = [false, null, '', undefined];
10881
10882 var h = function h(type, props) {
10883 for (var _len = arguments.length, children = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
10884 children[_key - 2] = arguments[_key];
10885 }
10886
10887 return {
10888 type: type,
10889 props: props || {},
10890 children: flattenArray(children.filter(function (child) {
10891 return ignoreChildren.indexOf(child) < 0;
10892 }))
10893 };
10894 };
10895
10896 var $h = htm.bind(h);
10897
10898 function vnode(sel, data, children, text, elm) {
10899 var key = data === undefined ? undefined : data.key;
10900 return {
10901 sel: sel,
10902 data: data,
10903 children: children,
10904 text: text,
10905 elm: elm,
10906 key: key
10907 };
10908 }
10909
10910 var array = Array.isArray;
10911 function primitive(s) {
10912 return typeof s === 'string' || typeof s === 'number';
10913 }
10914
10915 function addNS(data, children, sel) {
10916 data.ns = 'http://www.w3.org/2000/svg';
10917
10918 if (sel !== 'foreignObject' && children !== undefined) {
10919 for (var i = 0; i < children.length; ++i) {
10920 var childData = children[i].data;
10921
10922 if (childData !== undefined) {
10923 addNS(childData, children[i].children, children[i].sel);
10924 }
10925 }
10926 }
10927 }
10928
10929 function h$1(sel, b, c) {
10930 var data = {},
10931 children,
10932 text,
10933 i;
10934
10935 if (c !== undefined) {
10936 data = b;
10937
10938 if (array(c)) {
10939 children = c;
10940 } else if (primitive(c)) {
10941 text = c;
10942 } else if (c && c.sel) {
10943 children = [c];
10944 }
10945 } else if (b !== undefined) {
10946 if (array(b)) {
10947 children = b;
10948 } else if (primitive(b)) {
10949 text = b;
10950 } else if (b && b.sel) {
10951 children = [b];
10952 } else {
10953 data = b;
10954 }
10955 }
10956
10957 if (array(children)) {
10958 for (i = 0; i < children.length; ++i) {
10959 if (primitive(children[i])) children[i] = vnode(undefined, undefined, undefined, children[i], undefined);
10960 }
10961 }
10962
10963 if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' && (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
10964 addNS(data, children, sel);
10965 }
10966
10967 return vnode(sel, data, children, text, undefined);
10968 }
10969
10970 var customComponents = {};
10971
10972 var SELF_CLOSING = 'area base br col command embed hr img input keygen link menuitem meta param source track wbr'.split(' ');
10973 var PROPS_ATTRS = 'hidden checked disabled readonly selected autofocus autoplay required multiple value indeterminate routeProps innerHTML'.split(' ');
10974 var BOOLEAN_PROPS = 'hidden checked disabled readonly selected autofocus autoplay required multiple readOnly indeterminate'.split(' ');
10975
10976 var getTagName = function getTagName(treeNode) {
10977 return typeof treeNode.type === 'function' ? treeNode.type.name || 'CustomComponent' : treeNode.type;
10978 };
10979
10980 var toCamelCase$1 = function toCamelCase(name) {
10981 return name.split('-').map(function (word, index) {
10982 if (index === 0) return word.toLowerCase();
10983 return word[0].toUpperCase() + word.substr(1);
10984 }).join('');
10985 };
10986
10987 var propsFromAttrs = function propsFromAttrs() {
10988 var context = {};
10989
10990 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
10991 args[_key] = arguments[_key];
10992 }
10993
10994 args.forEach(function (obj) {
10995 if (obj === void 0) {
10996 obj = {};
10997 }
10998
10999 Object.keys(obj).forEach(function (key) {
11000 context[toCamelCase$1(key)] = obj[key];
11001 });
11002 });
11003 return context;
11004 };
11005
11006 var createCustomComponent = function createCustomComponent(_ref) {
11007 var f7 = _ref.f7,
11008 treeNode = _ref.treeNode,
11009 vnode = _ref.vnode,
11010 data = _ref.data;
11011 var component = typeof treeNode.type === 'function' ? treeNode.type : customComponents[treeNode.type];
11012 f7.component.create(component, propsFromAttrs(data.attrs || {}, data.props || {}), {
11013 el: vnode.elm,
11014 children: treeNode.children
11015 }).then(function (c) {
11016 if (vnode.data && vnode.data.on && c && c.$el) {
11017 Object.keys(vnode.data.on).forEach(function (eventName) {
11018 c.$el.on(eventName, vnode.data.on[eventName]);
11019 });
11020 } // eslint-disable-next-line
11021
11022
11023 vnode.elm.__component__ = c;
11024 });
11025 };
11026
11027 var updateCustomComponent = function updateCustomComponent(vnode) {
11028 // eslint-disable-next-line
11029 var component = vnode && vnode.elm && vnode.elm.__component__;
11030 if (!component) return;
11031 var newProps = propsFromAttrs(vnode.data.attrs || {}, vnode.data.props || {});
11032 component.children = vnode.data.treeNode.children;
11033 Object.assign(component.props, newProps);
11034 component.update();
11035 };
11036
11037 var destroyCustomComponent = function destroyCustomComponent(vnode) {
11038 // eslint-disable-next-line
11039 var component = vnode && vnode.elm && vnode.elm.__component__;
11040
11041 if (component) {
11042 var el = component.el,
11043 $el = component.$el;
11044
11045 if (vnode.data && vnode.data.on && $el) {
11046 Object.keys(vnode.data.on).forEach(function (eventName) {
11047 $el.off(eventName, vnode.data.on[eventName]);
11048 });
11049 }
11050
11051 if (component.destroy) component.destroy();
11052 if (el && el.parentNode) el.parentNode.removeChild(el);
11053 delete vnode.elm.__component__; // eslint-disable-line
11054 }
11055 };
11056
11057 var isCustomComponent = function isCustomComponent(treeNodeType) {
11058 return typeof treeNodeType === 'function' || treeNodeType && treeNodeType.indexOf('-') > 0 && customComponents[treeNodeType];
11059 };
11060
11061 function getHooks(treeNode, data, f7, initial, isRoot) {
11062 var hooks = {};
11063 var insert = [];
11064 var destroy = [];
11065 var update = [];
11066 var postpatch = [];
11067 var isFakeElement = false;
11068 var tagName = getTagName(treeNode);
11069
11070 if (data && data.attrs && data.attrs.component) {
11071 // eslint-disable-next-line
11072 tagName = (_readOnlyError("tagName"), data.attrs.component);
11073 delete data.attrs.component;
11074 isFakeElement = true;
11075 }
11076
11077 var isCustom = isCustomComponent(treeNode.type);
11078
11079 if (isCustom) {
11080 insert.push(function (vnode) {
11081 if (vnode.sel !== tagName && !isFakeElement) return;
11082 createCustomComponent({
11083 f7: f7,
11084 treeNode: treeNode,
11085 vnode: vnode,
11086 data: data
11087 });
11088 });
11089 destroy.push(function (vnode) {
11090 destroyCustomComponent(vnode);
11091 });
11092 update.push(function (oldVnode, vnode) {
11093 updateCustomComponent(vnode);
11094 });
11095 }
11096
11097 if (!isCustom) {
11098 if (!data || !data.attrs || !data.attrs.class) return hooks;
11099 var classNames = data.attrs.class;
11100 classNames.split(' ').forEach(function (className) {
11101 if (!initial) {
11102 insert.push.apply(insert, f7.getVnodeHooks('insert', className));
11103 }
11104
11105 destroy.push.apply(destroy, f7.getVnodeHooks('destroy', className));
11106 update.push.apply(update, f7.getVnodeHooks('update', className));
11107 postpatch.push.apply(postpatch, f7.getVnodeHooks('postpatch', className));
11108 });
11109 }
11110
11111 if (isRoot && !initial) {
11112 postpatch.push(function (oldVnode, vnode) {
11113 var vn = vnode || oldVnode;
11114 if (!vn) return;
11115
11116 if (vn.data && vn.data.component) {
11117 vn.data.component.hook('onUpdated');
11118 }
11119 });
11120 }
11121
11122 if (insert.length === 0 && destroy.length === 0 && update.length === 0 && postpatch.length === 0) {
11123 return hooks;
11124 }
11125
11126 if (insert.length) {
11127 hooks.insert = function (vnode) {
11128 insert.forEach(function (f) {
11129 return f(vnode);
11130 });
11131 };
11132 }
11133
11134 if (destroy.length) {
11135 hooks.destroy = function (vnode) {
11136 destroy.forEach(function (f) {
11137 return f(vnode);
11138 });
11139 };
11140 }
11141
11142 if (update.length) {
11143 hooks.update = function (oldVnode, vnode) {
11144 update.forEach(function (f) {
11145 return f(oldVnode, vnode);
11146 });
11147 };
11148 }
11149
11150 if (postpatch.length) {
11151 hooks.postpatch = function (oldVnode, vnode) {
11152 postpatch.forEach(function (f) {
11153 return f(oldVnode, vnode);
11154 });
11155 };
11156 }
11157
11158 return hooks;
11159 }
11160
11161 var getEventHandler = function getEventHandler(eventHandler, _temp) {
11162 var _ref2 = _temp === void 0 ? {} : _temp,
11163 stop = _ref2.stop,
11164 prevent = _ref2.prevent,
11165 once = _ref2.once;
11166
11167 var fired = false;
11168
11169 function handler() {
11170 var e = arguments.length <= 0 ? undefined : arguments[0];
11171 if (once && fired) return;
11172 if (stop) e.stopPropagation();
11173 if (prevent) e.preventDefault();
11174 fired = true;
11175 eventHandler.apply(void 0, arguments);
11176 }
11177
11178 return handler;
11179 };
11180
11181 var getData = function getData(treeNode, component, f7, initial, isRoot) {
11182 var data = {
11183 component: component,
11184 treeNode: treeNode
11185 };
11186 var tagName = getTagName(treeNode);
11187 Object.keys(treeNode.props).forEach(function (attrName) {
11188 var attrValue = treeNode.props[attrName];
11189 if (typeof attrValue === 'undefined') return;
11190
11191 if (PROPS_ATTRS.indexOf(attrName) >= 0) {
11192 // Props
11193 if (!data.props) data.props = {};
11194
11195 if (attrName === 'readonly') {
11196 // eslint-disable-next-line
11197 attrName = 'readOnly';
11198 }
11199
11200 if (attrName === 'routeProps') {
11201 // eslint-disable-next-line
11202 attrName = 'f7RouteProps';
11203 }
11204
11205 if (tagName === 'option' && attrName === 'value') {
11206 if (!data.attrs) data.attrs = {};
11207 data.attrs.value = attrValue;
11208 }
11209
11210 if (BOOLEAN_PROPS.indexOf(attrName) >= 0) {
11211 // eslint-disable-next-line
11212 data.props[attrName] = attrValue === false ? false : true;
11213 } else {
11214 data.props[attrName] = attrValue;
11215 }
11216 } else if (attrName === 'key') {
11217 // Key
11218 data.key = attrValue;
11219 } else if (attrName.indexOf('@') === 0 || attrName.indexOf('on') === 0 && attrName.length > 2) {
11220 // Events
11221 if (!data.on) data.on = {};
11222 var eventName = attrName.indexOf('@') === 0 ? attrName.substr(1) : eventNameToColonCase(attrName.substr(2));
11223 var stop = false;
11224 var prevent = false;
11225 var once = false;
11226
11227 if (eventName.indexOf('.') >= 0) {
11228 eventName.split('.').forEach(function (eventNamePart, eventNameIndex) {
11229 if (eventNameIndex === 0) eventName = eventNamePart;else {
11230 if (eventNamePart === 'stop') stop = true;
11231 if (eventNamePart === 'prevent') prevent = true;
11232 if (eventNamePart === 'once') once = true;
11233 }
11234 });
11235 }
11236
11237 data.on[eventName] = getEventHandler(attrValue, {
11238 stop: stop,
11239 prevent: prevent,
11240 once: once
11241 });
11242 } else if (attrName === 'style') {
11243 // Style
11244 if (typeof attrValue !== 'string') {
11245 data.style = attrValue;
11246 } else {
11247 if (!data.attrs) data.attrs = {};
11248 data.attrs.style = attrValue;
11249 }
11250 } else {
11251 // Rest of attribures
11252 if (!data.attrs) data.attrs = {};
11253 data.attrs[attrName] = attrValue; // ID -> Key
11254
11255 if (attrName === 'id' && !data.key && !isRoot) {
11256 data.key = attrValue;
11257 }
11258 }
11259 });
11260 var hooks = getHooks(treeNode, data, f7, initial, isRoot);
11261
11262 hooks.prepatch = function (oldVnode, vnode) {
11263 if (!oldVnode || !vnode) return;
11264
11265 if (oldVnode && oldVnode.data && oldVnode.data.props) {
11266 Object.keys(oldVnode.data.props).forEach(function (key) {
11267 if (BOOLEAN_PROPS.indexOf(key) < 0) return;
11268 if (!vnode.data) vnode.data = {};
11269 if (!vnode.data.props) vnode.data.props = {};
11270
11271 if (oldVnode.data.props[key] === true && !(key in vnode.data.props)) {
11272 vnode.data.props[key] = false;
11273 }
11274 });
11275 }
11276 };
11277
11278 data.hook = hooks;
11279 return data;
11280 };
11281
11282 var getChildren = function getChildren(treeNode, component, f7, initial) {
11283 if (treeNode && treeNode.type && SELF_CLOSING.indexOf(treeNode.type) >= 0) {
11284 return [];
11285 }
11286
11287 var children = [];
11288 var nodes = treeNode.children;
11289
11290 for (var i = 0; i < nodes.length; i += 1) {
11291 var childNode = nodes[i];
11292 var child = treeNodeToVNode(childNode, component, f7, initial, false);
11293
11294 if (Array.isArray(child)) {
11295 children.push.apply(children, child);
11296 } else if (child) {
11297 children.push(child);
11298 }
11299 }
11300
11301 return children;
11302 };
11303
11304 var getSlots = function getSlots(treeNode, component, f7, initial) {
11305 var slotName = treeNode.props.name || 'default';
11306 var slotNodes = (component.children || []).filter(function (childTreeNode) {
11307 var childSlotName = 'default';
11308
11309 if (childTreeNode.props) {
11310 childSlotName = childTreeNode.props.slot || 'default';
11311 }
11312
11313 return childSlotName === slotName;
11314 });
11315
11316 if (slotNodes.length === 0) {
11317 return getChildren(treeNode, component, f7, initial);
11318 }
11319
11320 return slotNodes.map(function (subTreeNode) {
11321 return treeNodeToVNode(subTreeNode, component, f7, initial);
11322 });
11323 };
11324
11325 var isTreeNode = function isTreeNode(treeNode) {
11326 return isObject$1(treeNode) && 'props' in treeNode && 'type' in treeNode && 'children' in treeNode;
11327 };
11328
11329 var treeNodeToVNode = function treeNodeToVNode(treeNode, component, f7, initial, isRoot) {
11330 if (!isTreeNode(treeNode)) {
11331 return String(treeNode);
11332 }
11333
11334 if (treeNode.type === 'slot') {
11335 return getSlots(treeNode, component, f7, initial);
11336 }
11337
11338 var data = getData(treeNode, component, f7, initial, isRoot);
11339 var children = isCustomComponent(treeNode.type) ? [] : getChildren(treeNode, component, f7, initial);
11340 return h$1(getTagName(treeNode), data, children);
11341 };
11342
11343 function vdom(tree, component, initial) {
11344 if (tree === void 0) {
11345 tree = {};
11346 }
11347
11348 return treeNodeToVNode(tree, component, component.f7, initial, true);
11349 }
11350
11351 function createElement(tagName) {
11352 return document.createElement(tagName);
11353 }
11354
11355 function createElementNS(namespaceURI, qualifiedName) {
11356 return document.createElementNS(namespaceURI, qualifiedName);
11357 }
11358
11359 function createTextNode(text) {
11360 return document.createTextNode(text);
11361 }
11362
11363 function createComment(text) {
11364 return document.createComment(text);
11365 }
11366
11367 function insertBefore$1(parentNode, newNode, referenceNode) {
11368 if (referenceNode && referenceNode.parentNode !== parentNode) {
11369 if (referenceNode.__component__) referenceNode = referenceNode.__component__.el;
11370 }
11371
11372 parentNode.insertBefore(newNode, referenceNode);
11373 }
11374
11375 function removeChild(node, child) {
11376 if (!node) return;
11377 node.removeChild(child);
11378 }
11379
11380 function appendChild(node, child) {
11381 node.appendChild(child);
11382 }
11383
11384 function parentNode(node) {
11385 return node.parentNode;
11386 }
11387
11388 function nextSibling(node) {
11389 return node.nextSibling;
11390 }
11391
11392 function tagName(elm) {
11393 return elm.tagName;
11394 }
11395
11396 function setTextContent(node, text) {
11397 node.textContent = text;
11398 }
11399
11400 function getTextContent(node) {
11401 return node.textContent;
11402 }
11403
11404 function isElement(node) {
11405 return node.nodeType === 1;
11406 }
11407
11408 function isText(node) {
11409 return node.nodeType === 3;
11410 }
11411
11412 function isComment(node) {
11413 return node.nodeType === 8;
11414 }
11415
11416 var htmlDomApi = {
11417 createElement: createElement,
11418 createElementNS: createElementNS,
11419 createTextNode: createTextNode,
11420 createComment: createComment,
11421 insertBefore: insertBefore$1,
11422 removeChild: removeChild,
11423 appendChild: appendChild,
11424 parentNode: parentNode,
11425 nextSibling: nextSibling,
11426 tagName: tagName,
11427 setTextContent: setTextContent,
11428 getTextContent: getTextContent,
11429 isElement: isElement,
11430 isText: isText,
11431 isComment: isComment
11432 };
11433
11434 function isUndef(s) {
11435 return s === undefined;
11436 }
11437
11438 function isDef(s) {
11439 return s !== undefined;
11440 }
11441
11442 var emptyNode = vnode('', {}, [], undefined, undefined);
11443
11444 function sameVnode(vnode1, vnode2) {
11445 return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
11446 }
11447
11448 function isVnode(vnode) {
11449 return vnode.sel !== undefined;
11450 }
11451
11452 function createKeyToOldIdx(children, beginIdx, endIdx) {
11453 var i,
11454 map = {},
11455 key,
11456 ch;
11457
11458 for (i = beginIdx; i <= endIdx; ++i) {
11459 ch = children[i];
11460
11461 if (ch != null) {
11462 key = ch.key;
11463 if (key !== undefined) map[key] = i;
11464 }
11465 }
11466
11467 return map;
11468 }
11469
11470 var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
11471 function init(modules, domApi) {
11472 var i,
11473 j,
11474 cbs = {};
11475 var api = domApi !== undefined ? domApi : htmlDomApi;
11476
11477 for (i = 0; i < hooks.length; ++i) {
11478 cbs[hooks[i]] = [];
11479
11480 for (j = 0; j < modules.length; ++j) {
11481 var hook = modules[j][hooks[i]];
11482
11483 if (hook !== undefined) {
11484 cbs[hooks[i]].push(hook);
11485 }
11486 }
11487 }
11488
11489 function emptyNodeAt(elm) {
11490 var id = elm.id ? '#' + elm.id : '';
11491 var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
11492 return vnode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
11493 }
11494
11495 function createRmCb(childElm, listeners) {
11496 return function rmCb() {
11497 if (--listeners === 0) {
11498 var parent_1 = api.parentNode(childElm);
11499 api.removeChild(parent_1, childElm);
11500 }
11501 };
11502 }
11503
11504 function createElm(vnode, insertedVnodeQueue) {
11505 var i,
11506 data = vnode.data;
11507
11508 if (data !== undefined) {
11509 if (isDef(i = data.hook) && isDef(i = i.init)) {
11510 i(vnode);
11511 data = vnode.data;
11512 }
11513 }
11514
11515 var children = vnode.children,
11516 sel = vnode.sel;
11517
11518 if (sel === '!') {
11519 if (isUndef(vnode.text)) {
11520 vnode.text = '';
11521 }
11522
11523 vnode.elm = api.createComment(vnode.text);
11524 } else if (sel !== undefined) {
11525 // Parse selector
11526 var hashIdx = sel.indexOf('#');
11527 var dotIdx = sel.indexOf('.', hashIdx);
11528 var hash = hashIdx > 0 ? hashIdx : sel.length;
11529 var dot = dotIdx > 0 ? dotIdx : sel.length;
11530 var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
11531 var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag) : api.createElement(tag);
11532 if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot));
11533 if (dotIdx > 0) elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
11534
11535 for (i = 0; i < cbs.create.length; ++i) {
11536 cbs.create[i](emptyNode, vnode);
11537 }
11538
11539 if (array(children)) {
11540 for (i = 0; i < children.length; ++i) {
11541 var ch = children[i];
11542
11543 if (ch != null) {
11544 api.appendChild(elm, createElm(ch, insertedVnodeQueue));
11545 }
11546 }
11547 } else if (primitive(vnode.text)) {
11548 api.appendChild(elm, api.createTextNode(vnode.text));
11549 }
11550
11551 i = vnode.data.hook; // Reuse variable
11552
11553 if (isDef(i)) {
11554 if (i.create) i.create(emptyNode, vnode);
11555 if (i.insert) insertedVnodeQueue.push(vnode);
11556 }
11557 } else {
11558 vnode.elm = api.createTextNode(vnode.text);
11559 }
11560
11561 return vnode.elm;
11562 }
11563
11564 function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
11565 for (; startIdx <= endIdx; ++startIdx) {
11566 var ch = vnodes[startIdx];
11567
11568 if (ch != null) {
11569 api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
11570 }
11571 }
11572 }
11573
11574 function invokeDestroyHook(vnode) {
11575 var i,
11576 j,
11577 data = vnode.data;
11578
11579 if (data !== undefined) {
11580 if (isDef(i = data.hook) && isDef(i = i.destroy)) i(vnode);
11581
11582 for (i = 0; i < cbs.destroy.length; ++i) {
11583 cbs.destroy[i](vnode);
11584 }
11585
11586 if (vnode.children !== undefined) {
11587 for (j = 0; j < vnode.children.length; ++j) {
11588 i = vnode.children[j];
11589
11590 if (i != null && typeof i !== "string") {
11591 invokeDestroyHook(i);
11592 }
11593 }
11594 }
11595 }
11596 }
11597
11598 function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
11599 for (; startIdx <= endIdx; ++startIdx) {
11600 var i_1 = void 0,
11601 listeners = void 0,
11602 rm = void 0,
11603 ch = vnodes[startIdx];
11604
11605 if (ch != null) {
11606 if (isDef(ch.sel)) {
11607 invokeDestroyHook(ch);
11608 listeners = cbs.remove.length + 1;
11609 rm = createRmCb(ch.elm, listeners);
11610
11611 for (i_1 = 0; i_1 < cbs.remove.length; ++i_1) {
11612 cbs.remove[i_1](ch, rm);
11613 }
11614
11615 if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
11616 i_1(ch, rm);
11617 } else {
11618 rm();
11619 }
11620 } else {
11621 api.removeChild(parentElm, ch.elm);
11622 }
11623 }
11624 }
11625 }
11626
11627 function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
11628 var oldStartIdx = 0,
11629 newStartIdx = 0;
11630 var oldEndIdx = oldCh.length - 1;
11631 var oldStartVnode = oldCh[0];
11632 var oldEndVnode = oldCh[oldEndIdx];
11633 var newEndIdx = newCh.length - 1;
11634 var newStartVnode = newCh[0];
11635 var newEndVnode = newCh[newEndIdx];
11636 var oldKeyToIdx;
11637 var idxInOld;
11638 var elmToMove;
11639 var before;
11640
11641 while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
11642 if (oldStartVnode == null) {
11643 oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
11644 } else if (oldEndVnode == null) {
11645 oldEndVnode = oldCh[--oldEndIdx];
11646 } else if (newStartVnode == null) {
11647 newStartVnode = newCh[++newStartIdx];
11648 } else if (newEndVnode == null) {
11649 newEndVnode = newCh[--newEndIdx];
11650 } else if (sameVnode(oldStartVnode, newStartVnode)) {
11651 patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
11652 oldStartVnode = oldCh[++oldStartIdx];
11653 newStartVnode = newCh[++newStartIdx];
11654 } else if (sameVnode(oldEndVnode, newEndVnode)) {
11655 patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
11656 oldEndVnode = oldCh[--oldEndIdx];
11657 newEndVnode = newCh[--newEndIdx];
11658 } else if (sameVnode(oldStartVnode, newEndVnode)) {
11659 patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
11660 api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
11661 oldStartVnode = oldCh[++oldStartIdx];
11662 newEndVnode = newCh[--newEndIdx];
11663 } else if (sameVnode(oldEndVnode, newStartVnode)) {
11664 patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
11665 api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
11666 oldEndVnode = oldCh[--oldEndIdx];
11667 newStartVnode = newCh[++newStartIdx];
11668 } else {
11669 if (oldKeyToIdx === undefined) {
11670 oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
11671 }
11672
11673 idxInOld = oldKeyToIdx[newStartVnode.key];
11674
11675 if (isUndef(idxInOld)) {
11676 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
11677 newStartVnode = newCh[++newStartIdx];
11678 } else {
11679 elmToMove = oldCh[idxInOld];
11680
11681 if (elmToMove.sel !== newStartVnode.sel) {
11682 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
11683 } else {
11684 patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
11685 oldCh[idxInOld] = undefined;
11686 api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
11687 }
11688
11689 newStartVnode = newCh[++newStartIdx];
11690 }
11691 }
11692 }
11693
11694 if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
11695 if (oldStartIdx > oldEndIdx) {
11696 before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
11697 addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
11698 } else {
11699 removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
11700 }
11701 }
11702 }
11703
11704 function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
11705 var i, hook;
11706
11707 if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
11708 i(oldVnode, vnode);
11709 }
11710
11711 var elm = vnode.elm = oldVnode.elm;
11712 var oldCh = oldVnode.children;
11713 var ch = vnode.children;
11714 if (oldVnode === vnode) return;
11715
11716 if (vnode.data !== undefined) {
11717 for (i = 0; i < cbs.update.length; ++i) {
11718 cbs.update[i](oldVnode, vnode);
11719 }
11720
11721 i = vnode.data.hook;
11722 if (isDef(i) && isDef(i = i.update)) i(oldVnode, vnode);
11723 }
11724
11725 if (isUndef(vnode.text)) {
11726 if (isDef(oldCh) && isDef(ch)) {
11727 if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);
11728 } else if (isDef(ch)) {
11729 if (isDef(oldVnode.text)) api.setTextContent(elm, '');
11730 addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
11731 } else if (isDef(oldCh)) {
11732 removeVnodes(elm, oldCh, 0, oldCh.length - 1);
11733 } else if (isDef(oldVnode.text)) {
11734 api.setTextContent(elm, '');
11735 }
11736 } else if (oldVnode.text !== vnode.text) {
11737 api.setTextContent(elm, vnode.text);
11738 }
11739
11740 if (isDef(hook) && isDef(i = hook.postpatch)) {
11741 i(oldVnode, vnode);
11742 }
11743 }
11744
11745 return function patch(oldVnode, vnode) {
11746 var i, elm, parent;
11747 var insertedVnodeQueue = [];
11748
11749 for (i = 0; i < cbs.pre.length; ++i) {
11750 cbs.pre[i]();
11751 }
11752
11753 if (!isVnode(oldVnode)) {
11754 oldVnode = emptyNodeAt(oldVnode);
11755 }
11756
11757 if (sameVnode(oldVnode, vnode)) {
11758 patchVnode(oldVnode, vnode, insertedVnodeQueue);
11759 } else {
11760 elm = oldVnode.elm;
11761 parent = api.parentNode(elm);
11762 createElm(vnode, insertedVnodeQueue);
11763
11764 if (parent !== null) {
11765 api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
11766 removeVnodes(parent, [oldVnode], 0, 0);
11767 }
11768 }
11769
11770 for (i = 0; i < insertedVnodeQueue.length; ++i) {
11771 insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
11772 }
11773
11774 for (i = 0; i < cbs.post.length; ++i) {
11775 cbs.post[i]();
11776 }
11777
11778 return vnode;
11779 };
11780 }
11781
11782 var xlinkNS = 'http://www.w3.org/1999/xlink';
11783 var xmlNS = 'http://www.w3.org/XML/1998/namespace';
11784 var colonChar = 58;
11785 var xChar = 120;
11786
11787 function updateAttrs(oldVnode, vnode) {
11788 var key,
11789 elm = vnode.elm,
11790 oldAttrs = oldVnode.data.attrs,
11791 attrs = vnode.data.attrs;
11792 if (!oldAttrs && !attrs) return;
11793 if (oldAttrs === attrs) return;
11794 oldAttrs = oldAttrs || {};
11795 attrs = attrs || {}; // update modified attributes, add new attributes
11796
11797 for (key in attrs) {
11798 var cur = attrs[key];
11799 var old = oldAttrs[key];
11800
11801 if (old !== cur) {
11802 if (cur === true) {
11803 elm.setAttribute(key, "");
11804 } else if (cur === false) {
11805 elm.removeAttribute(key);
11806 } else {
11807 if (key.charCodeAt(0) !== xChar) {
11808 elm.setAttribute(key, cur);
11809 } else if (key.charCodeAt(3) === colonChar) {
11810 // Assume xml namespace
11811 elm.setAttributeNS(xmlNS, key, cur);
11812 } else if (key.charCodeAt(5) === colonChar) {
11813 // Assume xlink namespace
11814 elm.setAttributeNS(xlinkNS, key, cur);
11815 } else {
11816 elm.setAttribute(key, cur);
11817 }
11818 }
11819 }
11820 } // remove removed attributes
11821 // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
11822 // the other option is to remove all attributes with value == undefined
11823
11824
11825 for (key in oldAttrs) {
11826 if (!(key in attrs)) {
11827 elm.removeAttribute(key);
11828 }
11829 }
11830 }
11831
11832 var attributesModule = {
11833 create: updateAttrs,
11834 update: updateAttrs
11835 };
11836
11837 function updateProps(oldVnode, vnode) {
11838 var key,
11839 cur,
11840 old,
11841 elm = vnode.elm,
11842 oldProps = oldVnode.data.props,
11843 props = vnode.data.props;
11844 if (!oldProps && !props) return;
11845 if (oldProps === props) return;
11846 oldProps = oldProps || {};
11847 props = props || {};
11848
11849 for (key in oldProps) {
11850 if (!props[key]) {
11851 delete elm[key];
11852 }
11853 }
11854
11855 for (key in props) {
11856 cur = props[key];
11857 old = oldProps[key];
11858
11859 if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
11860 elm[key] = cur;
11861 }
11862 }
11863 }
11864
11865 var propsModule = {
11866 create: updateProps,
11867 update: updateProps
11868 };
11869
11870 var raf = typeof window !== 'undefined' && window.requestAnimationFrame || setTimeout;
11871
11872 var nextFrame$1 = function nextFrame(fn) {
11873 raf(function () {
11874 raf(fn);
11875 });
11876 };
11877
11878 function setNextFrame(obj, prop, val) {
11879 nextFrame$1(function () {
11880 obj[prop] = val;
11881 });
11882 }
11883
11884 function updateStyle(oldVnode, vnode) {
11885 var cur,
11886 name,
11887 elm = vnode.elm,
11888 oldStyle = oldVnode.data.style,
11889 style = vnode.data.style;
11890 if (!oldStyle && !style) return;
11891 if (oldStyle === style) return;
11892 oldStyle = oldStyle || {};
11893 style = style || {};
11894 var oldHasDel = ('delayed' in oldStyle);
11895
11896 for (name in oldStyle) {
11897 if (!style[name]) {
11898 if (name[0] === '-' && name[1] === '-') {
11899 elm.style.removeProperty(name);
11900 } else {
11901 elm.style[name] = '';
11902 }
11903 }
11904 }
11905
11906 for (name in style) {
11907 cur = style[name];
11908
11909 if (name === 'delayed' && style.delayed) {
11910 for (var name2 in style.delayed) {
11911 cur = style.delayed[name2];
11912
11913 if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
11914 setNextFrame(elm.style, name2, cur);
11915 }
11916 }
11917 } else if (name !== 'remove' && cur !== oldStyle[name]) {
11918 if (name[0] === '-' && name[1] === '-') {
11919 elm.style.setProperty(name, cur);
11920 } else {
11921 elm.style[name] = cur;
11922 }
11923 }
11924 }
11925 }
11926
11927 function applyDestroyStyle(vnode) {
11928 var style,
11929 name,
11930 elm = vnode.elm,
11931 s = vnode.data.style;
11932 if (!s || !(style = s.destroy)) return;
11933
11934 for (name in style) {
11935 elm.style[name] = style[name];
11936 }
11937 }
11938
11939 function applyRemoveStyle(vnode, rm) {
11940 var s = vnode.data.style;
11941
11942 if (!s || !s.remove) {
11943 rm();
11944 return;
11945 }
11946
11947 var name,
11948 elm = vnode.elm,
11949 i = 0,
11950 compStyle,
11951 style = s.remove,
11952 amount = 0,
11953 applied = [];
11954
11955 for (name in style) {
11956 applied.push(name);
11957 elm.style[name] = style[name];
11958 }
11959
11960 compStyle = getComputedStyle(elm);
11961 var props = compStyle['transition-property'].split(', ');
11962
11963 for (; i < props.length; ++i) {
11964 if (applied.indexOf(props[i]) !== -1) amount++;
11965 }
11966
11967 elm.addEventListener('transitionend', function (ev) {
11968 if (ev.target === elm) --amount;
11969 if (amount === 0) rm();
11970 });
11971 }
11972
11973 var styleModule = {
11974 create: updateStyle,
11975 update: updateStyle,
11976 destroy: applyDestroyStyle,
11977 remove: applyRemoveStyle
11978 };
11979
11980 function invokeHandler(handler, event, args) {
11981 if (typeof handler === 'function') {
11982 // call function handler
11983 handler.apply(void 0, [event].concat(args));
11984 }
11985 }
11986
11987 function handleEvent(event, args, vnode) {
11988 var name = event.type;
11989 var on = vnode.data.on; // call event handler(s) if exists
11990
11991 if (on && on[name]) {
11992 invokeHandler(on[name], event, args);
11993 }
11994 }
11995
11996 function createListener() {
11997 return function handler(event) {
11998 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
11999 args[_key - 1] = arguments[_key];
12000 }
12001
12002 handleEvent(event, args, handler.vnode);
12003 };
12004 }
12005
12006 function updateEvents(oldVnode, vnode) {
12007 var oldOn = oldVnode.data.on;
12008 var oldListener = oldVnode.listener;
12009 var oldElm = oldVnode.elm;
12010 var on = vnode && vnode.data.on;
12011 var elm = vnode && vnode.elm; // optimization for reused immutable handlers
12012
12013 if (oldOn === on) {
12014 return;
12015 } // remove existing listeners which no longer used
12016
12017
12018 if (oldOn && oldListener) {
12019 // if element changed or deleted we remove all existing listeners unconditionally
12020 if (!on) {
12021 Object.keys(oldOn).forEach(function (name) {
12022 $$1(oldElm).off(name, oldListener);
12023 });
12024 } else {
12025 Object.keys(oldOn).forEach(function (name) {
12026 if (!on[name]) {
12027 $$1(oldElm).off(name, oldListener);
12028 }
12029 });
12030 }
12031 } // add new listeners which has not already attached
12032
12033
12034 if (on) {
12035 // reuse existing listener or create new
12036 var listener = oldVnode.listener || createListener();
12037 vnode.listener = listener; // update vnode for listener
12038
12039 listener.vnode = vnode; // if element changed or added we add all needed listeners unconditionally
12040
12041 if (!oldOn) {
12042 Object.keys(on).forEach(function (name) {
12043 $$1(elm).on(name, listener);
12044 });
12045 } else {
12046 Object.keys(on).forEach(function (name) {
12047 if (!oldOn[name]) {
12048 $$1(elm).on(name, listener);
12049 }
12050 });
12051 }
12052 }
12053 }
12054
12055 var eventListenersModule = {
12056 create: updateEvents,
12057 update: updateEvents,
12058 destroy: updateEvents
12059 };
12060
12061 /* eslint import/no-named-as-default: off */
12062 var patch = init([attributesModule, propsModule, styleModule, eventListenersModule]);
12063
12064 /* eslint no-underscore-dangle: "off" */
12065
12066 var Component = /*#__PURE__*/function () {
12067 function Component(app, component, props, _temp) {
12068 var _this = this;
12069
12070 if (props === void 0) {
12071 props = {};
12072 }
12073
12074 var _ref = _temp === void 0 ? {} : _temp,
12075 el = _ref.el,
12076 context = _ref.context,
12077 children = _ref.children;
12078
12079 var document = getDocument();
12080 merge(this, {
12081 f7: app,
12082 props: props || {},
12083 context: context || {},
12084 id: component.id || id(),
12085 children: children || [],
12086 theme: {
12087 ios: app.theme === 'ios',
12088 md: app.theme === 'md',
12089 aurora: app.theme === 'aurora'
12090 },
12091 style: component.style,
12092 __storeCallbacks: [],
12093 __updateQueue: [],
12094 __eventHandlers: [],
12095 __onceEventHandlers: [],
12096 __onBeforeMount: [],
12097 __onMounted: [],
12098 __onBeforeUpdate: [],
12099 __onUpdated: [],
12100 __onBeforeUnmount: [],
12101 __onUnmounted: []
12102 });
12103
12104 var createComponent = function createComponent() {
12105 return component(_this.props, _this.getComponentContext(true));
12106 };
12107
12108 var getRenderFuncion = function getRenderFuncion(componentResult) {
12109 return new Promise(function (resolve, reject) {
12110 if (typeof componentResult === 'function') {
12111 resolve(componentResult);
12112 } else if (componentResult instanceof Promise) {
12113 componentResult.then(function (render) {
12114 resolve(render);
12115 }).catch(function (err) {
12116 reject(err);
12117 });
12118 } else {
12119 reject(new Error('Framework7: Component render function is not a "function" type. Didn\'t you forget to "return $render"?'));
12120 }
12121 });
12122 };
12123
12124 return new Promise(function (resolve, reject) {
12125 var componentResult = createComponent();
12126 getRenderFuncion(componentResult).then(function (render) {
12127 _this.renderFunction = render;
12128
12129 var tree = _this.render();
12130
12131 if (el) {
12132 _this.vnode = vdom(tree, _this, true);
12133
12134 if (_this.style) {
12135 _this.styleEl = document.createElement('style');
12136 _this.styleEl.innerHTML = _this.style;
12137 }
12138
12139 _this.el = el;
12140 patch(_this.el, _this.vnode);
12141 _this.el = _this.vnode.elm;
12142 _this.$el = $$1(_this.el);
12143
12144 _this.attachEvents();
12145
12146 _this.el.f7Component = _this;
12147
12148 _this.mount();
12149
12150 resolve(_this);
12151 return;
12152 } // Make Dom
12153
12154
12155 if (tree) {
12156 _this.vnode = vdom(tree, _this, true);
12157 _this.el = document.createElement(_this.vnode.sel || 'div');
12158 patch(_this.el, _this.vnode);
12159 _this.$el = $$1(_this.el);
12160 }
12161
12162 if (_this.style) {
12163 _this.styleEl = document.createElement('style');
12164 _this.styleEl.innerHTML = _this.style;
12165 }
12166
12167 _this.attachEvents();
12168
12169 if (_this.el) {
12170 _this.el.f7Component = _this;
12171 }
12172
12173 resolve(_this);
12174 }).catch(function (err) {
12175 reject(err);
12176 });
12177 });
12178 }
12179
12180 var _proto = Component.prototype;
12181
12182 _proto.on = function on(eventName, handler) {
12183 if (!this.__eventHandlers) return;
12184
12185 this.__eventHandlers.push({
12186 eventName: eventName,
12187 handler: handler
12188 });
12189 };
12190
12191 _proto.once = function once(eventName, handler) {
12192 if (!this.__eventHandlers) return;
12193
12194 this.__onceEventHandlers.push({
12195 eventName: eventName,
12196 handler: handler
12197 });
12198 };
12199
12200 _proto.getComponentStore = function getComponentStore() {
12201 var _this2 = this;
12202
12203 var _this$f7$store = this.f7.store,
12204 state = _this$f7$store.state,
12205 getters = _this$f7$store.getters,
12206 dispatch = _this$f7$store.dispatch;
12207 var $store = {
12208 state: state,
12209 dispatch: dispatch
12210 };
12211 $store.getters = new Proxy(getters, {
12212 get: function get(target, prop) {
12213 var obj = target[prop];
12214
12215 var callback = function callback() {
12216 _this2.update();
12217 };
12218
12219 obj.onUpdated(callback);
12220
12221 _this2.__storeCallbacks.push(callback, obj.__callback);
12222
12223 return obj;
12224 }
12225 });
12226 return $store;
12227 };
12228
12229 _proto.getComponentContext = function getComponentContext(includeHooks) {
12230 var _this3 = this;
12231
12232 var ctx = {
12233 $f7route: this.context.f7route,
12234 $f7router: this.context.f7router,
12235 $h: $h,
12236 $: $$1,
12237 $id: this.id,
12238 $f7: this.f7,
12239 $f7ready: this.f7ready.bind(this),
12240 $theme: this.theme,
12241 $tick: this.tick.bind(this),
12242 $update: this.update.bind(this),
12243 $emit: this.emit.bind(this),
12244 $store: this.getComponentStore(),
12245 $el: {}
12246 };
12247 Object.defineProperty(ctx.$el, 'value', {
12248 get: function get() {
12249 return _this3.$el;
12250 }
12251 });
12252 if (includeHooks) Object.assign(ctx, {
12253 $on: this.on.bind(this),
12254 $once: this.once.bind(this),
12255 $onBeforeMount: function $onBeforeMount(handler) {
12256 return _this3.__onBeforeMount.push(handler);
12257 },
12258 $onMounted: function $onMounted(handler) {
12259 return _this3.__onMounted.push(handler);
12260 },
12261 $onBeforeUpdate: function $onBeforeUpdate(handler) {
12262 return _this3.__onBeforeUpdate.push(handler);
12263 },
12264 $onUpdated: function $onUpdated(handler) {
12265 return _this3.__onUpdated.push(handler);
12266 },
12267 $onBeforeUnmount: function $onBeforeUnmount(handler) {
12268 return _this3.__onBeforeUnmount.push(handler);
12269 },
12270 $onUnmounted: function $onUnmounted(handler) {
12271 return _this3.__onUnmounted.push(handler);
12272 }
12273 });
12274 return ctx;
12275 };
12276
12277 _proto.render = function render() {
12278 return this.renderFunction(this.getComponentContext());
12279 };
12280
12281 _proto.emit = function emit(name, data) {
12282 if (!this.el) return;
12283 this.$el.trigger(name, data);
12284 };
12285
12286 _proto.attachEvents = function attachEvents() {
12287 var $el = this.$el;
12288 if (!this.__eventHandlers) return;
12289
12290 this.__eventHandlers.forEach(function (_ref2) {
12291 var eventName = _ref2.eventName,
12292 handler = _ref2.handler;
12293 $el.on(eventNameToColonCase(eventName), handler);
12294 });
12295
12296 this.__onceEventHandlers.forEach(function (_ref3) {
12297 var eventName = _ref3.eventName,
12298 handler = _ref3.handler;
12299 $el.once(eventNameToColonCase(eventName), handler);
12300 });
12301 };
12302
12303 _proto.detachEvents = function detachEvents() {
12304 var $el = this.$el;
12305 if (!this.__eventHandlers) return;
12306
12307 this.__eventHandlers.forEach(function (_ref4) {
12308 var eventName = _ref4.eventName,
12309 handler = _ref4.handler;
12310 $el.on(eventNameToColonCase(eventName), handler);
12311 });
12312
12313 this.__onceEventHandlers.forEach(function (_ref5) {
12314 var eventName = _ref5.eventName,
12315 handler = _ref5.handler;
12316 $el.once(eventNameToColonCase(eventName), handler);
12317 });
12318 };
12319
12320 _proto.startUpdateQueue = function startUpdateQueue() {
12321 var _this4 = this;
12322
12323 var window = getWindow();
12324 if (this.__requestAnimationFrameId) return;
12325
12326 var update = function update() {
12327 _this4.hook('onBeforeUpdate');
12328
12329 var tree = _this4.render(); // Make Dom
12330
12331
12332 if (tree) {
12333 var newVNode = vdom(tree, _this4, false);
12334 _this4.vnode = patch(_this4.vnode, newVNode);
12335 }
12336 };
12337
12338 this.__requestAnimationFrameId = window.requestAnimationFrame(function () {
12339 if (_this4.__updateIsPending) update();
12340 var resolvers = [].concat(_this4.__updateQueue);
12341 _this4.__updateQueue = [];
12342 _this4.__updateIsPending = false;
12343 window.cancelAnimationFrame(_this4.__requestAnimationFrameId);
12344 delete _this4.__requestAnimationFrameId;
12345 delete _this4.__updateIsPending;
12346 resolvers.forEach(function (resolver) {
12347 return resolver();
12348 });
12349 resolvers = [];
12350 });
12351 };
12352
12353 _proto.tick = function tick(callback) {
12354 var _this5 = this;
12355
12356 return new Promise(function (resolve) {
12357 function resolver() {
12358 resolve();
12359 if (callback) callback();
12360 }
12361
12362 _this5.__updateQueue.push(resolver);
12363
12364 _this5.startUpdateQueue();
12365 });
12366 };
12367
12368 _proto.update = function update(callback) {
12369 var _this6 = this;
12370
12371 if (this.__destroyed) return new Promise(function () {});
12372 return new Promise(function (resolve) {
12373 var resolver = function resolver() {
12374 resolve();
12375 if (callback) callback();
12376 };
12377
12378 _this6.__updateIsPending = true;
12379
12380 _this6.__updateQueue.push(resolver);
12381
12382 _this6.startUpdateQueue();
12383 });
12384 };
12385
12386 _proto.setState = function setState(callback) {
12387 return this.update(callback);
12388 };
12389
12390 _proto.f7ready = function f7ready(callback) {
12391 var _this7 = this;
12392
12393 if (this.f7.initialized) {
12394 callback(this.f7);
12395 return;
12396 }
12397
12398 this.f7.once('init', function () {
12399 callback(_this7.f7);
12400 });
12401 };
12402
12403 _proto.mount = function mount(mountMethod) {
12404 this.hook('onBeforeMount', this.$el);
12405 if (this.styleEl) $$1('head').append(this.styleEl);
12406 if (mountMethod) mountMethod(this.el);
12407 this.hook('onMounted', this.$el);
12408 };
12409
12410 _proto.destroy = function destroy() {
12411 var _this8 = this;
12412
12413 if (this.__destroyed) return;
12414 var window = getWindow();
12415 this.hook('onBeforeUnmount');
12416 if (this.styleEl) $$1(this.styleEl).remove();
12417 this.detachEvents();
12418 this.hook('onUnmounted'); // Delete component instance
12419
12420 if (this.el && this.el.f7Component) {
12421 this.el.f7Component = null;
12422 delete this.el.f7Component;
12423 } // Patch with empty node
12424
12425
12426 if (this.vnode) {
12427 this.vnode = patch(this.vnode, {
12428 sel: this.vnode.sel,
12429 data: {}
12430 });
12431 } // Clear update queue
12432
12433
12434 window.cancelAnimationFrame(this.__requestAnimationFrameId);
12435
12436 this.__storeCallbacks.forEach(function (callback) {
12437 _this8.f7.store.__removeCallback(callback);
12438 });
12439
12440 this.__storeCallbacks = [];
12441 this.__updateQueue = [];
12442 this.__eventHandlers = [];
12443 this.__onceEventHandlers = [];
12444 this.__onBeforeMount = [];
12445 this.__onMounted = [];
12446 this.__onBeforeUpdate = [];
12447 this.__onUpdated = [];
12448 this.__onBeforeUnmount = [];
12449 this.__onUnmounted = []; // Delete all props
12450
12451 deleteProps(this);
12452 this.__destroyed = true;
12453 };
12454
12455 _proto.hook = function hook(name) {
12456 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
12457 args[_key - 1] = arguments[_key];
12458 }
12459
12460 if (this.__destroyed) return;
12461 this["__" + name].forEach(function (handler) {
12462 handler.apply(void 0, args);
12463 });
12464 };
12465
12466 return Component;
12467 }();
12468
12469 function parseComponent(componentString) {
12470 var window = getWindow();
12471 var document = getDocument();
12472 var componentId = id();
12473 var callbackCreateName = "f7_component_create_callback_" + componentId; // Template
12474
12475 var template;
12476 var hasTemplate = componentString.match(/<template([ ]?)([a-z0-9-]*)>/);
12477
12478 if (hasTemplate) {
12479 template = componentString.split(/<template[ ]?[a-z0-9-]*>/).filter(function (item, index) {
12480 return index > 0;
12481 }).join('<template>').split('</template>').filter(function (item, index, arr) {
12482 return index < arr.length - 1;
12483 }).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');
12484 } // Parse Styles
12485
12486
12487 var style = null;
12488
12489 if (componentString.indexOf('<style>') >= 0) {
12490 style = componentString.split('<style>')[1].split('</style>')[0];
12491 }
12492
12493 if (componentString.indexOf('<style scoped>') >= 0) {
12494 style = componentString.split('<style scoped>')[1].split('</style>')[0];
12495 } // Parse Script
12496
12497
12498 var scriptContent;
12499
12500 if (componentString.indexOf('<script>') >= 0) {
12501 var scripts = componentString.split('<script>');
12502 scriptContent = scripts[scripts.length - 1].split('</script>')[0].trim();
12503 } else {
12504 scriptContent = 'return () => {return $render}';
12505 }
12506
12507 if (!scriptContent || !scriptContent.trim()) scriptContent = 'return () => {return $render}'; // Parse Template
12508
12509 if (template) {
12510 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');
12511 } // Execute Script
12512
12513
12514 scriptContent = "window." + callbackCreateName + " = function () {" + scriptContent + "}"; // Insert Script El
12515
12516 var scriptEl = document.createElement('script');
12517 scriptEl.innerHTML = scriptContent;
12518 $$1('head').append(scriptEl);
12519 var component = window[callbackCreateName](); // Remove Script El
12520
12521 $$1(scriptEl).remove();
12522 window[callbackCreateName] = null;
12523 delete window[callbackCreateName]; // Assign Style
12524
12525 if (style) {
12526 component.style = style;
12527 } // Component ID
12528
12529
12530 component.id = componentId;
12531 return component;
12532 }
12533
12534 function registerComponent(tagName, component) {
12535 customComponents[tagName] = component;
12536 }
12537
12538 function unregisterComponent(tagName) {
12539 delete customComponents[tagName];
12540 }
12541 var ComponentModule = {
12542 name: 'component',
12543 static: {
12544 Component: Component,
12545 registerComponent: registerComponent,
12546 unregisterComponent: unregisterComponent
12547 },
12548 create: function create() {
12549 var app = this;
12550 app.component = {
12551 registerComponent: registerComponent,
12552 unregisterComponent: unregisterComponent,
12553 parse: function parse(componentString) {
12554 return parseComponent(componentString);
12555 },
12556 create: function create(component, props, _ref) {
12557 var root = _ref.root,
12558 el = _ref.el,
12559 context = _ref.context,
12560 children = _ref.children;
12561 return new Component(app, component, props, {
12562 root: root,
12563 el: el,
12564 context: context,
12565 children: children
12566 });
12567 }
12568 };
12569 }
12570 };
12571
12572 var HistoryModule = {
12573 name: 'history',
12574 static: {
12575 history: History
12576 },
12577 on: {
12578 init: function init() {
12579 History.init(this);
12580 }
12581 }
12582 };
12583
12584 var SW = {
12585 registrations: [],
12586 register: function register(path, scope) {
12587 var app = this;
12588 var window = getWindow();
12589
12590 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
12591 return new Promise(function (resolve, reject) {
12592 reject(new Error('Service worker is not supported'));
12593 });
12594 }
12595
12596 return new Promise(function (resolve, reject) {
12597 app.serviceWorker.container.register(path, scope ? {
12598 scope: scope
12599 } : {}).then(function (reg) {
12600 SW.registrations.push(reg);
12601 app.emit('serviceWorkerRegisterSuccess', reg);
12602 resolve(reg);
12603 }).catch(function (error) {
12604 app.emit('serviceWorkerRegisterError', error);
12605 reject(error);
12606 });
12607 });
12608 },
12609 unregister: function unregister(registration) {
12610 var app = this;
12611 var window = getWindow();
12612
12613 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
12614 return new Promise(function (resolve, reject) {
12615 reject(new Error('Service worker is not supported'));
12616 });
12617 }
12618
12619 var registrations;
12620 if (!registration) registrations = SW.registrations;else if (Array.isArray(registration)) registrations = registration;else registrations = [registration];
12621 return Promise.all(registrations.map(function (reg) {
12622 return new Promise(function (resolve, reject) {
12623 reg.unregister().then(function () {
12624 if (SW.registrations.indexOf(reg) >= 0) {
12625 SW.registrations.splice(SW.registrations.indexOf(reg), 1);
12626 }
12627
12628 app.emit('serviceWorkerUnregisterSuccess', reg);
12629 resolve();
12630 }).catch(function (error) {
12631 app.emit('serviceWorkerUnregisterError', reg, error);
12632 reject(error);
12633 });
12634 });
12635 }));
12636 }
12637 };
12638 var ServiceWorkerModule = {
12639 name: 'sw',
12640 params: {
12641 serviceWorker: {
12642 path: undefined,
12643 scope: undefined
12644 }
12645 },
12646 create: function create() {
12647 var app = this;
12648 var window = getWindow();
12649 extend$1(app, {
12650 serviceWorker: {
12651 container: 'serviceWorker' in window.navigator ? window.navigator.serviceWorker : undefined,
12652 registrations: SW.registrations,
12653 register: SW.register.bind(app),
12654 unregister: SW.unregister.bind(app)
12655 }
12656 });
12657 },
12658 on: {
12659 init: function init() {
12660 var window = getWindow();
12661 if (!('serviceWorker' in window.navigator)) return;
12662 var app = this;
12663 if (app.device.cordova || window.Capacitor && window.Capacitor.isNative) return;
12664 if (!app.serviceWorker.container) return;
12665 var paths = app.params.serviceWorker.path;
12666 var scope = app.params.serviceWorker.scope;
12667 if (!paths || Array.isArray(paths) && !paths.length) return;
12668 var toRegister = Array.isArray(paths) ? paths : [paths];
12669 toRegister.forEach(function (path) {
12670 app.serviceWorker.register(path, scope);
12671 });
12672 }
12673 }
12674 };
12675
12676 function createStore(storeParams) {
12677 if (storeParams === void 0) {
12678 storeParams = {};
12679 }
12680
12681 var store = {
12682 __store: true
12683 };
12684
12685 var originalState = _extends({}, storeParams.state || {});
12686
12687 var actions = _extends({}, storeParams.actions || {});
12688
12689 var getters = _extends({}, storeParams.getters || {});
12690
12691 var state = extend$1({}, originalState);
12692 var propsQueue = [];
12693 var gettersDependencies = {};
12694 var gettersCallbacks = {};
12695 Object.keys(getters).forEach(function (key) {
12696 gettersDependencies[key] = [];
12697 gettersCallbacks[key] = [];
12698 });
12699
12700 var addGetterDependencies = function addGetterDependencies(key, deps) {
12701 if (!gettersDependencies[key]) gettersDependencies[key] = [];
12702 deps.forEach(function (dep) {
12703 if (gettersDependencies[key].indexOf(dep) < 0) {
12704 gettersDependencies[key].push(dep);
12705 }
12706 });
12707 };
12708
12709 var addGetterCallback = function addGetterCallback(key, callback) {
12710 if (!gettersCallbacks[key]) gettersCallbacks[key] = [];
12711 gettersCallbacks[key].push(callback);
12712 };
12713
12714 var runGetterCallbacks = function runGetterCallbacks(stateKey, value) {
12715 var keys = Object.keys(gettersDependencies).filter(function (getterKey) {
12716 return gettersDependencies[getterKey].indexOf(stateKey) >= 0;
12717 });
12718 keys.forEach(function (getterKey) {
12719 if (!gettersCallbacks[getterKey] || !gettersCallbacks[getterKey].length) return;
12720 gettersCallbacks[getterKey].forEach(function (callback) {
12721 callback(value);
12722 });
12723 });
12724 };
12725
12726 var removeGetterCallback = function removeGetterCallback(callback) {
12727 Object.keys(gettersCallbacks).forEach(function (key) {
12728 var callbacks = gettersCallbacks[key];
12729
12730 if (callbacks.indexOf(callback) >= 0) {
12731 callbacks.splice(callbacks.indexOf(callback), 1);
12732 }
12733 });
12734 }; // eslint-disable-next-line
12735
12736
12737 store.__removeCallback = function (callback) {
12738 removeGetterCallback(callback);
12739 };
12740
12741 var getterValue = function getterValue(key) {
12742 if (key === 'constructor') return;
12743 propsQueue = [];
12744 var value = getters[key]({
12745 state: store.state
12746 });
12747 addGetterDependencies(key, propsQueue);
12748
12749 var onUpdated = function onUpdated(callback) {
12750 addGetterCallback(key, callback);
12751 };
12752
12753 var obj = {
12754 value: value,
12755 onUpdated: onUpdated
12756 };
12757
12758 var callback = function callback(v) {
12759 obj.value = v;
12760 };
12761
12762 obj.__callback = callback;
12763 addGetterCallback(key, callback); // eslint-disable-next-line
12764
12765 return obj;
12766 };
12767
12768 store.state = new Proxy(state, {
12769 set: function set(target, prop, value) {
12770 target[prop] = value;
12771 runGetterCallbacks(prop, value);
12772 return true;
12773 },
12774 get: function get(target, prop) {
12775 propsQueue.push(prop);
12776 return target[prop];
12777 }
12778 });
12779 store.getters = new Proxy(getters, {
12780 set: function set() {
12781 return false;
12782 },
12783 get: function get(target, prop) {
12784 if (!target[prop]) {
12785 return undefined;
12786 }
12787
12788 return getterValue(prop);
12789 }
12790 });
12791
12792 store.dispatch = function (actionName, data) {
12793 return new Promise(function (resolve, reject) {
12794 if (!actions[actionName]) {
12795 reject();
12796 throw new Error("Framework7: Store action \"" + actionName + "\" is not found");
12797 }
12798
12799 var result = actions[actionName]({
12800 state: store.state,
12801 dispatch: store.dispatch
12802 }, data);
12803 resolve(result);
12804 });
12805 };
12806
12807 return store;
12808 }
12809
12810 var StoreModule = {
12811 name: 'store',
12812 static: {
12813 createStore: createStore
12814 },
12815 proto: {
12816 createStore: createStore
12817 }
12818 };
12819
12820 var isCapacitor = function isCapacitor() {
12821 var window = getWindow();
12822 return window.Capacitor && window.Capacitor.isNative && window.Capacitor.Plugins && window.Capacitor.Plugins.StatusBar;
12823 };
12824
12825 var Statusbar = {
12826 hide: function hide() {
12827 var window = getWindow();
12828 var device = getDevice();
12829
12830 if (device.cordova && window.StatusBar) {
12831 window.StatusBar.hide();
12832 }
12833
12834 if (isCapacitor()) {
12835 window.Capacitor.Plugins.StatusBar.hide();
12836 }
12837 },
12838 show: function show() {
12839 var window = getWindow();
12840 var device = getDevice();
12841
12842 if (device.cordova && window.StatusBar) {
12843 window.StatusBar.show();
12844 }
12845
12846 if (isCapacitor()) {
12847 window.Capacitor.Plugins.StatusBar.show();
12848 }
12849 },
12850 onClick: function onClick() {
12851 var app = this;
12852 var pageContent;
12853
12854 if ($$1('.popup.modal-in').length > 0) {
12855 // Check for opened popup
12856 pageContent = $$1('.popup.modal-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
12857 } else if ($$1('.panel.panel-in').length > 0) {
12858 // Check for opened panel
12859 pageContent = $$1('.panel.panel-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
12860 } else if ($$1('.views > .view.tab-active').length > 0) {
12861 // View in tab bar app layout
12862 pageContent = $$1('.views > .view.tab-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
12863 } else if ($$1('.views').length > 0) {
12864 pageContent = $$1('.views').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
12865 } else {
12866 pageContent = app.$el.children('.view').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
12867 }
12868
12869 if (pageContent && pageContent.length > 0) {
12870 // Check for tab
12871 if (pageContent.hasClass('tab')) {
12872 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
12873 }
12874
12875 if (pageContent.length > 0) pageContent.scrollTop(0, 300);
12876 }
12877 },
12878 setTextColor: function setTextColor(color) {
12879 var window = getWindow();
12880 var device = getDevice();
12881
12882 if (device.cordova && window.StatusBar) {
12883 if (color === 'white') {
12884 window.StatusBar.styleLightContent();
12885 } else {
12886 window.StatusBar.styleDefault();
12887 }
12888 }
12889
12890 if (isCapacitor()) {
12891 if (color === 'white') {
12892 window.Capacitor.Plugins.StatusBar.setStyle({
12893 style: 'DARK'
12894 });
12895 } else {
12896 window.Capacitor.Plugins.StatusBar.setStyle({
12897 style: 'LIGHT'
12898 });
12899 }
12900 }
12901 },
12902 setBackgroundColor: function setBackgroundColor(color) {
12903 var window = getWindow();
12904 var device = getDevice();
12905
12906 if (device.cordova && window.StatusBar) {
12907 window.StatusBar.backgroundColorByHexString(color);
12908 }
12909
12910 if (isCapacitor()) {
12911 window.Capacitor.Plugins.StatusBar.setBackgroundColor({
12912 color: color
12913 });
12914 }
12915 },
12916 isVisible: function isVisible() {
12917 var window = getWindow();
12918 var device = getDevice();
12919 return new Promise(function (resolve) {
12920 if (device.cordova && window.StatusBar) {
12921 resolve(window.StatusBar.isVisible);
12922 }
12923
12924 if (isCapacitor()) {
12925 window.Capacitor.Plugins.StatusBar.getInfo().then(function (info) {
12926 resolve(info.visible);
12927 });
12928 }
12929
12930 resolve(false);
12931 });
12932 },
12933 overlaysWebView: function overlaysWebView(overlays) {
12934 if (overlays === void 0) {
12935 overlays = true;
12936 }
12937
12938 var window = getWindow();
12939 var device = getDevice();
12940
12941 if (device.cordova && window.StatusBar) {
12942 window.StatusBar.overlaysWebView(overlays);
12943 }
12944
12945 if (isCapacitor()) {
12946 window.Capacitor.Plugins.StatusBar.setOverlaysWebView({
12947 overlay: overlays
12948 });
12949 }
12950 },
12951 init: function init() {
12952 var app = this;
12953 var window = getWindow();
12954 var device = getDevice();
12955 var params = app.params.statusbar;
12956 if (!params.enabled) return;
12957 var isCordova = device.cordova && window.StatusBar;
12958 var isCap = isCapacitor();
12959
12960 if (isCordova || isCap) {
12961 if (params.scrollTopOnClick) {
12962 $$1(window).on('statusTap', Statusbar.onClick.bind(app));
12963 }
12964
12965 if (device.ios) {
12966 if (params.iosOverlaysWebView) {
12967 Statusbar.overlaysWebView(true);
12968 } else {
12969 Statusbar.overlaysWebView(false);
12970 }
12971
12972 if (params.iosTextColor === 'white') {
12973 Statusbar.setTextColor('white');
12974 } else {
12975 Statusbar.setTextColor('black');
12976 }
12977 }
12978
12979 if (device.android) {
12980 if (params.androidOverlaysWebView) {
12981 Statusbar.overlaysWebView(true);
12982 } else {
12983 Statusbar.overlaysWebView(false);
12984 }
12985
12986 if (params.androidTextColor === 'white') {
12987 Statusbar.setTextColor('white');
12988 } else {
12989 Statusbar.setTextColor('black');
12990 }
12991 }
12992 }
12993
12994 if (params.iosBackgroundColor && device.ios) {
12995 Statusbar.setBackgroundColor(params.iosBackgroundColor);
12996 }
12997
12998 if (params.androidBackgroundColor && device.android) {
12999 Statusbar.setBackgroundColor(params.androidBackgroundColor);
13000 }
13001 }
13002 };
13003 var Statusbar$1 = {
13004 name: 'statusbar',
13005 params: {
13006 statusbar: {
13007 enabled: true,
13008 scrollTopOnClick: true,
13009 iosOverlaysWebView: true,
13010 iosTextColor: 'black',
13011 iosBackgroundColor: null,
13012 androidOverlaysWebView: false,
13013 androidTextColor: 'black',
13014 androidBackgroundColor: null
13015 }
13016 },
13017 create: function create() {
13018 var app = this;
13019 bindMethods(app, {
13020 statusbar: Statusbar
13021 });
13022 },
13023 on: {
13024 init: function init() {
13025 var app = this;
13026 Statusbar.init.call(app);
13027 }
13028 }
13029 };
13030
13031 function getCurrentView(app) {
13032 var $popoverView = $$1('.popover.modal-in .view');
13033 var $popupView = $$1('.popup.modal-in .view');
13034 var $panelView = $$1('.panel.panel-in .view');
13035 var $viewsEl = $$1('.views');
13036 if ($viewsEl.length === 0) $viewsEl = app.$el; // Find active view as tab
13037
13038 var $viewEl = $viewsEl.children('.view');
13039
13040 if ($viewEl.length === 0) {
13041 $viewEl = $viewsEl.children('.tabs').children('.view');
13042 } // Propably in tabs or split view
13043
13044
13045 if ($viewEl.length > 1) {
13046 if ($viewEl.hasClass('tab')) {
13047 // Tabs
13048 $viewEl = $viewsEl.children('.view.tab-active');
13049
13050 if ($viewEl.length === 0) {
13051 $viewEl = $viewsEl.children('.tabs').children('.view.tab-active');
13052 }
13053 }
13054 }
13055
13056 if ($popoverView.length > 0 && $popoverView[0].f7View) return $popoverView[0].f7View;
13057 if ($popupView.length > 0 && $popupView[0].f7View) return $popupView[0].f7View;
13058 if ($panelView.length > 0 && $panelView[0].f7View) return $panelView[0].f7View;
13059
13060 if ($viewEl.length > 0) {
13061 if ($viewEl.length === 1 && $viewEl[0].f7View) return $viewEl[0].f7View;
13062
13063 if ($viewEl.length > 1) {
13064 return app.views.main;
13065 }
13066 }
13067
13068 return undefined;
13069 }
13070
13071 var View$1 = {
13072 name: 'view',
13073 params: {
13074 view: {
13075 init: true,
13076 name: undefined,
13077 main: false,
13078 router: true,
13079 linksView: null,
13080 stackPages: false,
13081 xhrCache: true,
13082 xhrCacheIgnore: [],
13083 xhrCacheIgnoreGetParameters: false,
13084 xhrCacheDuration: 1000 * 60 * 10,
13085 // Ten minutes
13086 componentCache: true,
13087 preloadPreviousPage: true,
13088 allowDuplicateUrls: false,
13089 reloadPages: false,
13090 reloadDetail: false,
13091 masterDetailBreakpoint: 0,
13092 masterDetailResizable: false,
13093 removeElements: true,
13094 removeElementsWithTimeout: false,
13095 removeElementsTimeout: 0,
13096 restoreScrollTopOnBack: true,
13097 unloadTabContent: true,
13098 passRouteQueryToRequest: true,
13099 passRouteParamsToRequest: false,
13100 loadInitialPage: true,
13101 // Swipe Back
13102 iosSwipeBack: true,
13103 iosSwipeBackAnimateShadow: true,
13104 iosSwipeBackAnimateOpacity: true,
13105 iosSwipeBackActiveArea: 30,
13106 iosSwipeBackThreshold: 0,
13107 mdSwipeBack: false,
13108 mdSwipeBackAnimateShadow: true,
13109 mdSwipeBackAnimateOpacity: false,
13110 mdSwipeBackActiveArea: 30,
13111 mdSwipeBackThreshold: 0,
13112 auroraSwipeBack: false,
13113 auroraSwipeBackAnimateShadow: false,
13114 auroraSwipeBackAnimateOpacity: true,
13115 auroraSwipeBackActiveArea: 30,
13116 auroraSwipeBackThreshold: 0,
13117 // Push State
13118 browserHistory: false,
13119 browserHistoryRoot: undefined,
13120 browserHistoryAnimate: true,
13121 browserHistoryAnimateOnLoad: false,
13122 browserHistorySeparator: '#!',
13123 browserHistoryOnLoad: true,
13124 browserHistoryInitialMatch: false,
13125 browserHistoryStoreHistory: true,
13126 // Animate Pages
13127 animate: true,
13128 // iOS Dynamic Navbar
13129 iosDynamicNavbar: true,
13130 // Animate iOS Navbar Back Icon
13131 iosAnimateNavbarBackIcon: true,
13132 // Delays
13133 iosPageLoadDelay: 0,
13134 mdPageLoadDelay: 0,
13135 auroraPageLoadDelay: 0,
13136 // Routes hooks
13137 routesBeforeEnter: null,
13138 routesBeforeLeave: null
13139 }
13140 },
13141 static: {
13142 View: View
13143 },
13144 create: function create() {
13145 var app = this;
13146 extend$1(app, {
13147 views: extend$1([], {
13148 create: function create(el, params) {
13149 return new View(app, el, params);
13150 },
13151 get: function get(viewEl) {
13152 var $viewEl = $$1(viewEl);
13153 if ($viewEl.length && $viewEl[0].f7View) return $viewEl[0].f7View;
13154 return undefined;
13155 }
13156 })
13157 });
13158 Object.defineProperty(app.views, 'current', {
13159 enumerable: true,
13160 configurable: true,
13161 get: function get() {
13162 return getCurrentView(app);
13163 }
13164 }); // Alias
13165
13166 app.view = app.views;
13167 },
13168 on: {
13169 init: function init() {
13170 var app = this;
13171 $$1('.view-init').each(function (viewEl) {
13172 if (viewEl.f7View) return;
13173 var viewParams = $$1(viewEl).dataset();
13174 app.views.create(viewEl, viewParams);
13175 });
13176 },
13177 'modalOpen panelOpen': function onOpen(instance) {
13178 var app = this;
13179 instance.$el.find('.view-init').each(function (viewEl) {
13180 if (viewEl.f7View) return;
13181 var viewParams = $$1(viewEl).dataset();
13182 app.views.create(viewEl, viewParams);
13183 });
13184 },
13185 'modalBeforeDestroy panelBeforeDestroy': function onClose(instance) {
13186 if (!instance || !instance.$el) return;
13187 instance.$el.find('.view-init').each(function (viewEl) {
13188 var view = viewEl.f7View;
13189 if (!view) return;
13190 view.destroy();
13191 });
13192 }
13193 },
13194 vnode: {
13195 'view-init': {
13196 insert: function insert(vnode) {
13197 var app = this;
13198 var viewEl = vnode.elm;
13199 if (viewEl.f7View) return;
13200 var viewParams = $$1(viewEl).dataset();
13201 app.views.create(viewEl, viewParams);
13202 },
13203 destroy: function destroy(vnode) {
13204 var viewEl = vnode.elm;
13205 var view = viewEl.f7View;
13206 if (!view) return;
13207 view.destroy();
13208 }
13209 }
13210 }
13211 };
13212
13213 var Navbar = {
13214 size: function size(el) {
13215 var app = this;
13216 var $el = $$1(el);
13217
13218 if ($el.hasClass('navbars')) {
13219 $el = $el.children('.navbar').each(function (navbarEl) {
13220 app.navbar.size(navbarEl);
13221 });
13222 return;
13223 }
13224
13225 var $innerEl = $el.children('.navbar-inner');
13226 if (!$innerEl.length) return;
13227 var needCenterTitle = $innerEl.hasClass('navbar-inner-centered-title') || app.params.navbar[app.theme + "CenterTitle"];
13228 var needLeftTitle = app.theme === 'ios' && !app.params.navbar[app.theme + "CenterTitle"];
13229 if (!needCenterTitle && !needLeftTitle) return;
13230
13231 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) {
13232 return;
13233 }
13234
13235 if (app.theme !== 'ios' && app.params.navbar[app.theme + "CenterTitle"]) {
13236 $innerEl.addClass('navbar-inner-centered-title');
13237 }
13238
13239 if (app.theme === 'ios' && !app.params.navbar.iosCenterTitle) {
13240 $innerEl.addClass('navbar-inner-left-title');
13241 }
13242
13243 var $viewEl = $el.parents('.view').eq(0);
13244 var left = app.rtl ? $innerEl.children('.right') : $innerEl.children('.left');
13245 var right = app.rtl ? $innerEl.children('.left') : $innerEl.children('.right');
13246 var title = $innerEl.children('.title');
13247 var subnavbar = $innerEl.children('.subnavbar');
13248 var noLeft = left.length === 0;
13249 var noRight = right.length === 0;
13250 var leftWidth = noLeft ? 0 : left.outerWidth(true);
13251 var rightWidth = noRight ? 0 : right.outerWidth(true);
13252 var titleWidth = title.outerWidth(true);
13253 var navbarStyles = $innerEl.styles();
13254 var navbarWidth = $innerEl[0].offsetWidth;
13255 var navbarInnerWidth = navbarWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10);
13256 var isPrevious = $el.hasClass('navbar-previous');
13257 var sliding = $innerEl.hasClass('sliding');
13258 var router;
13259 var dynamicNavbar;
13260
13261 if ($viewEl.length > 0 && $viewEl[0].f7View) {
13262 router = $viewEl[0].f7View.router;
13263 dynamicNavbar = router && router.dynamicNavbar;
13264 }
13265
13266 var currLeft;
13267 var diff;
13268
13269 if (noRight) {
13270 currLeft = navbarInnerWidth - titleWidth;
13271 }
13272
13273 if (noLeft) {
13274 currLeft = 0;
13275 }
13276
13277 if (!noLeft && !noRight) {
13278 currLeft = (navbarInnerWidth - rightWidth - titleWidth + leftWidth) / 2;
13279 }
13280
13281 var requiredLeft = (navbarInnerWidth - titleWidth) / 2;
13282
13283 if (navbarInnerWidth - leftWidth - rightWidth > titleWidth) {
13284 if (requiredLeft < leftWidth) {
13285 requiredLeft = leftWidth;
13286 }
13287
13288 if (requiredLeft + titleWidth > navbarInnerWidth - rightWidth) {
13289 requiredLeft = navbarInnerWidth - rightWidth - titleWidth;
13290 }
13291
13292 diff = requiredLeft - currLeft;
13293 } else {
13294 diff = 0;
13295 } // RTL inverter
13296
13297
13298 var inverter = app.rtl ? -1 : 1;
13299
13300 if (dynamicNavbar && app.theme === 'ios') {
13301 if (title.hasClass('sliding') || title.length > 0 && sliding) {
13302 var titleLeftOffset = -(currLeft + diff) * inverter;
13303 var titleRightOffset = (navbarInnerWidth - currLeft - diff - titleWidth) * inverter;
13304
13305 if (isPrevious) {
13306 if (router && router.params.iosAnimateNavbarBackIcon) {
13307 var activeNavbarBackLink = $el.parent().find('.navbar-current').children('.left.sliding').find('.back .icon ~ span');
13308
13309 if (activeNavbarBackLink.length > 0) {
13310 titleLeftOffset += activeNavbarBackLink[0].offsetLeft;
13311 }
13312 }
13313 }
13314
13315 title[0].f7NavbarLeftOffset = titleLeftOffset;
13316 title[0].f7NavbarRightOffset = titleRightOffset;
13317 }
13318
13319 if (!noLeft && (left.hasClass('sliding') || sliding)) {
13320 if (app.rtl) {
13321 left[0].f7NavbarLeftOffset = -(navbarInnerWidth - left[0].offsetWidth) / 2 * inverter;
13322 left[0].f7NavbarRightOffset = leftWidth * inverter;
13323 } else {
13324 left[0].f7NavbarLeftOffset = -leftWidth;
13325 left[0].f7NavbarRightOffset = (navbarInnerWidth - left[0].offsetWidth) / 2;
13326
13327 if (router && router.params.iosAnimateNavbarBackIcon && left.find('.back .icon').length > 0) {
13328 if (left.find('.back .icon ~ span').length) {
13329 var leftOffset = left[0].f7NavbarLeftOffset;
13330 var rightOffset = left[0].f7NavbarRightOffset;
13331 left[0].f7NavbarLeftOffset = 0;
13332 left[0].f7NavbarRightOffset = 0;
13333 left.find('.back .icon ~ span')[0].f7NavbarLeftOffset = leftOffset;
13334 left.find('.back .icon ~ span')[0].f7NavbarRightOffset = rightOffset - left.find('.back .icon')[0].offsetWidth;
13335 }
13336 }
13337 }
13338 }
13339
13340 if (!noRight && (right.hasClass('sliding') || sliding)) {
13341 if (app.rtl) {
13342 right[0].f7NavbarLeftOffset = -rightWidth * inverter;
13343 right[0].f7NavbarRightOffset = (navbarInnerWidth - right[0].offsetWidth) / 2 * inverter;
13344 } else {
13345 right[0].f7NavbarLeftOffset = -(navbarInnerWidth - right[0].offsetWidth) / 2;
13346 right[0].f7NavbarRightOffset = rightWidth;
13347 }
13348 }
13349
13350 if (subnavbar.length && (subnavbar.hasClass('sliding') || sliding)) {
13351 subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : -subnavbar[0].offsetWidth;
13352 subnavbar[0].f7NavbarRightOffset = -subnavbar[0].f7NavbarLeftOffset;
13353 }
13354 } // Center title
13355
13356
13357 if (needCenterTitle) {
13358 var titleLeft = diff;
13359 if (app.rtl && noLeft && noRight && title.length > 0) titleLeft = -titleLeft;
13360 title.css({
13361 left: titleLeft + "px"
13362 });
13363 }
13364 },
13365 hide: function hide(el, animate, hideStatusbar, hideOnlyCurrent) {
13366 if (animate === void 0) {
13367 animate = true;
13368 }
13369
13370 if (hideStatusbar === void 0) {
13371 hideStatusbar = false;
13372 }
13373
13374 if (hideOnlyCurrent === void 0) {
13375 hideOnlyCurrent = false;
13376 }
13377
13378 var app = this;
13379 var $el = $$1(el);
13380 var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length && !hideOnlyCurrent;
13381 if (isDynamic) $el = $el.parents('.navbars');
13382 if (!$el.length) return;
13383 if ($el.hasClass('navbar-hidden')) return;
13384 var className = "navbar-hidden" + (animate ? ' navbar-transitioning' : '');
13385 var currentIsLarge = isDynamic ? $el.find('.navbar-current .title-large').length : $el.find('.title-large').length;
13386
13387 if (currentIsLarge) {
13388 className += ' navbar-large-hidden';
13389 }
13390
13391 if (hideStatusbar) {
13392 className += ' navbar-hidden-statusbar';
13393 }
13394
13395 $el.transitionEnd(function () {
13396 $el.removeClass('navbar-transitioning');
13397 });
13398 $el.addClass(className);
13399
13400 if (isDynamic) {
13401 $el.children('.navbar').each(function (subEl) {
13402 $$1(subEl).trigger('navbar:hide');
13403 app.emit('navbarHide', subEl);
13404 });
13405 } else {
13406 $el.trigger('navbar:hide');
13407 app.emit('navbarHide', $el[0]);
13408 }
13409 },
13410 show: function show(el, animate, hideOnlyCurrent) {
13411 if (el === void 0) {
13412 el = '.navbar-hidden';
13413 }
13414
13415 if (animate === void 0) {
13416 animate = true;
13417 }
13418
13419 if (hideOnlyCurrent === void 0) {
13420 hideOnlyCurrent = false;
13421 }
13422
13423 var app = this;
13424 var $el = $$1(el);
13425 var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length && !hideOnlyCurrent;
13426 if (isDynamic) $el = $el.parents('.navbars');
13427 if (!$el.length) return;
13428 if (!$el.hasClass('navbar-hidden')) return;
13429
13430 if (animate) {
13431 $el.addClass('navbar-transitioning');
13432 $el.transitionEnd(function () {
13433 $el.removeClass('navbar-transitioning');
13434 });
13435 }
13436
13437 $el.removeClass('navbar-hidden navbar-large-hidden navbar-hidden-statusbar');
13438
13439 if (isDynamic) {
13440 $el.children('.navbar').each(function (subEl) {
13441 $$1(subEl).trigger('navbar:show');
13442 app.emit('navbarShow', subEl);
13443 });
13444 } else {
13445 $el.trigger('navbar:show');
13446 app.emit('navbarShow', $el[0]);
13447 }
13448 },
13449 getElByPage: function getElByPage(page) {
13450 var $pageEl;
13451 var $navbarEl;
13452 var pageData;
13453
13454 if (page.$navbarEl || page.$el) {
13455 pageData = page;
13456 $pageEl = page.$el;
13457 } else {
13458 $pageEl = $$1(page);
13459 if ($pageEl.length > 0) pageData = $pageEl[0].f7Page;
13460 }
13461
13462 if (pageData && pageData.$navbarEl && pageData.$navbarEl.length > 0) {
13463 $navbarEl = pageData.$navbarEl;
13464 } else if ($pageEl) {
13465 $navbarEl = $pageEl.children('.navbar');
13466 }
13467
13468 if (!$navbarEl || $navbarEl && $navbarEl.length === 0) return undefined;
13469 return $navbarEl[0];
13470 },
13471 getPageByEl: function getPageByEl(navbarEl) {
13472 var $navbarEl = $$1(navbarEl);
13473
13474 if ($navbarEl.parents('.page').length) {
13475 return $navbarEl.parents('.page')[0];
13476 }
13477
13478 var pageEl;
13479 $navbarEl.parents('.view').find('.page').each(function (el) {
13480 if (el && el.f7Page && el.f7Page.navbarEl && $navbarEl[0] === el.f7Page.navbarEl) {
13481 pageEl = el;
13482 }
13483 });
13484 return pageEl;
13485 },
13486 collapseLargeTitle: function collapseLargeTitle(navbarEl) {
13487 var app = this;
13488 var $navbarEl = $$1(navbarEl);
13489
13490 if ($navbarEl.hasClass('navbars')) {
13491 $navbarEl = $navbarEl.find('.navbar');
13492
13493 if ($navbarEl.length > 1) {
13494 $navbarEl = $$1(navbarEl).find('.navbar-large.navbar-current');
13495 }
13496
13497 if ($navbarEl.length > 1 || !$navbarEl.length) {
13498 return;
13499 }
13500 }
13501
13502 var $pageEl = $$1(app.navbar.getPageByEl($navbarEl));
13503 $navbarEl.addClass('navbar-large-collapsed');
13504 $pageEl.eq(0).addClass('page-with-navbar-large-collapsed').trigger('page:navbarlargecollapsed');
13505 app.emit('pageNavbarLargeCollapsed', $pageEl[0]);
13506 $navbarEl.trigger('navbar:collapse');
13507 app.emit('navbarCollapse', $navbarEl[0]);
13508 },
13509 expandLargeTitle: function expandLargeTitle(navbarEl) {
13510 var app = this;
13511 var $navbarEl = $$1(navbarEl);
13512
13513 if ($navbarEl.hasClass('navbars')) {
13514 $navbarEl = $navbarEl.find('.navbar-large');
13515
13516 if ($navbarEl.length > 1) {
13517 $navbarEl = $$1(navbarEl).find('.navbar-large.navbar-current');
13518 }
13519
13520 if ($navbarEl.length > 1 || !$navbarEl.length) {
13521 return;
13522 }
13523 }
13524
13525 var $pageEl = $$1(app.navbar.getPageByEl($navbarEl));
13526 $navbarEl.removeClass('navbar-large-collapsed');
13527 $pageEl.eq(0).removeClass('page-with-navbar-large-collapsed').trigger('page:navbarlargeexpanded');
13528 app.emit('pageNavbarLargeExpanded', $pageEl[0]);
13529 $navbarEl.trigger('navbar:expand');
13530 app.emit('navbarExpand', $navbarEl[0]);
13531 },
13532 toggleLargeTitle: function toggleLargeTitle(navbarEl) {
13533 var app = this;
13534 var $navbarEl = $$1(navbarEl);
13535
13536 if ($navbarEl.hasClass('navbars')) {
13537 $navbarEl = $navbarEl.find('.navbar-large');
13538
13539 if ($navbarEl.length > 1) {
13540 $navbarEl = $$1(navbarEl).find('.navbar-large.navbar-current');
13541 }
13542
13543 if ($navbarEl.length > 1 || !$navbarEl.length) {
13544 return;
13545 }
13546 }
13547
13548 if ($navbarEl.hasClass('navbar-large-collapsed')) {
13549 app.navbar.expandLargeTitle($navbarEl);
13550 } else {
13551 app.navbar.collapseLargeTitle($navbarEl);
13552 }
13553 },
13554 initNavbarOnScroll: function initNavbarOnScroll(pageEl, navbarEl, needHide, needCollapse, needTransparent) {
13555 var app = this;
13556 var support = getSupport();
13557 var $pageEl = $$1(pageEl);
13558 var $navbarEl = $$1(navbarEl);
13559 var $titleLargeEl = $navbarEl.find('.title-large');
13560 var isLarge = $titleLargeEl.length || $navbarEl.hasClass('.navbar-large');
13561 var navbarHideHeight = 44;
13562 var snapPageScrollToLargeTitle = app.params.navbar.snapPageScrollToLargeTitle;
13563 var snapPageScrollToTransparentNavbar = app.params.navbar.snapPageScrollToTransparentNavbar;
13564 var previousScrollTop;
13565 var currentScrollTop;
13566 var scrollHeight;
13567 var offsetHeight;
13568 var reachEnd;
13569 var action;
13570 var navbarHidden;
13571 var navbarCollapsed;
13572 var navbarTitleLargeHeight;
13573 var navbarOffsetHeight;
13574
13575 if (needCollapse || needHide && isLarge) {
13576 navbarTitleLargeHeight = $navbarEl.css('--f7-navbar-large-title-height');
13577
13578 if (navbarTitleLargeHeight && navbarTitleLargeHeight.indexOf('px') >= 0) {
13579 navbarTitleLargeHeight = parseInt(navbarTitleLargeHeight, 10);
13580
13581 if (Number.isNaN(navbarTitleLargeHeight) && $titleLargeEl.length) {
13582 navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
13583 } else if (Number.isNaN(navbarTitleLargeHeight)) {
13584 if (app.theme === 'ios') navbarTitleLargeHeight = 52;else if (app.theme === 'md') navbarTitleLargeHeight = 48;else if (app.theme === 'aurora') navbarTitleLargeHeight = 38;
13585 }
13586 } else if ($titleLargeEl.length) {
13587 navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
13588 } else {
13589 // eslint-disable-next-line
13590 if (app.theme === 'ios') navbarTitleLargeHeight = 52;else if (app.theme === 'md') navbarTitleLargeHeight = 48;else if (app.theme === 'aurora') navbarTitleLargeHeight = 38;
13591 }
13592 }
13593
13594 if (needHide && isLarge) {
13595 navbarHideHeight += navbarTitleLargeHeight;
13596 }
13597
13598 var scrollChanged;
13599 var scrollContent;
13600 var scrollTimeoutId;
13601 var touchEndTimeoutId;
13602 var touchSnapTimeout = 70;
13603 var desktopSnapTimeout = 300;
13604
13605 function snapLargeNavbar() {
13606 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
13607 if (inSearchbarExpanded) return;
13608 if (!scrollContent || currentScrollTop < 0) return;
13609
13610 if (currentScrollTop >= navbarTitleLargeHeight / 2 && currentScrollTop < navbarTitleLargeHeight) {
13611 $$1(scrollContent).scrollTop(navbarTitleLargeHeight, 100);
13612 } else if (currentScrollTop < navbarTitleLargeHeight) {
13613 $$1(scrollContent).scrollTop(0, 200);
13614 }
13615 }
13616
13617 function snapTransparentNavbar() {
13618 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
13619 if (inSearchbarExpanded) return;
13620 if (!scrollContent || currentScrollTop < 0) return;
13621
13622 if (currentScrollTop >= navbarOffsetHeight / 2 && currentScrollTop < navbarOffsetHeight) {
13623 $$1(scrollContent).scrollTop(navbarOffsetHeight, 100);
13624 } else if (currentScrollTop < navbarOffsetHeight) {
13625 $$1(scrollContent).scrollTop(0, 200);
13626 }
13627 }
13628
13629 function handleNavbarTransparent() {
13630 var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
13631 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
13632 if (inSearchbarExpanded || isHidden) return;
13633
13634 if (!navbarOffsetHeight) {
13635 navbarOffsetHeight = navbarEl.offsetHeight;
13636 }
13637
13638 var opacity = currentScrollTop / navbarOffsetHeight;
13639 var notTransparent = $navbarEl.hasClass('navbar-transparent-visible');
13640 opacity = Math.max(Math.min(opacity, 1), 0);
13641
13642 if (notTransparent && opacity === 1 || !notTransparent && opacity === 0) {
13643 $navbarEl.find('.navbar-bg, .title').css('opacity', '');
13644 return;
13645 }
13646
13647 if (notTransparent && opacity === 0) {
13648 $navbarEl.trigger('navbar:transparenthide');
13649 app.emit('navbarTransparentHide', $navbarEl[0]);
13650 $navbarEl.removeClass('navbar-transparent-visible');
13651 $navbarEl.find('.navbar-bg, .title').css('opacity', '');
13652 return;
13653 }
13654
13655 if (!notTransparent && opacity === 1) {
13656 $navbarEl.trigger('navbar:transparentshow');
13657 app.emit('navbarTransparentShow', $navbarEl[0]);
13658 $navbarEl.addClass('navbar-transparent-visible');
13659 $navbarEl.find('.navbar-bg, .title').css('opacity', '');
13660 return;
13661 }
13662
13663 $navbarEl.find('.navbar-bg, .title').css('opacity', opacity);
13664
13665 if (snapPageScrollToTransparentNavbar) {
13666 if (!support.touch) {
13667 clearTimeout(scrollTimeoutId);
13668 scrollTimeoutId = setTimeout(function () {
13669 snapTransparentNavbar();
13670 }, desktopSnapTimeout);
13671 } else if (touchEndTimeoutId) {
13672 clearTimeout(touchEndTimeoutId);
13673 touchEndTimeoutId = null;
13674 touchEndTimeoutId = setTimeout(function () {
13675 snapTransparentNavbar();
13676 clearTimeout(touchEndTimeoutId);
13677 touchEndTimeoutId = null;
13678 }, touchSnapTimeout);
13679 }
13680 }
13681 }
13682
13683 var previousCollapseProgress = null;
13684 var collapseProgress = null;
13685
13686 function handleLargeNavbarCollapse() {
13687 var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
13688 if (isHidden) return;
13689 var isLargeTransparent = $navbarEl.hasClass('navbar-large-transparent') || $navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-transparent');
13690 previousCollapseProgress = collapseProgress;
13691 collapseProgress = Math.min(Math.max(currentScrollTop / navbarTitleLargeHeight, 0), 1);
13692 var previousCollapseWasInMiddle = previousCollapseProgress > 0 && previousCollapseProgress < 1;
13693 var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
13694 if (inSearchbarExpanded) return;
13695 navbarCollapsed = $navbarEl.hasClass('navbar-large-collapsed');
13696
13697 if (collapseProgress === 0 && navbarCollapsed) {
13698 app.navbar.expandLargeTitle($navbarEl[0]);
13699 } else if (collapseProgress === 1 && !navbarCollapsed) {
13700 app.navbar.collapseLargeTitle($navbarEl[0]);
13701 }
13702
13703 if (collapseProgress === 0 && navbarCollapsed || collapseProgress === 0 && previousCollapseWasInMiddle || collapseProgress === 1 && !navbarCollapsed || collapseProgress === 1 && previousCollapseWasInMiddle) {
13704 if (app.theme === 'md') {
13705 $navbarEl.find('.navbar-inner').css('overflow', '');
13706 }
13707
13708 $navbarEl.find('.title').css('opacity', '');
13709 $navbarEl.find('.title-large-text, .subnavbar').css('transform', '');
13710
13711 if (isLargeTransparent) {
13712 $navbarEl.find('.navbar-bg').css('opacity', '');
13713 } else {
13714 $navbarEl.find('.navbar-bg').css('transform', '');
13715 }
13716 } else if (collapseProgress > 0 && collapseProgress < 1) {
13717 if (app.theme === 'md') {
13718 $navbarEl.find('.navbar-inner').css('overflow', 'visible');
13719 }
13720
13721 $navbarEl.find('.title').css('opacity', collapseProgress);
13722 $navbarEl.find('.title-large-text, .subnavbar').css('transform', "translate3d(0px, " + -1 * collapseProgress * navbarTitleLargeHeight + "px, 0)");
13723
13724 if (isLargeTransparent) {
13725 $navbarEl.find('.navbar-bg').css('opacity', collapseProgress);
13726 } else {
13727 $navbarEl.find('.navbar-bg').css('transform', "translate3d(0px, " + -1 * collapseProgress * navbarTitleLargeHeight + "px, 0)");
13728 }
13729 }
13730
13731 if (snapPageScrollToLargeTitle) {
13732 if (!support.touch) {
13733 clearTimeout(scrollTimeoutId);
13734 scrollTimeoutId = setTimeout(function () {
13735 snapLargeNavbar();
13736 }, desktopSnapTimeout);
13737 } else if (touchEndTimeoutId) {
13738 clearTimeout(touchEndTimeoutId);
13739 touchEndTimeoutId = null;
13740 touchEndTimeoutId = setTimeout(function () {
13741 snapLargeNavbar();
13742 clearTimeout(touchEndTimeoutId);
13743 touchEndTimeoutId = null;
13744 }, touchSnapTimeout);
13745 }
13746 }
13747 }
13748
13749 function handleTitleHideShow() {
13750 if ($pageEl.hasClass('page-with-card-opened')) return;
13751 scrollHeight = scrollContent.scrollHeight;
13752 offsetHeight = scrollContent.offsetHeight;
13753 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
13754 navbarHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
13755
13756 if (reachEnd) {
13757 if (app.params.navbar.showOnPageScrollEnd) {
13758 action = 'show';
13759 }
13760 } else if (previousScrollTop > currentScrollTop) {
13761 if (app.params.navbar.showOnPageScrollTop || currentScrollTop <= navbarHideHeight) {
13762 action = 'show';
13763 } else {
13764 action = 'hide';
13765 }
13766 } else if (currentScrollTop > navbarHideHeight) {
13767 action = 'hide';
13768 } else {
13769 action = 'show';
13770 }
13771
13772 if (action === 'show' && navbarHidden) {
13773 app.navbar.show($navbarEl, true, true);
13774 navbarHidden = false;
13775 } else if (action === 'hide' && !navbarHidden) {
13776 app.navbar.hide($navbarEl, true, false, true);
13777 navbarHidden = true;
13778 }
13779
13780 previousScrollTop = currentScrollTop;
13781 }
13782
13783 function handleScroll(e) {
13784 scrollContent = this;
13785
13786 if (e && e.target && e.target !== scrollContent) {
13787 return;
13788 }
13789
13790 currentScrollTop = scrollContent.scrollTop;
13791 scrollChanged = currentScrollTop;
13792
13793 if (needCollapse) {
13794 handleLargeNavbarCollapse();
13795 } else if (needTransparent) {
13796 handleNavbarTransparent();
13797 }
13798
13799 if ($pageEl.hasClass('page-previous')) return;
13800
13801 if (needHide) {
13802 handleTitleHideShow();
13803 }
13804 }
13805
13806 function handeTouchStart() {
13807 scrollChanged = false;
13808 }
13809
13810 function handleTouchEnd() {
13811 clearTimeout(touchEndTimeoutId);
13812 touchEndTimeoutId = null;
13813 touchEndTimeoutId = setTimeout(function () {
13814 if (scrollChanged !== false) {
13815 if (needTransparent && !needCollapse) {
13816 snapTransparentNavbar();
13817 } else {
13818 snapLargeNavbar();
13819 }
13820
13821 clearTimeout(touchEndTimeoutId);
13822 touchEndTimeoutId = null;
13823 }
13824 }, touchSnapTimeout);
13825 }
13826
13827 $pageEl.on('scroll', '.page-content', handleScroll, true);
13828
13829 if (support.touch && (needCollapse && snapPageScrollToLargeTitle || needTransparent && snapPageScrollToTransparentNavbar)) {
13830 app.on('touchstart:passive', handeTouchStart);
13831 app.on('touchend:passive', handleTouchEnd);
13832 }
13833
13834 if (needCollapse) {
13835 $pageEl.find('.page-content').each(function (pageContentEl) {
13836 if (pageContentEl.scrollTop > 0) handleScroll.call(pageContentEl);
13837 });
13838 } else if (needTransparent) {
13839 $pageEl.find('.page-content').each(function (pageContentEl) {
13840 if (pageContentEl.scrollTop > 0) handleScroll.call(pageContentEl);
13841 });
13842 }
13843
13844 $pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
13845 delete $pageEl[0].f7DetachNavbarScrollHandlers;
13846 $pageEl.off('scroll', '.page-content', handleScroll, true);
13847
13848 if (support.touch && (needCollapse && snapPageScrollToLargeTitle || needTransparent && snapPageScrollToTransparentNavbar)) {
13849 app.off('touchstart:passive', handeTouchStart);
13850 app.off('touchend:passive', handleTouchEnd);
13851 }
13852 };
13853 }
13854 };
13855 var Navbar$1 = {
13856 name: 'navbar',
13857 create: function create() {
13858 var app = this;
13859 bindMethods(app, {
13860 navbar: Navbar
13861 });
13862 },
13863 params: {
13864 navbar: {
13865 scrollTopOnTitleClick: true,
13866 iosCenterTitle: true,
13867 mdCenterTitle: false,
13868 auroraCenterTitle: true,
13869 hideOnPageScroll: false,
13870 showOnPageScrollEnd: true,
13871 showOnPageScrollTop: true,
13872 collapseLargeTitleOnScroll: true,
13873 snapPageScrollToLargeTitle: true,
13874 snapPageScrollToTransparentNavbar: true
13875 }
13876 },
13877 on: {
13878 'panelBreakpoint panelCollapsedBreakpoint panelResize viewResize resize viewMasterDetailBreakpoint': function onPanelResize() {
13879 var app = this;
13880 $$1('.navbar').each(function (navbarEl) {
13881 app.navbar.size(navbarEl);
13882 });
13883 },
13884 pageBeforeRemove: function pageBeforeRemove(page) {
13885 if (page.$el[0].f7DetachNavbarScrollHandlers) {
13886 page.$el[0].f7DetachNavbarScrollHandlers();
13887 }
13888 },
13889 pageBeforeIn: function pageBeforeIn(page) {
13890 var app = this;
13891 if (app.theme !== 'ios') return;
13892 var $navbarsEl;
13893 var view = page.$el.parents('.view')[0].f7View;
13894 var navbarEl = app.navbar.getElByPage(page);
13895
13896 if (!navbarEl) {
13897 $navbarsEl = page.$el.parents('.view').children('.navbars');
13898 } else {
13899 $navbarsEl = $$1(navbarEl).parents('.navbars');
13900 }
13901
13902 if (page.$el.hasClass('no-navbar') || view.router.dynamicNavbar && !navbarEl) {
13903 var animate = !!(page.pageFrom && page.router.history.length > 0);
13904 app.navbar.hide($navbarsEl, animate);
13905 } else {
13906 app.navbar.show($navbarsEl);
13907 }
13908 },
13909 pageReinit: function pageReinit(page) {
13910 var app = this;
13911 var $navbarEl = $$1(app.navbar.getElByPage(page));
13912 if (!$navbarEl || $navbarEl.length === 0) return;
13913 app.navbar.size($navbarEl);
13914 },
13915 pageInit: function pageInit(page) {
13916 var app = this;
13917 var $navbarEl = $$1(app.navbar.getElByPage(page));
13918 if (!$navbarEl || $navbarEl.length === 0) return; // Size
13919
13920 app.navbar.size($navbarEl); // Need Collapse On Scroll
13921
13922 var needCollapseOnScrollHandler;
13923
13924 if ($navbarEl.find('.title-large').length > 0) {
13925 $navbarEl.addClass('navbar-large');
13926 }
13927
13928 if ($navbarEl.hasClass('navbar-large')) {
13929 if (app.params.navbar.collapseLargeTitleOnScroll) needCollapseOnScrollHandler = true;
13930 page.$el.addClass('page-with-navbar-large');
13931 } // Need transparent on scroll
13932
13933
13934 var needTransparentOnScroll;
13935
13936 if (!needCollapseOnScrollHandler && $navbarEl.hasClass('navbar-transparent')) {
13937 needTransparentOnScroll = true;
13938 } // Need Hide On Scroll
13939
13940
13941 var needHideOnScrollHandler;
13942
13943 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')) {
13944 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')) {
13945 needHideOnScrollHandler = false;
13946 } else {
13947 needHideOnScrollHandler = true;
13948 }
13949 }
13950
13951 if (needCollapseOnScrollHandler || needHideOnScrollHandler || needTransparentOnScroll) {
13952 app.navbar.initNavbarOnScroll(page.el, $navbarEl[0], needHideOnScrollHandler, needCollapseOnScrollHandler, needTransparentOnScroll);
13953 }
13954 },
13955 'panelOpen panelSwipeOpen modalOpen': function onPanelModalOpen(instance) {
13956 var app = this;
13957 instance.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (navbarEl) {
13958 app.navbar.size(navbarEl);
13959 });
13960 },
13961 tabShow: function tabShow(tabEl) {
13962 var app = this;
13963 $$1(tabEl).find('.navbar:not(.navbar-previous):not(.stacked)').each(function (navbarEl) {
13964 app.navbar.size(navbarEl);
13965 });
13966 }
13967 },
13968 clicks: {
13969 '.navbar .title': function onTitleClick($clickedEl) {
13970 var app = this;
13971 if (!app.params.navbar.scrollTopOnTitleClick) return;
13972
13973 if ($clickedEl.closest('a').length > 0) {
13974 return;
13975 }
13976
13977 var $pageContentEl; // Find active page
13978
13979 var $navbarEl = $clickedEl.parents('.navbar');
13980 var $navbarsEl = $navbarEl.parents('.navbars'); // Static Layout
13981
13982 $pageContentEl = $navbarEl.parents('.page-content');
13983
13984 if ($pageContentEl.length === 0) {
13985 // Fixed Layout
13986 if ($navbarEl.parents('.page').length > 0) {
13987 $pageContentEl = $navbarEl.parents('.page').find('.page-content');
13988 } // Through Layout iOS
13989
13990
13991 if ($pageContentEl.length === 0 && $navbarsEl.length) {
13992 if ($navbarsEl.nextAll('.page-current:not(.stacked)').length > 0) {
13993 $pageContentEl = $navbarsEl.nextAll('.page-current:not(.stacked)').find('.page-content');
13994 }
13995 } // Through Layout
13996
13997
13998 if ($pageContentEl.length === 0) {
13999 if ($navbarEl.nextAll('.page-current:not(.stacked)').length > 0) {
14000 $pageContentEl = $navbarEl.nextAll('.page-current:not(.stacked)').find('.page-content');
14001 }
14002 }
14003 }
14004
14005 if ($pageContentEl && $pageContentEl.length > 0) {
14006 // Check for tab
14007 if ($pageContentEl.hasClass('tab')) {
14008 $pageContentEl = $pageContentEl.parent('.tabs').children('.page-content.tab-active');
14009 }
14010
14011 if ($pageContentEl.length > 0) $pageContentEl.scrollTop(0, 300);
14012 }
14013 }
14014 },
14015 vnode: {
14016 navbar: {
14017 postpatch: function postpatch(vnode) {
14018 var app = this;
14019 app.navbar.size(vnode.elm);
14020 }
14021 }
14022 }
14023 };
14024
14025 var Toolbar = {
14026 setHighlight: function setHighlight(tabbarEl) {
14027 var app = this;
14028 if (app.theme === 'ios') return;
14029 var $tabbarEl = $$1(tabbarEl);
14030 if ($tabbarEl.length === 0 || !($tabbarEl.hasClass('tabbar') || $tabbarEl.hasClass('tabbar-labels'))) return;
14031 var $highlightEl = $tabbarEl.find('.tab-link-highlight');
14032 var tabLinksCount = $tabbarEl.find('.tab-link').length;
14033
14034 if (tabLinksCount === 0) {
14035 $highlightEl.remove();
14036 return;
14037 }
14038
14039 if ($highlightEl.length === 0) {
14040 $tabbarEl.children('.toolbar-inner').append('<span class="tab-link-highlight"></span>');
14041 $highlightEl = $tabbarEl.find('.tab-link-highlight');
14042 } else if ($highlightEl.next().length) {
14043 $tabbarEl.children('.toolbar-inner').append($highlightEl);
14044 }
14045
14046 var $activeLink = $tabbarEl.find('.tab-link-active');
14047 var highlightWidth;
14048 var highlightTranslate;
14049
14050 if ($tabbarEl.hasClass('tabbar-scrollable') && $activeLink && $activeLink[0]) {
14051 highlightWidth = $activeLink[0].offsetWidth + "px";
14052 highlightTranslate = $activeLink[0].offsetLeft + "px";
14053 } else {
14054 var activeIndex = $activeLink.index();
14055 highlightWidth = 100 / tabLinksCount + "%";
14056 highlightTranslate = (app.rtl ? -activeIndex : activeIndex) * 100 + "%";
14057 }
14058
14059 nextFrame(function () {
14060 $highlightEl.css('width', highlightWidth).transform("translate3d(" + highlightTranslate + ",0,0)");
14061 });
14062 },
14063 init: function init(tabbarEl) {
14064 var app = this;
14065 app.toolbar.setHighlight(tabbarEl);
14066 },
14067 hide: function hide(el, animate) {
14068 if (animate === void 0) {
14069 animate = true;
14070 }
14071
14072 var app = this;
14073 var $el = $$1(el);
14074 if ($el.hasClass('toolbar-hidden')) return;
14075 var className = "toolbar-hidden" + (animate ? ' toolbar-transitioning' : '');
14076 $el.transitionEnd(function () {
14077 $el.removeClass('toolbar-transitioning');
14078 });
14079 $el.addClass(className);
14080 $el.trigger('toolbar:hide');
14081 app.emit('toolbarHide', $el[0]);
14082 },
14083 show: function show(el, animate) {
14084 if (animate === void 0) {
14085 animate = true;
14086 }
14087
14088 var app = this;
14089 var $el = $$1(el);
14090 if (!$el.hasClass('toolbar-hidden')) return;
14091
14092 if (animate) {
14093 $el.addClass('toolbar-transitioning');
14094 $el.transitionEnd(function () {
14095 $el.removeClass('toolbar-transitioning');
14096 });
14097 }
14098
14099 $el.removeClass('toolbar-hidden');
14100 $el.trigger('toolbar:show');
14101 app.emit('toolbarShow', $el[0]);
14102 },
14103 initToolbarOnScroll: function initToolbarOnScroll(pageEl) {
14104 var app = this;
14105 var $pageEl = $$1(pageEl);
14106 var $toolbarEl = $pageEl.parents('.view').children('.toolbar');
14107
14108 if ($toolbarEl.length === 0) {
14109 $toolbarEl = $pageEl.find('.toolbar');
14110 }
14111
14112 if ($toolbarEl.length === 0) {
14113 $toolbarEl = $pageEl.parents('.views').children('.tabbar, .tabbar-labels');
14114 }
14115
14116 if ($toolbarEl.length === 0) {
14117 return;
14118 }
14119
14120 var previousScrollTop;
14121 var currentScrollTop;
14122 var scrollHeight;
14123 var offsetHeight;
14124 var reachEnd;
14125 var action;
14126 var toolbarHidden;
14127
14128 function handleScroll(e) {
14129 if ($pageEl.hasClass('page-with-card-opened')) return;
14130 if ($pageEl.hasClass('page-previous')) return;
14131 var scrollContent = this;
14132
14133 if (e && e.target && e.target !== scrollContent) {
14134 return;
14135 }
14136
14137 currentScrollTop = scrollContent.scrollTop;
14138 scrollHeight = scrollContent.scrollHeight;
14139 offsetHeight = scrollContent.offsetHeight;
14140 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
14141 toolbarHidden = $toolbarEl.hasClass('toolbar-hidden');
14142
14143 if (reachEnd) {
14144 if (app.params.toolbar.showOnPageScrollEnd) {
14145 action = 'show';
14146 }
14147 } else if (previousScrollTop > currentScrollTop) {
14148 if (app.params.toolbar.showOnPageScrollTop || currentScrollTop <= 44) {
14149 action = 'show';
14150 } else {
14151 action = 'hide';
14152 }
14153 } else if (currentScrollTop > 44) {
14154 action = 'hide';
14155 } else {
14156 action = 'show';
14157 }
14158
14159 if (action === 'show' && toolbarHidden) {
14160 app.toolbar.show($toolbarEl);
14161 toolbarHidden = false;
14162 } else if (action === 'hide' && !toolbarHidden) {
14163 app.toolbar.hide($toolbarEl);
14164 toolbarHidden = true;
14165 }
14166
14167 previousScrollTop = currentScrollTop;
14168 }
14169
14170 $pageEl.on('scroll', '.page-content', handleScroll, true);
14171 $pageEl[0].f7ScrollToolbarHandler = handleScroll;
14172 }
14173 };
14174 var Toolbar$1 = {
14175 name: 'toolbar',
14176 create: function create() {
14177 var app = this;
14178 bindMethods(app, {
14179 toolbar: Toolbar
14180 });
14181 },
14182 params: {
14183 toolbar: {
14184 hideOnPageScroll: false,
14185 showOnPageScrollEnd: true,
14186 showOnPageScrollTop: true
14187 }
14188 },
14189 on: {
14190 pageBeforeRemove: function pageBeforeRemove(page) {
14191 if (page.$el[0].f7ScrollToolbarHandler) {
14192 page.$el.off('scroll', '.page-content', page.$el[0].f7ScrollToolbarHandler, true);
14193 }
14194 },
14195 pageBeforeIn: function pageBeforeIn(page) {
14196 var app = this;
14197 var $toolbarEl = page.$el.parents('.view').children('.toolbar');
14198
14199 if ($toolbarEl.length === 0) {
14200 $toolbarEl = page.$el.parents('.views').children('.tabbar, .tabbar-labels');
14201 }
14202
14203 if ($toolbarEl.length === 0) {
14204 $toolbarEl = page.$el.find('.toolbar');
14205 }
14206
14207 if ($toolbarEl.length === 0) {
14208 return;
14209 }
14210
14211 if (page.$el.hasClass('no-toolbar')) {
14212 app.toolbar.hide($toolbarEl);
14213 } else {
14214 app.toolbar.show($toolbarEl);
14215 }
14216 },
14217 pageInit: function pageInit(page) {
14218 var app = this;
14219 page.$el.find('.tabbar, .tabbar-labels').each(function (tabbarEl) {
14220 app.toolbar.init(tabbarEl);
14221 });
14222
14223 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')) {
14224 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')) {
14225 return;
14226 }
14227
14228 app.toolbar.initToolbarOnScroll(page.el);
14229 }
14230 },
14231 init: function init() {
14232 var app = this;
14233 app.$el.find('.tabbar, .tabbar-labels').each(function (tabbarEl) {
14234 app.toolbar.init(tabbarEl);
14235 });
14236 }
14237 },
14238 vnode: {
14239 tabbar: {
14240 insert: function insert(vnode) {
14241 var app = this;
14242 app.toolbar.init(vnode.elm);
14243 }
14244 }
14245 }
14246 };
14247
14248 var Subnavbar = {
14249 name: 'subnavbar',
14250 on: {
14251 pageInit: function pageInit(page) {
14252 if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length) {
14253 page.$el.addClass('page-with-subnavbar');
14254 }
14255
14256 var $innerSubnavbars = page.$el.find('.subnavbar').filter(function (subnavbarEl) {
14257 return $$1(subnavbarEl).parents('.page')[0] === page.$el[0];
14258 });
14259
14260 if ($innerSubnavbars.length) {
14261 page.$el.addClass('page-with-subnavbar');
14262 }
14263 }
14264 }
14265 };
14266
14267 var TouchRipple = /*#__PURE__*/function () {
14268 function TouchRipple(app, $el, x, y) {
14269 var ripple = this;
14270 if (!$el) return undefined;
14271
14272 var _$el$0$getBoundingCli = $el[0].getBoundingClientRect(),
14273 left = _$el$0$getBoundingCli.left,
14274 top = _$el$0$getBoundingCli.top,
14275 width = _$el$0$getBoundingCli.width,
14276 height = _$el$0$getBoundingCli.height;
14277
14278 var center = {
14279 x: x - left,
14280 y: y - top
14281 };
14282 var diameter = Math.max(Math.pow(Math.pow(height, 2) + Math.pow(width, 2), 0.5), 48);
14283 var isInset = false;
14284 var insetElements = app.params.touch.touchRippleInsetElements || '';
14285
14286 if (insetElements && $el.is(insetElements)) {
14287 isInset = true;
14288 }
14289
14290 if (isInset) {
14291 diameter = Math.max(Math.min(width, height), 48);
14292 }
14293
14294 if (!isInset && $el.css('overflow') === 'hidden') {
14295 var distanceFromCenter = Math.pow(Math.pow(center.x - width / 2, 2) + Math.pow(center.y - height / 2, 2), 0.5);
14296 var scale = (diameter / 2 + distanceFromCenter) / (diameter / 2);
14297 ripple.rippleTransform = "translate3d(0px, 0px, 0) scale(" + scale + ")";
14298 } else {
14299 // prettier-ignore
14300 ripple.rippleTransform = "translate3d(" + (-center.x + width / 2) + "px, " + (-center.y + height / 2) + "px, 0) scale(1)";
14301 }
14302
14303 if (isInset) {
14304 $el.addClass('ripple-inset');
14305 }
14306
14307 ripple.$rippleWaveEl = $$1("<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>");
14308 $el.prepend(ripple.$rippleWaveEl);
14309 ripple.$rippleWaveEl.animationEnd(function () {
14310 if (!ripple.$rippleWaveEl) return;
14311 if (ripple.$rippleWaveEl.hasClass('ripple-wave-out')) return;
14312 ripple.$rippleWaveEl.addClass('ripple-wave-in');
14313
14314 if (ripple.shouldBeRemoved) {
14315 ripple.out();
14316 }
14317 });
14318 return ripple;
14319 }
14320
14321 var _proto = TouchRipple.prototype;
14322
14323 _proto.destroy = function destroy() {
14324 var ripple = this;
14325
14326 if (ripple.$rippleWaveEl) {
14327 ripple.$rippleWaveEl.remove();
14328 }
14329
14330 Object.keys(ripple).forEach(function (key) {
14331 ripple[key] = null;
14332 delete ripple[key];
14333 });
14334 ripple = null;
14335 };
14336
14337 _proto.out = function out() {
14338 var ripple = this;
14339 var $rippleWaveEl = this.$rippleWaveEl;
14340 clearTimeout(ripple.removeTimeout);
14341 $rippleWaveEl.addClass('ripple-wave-out');
14342 ripple.removeTimeout = setTimeout(function () {
14343 ripple.destroy();
14344 }, 300);
14345 $rippleWaveEl.animationEnd(function () {
14346 clearTimeout(ripple.removeTimeout);
14347 ripple.destroy();
14348 });
14349 };
14350
14351 _proto.remove = function remove() {
14352 var ripple = this;
14353 if (ripple.shouldBeRemoved) return;
14354 ripple.removeTimeout = setTimeout(function () {
14355 ripple.destroy();
14356 }, 400);
14357 ripple.shouldBeRemoved = true;
14358
14359 if (ripple.$rippleWaveEl.hasClass('ripple-wave-in')) {
14360 ripple.out();
14361 }
14362 };
14363
14364 return TouchRipple;
14365 }();
14366
14367 var TouchRipple$1 = {
14368 name: 'touch-ripple',
14369 static: {
14370 TouchRipple: TouchRipple
14371 },
14372 create: function create() {
14373 var app = this;
14374 app.touchRipple = {
14375 create: function create() {
14376 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
14377 args[_key] = arguments[_key];
14378 }
14379
14380 return _construct$1(TouchRipple, args);
14381 }
14382 };
14383 }
14384 };
14385
14386 var openedModals = [];
14387 var dialogsQueue = [];
14388
14389 function clearDialogsQueue() {
14390 if (dialogsQueue.length === 0) return;
14391 var dialog = dialogsQueue.shift();
14392 dialog.open();
14393 }
14394
14395 var Modal = /*#__PURE__*/function (_Framework7Class) {
14396 _inheritsLoose$1(Modal, _Framework7Class);
14397
14398 function Modal(app, params) {
14399 var _this;
14400
14401 _this = _Framework7Class.call(this, params, [app]) || this;
14402
14403 var modal = _assertThisInitialized$1(_this);
14404
14405 var defaults = {}; // Extend defaults with modules params
14406
14407 modal.useModulesParams(defaults);
14408 modal.params = extend$1(defaults, params);
14409 modal.opened = false;
14410 var $containerEl = modal.params.containerEl ? $$1(modal.params.containerEl).eq(0) : app.$el;
14411 if (!$containerEl.length) $containerEl = app.$el;
14412 modal.$containerEl = $containerEl;
14413 modal.containerEl = $containerEl[0]; // Install Modules
14414
14415 modal.useModules();
14416 return _assertThisInitialized$1(_this) || _assertThisInitialized$1(_this);
14417 }
14418
14419 var _proto = Modal.prototype;
14420
14421 _proto.onOpen = function onOpen() {
14422 var modal = this;
14423 modal.opened = true;
14424 openedModals.push(modal);
14425 $$1('html').addClass("with-modal-" + modal.type.toLowerCase());
14426 modal.$el.trigger("modal:open " + modal.type.toLowerCase() + ":open");
14427 modal.emit("local::open modalOpen " + modal.type + "Open", modal);
14428 };
14429
14430 _proto.onOpened = function onOpened() {
14431 var modal = this;
14432 modal.$el.trigger("modal:opened " + modal.type.toLowerCase() + ":opened");
14433 modal.emit("local::opened modalOpened " + modal.type + "Opened", modal);
14434 };
14435
14436 _proto.onClose = function onClose() {
14437 var modal = this;
14438 modal.opened = false;
14439 if (!modal.type || !modal.$el) return;
14440 openedModals.splice(openedModals.indexOf(modal), 1);
14441 $$1('html').removeClass("with-modal-" + modal.type.toLowerCase());
14442 modal.$el.trigger("modal:close " + modal.type.toLowerCase() + ":close");
14443 modal.emit("local::close modalClose " + modal.type + "Close", modal);
14444 };
14445
14446 _proto.onClosed = function onClosed() {
14447 var modal = this;
14448 if (!modal.type || !modal.$el) return;
14449 modal.$el.removeClass('modal-out');
14450 modal.$el.hide();
14451 modal.$el.trigger("modal:closed " + modal.type.toLowerCase() + ":closed");
14452 modal.emit("local::closed modalClosed " + modal.type + "Closed", modal);
14453 };
14454
14455 _proto.open = function open(animateModal) {
14456 var modal = this;
14457 var document = getDocument();
14458 var app = modal.app;
14459 var $el = modal.$el;
14460 var $backdropEl = modal.$backdropEl;
14461 var type = modal.type;
14462 var animate = true;
14463 if (typeof animateModal !== 'undefined') animate = animateModal;else if (typeof modal.params.animate !== 'undefined') {
14464 animate = modal.params.animate;
14465 }
14466
14467 if (!$el || $el.hasClass('modal-in')) {
14468 return modal;
14469 }
14470
14471 if (type === 'dialog' && app.params.modal.queueDialogs) {
14472 var pushToQueue;
14473
14474 if ($$1('.dialog.modal-in').length > 0) {
14475 pushToQueue = true;
14476 } else if (openedModals.length > 0) {
14477 openedModals.forEach(function (openedModal) {
14478 if (openedModal.type === 'dialog') pushToQueue = true;
14479 });
14480 }
14481
14482 if (pushToQueue) {
14483 dialogsQueue.push(modal);
14484 return modal;
14485 }
14486 }
14487
14488 var $modalParentEl = $el.parent();
14489 var wasInDom = $el.parents(document).length > 0;
14490
14491 if (!$modalParentEl.is(modal.$containerEl)) {
14492 modal.$containerEl.append($el);
14493 modal.once(type + "Closed", function () {
14494 if (wasInDom) {
14495 $modalParentEl.append($el);
14496 } else {
14497 $el.remove();
14498 }
14499 });
14500 } // Show Modal
14501
14502
14503 $el.show();
14504 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
14505
14506 modal._clientLeft = $el[0].clientLeft; // Modal
14507
14508 function transitionEnd() {
14509 if ($el.hasClass('modal-out')) {
14510 modal.onClosed();
14511 } else if ($el.hasClass('modal-in')) {
14512 modal.onOpened();
14513 }
14514 }
14515
14516 if (animate) {
14517 if ($backdropEl) {
14518 $backdropEl.removeClass('not-animated');
14519 $backdropEl.addClass('backdrop-in');
14520 }
14521
14522 $el.animationEnd(function () {
14523 transitionEnd();
14524 });
14525 $el.transitionEnd(function () {
14526 transitionEnd();
14527 });
14528 $el.removeClass('modal-out not-animated').addClass('modal-in');
14529 modal.onOpen();
14530 } else {
14531 if ($backdropEl) {
14532 $backdropEl.addClass('backdrop-in not-animated');
14533 }
14534
14535 $el.removeClass('modal-out').addClass('modal-in not-animated');
14536 modal.onOpen();
14537 modal.onOpened();
14538 }
14539
14540 return modal;
14541 };
14542
14543 _proto.close = function close(animateModal) {
14544 var modal = this;
14545 var $el = modal.$el;
14546 var $backdropEl = modal.$backdropEl;
14547 var animate = true;
14548 if (typeof animateModal !== 'undefined') animate = animateModal;else if (typeof modal.params.animate !== 'undefined') {
14549 animate = modal.params.animate;
14550 }
14551
14552 if (!$el || !$el.hasClass('modal-in')) {
14553 if (dialogsQueue.indexOf(modal) >= 0) {
14554 dialogsQueue.splice(dialogsQueue.indexOf(modal), 1);
14555 }
14556
14557 return modal;
14558 } // backdrop
14559
14560
14561 if ($backdropEl) {
14562 var needToHideBackdrop = true;
14563
14564 if (modal.type === 'popup') {
14565 modal.$el.prevAll('.popup.modal-in').add(modal.$el.nextAll('.popup.modal-in')).each(function (popupEl) {
14566 var popupInstance = popupEl.f7Modal;
14567 if (!popupInstance) return;
14568
14569 if (popupInstance.params.closeByBackdropClick && popupInstance.params.backdrop && popupInstance.backdropEl === modal.backdropEl) {
14570 needToHideBackdrop = false;
14571 }
14572 });
14573 }
14574
14575 if (needToHideBackdrop) {
14576 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
14577 $backdropEl.removeClass('backdrop-in');
14578 }
14579 } // Modal
14580
14581
14582 $el[animate ? 'removeClass' : 'addClass']('not-animated');
14583
14584 function transitionEnd() {
14585 if ($el.hasClass('modal-out')) {
14586 modal.onClosed();
14587 } else if ($el.hasClass('modal-in')) {
14588 modal.onOpened();
14589 }
14590 }
14591
14592 if (animate) {
14593 $el.animationEnd(function () {
14594 transitionEnd();
14595 });
14596 $el.transitionEnd(function () {
14597 transitionEnd();
14598 });
14599 $el.removeClass('modal-in').addClass('modal-out'); // Emit close
14600
14601 modal.onClose();
14602 } else {
14603 $el.addClass('not-animated').removeClass('modal-in').addClass('modal-out'); // Emit close
14604
14605 modal.onClose();
14606 modal.onClosed();
14607 }
14608
14609 if (modal.type === 'dialog') {
14610 clearDialogsQueue();
14611 }
14612
14613 return modal;
14614 };
14615
14616 _proto.destroy = function destroy() {
14617 var modal = this;
14618 if (modal.destroyed) return;
14619 modal.emit("local::beforeDestroy modalBeforeDestroy " + modal.type + "BeforeDestroy", modal);
14620
14621 if (modal.$el) {
14622 modal.$el.trigger("modal:beforedestroy " + modal.type.toLowerCase() + ":beforedestroy");
14623
14624 if (modal.$el.length && modal.$el[0].f7Modal) {
14625 delete modal.$el[0].f7Modal;
14626 }
14627 }
14628
14629 deleteProps(modal);
14630 modal.destroyed = true;
14631 };
14632
14633 return Modal;
14634 }(Framework7Class);
14635
14636 var CustomModal = /*#__PURE__*/function (_Modal) {
14637 _inheritsLoose$1(CustomModal, _Modal);
14638
14639 function CustomModal(app, params) {
14640 var _this;
14641
14642 var extendedParams = extend$1({
14643 backdrop: true,
14644 closeByBackdropClick: true,
14645 on: {}
14646 }, params); // Extends with open/close Modal methods;
14647
14648 _this = _Modal.call(this, app, extendedParams) || this;
14649
14650 var customModal = _assertThisInitialized$1(_this);
14651
14652 customModal.params = extendedParams; // Find Element
14653
14654 var $el;
14655
14656 if (!customModal.params.el) {
14657 $el = $$1(customModal.params.content);
14658 } else {
14659 $el = $$1(customModal.params.el);
14660 }
14661
14662 if ($el && $el.length > 0 && $el[0].f7Modal) {
14663 return $el[0].f7Modal || _assertThisInitialized$1(_this);
14664 }
14665
14666 if ($el.length === 0) {
14667 return customModal.destroy() || _assertThisInitialized$1(_this);
14668 }
14669
14670 var $backdropEl;
14671
14672 if (customModal.params.backdrop) {
14673 $backdropEl = app.$el.children('.custom-modal-backdrop');
14674
14675 if ($backdropEl.length === 0) {
14676 $backdropEl = $$1('<div class="custom-modal-backdrop"></div>');
14677 app.$el.append($backdropEl);
14678 }
14679 }
14680
14681 function handleClick(e) {
14682 if (!customModal || customModal.destroyed) return;
14683
14684 if ($backdropEl && e.target === $backdropEl[0]) {
14685 customModal.close();
14686 }
14687 }
14688
14689 customModal.on('customModalOpened', function () {
14690 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
14691 app.on('click', handleClick);
14692 }
14693 });
14694 customModal.on('customModalClose', function () {
14695 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
14696 app.off('click', handleClick);
14697 }
14698 });
14699 extend$1(customModal, {
14700 app: app,
14701 $el: $el,
14702 el: $el[0],
14703 $backdropEl: $backdropEl,
14704 backdropEl: $backdropEl && $backdropEl[0],
14705 type: 'customModal'
14706 });
14707 $el[0].f7Modal = customModal;
14708 return customModal || _assertThisInitialized$1(_this);
14709 }
14710
14711 return CustomModal;
14712 }(Modal);
14713
14714 var Modal$1 = {
14715 name: 'modal',
14716 static: {
14717 Modal: Modal,
14718 CustomModal: CustomModal
14719 },
14720 create: function create() {
14721 var app = this;
14722 app.customModal = {
14723 create: function create(params) {
14724 return new CustomModal(app, params);
14725 }
14726 };
14727 },
14728 params: {
14729 modal: {
14730 queueDialogs: true
14731 }
14732 }
14733 };
14734
14735 if (typeof window !== 'undefined') {
14736 // Dom7
14737 if (!window.Dom7) window.Dom7 = $$1;
14738 } // UMD_ONLY_END
14739
14740
14741 Router.use([RouterComponentLoaderModule]);
14742 Framework7.use([DeviceModule, SupportModule, UtilsModule, ResizeModule, RequestModule, TouchModule, ClicksModule, RouterModule, HistoryModule, ComponentModule, ServiceWorkerModule, StoreModule, Statusbar$1, View$1, Navbar$1, Toolbar$1, Subnavbar, TouchRipple$1, Modal$1]);
14743
14744 return Framework7;
14745
14746})));
14747//# sourceMappingURL=framework7.js.map