3 * Full featured mobile HTML framework for building iOS & Android apps
4 * http://framework7.io/
6 * Copyright 2014-2019 Vladimir Kharlampidi
8 * Released under the MIT License
10 * Released on: February 14, 2019
13 (function (global
, factory
) {
14 typeof exports
=== 'object' && typeof module
!== 'undefined' ? module
.exports
= factory() :
15 typeof define
=== 'function' && define
.amd
? define(factory
) :
16 (global
= global
|| self
, global
.Framework7
= factory());
17 }(this, function () { 'use strict';
21 * Mobile-first HTML template engine
23 * http://www.idangero.us/template7/
25 * Copyright 2019, Vladimir Kharlampidi
27 * http://www.idangero.us/
31 * Released on: February 5, 2019
35 if (typeof window
!== 'undefined') {
37 } else if (typeof global
!== 'undefined') {
43 var Template7Context
= t7ctx
;
45 var Template7Utils
= {
46 quoteSingleRexExp
: new RegExp('\'', 'g'),
47 quoteDoubleRexExp
: new RegExp('"', 'g'),
48 isFunction
: function isFunction(func
) {
49 return typeof func
=== 'function';
51 escape
: function escape(string
) {
52 if ( string
=== void 0 ) string
= '';
55 .replace(/&/g
, '&')
56 .replace(/</g
, '<')
57 .replace(/>/g
, '>')
58 .replace(/"/g, '"')
59 .replace(/'/g, ''');
61 helperToSlices: function helperToSlices(string) {
62 var quoteDoubleRexExp = Template7Utils.quoteDoubleRexExp;
63 var quoteSingleRexExp = Template7Utils.quoteSingleRexExp;
64 var helperParts = string.replace(/[{}#}]/g, '').trim().split(' ');
69 for (i = 0; i < helperParts.length; i += 1) {
70 var part = helperParts[i];
71 var blockQuoteRegExp = (void 0);
72 var openingQuote = (void 0);
73 if (i === 0) { slices.push(part); }
74 else if (part.indexOf('"') === 0 || part.indexOf('\'') === 0) {
75 blockQuoteRegExp = part.indexOf('"') === 0 ? quoteDoubleRexExp : quoteSingleRexExp;
76 openingQuote = part.indexOf('"') === 0 ? '"' : '\'';
78 if (part.match(blockQuoteRegExp).length === 2) {
84 for (j = i + 1; j < helperParts.length; j += 1) {
85 part += " " + (helperParts[j]);
86 if (helperParts[j].indexOf(openingQuote) >= 0) {
92 if (shiftIndex) { i = shiftIndex; }
94 } else if (part.indexOf('=') > 0) {
96 var hashParts = part.split('=');
97 var hashName = hashParts[0];
98 var hashContent = hashParts[1];
99 if (!blockQuoteRegExp) {
100 blockQuoteRegExp = hashContent.indexOf('"') === 0 ? quoteDoubleRexExp : quoteSingleRexExp;
101 openingQuote = hashContent.indexOf('"') === 0 ? '"' : '\'';
103 if (hashContent.match(blockQuoteRegExp).length !== 2) {
105 for (j = i + 1; j < helperParts.length; j += 1) {
106 hashContent += " " + (helperParts[j]);
107 if (helperParts[j].indexOf(openingQuote) >= 0) {
112 if (shiftIndex) { i = shiftIndex; }
114 var hash = [hashName, hashContent.replace(blockQuoteRegExp, '')];
123 stringToBlocks: function stringToBlocks(string) {
127 if (!string) { return []; }
128 var stringBlocks = string.split(/({{[^{^}]*}})/);
129 for (i = 0; i < stringBlocks.length; i += 1) {
130 var block = stringBlocks[i];
131 if (block === '') { continue; }
132 if (block.indexOf('{{') < 0) {
138 if (block.indexOf('{/') >= 0) {
142 .replace(/{{([#/])*([ ])*/, '{{$1')
143 .replace(/([ ])*}}/, '}}');
144 if (block.indexOf('{#') < 0 && block.indexOf(' ') < 0 && block.indexOf('else') < 0) {
148 contextName: block.replace(/[{}]/g, ''),
153 var helperSlices = Template7Utils.helperToSlices(block);
154 var helperName = helperSlices[0];
155 var isPartial = helperName === '>';
156 var helperContext = [];
158 for (j = 1; j < helperSlices.length; j += 1) {
159 var slice = helperSlices[j];
160 if (Array.isArray(slice)) {
162 helperHash[slice[0]] = slice[1] === 'false' ? false : slice[1];
164 helperContext.push(slice);
168 if (block.indexOf('{#') >= 0) {
170 var helperContent = '';
171 var elseContent = '';
173 var shiftIndex = (void 0);
174 var foundClosed = false;
175 var foundElse = false;
177 for (j = i + 1; j < stringBlocks.length; j += 1) {
178 if (stringBlocks[j].indexOf('{{#') >= 0) {
181 if (stringBlocks[j].indexOf('{{/') >= 0) {
184 if (stringBlocks[j].indexOf(("{{#" + helperName)) >= 0) {
185 helperContent += stringBlocks[j];
186 if (foundElse) { elseContent += stringBlocks[j]; }
188 } else if (stringBlocks[j].indexOf(("{{/" + helperName)) >= 0) {
191 helperContent += stringBlocks[j];
192 if (foundElse) { elseContent += stringBlocks[j]; }
198 } else if (stringBlocks[j].indexOf('else') >= 0 && depth === 0) {
201 if (!foundElse) { helperContent += stringBlocks[j]; }
202 if (foundElse) { elseContent += stringBlocks[j]; }
206 if (shiftIndex) { i = shiftIndex; }
207 if (helperName === 'raw
') {
210 content: helperContent,
215 helperName: helperName,
216 contextName: helperContext,
217 content: helperContent,
218 inverseContent: elseContent,
223 } else if (block.indexOf(' ') > 0) {
225 helperName = '_partial
';
226 if (helperContext[0]) {
227 if (helperContext[0].indexOf('[') === 0) { helperContext[0] = helperContext[0].replace(/[[\]]/g, ''); }
228 else { helperContext[0] = "\"" + (helperContext[0].replace(/"|'/g
, '')) + "\""; }
233 helperName
: helperName
,
234 contextName
: helperContext
,
242 parseJsVariable
: function parseJsVariable(expression
, replace
, object
) {
243 return expression
.split(/([+ \-*/^()&=|<>!%:?])/g
).reduce(function (arr
, part
) {
247 if (part
.indexOf(replace
) < 0) {
252 arr
.push(JSON
.stringify(''));
256 var variable
= object
;
257 if (part
.indexOf((replace
+ ".")) >= 0) {
258 part
.split((replace
+ "."))[1].split('.').forEach(function (partName
) {
259 if (partName
in variable
) { variable
= variable
[partName
]; }
260 else { variable
= undefined; }
263 if (typeof variable
=== 'string') {
264 variable
= JSON
.stringify(variable
);
266 if (variable
=== undefined) { variable
= 'undefined'; }
272 parseJsParents
: function parseJsParents(expression
, parents
) {
273 return expression
.split(/([+ \-*^()&=|<>!%:?])/g).reduce(function (arr
, part
) {
278 if (part
.indexOf('../') < 0) {
283 if (!parents
|| parents
.length
=== 0) {
284 arr
.push(JSON
.stringify(''));
288 var levelsUp
= part
.split('../').length
- 1;
289 var parentData
= levelsUp
> parents
.length
? parents
[parents
.length
- 1] : parents
[levelsUp
- 1];
291 var variable
= parentData
;
292 var parentPart
= part
.replace(/..\//g, '');
293 parentPart
.split('.').forEach(function (partName
) {
294 if (typeof variable
[partName
] !== 'undefined') { variable
= variable
[partName
]; }
295 else { variable
= 'undefined'; }
297 if (variable
=== false || variable
=== true) {
298 arr
.push(JSON
.stringify(variable
));
301 if (variable
=== null || variable
=== 'undefined') {
302 arr
.push(JSON
.stringify(''));
305 arr
.push(JSON
.stringify(variable
));
309 getCompileVar
: function getCompileVar(name
, ctx
, data
) {
310 if ( data
=== void 0 ) data
= 'data_1';
316 if (name
.indexOf('../') === 0) {
317 levelsUp
= name
.split('../').length
- 1;
318 newDepth
= variable
.split('_')[1] - levelsUp
;
319 variable
= "ctx_" + (newDepth
>= 1 ? newDepth
: 1);
320 parts
= name
.split('../')[levelsUp
].split('.');
321 } else if (name
.indexOf('@global') === 0) {
322 variable
= 'Template7.global';
323 parts
= name
.split('@global.')[1].split('.');
324 } else if (name
.indexOf('@root') === 0) {
326 parts
= name
.split('@root.')[1].split('.');
328 parts
= name
.split('.');
330 for (var i
= 0; i
< parts
.length
; i
+= 1) {
332 if (part
.indexOf('@') === 0) {
333 var dataLevel
= data
.split('_')[1];
335 dataLevel
= newDepth
;
338 variable
+= "[(data_" + dataLevel
+ " && data_" + dataLevel
+ "." + (part
.replace('@', '')) + ")]";
340 variable
= "(data_" + dataLevel
+ " && data_" + dataLevel
+ "." + (part
.replace('@', '')) + ")";
342 } else if (Number
.isFinite
? Number
.isFinite(part
) : Template7Context
.isFinite(part
)) {
343 variable
+= "[" + part
+ "]";
344 } else if (part
=== 'this' || part
.indexOf('this.') >= 0 || part
.indexOf('this[') >= 0 || part
.indexOf('this(') >= 0) {
345 variable
= part
.replace('this', ctx
);
347 variable
+= "." + part
;
352 getCompiledArguments
: function getCompiledArguments(contextArray
, ctx
, data
) {
354 for (var i
= 0; i
< contextArray
.length
; i
+= 1) {
355 if (/^['"]/.test(contextArray
[i
])) { arr
.push(contextArray
[i
]); }
356 else if (/^(true|false|\d+)$/.test(contextArray
[i
])) { arr
.push(contextArray
[i
]); }
358 arr
.push(Template7Utils
.getCompileVar(contextArray
[i
], ctx
, data
));
362 return arr
.join(', ');
366 /* eslint no-eval: "off" */
368 var Template7Helpers
= {
369 _partial
: function _partial(partialName
, options
) {
371 var p
= Template7Class
.partials
[partialName
];
372 if (!p
|| (p
&& !p
.template
)) { return ''; }
374 p
.compiled
= new Template7Class(p
.template
).compile();
376 Object
.keys(options
.hash
).forEach(function (hashName
) {
377 ctx
[hashName
] = options
.hash
[hashName
];
379 return p
.compiled(ctx
, options
.data
, options
.root
);
381 escape
: function escape(context
) {
382 if (typeof context
!== 'string') {
383 throw new Error('Template7: Passed context to "escape" helper should be a string');
385 return Template7Utils
.escape(context
);
387 if: function if$1(context
, options
) {
389 if (Template7Utils
.isFunction(ctx
)) { ctx
= ctx
.call(this); }
391 return options
.fn(this, options
.data
);
394 return options
.inverse(this, options
.data
);
396 unless
: function unless(context
, options
) {
398 if (Template7Utils
.isFunction(ctx
)) { ctx
= ctx
.call(this); }
400 return options
.fn(this, options
.data
);
403 return options
.inverse(this, options
.data
);
405 each
: function each(context
, options
) {
409 if (Template7Utils
.isFunction(ctx
)) { ctx
= ctx
.call(this); }
410 if (Array
.isArray(ctx
)) {
411 if (options
.hash
.reverse
) {
414 for (i
= 0; i
< ctx
.length
; i
+= 1) {
415 ret
+= options
.fn(ctx
[i
], { first
: i
=== 0, last
: i
=== ctx
.length
- 1, index
: i
});
417 if (options
.hash
.reverse
) {
421 // eslint-disable-next-line
422 for (var key
in ctx
) {
424 ret
+= options
.fn(ctx
[key
], { key
: key
});
427 if (i
> 0) { return ret
; }
428 return options
.inverse(this);
430 with: function with$1(context
, options
) {
432 if (Template7Utils
.isFunction(ctx
)) { ctx
= context
.call(this); }
433 return options
.fn(ctx
);
435 join
: function join(context
, options
) {
437 if (Template7Utils
.isFunction(ctx
)) { ctx
= ctx
.call(this); }
438 return ctx
.join(options
.hash
.delimiter
|| options
.hash
.delimeter
);
440 js
: function js(expression
, options
) {
441 var data
= options
.data
;
443 var execute
= expression
;
444 ('index first last key').split(' ').forEach(function (prop
) {
445 if (typeof data
[prop
] !== 'undefined') {
446 var re1
= new RegExp(("this.@" + prop
), 'g');
447 var re2
= new RegExp(("@" + prop
), 'g');
449 .replace(re1
, JSON
.stringify(data
[prop
]))
450 .replace(re2
, JSON
.stringify(data
[prop
]));
453 if (options
.root
&& execute
.indexOf('@root') >= 0) {
454 execute
= Template7Utils
.parseJsVariable(execute
, '@root', options
.root
);
456 if (execute
.indexOf('@global') >= 0) {
457 execute
= Template7Utils
.parseJsVariable(execute
, '@global', Template7Context
.Template7
.global
);
459 if (execute
.indexOf('../') >= 0) {
460 execute
= Template7Utils
.parseJsParents(execute
, options
.parents
);
462 if (execute
.indexOf('return') >= 0) {
463 func
= "(function(){" + execute
+ "})";
465 func
= "(function(){return (" + execute
+ ")})";
467 return eval(func
).call(this);
469 js_if
: function js_if(expression
, options
) {
470 var data
= options
.data
;
472 var execute
= expression
;
473 ('index first last key').split(' ').forEach(function (prop
) {
474 if (typeof data
[prop
] !== 'undefined') {
475 var re1
= new RegExp(("this.@" + prop
), 'g');
476 var re2
= new RegExp(("@" + prop
), 'g');
478 .replace(re1
, JSON
.stringify(data
[prop
]))
479 .replace(re2
, JSON
.stringify(data
[prop
]));
482 if (options
.root
&& execute
.indexOf('@root') >= 0) {
483 execute
= Template7Utils
.parseJsVariable(execute
, '@root', options
.root
);
485 if (execute
.indexOf('@global') >= 0) {
486 execute
= Template7Utils
.parseJsVariable(execute
, '@global', Template7Context
.Template7
.global
);
488 if (execute
.indexOf('../') >= 0) {
489 execute
= Template7Utils
.parseJsParents(execute
, options
.parents
);
491 if (execute
.indexOf('return') >= 0) {
492 func
= "(function(){" + execute
+ "})";
494 func
= "(function(){return (" + execute
+ ")})";
496 var condition
= eval(func
).call(this);
498 return options
.fn(this, options
.data
);
501 return options
.inverse(this, options
.data
);
504 Template7Helpers
.js_compare
= Template7Helpers
.js_if
;
506 var Template7Options
= {};
507 var Template7Partials
= {};
509 var Template7Class
= function Template7Class(template
) {
511 t
.template
= template
;
514 var staticAccessors
= { options
: { configurable
: true },partials
: { configurable
: true },helpers
: { configurable
: true } };
515 Template7Class
.prototype.compile
= function compile (template
, depth
) {
516 if ( template
=== void 0 ) template
= this.template
;
517 if ( depth
=== void 0 ) depth
= 1;
520 if (t
.compiled
) { return t
.compiled
; }
522 if (typeof template
!== 'string') {
523 throw new Error('Template7: Template must be a string');
525 var stringToBlocks
= Template7Utils
.stringToBlocks
;
526 var getCompileVar
= Template7Utils
.getCompileVar
;
527 var getCompiledArguments
= Template7Utils
.getCompiledArguments
;
529 var blocks
= stringToBlocks(template
);
530 var ctx
= "ctx_" + depth
;
531 var data
= "data_" + depth
;
532 if (blocks
.length
=== 0) {
533 return function empty() { return ''; };
536 function getCompileFn(block
, newDepth
) {
537 if (block
.content
) { return t
.compile(block
.content
, newDepth
); }
538 return function empty() { return ''; };
540 function getCompileInverse(block
, newDepth
) {
541 if (block
.inverseContent
) { return t
.compile(block
.inverseContent
, newDepth
); }
542 return function empty() { return ''; };
545 var resultString
= '';
547 resultString
+= "(function (" + ctx
+ ", " + data
+ ", root) {\n";
549 resultString
+= "(function (" + ctx
+ ", " + data
+ ") {\n";
552 resultString
+= 'function isArray(arr){return Array.isArray(arr);}\n';
553 resultString
+= 'function isFunction(func){return (typeof func === \'function\');}\n';
554 resultString
+= 'function c(val, ctx) {if (typeof val !== "undefined" && val !== null) {if (isFunction(val)) {return val.call(ctx);} else return val;} else return "";}\n';
555 resultString
+= 'root = root || ctx_1 || {};\n';
557 resultString
+= 'var r = \'\';\n';
559 for (i
= 0; i
< blocks
.length
; i
+= 1) {
560 var block
= blocks
[i
];
562 if (block
.type
=== 'plain') {
563 // eslint-disable-next-line
564 resultString
+= "r +='" + ((block
.content
).replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/'/g, '\\' + '\'')) + "';";
567 var variable = (void 0);
568 var compiledArguments = (void 0);
570 if (block.type === 'variable') {
571 variable = getCompileVar(block.contextName, ctx, data);
572 resultString += "r
+= c(" + variable + ", " + ctx + ");";
575 if (block.type === 'helper') {
576 var parents = (void 0);
577 if (ctx !== 'ctx_1') {
578 var level = ctx.split('_')[1];
579 var parentsString = "ctx_
" + (level - 1);
580 for (var j = level - 2; j >= 1; j -= 1) {
581 parentsString += ", ctx_
" + j;
583 parents = "[" + parentsString + "]";
585 parents = "[" + ctx + "]";
587 var dynamicHelper = (void 0);
588 if (block.helperName.indexOf('[') === 0) {
589 block.helperName = getCompileVar(block.helperName.replace(/[[\]]/g, ''), ctx, data);
590 dynamicHelper = true;
592 if (dynamicHelper || block.helperName in Template7Helpers) {
593 compiledArguments = getCompiledArguments(block.contextName, ctx, data);
594 resultString += "r
+= (Template7Helpers
" + (dynamicHelper ? ("[" + (block.helperName) + "]") : ("." + (block.helperName))) + ").call(" + ctx + ", " + (compiledArguments && ((compiledArguments + ", "))) + "{hash
:" + (JSON.stringify(block.hash)) + ", data
: " + data + " || {}, fn
: " + (getCompileFn(block, depth + 1)) + ", inverse
: " + (getCompileInverse(block, depth + 1)) + ", root
: root
, parents
: " + parents + "});";
595 } else if (block.contextName.length > 0) {
596 throw new Error(("Template7
: Missing helper
: \"" + (block.helperName) + "\""));
598 variable = getCompileVar(block.helperName, ctx, data);
599 resultString += "if (" + variable + ") {";
600 resultString += "if (isArray(" + variable + ")) {";
601 resultString += "r
+= (Template7Helpers
.each
).call(" + ctx + ", " + variable + ", {hash
:" + (JSON.stringify(block.hash)) + ", data
: " + data + " || {}, fn
: " + (getCompileFn(block, depth + 1)) + ", inverse
: " + (getCompileInverse(block, depth + 1)) + ", root
: root
, parents
: " + parents + "});";
602 resultString += '}else {';
603 resultString += "r
+= (Template7Helpers
.with).call(" + ctx + ", " + variable + ", {hash
:" + (JSON.stringify(block.hash)) + ", data
: " + data + " || {}, fn
: " + (getCompileFn(block, depth + 1)) + ", inverse
: " + (getCompileInverse(block, depth + 1)) + ", root
: root
, parents
: " + parents + "});";
604 resultString += '}}';
608 resultString += '\nreturn r;})';
611 // eslint-disable-next-line
612 t.compiled = eval(resultString);
617 staticAccessors.options.get = function () {
618 return Template7Options;
620 staticAccessors.partials.get = function () {
621 return Template7Partials;
623 staticAccessors.helpers.get = function () {
624 return Template7Helpers;
627 Object.defineProperties( Template7Class, staticAccessors );
629 function Template7() {
630 var args = [], len = arguments.length;
631 while ( len-- ) args[ len ] = arguments[ len ];
633 var template = args[0];
635 if (args.length === 2) {
636 var instance = new Template7Class(template);
637 var rendered = instance.compile()(data);
641 return new Template7Class(template);
643 Template7.registerHelper = function registerHelper(name, fn) {
644 Template7Class.helpers[name] = fn;
646 Template7.unregisterHelper = function unregisterHelper(name) {
647 Template7Class.helpers[name] = undefined;
648 delete Template7Class.helpers[name];
650 Template7.registerPartial = function registerPartial(name, template) {
651 Template7Class.partials[name] = { template: template };
653 Template7.unregisterPartial = function unregisterPartial(name) {
654 if (Template7Class.partials[name]) {
655 Template7Class.partials[name] = undefined;
656 delete Template7Class.partials[name];
659 Template7.compile = function compile(template, options) {
660 var instance = new Template7Class(template, options);
661 return instance.compile();
664 Template7.options = Template7Class.options;
665 Template7.helpers = Template7Class.helpers;
666 Template7.partials = Template7Class.partials;
670 * Better handling for window object in SSR environment
671 * https://github.com/nolimits4web/ssr-window
673 * Copyright 2018, Vladimir Kharlampidi
677 * Released on: July 18, 2018
679 var doc = (typeof document === 'undefined') ? {
681 addEventListener: function addEventListener() {},
682 removeEventListener: function removeEventListener() {},
684 blur: function blur() {},
687 querySelector: function querySelector() {
690 querySelectorAll: function querySelectorAll() {
693 getElementById: function getElementById() {
696 createEvent: function createEvent() {
698 initEvent: function initEvent() {},
701 createElement: function createElement() {
706 setAttribute: function setAttribute() {},
707 getElementsByTagName: function getElementsByTagName() {
712 location: { hash: '' },
713 } : document; // eslint-disable-line
715 var win = (typeof window === 'undefined') ? {
722 CustomEvent: function CustomEvent() {
725 addEventListener: function addEventListener() {},
726 removeEventListener: function removeEventListener() {},
727 getComputedStyle: function getComputedStyle() {
729 getPropertyValue: function getPropertyValue() {
734 Image: function Image() {},
735 Date: function Date() {},
737 setTimeout: function setTimeout() {},
738 clearTimeout: function clearTimeout() {},
739 } : window; // eslint-disable-line
743 * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
744 * http://framework7.io/docs/dom.html
746 * Copyright 2019, Vladimir Kharlampidi
748 * http://www.idangero.us/
752 * Released on: February 11, 2019
755 var Dom7 = function Dom7(arr) {
757 // Create array-like object
758 for (var i = 0; i < arr.length; i += 1) {
761 self.length = arr.length;
762 // Return collection with methods
766 function $(selector, context) {
769 if (selector && !context) {
770 if (selector instanceof Dom7) {
776 if (typeof selector === 'string') {
779 var html = selector.trim();
780 if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
781 var toCreate = 'div';
782 if (html.indexOf('<li') === 0) { toCreate = 'ul'; }
783 if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }
784 if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }
785 if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }
786 if (html.indexOf('<option') === 0) { toCreate = 'select'; }
787 tempParent = doc.createElement(toCreate);
788 tempParent.innerHTML = html;
789 for (i = 0; i < tempParent.childNodes.length; i += 1) {
790 arr.push(tempParent.childNodes[i]);
793 if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
795 els = [doc.getElementById(selector.trim().split('#')[1])];
798 els = (context || doc).querySelectorAll(selector.trim());
800 for (i = 0; i < els.length; i += 1) {
801 if (els[i]) { arr.push(els[i]); }
804 } else if (selector.nodeType || selector === win || selector === doc) {
807 } else if (selector.length > 0 && selector[0].nodeType) {
808 // Array of elements or instance of Dom
809 for (i = 0; i < selector.length; i += 1) {
810 arr.push(selector[i]);
814 return new Dom7(arr);
817 $.fn = Dom7.prototype;
821 function unique(arr) {
822 var uniqueArray = [];
823 for (var i = 0; i < arr.length; i += 1) {
824 if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }
828 function toCamelCase(string) {
829 return string.toLowerCase().replace(/-(.)/g, function (match, group1) { return group1.toUpperCase(); });
832 function requestAnimationFrame(callback) {
833 if (win.requestAnimationFrame) { return win.requestAnimationFrame(callback); }
834 else if (win.webkitRequestAnimationFrame) { return win.webkitRequestAnimationFrame(callback); }
835 return win.setTimeout(callback, 1000 / 60);
837 function cancelAnimationFrame(id) {
838 if (win.cancelAnimationFrame) { return win.cancelAnimationFrame(id); }
839 else if (win.webkitCancelAnimationFrame) { return win.webkitCancelAnimationFrame(id); }
840 return win.clearTimeout(id);
843 // Classes and attributes
844 function addClass(className) {
845 if (typeof className === 'undefined') {
848 var classes = className.split(' ');
849 for (var i = 0; i < classes.length; i += 1) {
850 for (var j = 0; j < this.length; j += 1) {
851 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }
856 function removeClass(className) {
857 var classes = className.split(' ');
858 for (var i = 0; i < classes.length; i += 1) {
859 for (var j = 0; j < this.length; j += 1) {
860 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }
865 function hasClass(className) {
866 if (!this[0]) { return false; }
867 return this[0].classList.contains(className);
869 function toggleClass(className) {
870 var classes = className.split(' ');
871 for (var i = 0; i < classes.length; i += 1) {
872 for (var j = 0; j < this.length; j += 1) {
873 if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }
878 function attr(attrs, value) {
879 var arguments$1 = arguments;
881 if (arguments.length === 1 && typeof attrs === 'string') {
883 if (this[0]) { return this[0].getAttribute(attrs); }
888 for (var i = 0; i < this.length; i += 1) {
889 if (arguments$1.length === 2) {
891 this[i].setAttribute(attrs, value);
894 // eslint-disable-next-line
895 for (var attrName in attrs) {
896 this[i][attrName] = attrs[attrName];
897 this[i].setAttribute(attrName, attrs[attrName]);
903 // eslint-disable-next-line
904 function removeAttr(attr) {
905 for (var i = 0; i < this.length; i += 1) {
906 this[i].removeAttribute(attr);
910 // eslint-disable-next-line
911 function prop(props, value) {
912 var arguments$1 = arguments;
914 if (arguments.length === 1 && typeof props === 'string') {
916 if (this[0]) { return this[0][props]; }
919 for (var i = 0; i < this.length; i += 1) {
920 if (arguments$1.length === 2) {
922 this[i][props] = value;
925 // eslint-disable-next-line
926 for (var propName in props) {
927 this[i][propName] = props[propName];
934 function data(key, value) {
936 if (typeof value === 'undefined') {
940 if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {
941 return el.dom7ElementDataStorage[key];
944 var dataKey = el.getAttribute(("data
-" + key));
954 for (var i = 0; i < this.length; i += 1) {
956 if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }
957 el.dom7ElementDataStorage[key] = value;
961 function removeData(key) {
962 for (var i = 0; i < this.length; i += 1) {
964 if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {
965 el.dom7ElementDataStorage[key] = null;
966 delete el.dom7ElementDataStorage[key];
972 if (!el) { return undefined; }
973 var dataset = {}; // eslint-disable-line
975 // eslint-disable-next-line
976 for (var dataKey in el.dataset) {
977 dataset[dataKey] = el.dataset[dataKey];
980 for (var i = 0; i < el.attributes.length; i += 1) {
981 // eslint-disable-next-line
982 var attr = el.attributes[i];
983 if (attr.name.indexOf('data-') >= 0) {
984 dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;
988 // eslint-disable-next-line
989 for (var key in dataset) {
990 if (dataset[key] === 'false') { dataset[key] = false; }
991 else if (dataset[key] === 'true') { dataset[key] = true; }
992 else if (parseFloat(dataset[key]) === dataset[key] * 1) { dataset[key] *= 1; }
996 function val(value) {
998 if (typeof value === 'undefined') {
1000 if (dom[0].multiple && dom[0].nodeName.toLowerCase() === 'select') {
1002 for (var i = 0; i < dom[0].selectedOptions.length; i += 1) {
1003 values.push(dom[0].selectedOptions[i].value);
1007 return dom[0].value;
1012 for (var i$1 = 0; i$1 < dom.length; i$1 += 1) {
1014 if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {
1015 for (var j = 0; j < el.options.length; j += 1) {
1016 el.options[j].selected = value.indexOf(el.options[j].value) >= 0;
1025 // eslint-disable-next-line
1026 function transform(transform) {
1027 for (var i = 0; i < this.length; i += 1) {
1028 var elStyle = this[i].style;
1029 elStyle.webkitTransform = transform;
1030 elStyle.transform = transform;
1034 function transition(duration) {
1035 if (typeof duration !== 'string') {
1036 duration = duration + "ms
"; // eslint-disable-line
1038 for (var i = 0; i < this.length; i += 1) {
1039 var elStyle = this[i].style;
1040 elStyle.webkitTransitionDuration = duration;
1041 elStyle.transitionDuration = duration;
1049 var args = [], len = arguments.length;
1050 while ( len-- ) args[ len ] = arguments[ len ];
1051 var eventType = args[0];
1052 var targetSelector = args[1];
1053 var listener = args[2];
1054 var capture = args[3];
1055 if (typeof args[1] === 'function') {
1056 (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
1057 targetSelector = undefined;
1059 if (!capture) { capture = false; }
1061 function handleLiveEvent(e) {
1062 var target = e.target;
1063 if (!target) { return; }
1064 var eventData = e.target.dom7EventData || [];
1065 if (eventData.indexOf(e) < 0) {
1066 eventData.unshift(e);
1068 if ($(target).is(targetSelector)) { listener.apply(target, eventData); }
1070 var parents = $(target).parents(); // eslint-disable-line
1071 for (var k = 0; k < parents.length; k += 1) {
1072 if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }
1076 function handleEvent(e) {
1077 var eventData = e && e.target ? e.target.dom7EventData || [] : [];
1078 if (eventData.indexOf(e) < 0) {
1079 eventData.unshift(e);
1081 listener.apply(this, eventData);
1083 var events = eventType.split(' ');
1085 for (var i = 0; i < this.length; i += 1) {
1087 if (!targetSelector) {
1088 for (j = 0; j < events.length; j += 1) {
1089 var event = events[j];
1090 if (!el.dom7Listeners) { el.dom7Listeners = {}; }
1091 if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }
1092 el.dom7Listeners[event].push({
1094 proxyListener: handleEvent,
1096 el.addEventListener(event, handleEvent, capture);
1100 for (j = 0; j < events.length; j += 1) {
1101 var event$1 = events[j];
1102 if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }
1103 if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }
1104 el.dom7LiveListeners[event$1].push({
1106 proxyListener: handleLiveEvent,
1108 el.addEventListener(event$1, handleLiveEvent, capture);
1117 var args = [], len = arguments.length;
1118 while ( len-- ) args[ len ] = arguments[ len ];
1119 var eventType = args[0];
1120 var targetSelector = args[1];
1121 var listener = args[2];
1122 var capture = args[3];
1123 if (typeof args[1] === 'function') {
1124 (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
1125 targetSelector = undefined;
1127 if (!capture) { capture = false; }
1129 var events = eventType.split(' ');
1130 for (var i = 0; i < events.length; i += 1) {
1131 var event = events[i];
1132 for (var j = 0; j < this.length; j += 1) {
1134 var handlers = (void 0);
1135 if (!targetSelector && el.dom7Listeners) {
1136 handlers = el.dom7Listeners[event];
1137 } else if (targetSelector && el.dom7LiveListeners) {
1138 handlers = el.dom7LiveListeners[event];
1140 if (handlers && handlers.length) {
1141 for (var k = handlers.length - 1; k >= 0; k -= 1) {
1142 var handler = handlers[k];
1143 if (listener && handler.listener === listener) {
1144 el.removeEventListener(event, handler.proxyListener, capture);
1145 handlers.splice(k, 1);
1146 } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
1147 el.removeEventListener(event, handler.proxyListener, capture);
1148 handlers.splice(k, 1);
1149 } else if (!listener) {
1150 el.removeEventListener(event, handler.proxyListener, capture);
1151 handlers.splice(k, 1);
1162 var args = [], len = arguments.length;
1163 while ( len-- ) args[ len ] = arguments[ len ];
1165 var eventName = args[0];
1166 var targetSelector = args[1];
1167 var listener = args[2];
1168 var capture = args[3];
1169 if (typeof args[1] === 'function') {
1170 (assign = args, eventName = assign[0], listener = assign[1], capture = assign[2]);
1171 targetSelector = undefined;
1173 function onceHandler() {
1174 var eventArgs = [], len = arguments.length;
1175 while ( len-- ) eventArgs[ len ] = arguments[ len ];
1177 listener.apply(this, eventArgs);
1178 dom.off(eventName, targetSelector, onceHandler, capture);
1179 if (onceHandler.dom7proxy) {
1180 delete onceHandler.dom7proxy;
1183 onceHandler.dom7proxy = listener;
1184 return dom.on(eventName, targetSelector, onceHandler, capture);
1186 function trigger() {
1187 var args = [], len = arguments.length;
1188 while ( len-- ) args[ len ] = arguments[ len ];
1190 var events = args[0].split(' ');
1191 var eventData = args[1];
1192 for (var i = 0; i < events.length; i += 1) {
1193 var event = events[i];
1194 for (var j = 0; j < this.length; j += 1) {
1198 evt = new win.CustomEvent(event, {
1204 evt = doc.createEvent('Event');
1205 evt.initEvent(event, true, true);
1206 evt.detail = eventData;
1208 // eslint-disable-next-line
1209 el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });
1210 el.dispatchEvent(evt);
1211 el.dom7EventData = [];
1212 delete el.dom7EventData;
1217 function transitionEnd(callback) {
1218 var events = ['webkitTransitionEnd', 'transitionend'];
1221 function fireCallBack(e) {
1222 /* jshint validthis:true */
1223 if (e.target !== this) { return; }
1224 callback.call(this, e);
1225 for (i = 0; i < events.length; i += 1) {
1226 dom.off(events[i], fireCallBack);
1230 for (i = 0; i < events.length; i += 1) {
1231 dom.on(events[i], fireCallBack);
1236 function animationEnd(callback) {
1237 var events = ['webkitAnimationEnd', 'animationend'];
1240 function fireCallBack(e) {
1241 if (e.target !== this) { return; }
1242 callback.call(this, e);
1243 for (i = 0; i < events.length; i += 1) {
1244 dom.off(events[i], fireCallBack);
1248 for (i = 0; i < events.length; i += 1) {
1249 dom.on(events[i], fireCallBack);
1256 if (this[0] === win) {
1257 return win.innerWidth;
1260 if (this.length > 0) {
1261 return parseFloat(this.css('width'));
1266 function outerWidth(includeMargins) {
1267 if (this.length > 0) {
1268 if (includeMargins) {
1269 // eslint-disable-next-line
1270 var styles = this.styles();
1271 return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));
1273 return this[0].offsetWidth;
1278 if (this[0] === win) {
1279 return win.innerHeight;
1282 if (this.length > 0) {
1283 return parseFloat(this.css('height'));
1288 function outerHeight(includeMargins) {
1289 if (this.length > 0) {
1290 if (includeMargins) {
1291 // eslint-disable-next-line
1292 var styles = this.styles();
1293 return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));
1295 return this[0].offsetHeight;
1300 if (this.length > 0) {
1302 var box = el.getBoundingClientRect();
1303 var body = doc.body;
1304 var clientTop = el.clientTop || body.clientTop || 0;
1305 var clientLeft = el.clientLeft || body.clientLeft || 0;
1306 var scrollTop = el === win ? win.scrollY : el.scrollTop;
1307 var scrollLeft = el === win ? win.scrollX : el.scrollLeft;
1309 top: (box.top + scrollTop) - clientTop,
1310 left: (box.left + scrollLeft) - clientLeft,
1317 for (var i = 0; i < this.length; i += 1) {
1318 this[i].style.display = 'none';
1323 for (var i = 0; i < this.length; i += 1) {
1325 if (el.style.display === 'none') {
1326 el.style.display = '';
1328 if (win.getComputedStyle(el, null).getPropertyValue('display') === 'none') {
1329 // Still not visible
1330 el.style.display = 'block';
1336 if (this[0]) { return win.getComputedStyle(this[0], null); }
1339 function css(props, value) {
1341 if (arguments.length === 1) {
1342 if (typeof props === 'string') {
1343 if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }
1345 for (i = 0; i < this.length; i += 1) {
1346 // eslint-disable-next-line
1347 for (var prop in props) {
1348 this[i].style[prop] = props[prop];
1354 if (arguments.length === 2 && typeof props === 'string') {
1355 for (i = 0; i < this.length; i += 1) {
1356 this[i].style[props] = value;
1364 function toArray() {
1366 for (var i = 0; i < this.length; i += 1) {
1371 // Iterate over the collection passing elements to `callback`
1372 function each(callback) {
1373 // Don't bother continuing without a callback
1374 if (!callback) { return this; }
1375 // Iterate over the current collection
1376 for (var i = 0; i < this.length; i += 1) {
1377 // If the callback returns false
1378 if (callback.call(this[i], i, this[i]) === false) {
1379 // End the loop early
1383 // Return `this` to allow chained DOM operations
1386 function forEach(callback) {
1387 // Don't bother continuing without a callback
1388 if (!callback) { return this; }
1389 // Iterate over the current collection
1390 for (var i = 0; i < this.length; i += 1) {
1391 // If the callback returns false
1392 if (callback.call(this[i], this[i], i) === false) {
1393 // End the loop early
1397 // Return `this` to allow chained DOM operations
1400 function filter(callback) {
1401 var matchedItems = [];
1403 for (var i = 0; i < dom.length; i += 1) {
1404 if (callback.call(dom[i], i, dom[i])) { matchedItems.push(dom[i]); }
1406 return new Dom7(matchedItems);
1408 function map(callback) {
1409 var modifiedItems = [];
1411 for (var i = 0; i < dom.length; i += 1) {
1412 modifiedItems.push(callback.call(dom[i], i, dom[i]));
1414 return new Dom7(modifiedItems);
1416 // eslint-disable-next-line
1417 function html(html) {
1418 if (typeof html === 'undefined') {
1419 return this[0] ? this[0].innerHTML : undefined;
1422 for (var i = 0; i < this.length; i += 1) {
1423 this[i].innerHTML = html;
1427 // eslint-disable-next-line
1428 function text(text) {
1429 if (typeof text === 'undefined') {
1431 return this[0].textContent.trim();
1436 for (var i = 0; i < this.length; i += 1) {
1437 this[i].textContent = text;
1441 function is(selector) {
1445 if (!el || typeof selector === 'undefined') { return false; }
1446 if (typeof selector === 'string') {
1447 if (el.matches) { return el.matches(selector); }
1448 else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }
1449 else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }
1451 compareWith = $(selector);
1452 for (i = 0; i < compareWith.length; i += 1) {
1453 if (compareWith[i] === el) { return true; }
1456 } else if (selector === doc) { return el === doc; }
1457 else if (selector === win) { return el === win; }
1459 if (selector.nodeType || selector instanceof Dom7) {
1460 compareWith = selector.nodeType ? [selector] : selector;
1461 for (i = 0; i < compareWith.length; i += 1) {
1462 if (compareWith[i] === el) { return true; }
1468 function indexOf(el) {
1469 for (var i = 0; i < this.length; i += 1) {
1470 if (this[i] === el) { return i; }
1475 var child = this[0];
1479 // eslint-disable-next-line
1480 while ((child = child.previousSibling) !== null) {
1481 if (child.nodeType === 1) { i += 1; }
1487 // eslint-disable-next-line
1488 function eq(index) {
1489 if (typeof index === 'undefined') { return this; }
1490 var length = this.length;
1492 if (index > length - 1) {
1493 return new Dom7([]);
1496 returnIndex = length + index;
1497 if (returnIndex < 0) { return new Dom7([]); }
1498 return new Dom7([this[returnIndex]]);
1500 return new Dom7([this[index]]);
1503 var args = [], len = arguments.length;
1504 while ( len-- ) args[ len ] = arguments[ len ];
1508 for (var k = 0; k < args.length; k += 1) {
1510 for (var i = 0; i < this.length; i += 1) {
1511 if (typeof newChild === 'string') {
1512 var tempDiv = doc.createElement('div');
1513 tempDiv.innerHTML = newChild;
1514 while (tempDiv.firstChild) {
1515 this[i].appendChild(tempDiv.firstChild);
1517 } else if (newChild instanceof Dom7) {
1518 for (var j = 0; j < newChild.length; j += 1) {
1519 this[i].appendChild(newChild[j]);
1522 this[i].appendChild(newChild);
1529 // eslint-disable-next-line
1530 function appendTo(parent) {
1531 $(parent).append(this);
1534 function prepend(newChild) {
1537 for (i = 0; i < this.length; i += 1) {
1538 if (typeof newChild === 'string') {
1539 var tempDiv = doc.createElement('div');
1540 tempDiv.innerHTML = newChild;
1541 for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
1542 this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
1544 } else if (newChild instanceof Dom7) {
1545 for (j = 0; j < newChild.length; j += 1) {
1546 this[i].insertBefore(newChild[j], this[i].childNodes[0]);
1549 this[i].insertBefore(newChild, this[i].childNodes[0]);
1554 // eslint-disable-next-line
1555 function prependTo(parent) {
1556 $(parent).prepend(this);
1559 function insertBefore(selector) {
1560 var before = $(selector);
1561 for (var i = 0; i < this.length; i += 1) {
1562 if (before.length === 1) {
1563 before[0].parentNode.insertBefore(this[i], before[0]);
1564 } else if (before.length > 1) {
1565 for (var j = 0; j < before.length; j += 1) {
1566 before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);
1571 function insertAfter(selector) {
1572 var after = $(selector);
1573 for (var i = 0; i < this.length; i += 1) {
1574 if (after.length === 1) {
1575 after[0].parentNode.insertBefore(this[i], after[0].nextSibling);
1576 } else if (after.length > 1) {
1577 for (var j = 0; j < after.length; j += 1) {
1578 after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);
1583 function next(selector) {
1584 if (this.length > 0) {
1586 if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
1587 return new Dom7([this[0].nextElementSibling]);
1589 return new Dom7([]);
1592 if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }
1593 return new Dom7([]);
1595 return new Dom7([]);
1597 function nextAll(selector) {
1600 if (!el) { return new Dom7([]); }
1601 while (el.nextElementSibling) {
1602 var next = el.nextElementSibling; // eslint-disable-line
1604 if ($(next).is(selector)) { nextEls.push(next); }
1605 } else { nextEls.push(next); }
1608 return new Dom7(nextEls);
1610 function prev(selector) {
1611 if (this.length > 0) {
1614 if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
1615 return new Dom7([el.previousElementSibling]);
1617 return new Dom7([]);
1620 if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }
1621 return new Dom7([]);
1623 return new Dom7([]);
1625 function prevAll(selector) {
1628 if (!el) { return new Dom7([]); }
1629 while (el.previousElementSibling) {
1630 var prev = el.previousElementSibling; // eslint-disable-line
1632 if ($(prev).is(selector)) { prevEls.push(prev); }
1633 } else { prevEls.push(prev); }
1636 return new Dom7(prevEls);
1638 function siblings(selector) {
1639 return this.nextAll(selector).add(this.prevAll(selector));
1641 function parent(selector) {
1642 var parents = []; // eslint-disable-line
1643 for (var i = 0; i < this.length; i += 1) {
1644 if (this[i].parentNode !== null) {
1646 if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }
1648 parents.push(this[i].parentNode);
1652 return $(unique(parents));
1654 function parents(selector) {
1655 var parents = []; // eslint-disable-line
1656 for (var i = 0; i < this.length; i += 1) {
1657 var parent = this[i].parentNode; // eslint-disable-line
1660 if ($(parent).is(selector)) { parents.push(parent); }
1662 parents.push(parent);
1664 parent = parent.parentNode;
1667 return $(unique(parents));
1669 function closest(selector) {
1670 var closest = this; // eslint-disable-line
1671 if (typeof selector === 'undefined') {
1672 return new Dom7([]);
1674 if (!closest.is(selector)) {
1675 closest = closest.parents(selector).eq(0);
1679 function find(selector) {
1680 var foundElements = [];
1681 for (var i = 0; i < this.length; i += 1) {
1682 var found = this[i].querySelectorAll(selector);
1683 for (var j = 0; j < found.length; j += 1) {
1684 foundElements.push(found[j]);
1687 return new Dom7(foundElements);
1689 function children(selector) {
1690 var children = []; // eslint-disable-line
1691 for (var i = 0; i < this.length; i += 1) {
1692 var childNodes = this[i].childNodes;
1694 for (var j = 0; j < childNodes.length; j += 1) {
1696 if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }
1697 } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {
1698 children.push(childNodes[j]);
1702 return new Dom7(unique(children));
1705 for (var i = 0; i < this.length; i += 1) {
1706 if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }
1711 return this.remove();
1714 var args = [], len = arguments.length;
1715 while ( len-- ) args[ len ] = arguments[ len ];
1720 for (i = 0; i < args.length; i += 1) {
1721 var toAdd = $(args[i]);
1722 for (j = 0; j < toAdd.length; j += 1) {
1723 dom[dom.length] = toAdd[j];
1730 for (var i = 0; i < this.length; i += 1) {
1732 if (el.nodeType === 1) {
1733 for (var j = 0; j < el.childNodes.length; j += 1) {
1734 if (el.childNodes[j].parentNode) {
1735 el.childNodes[j].parentNode.removeChild(el.childNodes[j]);
1738 el.textContent = '';
1744 var Methods = /*#__PURE__*/Object.freeze({
1746 removeClass: removeClass,
1748 toggleClass: toggleClass,
1750 removeAttr: removeAttr,
1753 removeData: removeData,
1756 transform: transform,
1757 transition: transition,
1762 transitionEnd: transitionEnd,
1763 animationEnd: animationEnd,
1765 outerWidth: outerWidth,
1767 outerHeight: outerHeight,
1787 prependTo: prependTo,
1788 insertBefore: insertBefore,
1789 insertAfter: insertAfter,
1806 function scrollTo() {
1809 var args = [], len = arguments.length;
1810 while ( len-- ) args[ len ] = arguments[ len ];
1813 var duration = args[2];
1814 var easing = args[3];
1815 var callback = args[4];
1816 if (args.length === 4 && typeof easing === 'function') {
1818 (assign = args, left = assign[0], top = assign[1], duration = assign[2], callback = assign[3], easing = assign[4]);
1820 if (typeof easing === 'undefined') { easing = 'swing'; }
1822 return this.each(function animate() {
1830 var scrollTop; // eslint-disable-line
1831 var scrollLeft; // eslint-disable-line
1832 var animateTop = top > 0 || top === 0;
1833 var animateLeft = left > 0 || left === 0;
1834 if (typeof easing === 'undefined') {
1838 currentTop = el.scrollTop;
1844 currentLeft = el.scrollLeft;
1846 el.scrollLeft = left;
1849 if (!duration) { return; }
1851 maxTop = el.scrollHeight - el.offsetHeight;
1852 newTop = Math.max(Math.min(top, maxTop), 0);
1855 maxLeft = el.scrollWidth - el.offsetWidth;
1856 newLeft = Math.max(Math.min(left, maxLeft), 0);
1858 var startTime = null;
1859 if (animateTop && newTop === currentTop) { animateTop = false; }
1860 if (animateLeft && newLeft === currentLeft) { animateLeft = false; }
1861 function render(time) {
1862 if ( time === void 0 ) time = new Date().getTime();
1864 if (startTime === null) {
1867 var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
1868 var easeProgress = easing === 'linear' ? progress : (0.5 - (Math.cos(progress * Math.PI) / 2));
1870 if (animateTop) { scrollTop = currentTop + (easeProgress * (newTop - currentTop)); }
1871 if (animateLeft) { scrollLeft = currentLeft + (easeProgress * (newLeft - currentLeft)); }
1872 if (animateTop && newTop > currentTop && scrollTop >= newTop) {
1873 el.scrollTop = newTop;
1876 if (animateTop && newTop < currentTop && scrollTop <= newTop) {
1877 el.scrollTop = newTop;
1880 if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {
1881 el.scrollLeft = newLeft;
1884 if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {
1885 el.scrollLeft = newLeft;
1890 if (callback) { callback(); }
1893 if (animateTop) { el.scrollTop = scrollTop; }
1894 if (animateLeft) { el.scrollLeft = scrollLeft; }
1895 requestAnimationFrame(render);
1897 requestAnimationFrame(render);
1900 // scrollTop(top, duration, easing, callback) {
1901 function scrollTop() {
1904 var args = [], len = arguments.length;
1905 while ( len-- ) args[ len ] = arguments[ len ];
1907 var duration = args[1];
1908 var easing = args[2];
1909 var callback = args[3];
1910 if (args.length === 3 && typeof easing === 'function') {
1911 (assign = args, top = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
1914 if (typeof top === 'undefined') {
1915 if (dom.length > 0) { return dom[0].scrollTop; }
1918 return dom.scrollTo(undefined, top, duration, easing, callback);
1920 function scrollLeft() {
1923 var args = [], len = arguments.length;
1924 while ( len-- ) args[ len ] = arguments[ len ];
1926 var duration = args[1];
1927 var easing = args[2];
1928 var callback = args[3];
1929 if (args.length === 3 && typeof easing === 'function') {
1930 (assign = args, left = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
1933 if (typeof left === 'undefined') {
1934 if (dom.length > 0) { return dom[0].scrollLeft; }
1937 return dom.scrollTo(left, undefined, duration, easing, callback);
1940 var Scroll = /*#__PURE__*/Object.freeze({
1942 scrollTop: scrollTop,
1943 scrollLeft: scrollLeft
1946 function animate(initialProps, initialParams) {
1949 props: Object.assign({}, initialProps),
1950 params: Object.assign({
1952 easing: 'swing', // or 'linear'
1956 progress(elements, complete, remaining, start, tweenValue)
1964 easingProgress: function easingProgress(easing, progress) {
1965 if (easing === 'swing') {
1966 return 0.5 - (Math.cos(progress * Math.PI) / 2);
1968 if (typeof easing === 'function') {
1969 return easing(progress);
1973 stop: function stop() {
1975 cancelAnimationFrame(a.frameId);
1977 a.animating = false;
1978 a.elements.each(function (index, el) {
1980 delete element.dom7AnimateInstance;
1984 done: function done(complete) {
1985 a.animating = false;
1986 a.elements.each(function (index, el) {
1988 delete element.dom7AnimateInstance;
1990 if (complete) { complete(els); }
1991 if (a.que.length > 0) {
1992 var que = a.que.shift();
1993 a.animate(que[0], que[1]);
1996 animate: function animate(props, params) {
1998 a.que.push([props, params]);
2003 // Define & Cache Initials & Units
2004 a.elements.each(function (index, el) {
2005 var initialFullValue;
2011 if (!el.dom7AnimateInstance) { a.elements[index].dom7AnimateInstance = a; }
2016 Object.keys(props).forEach(function (prop) {
2017 initialFullValue = win.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');
2018 initialValue = parseFloat(initialFullValue);
2019 unit = initialFullValue.replace(initialValue, '');
2020 finalValue = parseFloat(props[prop]);
2021 finalFullValue = props[prop] + unit;
2022 elements[index][prop] = {
2023 initialFullValue: initialFullValue,
2024 initialValue: initialValue,
2026 finalValue: finalValue,
2027 finalFullValue: finalFullValue,
2028 currentValue: initialValue,
2033 var startTime = null;
2035 var elementsDone = 0;
2043 time = new Date().getTime();
2049 if (params.begin) { params.begin(els); }
2051 if (startTime === null) {
2054 if (params.progress) {
2055 // eslint-disable-next-line
2056 params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), ((startTime + params.duration) - time < 0 ? 0 : (startTime + params.duration) - time), startTime);
2059 elements.forEach(function (element) {
2061 if (done || el.done) { return; }
2062 Object.keys(props).forEach(function (prop) {
2063 if (done || el.done) { return; }
2064 progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);
2065 easeProgress = a.easingProgress(params.easing, progress);
2067 var initialValue = ref.initialValue;
2068 var finalValue = ref.finalValue;
2069 var unit = ref.unit;
2070 el[prop].currentValue = initialValue + (easeProgress * (finalValue - initialValue));
2071 var currentValue = el[prop].currentValue;
2074 (finalValue > initialValue && currentValue >= finalValue) ||
2075 (finalValue < initialValue && currentValue <= finalValue)) {
2076 el.container.style[prop] = finalValue + unit;
2078 if (propsDone === Object.keys(props).length) {
2082 if (elementsDone === elements.length) {
2087 a.done(params.complete);
2090 el.container.style[prop] = currentValue + unit;
2093 if (done) { return; }
2095 a.frameId = requestAnimationFrame(render);
2097 a.frameId = requestAnimationFrame(render);
2102 if (a.elements.length === 0) {
2106 var animateInstance;
2107 for (var i = 0; i < a.elements.length; i += 1) {
2108 if (a.elements[i].dom7AnimateInstance) {
2109 animateInstance = a.elements[i].dom7AnimateInstance;
2110 } else { a.elements[i].dom7AnimateInstance = a; }
2112 if (!animateInstance) {
2113 animateInstance = a;
2116 if (initialProps === 'stop') {
2117 animateInstance.stop();
2119 animateInstance.animate(a.props, a.params);
2127 for (var i = 0; i < els.length; i += 1) {
2128 if (els[i].dom7AnimateInstance) {
2129 els[i].dom7AnimateInstance.stop();
2134 var Animate = /*#__PURE__*/Object.freeze({
2139 var noTrigger = ('resize scroll').split(' ');
2140 function eventShortcut(name) {
2143 var args = [], len = arguments.length - 1;
2144 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
2145 if (typeof args[0] === 'undefined') {
2146 for (var i = 0; i < this.length; i += 1) {
2147 if (noTrigger.indexOf(name) < 0) {
2148 if (name in this[i]) { this[i][name](); }
2150 $(this[i]).trigger(name);
2156 return (ref = this).on.apply(ref, [ name ].concat( args ));
2160 var args = [], len = arguments.length;
2161 while ( len-- ) args[ len ] = arguments[ len ];
2163 return eventShortcut.bind(this).apply(void 0, [ 'click' ].concat( args ));
2166 var args = [], len = arguments.length;
2167 while ( len-- ) args[ len ] = arguments[ len ];
2169 return eventShortcut.bind(this).apply(void 0, [ 'blur' ].concat( args ));
2172 var args = [], len = arguments.length;
2173 while ( len-- ) args[ len ] = arguments[ len ];
2175 return eventShortcut.bind(this).apply(void 0, [ 'focus' ].concat( args ));
2177 function focusin() {
2178 var args = [], len = arguments.length;
2179 while ( len-- ) args[ len ] = arguments[ len ];
2181 return eventShortcut.bind(this).apply(void 0, [ 'focusin' ].concat( args ));
2183 function focusout() {
2184 var args = [], len = arguments.length;
2185 while ( len-- ) args[ len ] = arguments[ len ];
2187 return eventShortcut.bind(this).apply(void 0, [ 'focusout' ].concat( args ));
2190 var args = [], len = arguments.length;
2191 while ( len-- ) args[ len ] = arguments[ len ];
2193 return eventShortcut.bind(this).apply(void 0, [ 'keyup' ].concat( args ));
2195 function keydown() {
2196 var args = [], len = arguments.length;
2197 while ( len-- ) args[ len ] = arguments[ len ];
2199 return eventShortcut.bind(this).apply(void 0, [ 'keydown' ].concat( args ));
2201 function keypress() {
2202 var args = [], len = arguments.length;
2203 while ( len-- ) args[ len ] = arguments[ len ];
2205 return eventShortcut.bind(this).apply(void 0, [ 'keypress' ].concat( args ));
2208 var args = [], len = arguments.length;
2209 while ( len-- ) args[ len ] = arguments[ len ];
2211 return eventShortcut.bind(this).apply(void 0, [ 'submit' ].concat( args ));
2214 var args = [], len = arguments.length;
2215 while ( len-- ) args[ len ] = arguments[ len ];
2217 return eventShortcut.bind(this).apply(void 0, [ 'change' ].concat( args ));
2219 function mousedown() {
2220 var args = [], len = arguments.length;
2221 while ( len-- ) args[ len ] = arguments[ len ];
2223 return eventShortcut.bind(this).apply(void 0, [ 'mousedown' ].concat( args ));
2225 function mousemove() {
2226 var args = [], len = arguments.length;
2227 while ( len-- ) args[ len ] = arguments[ len ];
2229 return eventShortcut.bind(this).apply(void 0, [ 'mousemove' ].concat( args ));
2231 function mouseup() {
2232 var args = [], len = arguments.length;
2233 while ( len-- ) args[ len ] = arguments[ len ];
2235 return eventShortcut.bind(this).apply(void 0, [ 'mouseup' ].concat( args ));
2237 function mouseenter() {
2238 var args = [], len = arguments.length;
2239 while ( len-- ) args[ len ] = arguments[ len ];
2241 return eventShortcut.bind(this).apply(void 0, [ 'mouseenter' ].concat( args ));
2243 function mouseleave() {
2244 var args = [], len = arguments.length;
2245 while ( len-- ) args[ len ] = arguments[ len ];
2247 return eventShortcut.bind(this).apply(void 0, [ 'mouseleave' ].concat( args ));
2249 function mouseout() {
2250 var args = [], len = arguments.length;
2251 while ( len-- ) args[ len ] = arguments[ len ];
2253 return eventShortcut.bind(this).apply(void 0, [ 'mouseout' ].concat( args ));
2255 function mouseover() {
2256 var args = [], len = arguments.length;
2257 while ( len-- ) args[ len ] = arguments[ len ];
2259 return eventShortcut.bind(this).apply(void 0, [ 'mouseover' ].concat( args ));
2261 function touchstart() {
2262 var args = [], len = arguments.length;
2263 while ( len-- ) args[ len ] = arguments[ len ];
2265 return eventShortcut.bind(this).apply(void 0, [ 'touchstart' ].concat( args ));
2267 function touchend() {
2268 var args = [], len = arguments.length;
2269 while ( len-- ) args[ len ] = arguments[ len ];
2271 return eventShortcut.bind(this).apply(void 0, [ 'touchend' ].concat( args ));
2273 function touchmove() {
2274 var args = [], len = arguments.length;
2275 while ( len-- ) args[ len ] = arguments[ len ];
2277 return eventShortcut.bind(this).apply(void 0, [ 'touchmove' ].concat( args ));
2280 var args = [], len = arguments.length;
2281 while ( len-- ) args[ len ] = arguments[ len ];
2283 return eventShortcut.bind(this).apply(void 0, [ 'resize' ].concat( args ));
2286 var args = [], len = arguments.length;
2287 while ( len-- ) args[ len ] = arguments[ len ];
2289 return eventShortcut.bind(this).apply(void 0, [ 'scroll' ].concat( args ));
2292 var eventShortcuts = /*#__PURE__*/Object.freeze({
2303 mousedown: mousedown,
2304 mousemove: mousemove,
2306 mouseenter: mouseenter,
2307 mouseleave: mouseleave,
2309 mouseover: mouseover,
2310 touchstart: touchstart,
2312 touchmove: touchmove,
2317 [Methods, Scroll, Animate, eventShortcuts].forEach(function (group) {
2318 Object.keys(group).forEach(function (methodName) {
2319 $.fn[methodName] = group[methodName];
2324 * https://github.com/gre/bezier-easing
2325 * BezierEasing - use bezier curve for transition easing function
2326 * by Gaëtan Renaudeau 2014 - 2015 – MIT License
2329 /* eslint-disable */
2331 // These values are established by empiricism with tests (tradeoff: performance VS precision)
2332 var NEWTON_ITERATIONS = 4;
2333 var NEWTON_MIN_SLOPE = 0.001;
2334 var SUBDIVISION_PRECISION = 0.0000001;
2335 var SUBDIVISION_MAX_ITERATIONS = 10;
2337 var kSplineTableSize = 11;
2338 var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);
2340 var float32ArraySupported = typeof Float32Array === 'function';
2342 function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }
2343 function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }
2344 function C (aA1) { return 3.0 * aA1; }
2346 // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.
2347 function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }
2349 // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
2350 function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }
2352 function binarySubdivide (aX, aA, aB, mX1, mX2) {
2353 var currentX, currentT, i = 0;
2355 currentT = aA + (aB - aA) / 2.0;
2356 currentX = calcBezier(currentT, mX1, mX2) - aX;
2357 if (currentX > 0.0) {
2362 } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
2366 function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {
2367 for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
2368 var currentSlope = getSlope(aGuessT, mX1, mX2);
2369 if (currentSlope === 0.0) {
2372 var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
2373 aGuessT -= currentX / currentSlope;
2378 function bezier (mX1, mY1, mX2, mY2) {
2379 if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {
2380 throw new Error('bezier x values must be in [0, 1] range');
2383 // Precompute samples table
2384 var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
2385 if (mX1 !== mY1 || mX2 !== mY2) {
2386 for (var i = 0; i < kSplineTableSize; ++i) {
2387 sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
2391 function getTForX (aX) {
2392 var intervalStart = 0.0;
2393 var currentSample = 1;
2394 var lastSample = kSplineTableSize - 1;
2396 for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
2397 intervalStart += kSampleStepSize;
2401 // Interpolate to provide an initial guess for t
2402 var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
2403 var guessForT = intervalStart + dist * kSampleStepSize;
2405 var initialSlope = getSlope(guessForT, mX1, mX2);
2406 if (initialSlope >= NEWTON_MIN_SLOPE) {
2407 return newtonRaphsonIterate(aX, guessForT, mX1, mX2);
2408 } else if (initialSlope === 0.0) {
2411 return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
2415 return function BezierEasing (x) {
2416 if (mX1 === mY1 && mX2 === mY2) {
2419 // Because JavaScript number are imprecise, we should guarantee the extremes are right.
2426 return calcBezier(getTForX(x), mY1, mY2);
2430 /* eslint no-control-regex: "off
" */
2432 // Remove Diacritics
2433 var defaultDiacriticsRemovalap = [
2434 { base: 'A', letters: '\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F' },
2435 { base: 'AA', letters: '\uA732' },
2436 { base: 'AE', letters: '\u00C6\u01FC\u01E2' },
2437 { base: 'AO', letters: '\uA734' },
2438 { base: 'AU', letters: '\uA736' },
2439 { base: 'AV', letters: '\uA738\uA73A' },
2440 { base: 'AY', letters: '\uA73C' },
2441 { base: 'B', letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181' },
2442 { base: 'C', letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E' },
2443 { base: 'D', letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779' },
2444 { base: 'DZ', letters: '\u01F1\u01C4' },
2445 { base: 'Dz', letters: '\u01F2\u01C5' },
2446 { base: 'E', letters: '\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E' },
2447 { base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
2448 { base: 'G', letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E' },
2449 { base: 'H', letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D' },
2450 { base: 'I', letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197' },
2451 { base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
2452 { base: 'K', letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2' },
2453 { base: 'L', letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780' },
2454 { base: 'LJ', letters: '\u01C7' },
2455 { base: 'Lj', letters: '\u01C8' },
2456 { base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
2457 { base: 'N', letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4' },
2458 { base: 'NJ', letters: '\u01CA' },
2459 { base: 'Nj', letters: '\u01CB' },
2460 { base: 'O', letters: '\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C' },
2461 { base: 'OI', letters: '\u01A2' },
2462 { base: 'OO', letters: '\uA74E' },
2463 { base: 'OU', letters: '\u0222' },
2464 { base: 'OE', letters: '\u008C\u0152' },
2465 { base: 'oe', letters: '\u009C\u0153' },
2466 { base: 'P', letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754' },
2467 { base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
2468 { base: 'R', letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782' },
2469 { base: 'S', letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784' },
2470 { base: 'T', letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786' },
2471 { base: 'TZ', letters: '\uA728' },
2472 { base: 'U', letters: '\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244' },
2473 { base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
2474 { base: 'VY', letters: '\uA760' },
2475 { base: 'W', letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72' },
2476 { base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
2477 { base: 'Y', letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE' },
2478 { base: 'Z', letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762' },
2479 { base: 'a', letters: '\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250' },
2480 { base: 'aa', letters: '\uA733' },
2481 { base: 'ae', letters: '\u00E6\u01FD\u01E3' },
2482 { base: 'ao', letters: '\uA735' },
2483 { base: 'au', letters: '\uA737' },
2484 { base: 'av', letters: '\uA739\uA73B' },
2485 { base: 'ay', letters: '\uA73D' },
2486 { base: 'b', letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253' },
2487 { base: 'c', letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184' },
2488 { base: 'd', letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A' },
2489 { base: 'dz', letters: '\u01F3\u01C6' },
2490 { base: 'e', letters: '\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD' },
2491 { base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
2492 { base: 'g', letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F' },
2493 { base: 'h', letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265' },
2494 { base: 'hv', letters: '\u0195' },
2495 { base: 'i', letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131' },
2496 { base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
2497 { base: 'k', letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3' },
2498 { base: 'l', letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747' },
2499 { base: 'lj', letters: '\u01C9' },
2500 { base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
2501 { base: 'n', letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5' },
2502 { base: 'nj', letters: '\u01CC' },
2503 { base: 'o', letters: '\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275' },
2504 { base: 'oi', letters: '\u01A3' },
2505 { base: 'ou', letters: '\u0223' },
2506 { base: 'oo', letters: '\uA74F' },
2507 { base: 'p', letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755' },
2508 { base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
2509 { base: 'r', letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783' },
2510 { base: 's', letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B' },
2511 { base: 't', letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787' },
2512 { base: 'tz', letters: '\uA729' },
2513 { base: 'u', letters: '\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289' },
2514 { base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
2515 { base: 'vy', letters: '\uA761' },
2516 { base: 'w', letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73' },
2517 { base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
2518 { base: 'y', letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF' },
2519 { base: 'z', letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763' } ];
2521 var diacriticsMap = {};
2522 for (var i = 0; i < defaultDiacriticsRemovalap.length; i += 1) {
2523 var letters = defaultDiacriticsRemovalap[i].letters;
2524 for (var j = 0; j < letters.length; j += 1) {
2525 diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
2529 var uniqueNumber = 1;
2532 uniqueNumber: function uniqueNumber$1() {
2534 return uniqueNumber;
2536 id: function id(mask, map) {
2537 if ( mask === void 0 ) mask = 'xxxxxxxxxx';
2538 if ( map === void 0 ) map = '0123456789abcdef';
2540 var length = map.length;
2541 return mask.replace(/x/g, function () { return map[Math.floor((Math.random() * length))]; });
2543 mdPreloaderContent: "\n <span
class=\"preloader
-inner
\">\n <span
class=\"preloader
-inner
-gap
\"></span>\n <span class=\"preloader-inner-left\">\n <span class=\"preloader-inner-half-circle\"></span>\n </span>\n <span class=\"preloader-inner-right\">\n <span class=\"preloader-inner-half-circle\"></span>\n </span>\n </span>\n ".trim(),
2544 iosPreloaderContent: ("\n <span
class=\"preloader
-inner
\">\n " + (Array.from({ length: 12 }).map(function () { return '<span class="preloader
-inner
-line
"></span>'; }).join('')) + "\n </span
>\n ").trim(),
2545 eventNameToColonCase: function eventNameToColonCase(eventName) {
2547 return eventName.split('').map(function (char, index) {
2548 if (char.match(/[A-Z]/) && index !== 0 && !hasColon) {
2550 return (":" + (char.toLowerCase()));
2552 return char.toLowerCase();
2555 deleteProps: function deleteProps(obj) {
2557 Object.keys(object).forEach(function (key) {
2561 // no setter for object
2566 // something got wrong
2570 bezier: function bezier$1() {
2571 var args = [], len = arguments.length;
2572 while ( len-- ) args[ len ] = arguments[ len ];
2574 return bezier.apply(void 0, args);
2576 nextTick: function nextTick(callback, delay) {
2577 if ( delay === void 0 ) delay = 0;
2579 return setTimeout(callback, delay);
2581 nextFrame: function nextFrame(callback) {
2582 return Utils.requestAnimationFrame(function () {
2583 Utils.requestAnimationFrame(callback);
2586 now: function now() {
2589 requestAnimationFrame: function requestAnimationFrame(callback) {
2590 return win.requestAnimationFrame(callback);
2592 cancelAnimationFrame: function cancelAnimationFrame(id) {
2593 return win.cancelAnimationFrame(id);
2595 removeDiacritics: function removeDiacritics(str) {
2596 return str.replace(/[^\u0000-\u007E]/g, function (a) { return diacriticsMap[a] || a; });
2598 parseUrlQuery: function parseUrlQuery(url) {
2600 var urlToParse = url || win.location.href;
2605 if (typeof urlToParse === 'string' && urlToParse.length) {
2606 urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
2607 params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });
2608 length = params.length;
2610 for (i = 0; i < length; i += 1) {
2611 param = params[i].replace(/#\S+/g, '').split('=');
2612 query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param.slice(1).join('=')) || '';
2617 getTranslate: function getTranslate(el, axis) {
2618 if ( axis === void 0 ) axis = 'x';
2622 var transformMatrix;
2624 var curStyle = win.getComputedStyle(el, null);
2626 if (win.WebKitCSSMatrix) {
2627 curTransform = curStyle.transform || curStyle.webkitTransform;
2628 if (curTransform.split(',').length > 6) {
2629 curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');
2631 // Some old versions of Webkit choke when 'none' is passed; pass
2632 // empty string instead in this case
2633 transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
2635 transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
2636 matrix = transformMatrix.toString().split(',');
2640 // Latest Chrome and webkits Fix
2641 if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }
2642 // Crazy IE10 Matrix
2643 else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }
2645 else { curTransform = parseFloat(matrix[4]); }
2648 // Latest Chrome and webkits Fix
2649 if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }
2650 // Crazy IE10 Matrix
2651 else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }
2653 else { curTransform = parseFloat(matrix[5]); }
2655 return curTransform || 0;
2657 serializeObject: function serializeObject(obj, parents) {
2658 if ( parents === void 0 ) parents = [];
2660 if (typeof obj === 'string') { return obj; }
2661 var resultArray = [];
2662 var separator = '&';
2664 function varName(name) {
2665 if (parents.length > 0) {
2666 var parentParts = '';
2667 for (var j = 0; j < parents.length; j += 1) {
2668 if (j === 0) { parentParts += parents[j]; }
2669 else { parentParts += "[" + (encodeURIComponent(parents[j])) + "]"; }
2671 return (parentParts + "[" + (encodeURIComponent(name)) + "]");
2673 return encodeURIComponent(name);
2675 function varValue(value) {
2676 return encodeURIComponent(value);
2678 Object.keys(obj).forEach(function (prop) {
2680 if (Array.isArray(obj[prop])) {
2682 for (var i = 0; i < obj[prop].length; i += 1) {
2683 if (!Array.isArray(obj[prop][i]) && typeof obj[prop][i] === 'object') {
2684 newParents = parents.slice();
2685 newParents.push(prop);
2686 newParents.push(String(i));
2687 toPush.push(Utils.serializeObject(obj[prop][i], newParents));
2689 toPush.push(((varName(prop)) + "[]=" + (varValue(obj[prop][i]))));
2692 if (toPush.length > 0) { resultArray.push(toPush.join(separator)); }
2693 } else if (obj[prop] === null || obj[prop] === '') {
2694 resultArray.push(((varName(prop)) + "="));
2695 } else if (typeof obj[prop] === 'object') {
2696 // Object, convert to named array
2697 newParents = parents.slice();
2698 newParents.push(prop);
2699 toPush = Utils.serializeObject(obj[prop], newParents);
2700 if (toPush !== '') { resultArray.push(toPush); }
2701 } else if (typeof obj[prop] !== 'undefined' && obj[prop] !== '') {
2702 // Should be string or plain value
2703 resultArray.push(((varName(prop)) + "=" + (varValue(obj[prop]))));
2704 } else if (obj[prop] === '') { resultArray.push(varName(prop)); }
2706 return resultArray.join(separator);
2708 isObject: function isObject(o) {
2709 return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
2711 merge: function merge() {
2712 var args = [], len$1 = arguments.length;
2713 while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
2719 for (var i = 0; i < from.length; i += 1) {
2720 var nextSource = args[i];
2721 if (nextSource !== undefined && nextSource !== null) {
2722 var keysArray = Object.keys(Object(nextSource));
2723 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2724 var nextKey = keysArray[nextIndex];
2725 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2726 if (desc !== undefined && desc.enumerable) {
2727 to[nextKey] = nextSource[nextKey];
2734 extend: function extend() {
2735 var args = [], len$1 = arguments.length;
2736 while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
2741 if (typeof args[0] === 'boolean') {
2751 for (var i = 0; i < from.length; i += 1) {
2752 var nextSource = args[i];
2753 if (nextSource !== undefined && nextSource !== null) {
2754 var keysArray = Object.keys(Object(nextSource));
2755 for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
2756 var nextKey = keysArray[nextIndex];
2757 var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
2758 if (desc !== undefined && desc.enumerable) {
2760 to[nextKey] = nextSource[nextKey];
2761 } else if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
2762 Utils.extend(to[nextKey], nextSource[nextKey]);
2763 } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
2765 Utils.extend(to[nextKey], nextSource[nextKey]);
2767 to[nextKey] = nextSource[nextKey];
2775 colorHexToRgb: function colorHexToRgb(hex) {
2776 var h = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (m, r, g, b) { return r + r + g + g + b + b; });
2777 var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h);
2779 ? result.slice(1).map(function (n) { return parseInt(n, 16); })
2782 colorRgbToHex: function colorRgbToHex(r, g, b) {
2783 var result = [r, g, b].map(function (n) {
2784 var hex = n.toString(16);
2785 return hex.length === 1 ? ("0" + hex) : hex;
2787 return ("#" + result);
2789 colorRgbToHsl: function colorRgbToHsl(r, g, b) {
2790 r /= 255; // eslint-disable-line
2791 g /= 255; // eslint-disable-line
2792 b /= 255; // eslint-disable-line
2793 var max = Math.max(r, g, b);
2794 var min = Math.min(r, g, b);
2797 if (d === 0) { h = 0; }
2798 else if (max === r) { h = ((g - b) / d) % 6; }
2799 else if (max === g) { h = (b - r) / d + 2; }
2800 else if (max === b) { h = (r - g) / d + 4; }
2801 var l = (min + max) / 2;
2802 var s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
2803 return [h * 60, s, l];
2805 colorHslToRgb: function colorHslToRgb(h, s, l) {
2806 var c = (1 - Math.abs(2 * l - 1)) * s;
2808 var x = c * (1 - Math.abs((hp % 2) - 1));
2810 if (Number.isNaN(h) || typeof h === 'undefined') {
2812 } else if (hp <= 1) { rgb1 = [c, x, 0]; }
2813 else if (hp <= 2) { rgb1 = [x, c, 0]; }
2814 else if (hp <= 3) { rgb1 = [0, c, x]; }
2815 else if (hp <= 4) { rgb1 = [0, x, c]; }
2816 else if (hp <= 5) { rgb1 = [x, 0, c]; }
2817 else if (hp <= 6) { rgb1 = [c, 0, x]; }
2818 var m = l - (c / 2);
2819 return rgb1.map(function (n) { return Math.max(0, Math.min(255, Math.round(255 * (n + m)))); });
2821 colorThemeCSSProperties: function colorThemeCSSProperties() {
2822 var args = [], len = arguments.length;
2823 while ( len-- ) args[ len ] = arguments[ len ];
2827 if (args.length === 1) {
2829 rgb = Utils.colorHexToRgb(hex);
2830 } else if (args.length === 3) {
2832 hex = Utils.colorRgbToHex.apply(Utils, rgb);
2834 if (!rgb) { return {}; }
2835 var hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
2836 var hslShade = [hsl[0], hsl[1], Math.max(0, (hsl[2] - 0.08))];
2837 var hslTint = [hsl[0], hsl[1], Math.max(0, (hsl[2] + 0.08))];
2838 var shade = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslShade));
2839 var tint = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslTint));
2841 '--f7-theme-color': hex,
2842 '--f7-theme-color-rgb': rgb.join(', '),
2843 '--f7-theme-color-shade': shade,
2844 '--f7-theme-color-tint': tint,
2849 var Device = (function Device() {
2850 var platform = win.navigator.platform;
2851 var ua = win.navigator.userAgent;
2856 androidChrome: false,
2858 windowsPhone: false,
2868 cordova: !!(win.cordova || win.phonegap),
2869 phonegap: !!(win.cordova || win.phonegap),
2872 var screenWidth = win.screen.width;
2873 var screenHeight = win.screen.height;
2875 var windowsPhone = ua.match(/(Windows Phone);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2876 var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
2877 var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
2878 var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
2879 var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
2880 var iphoneX = iphone && (
2881 (screenWidth === 375 && screenHeight === 812) // X/XS
2882 || (screenWidth === 414 && screenHeight === 896) // XR / XS Max
2884 var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
2885 var edge = ua.indexOf('Edge/') >= 0;
2886 var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
2887 var macos = platform === 'MacIntel';
2888 var windows = platform === 'Win32';
2892 device.firefox = firefox;
2896 device.os = 'windows';
2897 device.osVersion = windowsPhone[2];
2898 device.windowsPhone = true;
2901 if (android && !windows) {
2902 device.os = 'android';
2903 device.osVersion = android[2];
2904 device.android = true;
2905 device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
2907 if (ipad || iphone || ipod) {
2912 if (iphone && !ipod) {
2913 device.osVersion = iphone[2].replace(/_/g, '.');
2914 device.iphone = true;
2915 device.iphoneX = iphoneX;
2918 device.osVersion = ipad[2].replace(/_/g, '.');
2922 device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
2923 device.iphone = true;
2925 // iOS 8+ changed UA
2926 if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
2927 if (device.osVersion.split('.')[0] === '10') {
2928 device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
2933 device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || win.navigator.standalone))
2934 || (win.matchMedia && win.matchMedia('(display-mode: standalone)').matches);
2935 device.webview = device.webView;
2936 device.standalone = device.webView;
2939 device.desktop = !(device.os || device.android || device.webView);
2940 if (device.desktop) {
2941 device.macos = macos;
2942 device.windows = windows;
2946 if (device.os && device.os === 'ios') {
2947 var osVersionArr = device.osVersion.split('.');
2948 var metaViewport = doc.querySelector('meta[name="viewport
"]');
2949 device.minimalUi = !device.webView
2951 && (osVersionArr[0] * 1 === 7 ? osVersionArr[1] * 1 >= 1 : osVersionArr[0] * 1 > 7)
2952 && metaViewport && metaViewport.getAttribute('content').indexOf('minimal-ui') >= 0;
2956 var metaStatusbar = doc.querySelector('meta[name="apple
-mobile
-web
-app
-status
-bar
-style
"]');
2958 // Check for status bar and fullscreen app mode
2959 device.needsStatusbarOverlay = function needsStatusbarOverlay() {
2960 if (device.standalone && device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
2963 if ((device.webView || (device.android && device.cordova)) && (win.innerWidth * win.innerHeight === win.screen.width * win.screen.height)) {
2964 if (device.iphoneX && (win.orientation === 90 || win.orientation === -90)) {
2971 device.statusbar = device.needsStatusbarOverlay();
2974 device.pixelRatio = win.devicePixelRatio || 1;
2980 var EventsClass = function EventsClass(parents) {
2981 if ( parents === void 0 ) parents = [];
2984 self.eventsParents = parents;
2985 self.eventsListeners = {};
2988 EventsClass.prototype.on = function on (events, handler, priority) {
2990 if (typeof handler !== 'function') { return self; }
2991 var method = priority ? 'unshift' : 'push';
2992 events.split(' ').forEach(function (event) {
2993 if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }
2994 self.eventsListeners[event][method](handler);
2999 EventsClass.prototype.once = function once (events, handler, priority) {
3001 if (typeof handler !== 'function') { return self; }
3002 function onceHandler() {
3003 var args = [], len = arguments.length;
3004 while ( len-- ) args[ len ] = arguments[ len ];
3006 handler.apply(self, args);
3007 self.off(events, onceHandler);
3008 if (onceHandler.f7proxy) {
3009 delete onceHandler.f7proxy;
3012 onceHandler.f7proxy = handler;
3013 return self.on(events, onceHandler, priority);
3016 EventsClass.prototype.off = function off (events, handler) {
3018 if (!self.eventsListeners) { return self; }
3019 events.split(' ').forEach(function (event) {
3020 if (typeof handler === 'undefined') {
3021 self.eventsListeners[event] = [];
3022 } else if (self.eventsListeners[event]) {
3023 self.eventsListeners[event].forEach(function (eventHandler, index) {
3024 if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {
3025 self.eventsListeners[event].splice(index, 1);
3033 EventsClass.prototype.emit = function emit () {
3034 var args = [], len = arguments.length;
3035 while ( len-- ) args[ len ] = arguments[ len ];
3038 if (!self.eventsListeners) { return self; }
3043 if (typeof args[0] === 'string' || Array.isArray(args[0])) {
3045 data = args.slice(1, args.length);
3047 eventsParents = self.eventsParents;
3049 events = args[0].events;
3050 data = args[0].data;
3051 context = args[0].context || self;
3052 eventsParents = args[0].local ? [] : args[0].parents || self.eventsParents;
3054 var eventsArray = Array.isArray(events) ? events : events.split(' ');
3055 var localEvents = eventsArray.map(function (eventName) { return eventName.replace('local::', ''); });
3056 var parentEvents = eventsArray.filter(function (eventName) { return eventName.indexOf('local::') < 0; });
3058 localEvents.forEach(function (event) {
3059 if (self.eventsListeners && self.eventsListeners[event]) {
3061 self.eventsListeners[event].forEach(function (eventHandler) {
3062 handlers.push(eventHandler);
3064 handlers.forEach(function (eventHandler) {
3065 eventHandler.apply(context, data);
3069 if (eventsParents && eventsParents.length > 0) {
3070 eventsParents.forEach(function (eventsParent) {
3071 eventsParent.emit.apply(eventsParent, [ parentEvents ].concat( data ));
3077 var Framework7Class = /*@__PURE__*/(function (EventsClass$$1) {
3078 function Framework7Class(params, parents) {
3079 if ( params === void 0 ) params = {};
3080 if ( parents === void 0 ) parents = [];
3082 EventsClass$$1.call(this, parents);
3084 self.params = params;
3086 if (self.params && self.params.on) {
3087 Object.keys(self.params.on).forEach(function (eventName) {
3088 self.on(eventName, self.params.on[eventName]);
3093 if ( EventsClass$$1 ) Framework7Class.__proto__ = EventsClass$$1;
3094 Framework7Class.prototype = Object.create( EventsClass$$1 && EventsClass$$1.prototype );
3095 Framework7Class.prototype.constructor = Framework7Class;
3097 var staticAccessors = { components: { configurable: true } };
3099 // eslint-disable-next-line
3100 Framework7Class.prototype.useModuleParams = function useModuleParams (module, instanceParams) {
3101 if (module.params) {
3102 var originalParams = {};
3103 Object.keys(module.params).forEach(function (paramKey) {
3104 if (typeof instanceParams[paramKey] === 'undefined') { return; }
3105 originalParams[paramKey] = Utils.extend({}, instanceParams[paramKey]);
3107 Utils.extend(instanceParams, module.params);
3108 Object.keys(originalParams).forEach(function (paramKey) {
3109 Utils.extend(instanceParams[paramKey], originalParams[paramKey]);
3114 Framework7Class.prototype.useModulesParams = function useModulesParams (instanceParams) {
3115 var instance = this;
3116 if (!instance.modules) { return; }
3117 Object.keys(instance.modules).forEach(function (moduleName) {
3118 var module = instance.modules[moduleName];
3120 if (module.params) {
3121 Utils.extend(instanceParams, module.params);
3126 Framework7Class.prototype.useModule = function useModule (moduleName, moduleParams) {
3127 if ( moduleName === void 0 ) moduleName = '';
3128 if ( moduleParams === void 0 ) moduleParams = {};
3130 var instance = this;
3131 if (!instance.modules) { return; }
3132 var module = typeof moduleName === 'string' ? instance.modules[moduleName] : moduleName;
3133 if (!module) { return; }
3135 // Extend instance methods and props
3136 if (module.instance) {
3137 Object.keys(module.instance).forEach(function (modulePropName) {
3138 var moduleProp = module.instance[modulePropName];
3139 if (typeof moduleProp === 'function') {
3140 instance[modulePropName] = moduleProp.bind(instance);
3142 instance[modulePropName] = moduleProp;
3146 // Add event listeners
3147 if (module.on && instance.on) {
3148 Object.keys(module.on).forEach(function (moduleEventName) {
3149 instance.on(moduleEventName, module.on[moduleEventName]);
3154 if (!instance.vnodeHooks) { instance.vnodeHooks = {}; }
3155 Object.keys(module.vnode).forEach(function (vnodeId) {
3156 Object.keys(module.vnode[vnodeId]).forEach(function (hookName) {
3157 var handler = module.vnode[vnodeId][hookName];
3158 if (!instance.vnodeHooks[hookName]) { instance.vnodeHooks[hookName] = {}; }
3159 if (!instance.vnodeHooks[hookName][vnodeId]) { instance.vnodeHooks[hookName][vnodeId] = []; }
3160 instance.vnodeHooks[hookName][vnodeId].push(handler.bind(instance));
3164 // Module create callback
3165 if (module.create) {
3166 module.create.bind(instance)(moduleParams);
3170 Framework7Class.prototype.useModules = function useModules (modulesParams) {
3171 if ( modulesParams === void 0 ) modulesParams = {};
3173 var instance = this;
3174 if (!instance.modules) { return; }
3175 Object.keys(instance.modules).forEach(function (moduleName) {
3176 var moduleParams = modulesParams[moduleName] || {};
3177 instance.useModule(moduleName, moduleParams);
3181 staticAccessors.components.set = function (components) {
3183 if (!Class.use) { return; }
3184 Class.use(components);
3187 Framework7Class.installModule = function installModule (module) {
3188 var params = [], len = arguments.length - 1;
3189 while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
3192 if (!Class.prototype.modules) { Class.prototype.modules = {}; }
3193 var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_
" + (Utils.now())));
3194 Class.prototype.modules[name] = module;
3197 Object.keys(module.proto).forEach(function (key) {
3198 Class.prototype[key] = module.proto[key];
3202 if (module.static) {
3203 Object.keys(module.static).forEach(function (key) {
3204 Class[key] = module.static[key];
3208 if (module.install) {
3209 module.install.apply(Class, params);
3214 Framework7Class.use = function use (module) {
3215 var params = [], len = arguments.length - 1;
3216 while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
3219 if (Array.isArray(module)) {
3220 module.forEach(function (m) { return Class.installModule(m); });
3223 return Class.installModule.apply(Class, [ module ].concat( params ));
3226 Object.defineProperties( Framework7Class, staticAccessors );
3228 return Framework7Class;
3231 function ConstructorMethods (parameters) {
3232 if ( parameters === void 0 ) parameters = {};
3234 var defaultSelector = parameters.defaultSelector;
3235 var constructor = parameters.constructor;
3236 var domProp = parameters.domProp;
3237 var app = parameters.app;
3238 var addMethods = parameters.addMethods;
3240 create: function create() {
3241 var args = [], len = arguments.length;
3242 while ( len-- ) args[ len ] = arguments[ len ];
3244 if (app) { return new (Function.prototype.bind.apply( constructor, [ null ].concat( [app], args) )); }
3245 return new (Function.prototype.bind.apply( constructor, [ null ].concat( args) ));
3247 get: function get(el) {
3248 if ( el === void 0 ) el = defaultSelector;
3250 if (el instanceof constructor) { return el; }
3252 if ($el.length === 0) { return undefined; }
3253 return $el[0][domProp];
3255 destroy: function destroy(el) {
3256 var instance = methods.get(el);
3257 if (instance && instance.destroy) { return instance.destroy(); }
3261 if (addMethods && Array.isArray(addMethods)) {
3262 addMethods.forEach(function (methodName) {
3263 methods[methodName] = function (el) {
3264 if ( el === void 0 ) el = defaultSelector;
3265 var args = [], len = arguments.length - 1;
3266 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
3268 var instance = methods.get(el);
3269 if (instance && instance[methodName]) { return instance[methodName].apply(instance, args); }
3277 function ModalMethods (parameters) {
3278 if ( parameters === void 0 ) parameters = {};
3280 var defaultSelector = parameters.defaultSelector;
3281 var constructor = parameters.constructor;
3282 var app = parameters.app;
3283 var methods = Utils.extend(
3284 ConstructorMethods({
3285 defaultSelector: defaultSelector,
3286 constructor: constructor,
3291 open: function open(el, animate) {
3293 var instance = $el[0].f7Modal;
3294 if (!instance) { instance = new constructor(app, { el: $el }); }
3295 return instance.open(animate);
3297 close: function close(el, animate) {
3298 if ( el === void 0 ) el = defaultSelector;
3301 if ($el.length === 0) { return undefined; }
3302 var instance = $el[0].f7Modal;
3303 if (!instance) { instance = new constructor(app, { el: $el }); }
3304 return instance.close(animate);
3311 var fetchedModules = [];
3312 function loadModule(moduleToLoad) {
3313 var Framework7 = this;
3314 return new Promise(function (resolve, reject) {
3315 var app = Framework7.instance;
3319 if (!moduleToLoad) {
3320 reject(new Error('Framework7: Lazy module must be specified'));
3324 function install(module) {
3325 Framework7.use(module);
3328 app.useModuleParams(module, app.params);
3329 app.useModule(module);
3333 if (typeof moduleToLoad === 'string') {
3334 var matchNamePattern = moduleToLoad.match(/([a-z0-9-]*)/i);
3335 if (moduleToLoad.indexOf('.') < 0 && matchNamePattern && matchNamePattern[0].length === moduleToLoad.length) {
3336 if (!app || (app && !app.params.lazyModulesPath)) {
3337 reject(new Error('Framework7: "lazyModulesPath
" app parameter must be specified to fetch module by name'));
3340 modulePath = (app.params.lazyModulesPath) + "/" + moduleToLoad + ".js
";
3342 modulePath = moduleToLoad;
3344 } else if (typeof moduleToLoad === 'function') {
3345 moduleFunc = moduleToLoad;
3347 // considering F7-Plugin object
3348 moduleObj = moduleToLoad;
3352 var module = moduleFunc(Framework7, false);
3354 reject(new Error('Framework7: Can\'t find Framework7 component in specified component function'));
3357 // Check if it was added
3358 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3368 var module$1 = moduleObj;
3370 reject(new Error('Framework7: Can\'t find Framework7 component in specified component'));
3373 // Check if it was added
3374 if (Framework7.prototype.modules && Framework7.prototype.modules[module$1.name]) {
3384 if (fetchedModules.indexOf(modulePath) >= 0) {
3388 fetchedModules.push(modulePath);
3389 var scriptLoad = new Promise(function (resolveScript, rejectScript) {
3390 Framework7.request.get(
3392 function (scriptContent) {
3393 var id = Utils.id();
3394 var callbackLoadName = "f7_component_loader_callback_
" + id;
3396 var scriptEl = document.createElement('script');
3397 scriptEl.innerHTML = "window
." + callbackLoadName + " = function (Framework7
, Framework7AutoInstallComponent
) {return " + (scriptContent.trim()) + "}";
3398 $('head').append(scriptEl);
3400 var componentLoader = window[callbackLoadName];
3401 delete window[callbackLoadName];
3402 $(scriptEl).remove();
3404 var module = componentLoader(Framework7, false);
3407 rejectScript(new Error(("Framework7
: Can
't find Framework7 component in " + modulePath + " file")));
3411 // Check if it was added
3412 if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
3422 function (xhr, status) {
3423 rejectScript(xhr, status);
3427 var styleLoad = new Promise(function (resolveStyle) {
3428 Framework7.request.get(
3429 modulePath.replace('.js
', app.rtl ? '.rtl
.css
' : '.css
'),
3430 function (styleContent) {
3431 var styleEl = document.createElement('style
');
3432 styleEl.innerHTML = styleContent;
3433 $('head
').append(styleEl);
3443 Promise.all([scriptLoad, styleLoad]).then(function () {
3445 }).catch(function (err) {
3452 var Framework7 = /*@__PURE__*/(function (Framework7Class$$1) {
3453 function Framework7(params) {
3454 Framework7Class$$1.call(this, params);
3455 if (Framework7.instance) {
3456 throw new Error('Framework7 is already initialized and can
\'t be initialized more than once
');
3459 var passedParams = Utils.extend({}, params);
3464 Framework7.instance = app;
3469 id: 'io
.framework7
.testapp
',
3472 language: win.navigator.language,
3475 lazyModulesPath: null,
3476 initOnDeviceReady: true,
3480 // Extend defaults with modules params
3481 app.useModulesParams(defaults);
3483 // Extend defaults with passed params
3484 app.params = Utils.extend(defaults, params);
3486 var $rootEl = $(app.params.root);
3492 name: app.params.name,
3494 version: app.params.version,
3496 routes: app.params.routes,
3498 language: app.params.language,
3502 rtl: $rootEl.css('direction
') === 'rtl
',
3504 theme: (function getTheme() {
3505 if (app.params.theme === 'auto
') {
3506 return Device.ios ? 'ios
' : 'md
';
3508 return app.params.theme;
3510 // Initially passed parameters
3511 passedParams: passedParams,
3515 if (app.root && app.root[0]) {
3516 app.root[0].f7 = app;
3522 // Init Data & Methods
3526 if (app.params.init) {
3527 if (Device.cordova && app.params.initOnDeviceReady) {
3528 $(doc).on('deviceready
', function () {
3535 // Return app instance
3539 if ( Framework7Class$$1 ) Framework7.__proto__ = Framework7Class$$1;
3540 Framework7.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
3541 Framework7.prototype.constructor = Framework7;
3543 var prototypeAccessors = { $: { configurable: true },t7: { configurable: true } };
3544 var staticAccessors = { Dom7: { configurable: true },$: { configurable: true },Template7: { configurable: true },Class: { configurable: true },Events: { configurable: true } };
3546 Framework7.prototype.initData = function initData () {
3551 if (app.params.data && typeof app.params.data === 'function') {
3552 Utils.extend(app.data, app.params.data.bind(app)());
3553 } else if (app.params.data) {
3554 Utils.extend(app.data, app.params.data);
3558 if (app.params.methods) {
3559 Object.keys(app.params.methods).forEach(function (methodName) {
3560 if (typeof app.params.methods[methodName] === 'function') {
3561 app.methods[methodName] = app.params.methods[methodName].bind(app);
3563 app.methods[methodName] = app.params.methods[methodName];
3569 Framework7.prototype.init = function init () {
3571 if (app.initialized) { return app; }
3573 app.root.addClass('framework7
-initializing
');
3577 $('html
').attr('dir
', 'rtl
');
3581 app.root.addClass('framework7
-root
');
3584 $('html
').removeClass('ios md
').addClass(app.theme);
3587 Utils.nextFrame(function () {
3588 app.root.removeClass('framework7
-initializing
');
3590 // Emit, init other modules
3591 app.initialized = true;
3597 // eslint-disable-next-line
3598 Framework7.prototype.loadModule = function loadModule$$1 () {
3599 var args = [], len = arguments.length;
3600 while ( len-- ) args[ len ] = arguments[ len ];
3602 return Framework7.loadModule.apply(Framework7, args);
3605 // eslint-disable-next-line
3606 Framework7.prototype.loadModules = function loadModules () {
3607 var args = [], len = arguments.length;
3608 while ( len-- ) args[ len ] = arguments[ len ];
3610 return Framework7.loadModules.apply(Framework7, args);
3613 Framework7.prototype.getVnodeHooks = function getVnodeHooks (hook, id) {
3615 if (!app.vnodeHooks || !app.vnodeHooks[hook]) { return []; }
3616 return app.vnodeHooks[hook][id] || [];
3619 // eslint-disable-next-line
3620 prototypeAccessors.$.get = function () {
3623 // eslint-disable-next-line
3624 prototypeAccessors.t7.get = function () {
3628 staticAccessors.Dom7.get = function () {
3632 staticAccessors.$.get = function () {
3636 staticAccessors.Template7.get = function () {
3640 staticAccessors.Class.get = function () {
3641 return Framework7Class$$1;
3644 staticAccessors.Events.get = function () {
3648 Object.defineProperties( Framework7.prototype, prototypeAccessors );
3649 Object.defineProperties( Framework7, staticAccessors );
3652 }(Framework7Class));
3654 Framework7.ModalMethods = ModalMethods;
3655 Framework7.ConstructorMethods = ConstructorMethods;
3657 Framework7.loadModule = loadModule;
3658 Framework7.loadModules = function loadModules(modules) {
3659 return Promise.all(modules.map(function (module) { return Framework7.loadModule(module); }));
3662 var DeviceModule = {
3671 init: function init() {
3672 var classNames = [];
3673 var html = doc.querySelector('html
');
3674 var metaStatusbar = doc.querySelector('meta
[name
="apple-mobile-web-app-status-bar-style"]');
3675 if (!html) { return; }
3676 if (Device.standalone && Device.ios && metaStatusbar && metaStatusbar.content === 'black
-translucent
') {
3677 classNames.push('device
-full
-viewport
');
3681 classNames.push(("device-pixel-ratio-" + (Math.floor(Device.pixelRatio))));
3682 if (Device.pixelRatio >= 2) {
3683 classNames.push('device
-retina
');
3688 ("device-" + (Device.os)),
3689 ("device-" + (Device.os) + "-" + (Device.osVersion.split('.')[0])),
3690 ("device-" + (Device.os) + "-" + (Device.osVersion.replace(/\./g, '-')))
3692 if (Device.os === 'ios
') {
3693 var major = parseInt(Device.osVersion.split('.')[0], 10);
3694 for (var i = major - 1; i >= 6; i -= 1) {
3695 classNames.push(("device-ios-gt-" + i));
3697 if (Device.iphoneX) {
3698 classNames.push('device
-iphone
-x
');
3701 } else if (Device.desktop) {
3702 classNames.push('device
-desktop
');
3703 if (Device.macos) { classNames.push('device
-macos
'); }
3704 else if (Device.windows) { classNames.push('device
-windows
'); }
3706 if (Device.cordova || Device.phonegap) {
3707 classNames.push('device
-cordova
');
3711 classNames.forEach(function (className) {
3712 html.classList.add(className);
3718 var Support = (function Support() {
3719 var testDiv = doc.createElement('div
');
3722 touch: (function checkTouch() {
3723 return !!((win.navigator.maxTouchPoints > 0) || ('ontouchstart
' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch));
3726 pointerEvents: !!(win.navigator.pointerEnabled || win.PointerEvent || ('maxTouchPoints
' in win.navigator)),
3727 prefixedPointerEvents: !!win.navigator.msPointerEnabled,
3729 transition: (function checkTransition() {
3730 var style = testDiv.style;
3731 return ('transition
' in style || 'webkitTransition
' in style || 'MozTransition
' in style);
3733 transforms3d: (win.Modernizr && win.Modernizr.csstransforms3d === true) || (function checkTransforms3d() {
3734 var style = testDiv.style;
3735 return ('webkitPerspective
' in style || 'MozPerspective
' in style || 'OPerspective
' in style || 'MsPerspective
' in style || 'perspective
' in style);
3738 flexbox: (function checkFlexbox() {
3739 var div = doc.createElement('div
').style;
3740 var styles = ('alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient
').split(' ');
3741 for (var i = 0; i < styles.length; i += 1) {
3742 if (styles[i] in div) { return true; }
3747 observer: (function checkObserver() {
3748 return ('MutationObserver
' in win || 'WebkitMutationObserver
' in win);
3751 passiveListener: (function checkPassiveListener() {
3752 var supportsPassive = false;
3754 var opts = Object.defineProperty({}, 'passive
', {
3755 // eslint-disable-next-line
3756 get: function get() {
3757 supportsPassive = true;
3760 win.addEventListener('testPassiveListener
', null, opts);
3764 return supportsPassive;
3767 gestures: (function checkGestures() {
3768 return 'ongesturestart
' in win;
3771 intersectionObserver: (function checkObserver() {
3772 return ('IntersectionObserver
' in win);
3777 var SupportModule = {
3786 init: function init() {
3787 var html = doc.querySelector('html
');
3788 if (!html) { return; }
3789 var classNames = [];
3791 classNames.forEach(function (className) {
3792 html.classList.add(className);
3808 var ResizeModule = {
3811 getSize: function getSize() {
3813 if (!app.root[0]) { return { width: 0, height: 0, left: 0, top: 0 }; }
3814 var offset = app.root.offset();
3815 var ref = [app.root[0].offsetWidth, app.root[0].offsetHeight, offset.left, offset.top];
3817 var height = ref[1];
3821 app.height = height;
3824 return { width: width, height: height, left: left, top: top };
3828 init: function init() {
3835 win.addEventListener('resize
', function () {
3839 // Emit orientationchange
3840 win.addEventListener('orientationchange
', function () {
3841 app.emit('orientationchange
');
3844 orientationchange: function orientationchange() {
3846 if (app.device && app.device.minimalUi) {
3847 if (win.orientation === 90 || win.orientation === -90) {
3848 doc.body.scrollTop = 0;
3851 // Fix iPad weird body scroll
3852 if (app.device.ipad) {
3853 doc.body.scrollLeft = 0;
3854 setTimeout(function () {
3855 doc.body.scrollLeft = 0;
3859 resize: function resize() {
3867 var jsonpRequests = 0;
3869 function Request(requestOptions) {
3870 var globalsNoCallbacks = Utils.extend({}, globals);
3871 ('beforeCreate beforeOpen beforeSend error complete success statusCode
').split(' ').forEach(function (callbackName) {
3872 delete globalsNoCallbacks[callbackName];
3874 var defaults = Utils.extend({
3875 url: win.location.toString(),
3887 contentType: 'application
/x
-www
-form
-urlencoded
',
3889 }, globalsNoCallbacks);
3891 var options = Utils.extend({}, defaults, requestOptions);
3894 // Function to run XHR callbacks and events
3895 function fireCallback(callbackName) {
3896 var data = [], len = arguments.length - 1;
3897 while ( len-- > 0 ) data[ len ] = arguments[ len + 1 ];
3901 beforeCreate (options),
3902 beforeOpen (xhr, options),
3903 beforeSend (xhr, options),
3904 error (xhr, status),
3905 complete (xhr, stautus),
3906 success (response, status, xhr),
3909 var globalCallbackValue;
3910 var optionCallbackValue;
3911 if (globals[callbackName]) {
3912 globalCallbackValue = globals[callbackName].apply(globals, data);
3914 if (options[callbackName]) {
3915 optionCallbackValue = options[callbackName].apply(options, data);
3917 if (typeof globalCallbackValue !== 'boolean') { globalCallbackValue = true; }
3918 if (typeof optionCallbackValue !== 'boolean') { optionCallbackValue = true; }
3919 return (globalCallbackValue && optionCallbackValue);
3922 // Before create callback
3923 proceedRequest = fireCallback('beforeCreate
', options);
3924 if (proceedRequest === false) { return undefined; }
3927 if (options.type) { options.method = options.type; }
3929 // Parameters Prefix
3930 var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?';
3933 var method = options.method.toUpperCase();
3935 // Data to modify GET URL
3936 if ((method === 'GET
' || method === 'HEAD
' || method === 'OPTIONS
' || method === 'DELETE
') && options.data) {
3938 if (typeof options.data === 'string
') {
3939 // Should be key=value string
3940 if (options.data.indexOf('?') >= 0) { stringData = options.data.split('?')[1]; }
3941 else { stringData = options.data; }
3943 // Should be key=value object
3944 stringData = Utils.serializeObject(options.data);
3946 if (stringData.length) {
3947 options.url += paramsPrefix + stringData;
3948 if (paramsPrefix === '?') { paramsPrefix = '&'; }
3953 if (options.dataType === 'json
' && options.url.indexOf('callback
=') >= 0) {
3954 var callbackName = "f7jsonp_" + (Date.now() + ((jsonpRequests += 1)));
3956 var callbackSplit = options.url.split('callback
=');
3957 var requestUrl = (callbackSplit[0]) + "callback=" + callbackName;
3958 if (callbackSplit[1].indexOf('&') >= 0) {
3959 var addVars = callbackSplit[1].split('&').filter(function (el) { return el.indexOf('=') > 0; }).join('&');
3960 if (addVars.length > 0) { requestUrl += "&" + addVars; }
3964 var script = doc.createElement('script
');
3965 script.type = 'text
/javascript
';
3966 script.onerror = function onerror() {
3967 clearTimeout(abortTimeout);
3968 fireCallback('error
', null, 'scripterror
');
3969 fireCallback('complete
', null, 'scripterror
');
3971 script.src = requestUrl;
3974 win[callbackName] = function jsonpCallback(data) {
3975 clearTimeout(abortTimeout);
3976 fireCallback('success
', data);
3977 script.parentNode.removeChild(script);
3979 delete win[callbackName];
3981 doc.querySelector('head
').appendChild(script);
3983 if (options.timeout > 0) {
3984 abortTimeout = setTimeout(function () {
3985 script.parentNode.removeChild(script);
3987 fireCallback('error
', null, 'timeout
');
3988 }, options.timeout);
3994 // Cache for GET/HEAD requests
3995 if (method === 'GET
' || method === 'HEAD
' || method === 'OPTIONS
' || method === 'DELETE
') {
3996 if (options.cache === false) {
3997 options.url += paramsPrefix + "_nocache" + (Date.now());
4002 var xhr = new XMLHttpRequest();
4005 xhr.requestUrl = options.url;
4006 xhr.requestParameters = options;
4008 // Before open callback
4009 proceedRequest = fireCallback('beforeOpen
', xhr, options);
4010 if (proceedRequest === false) { return xhr; }
4013 xhr.open(method, options.url, options.async, options.user, options.password);
4016 var postData = null;
4018 if ((method === 'POST
' || method === 'PUT
' || method === 'PATCH
') && options.data) {
4019 if (options.processData) {
4020 var postDataInstances = [ArrayBuffer, Blob, Document, FormData];
4022 if (postDataInstances.indexOf(options.data.constructor) >= 0) {
4023 postData = options.data;
4026 var boundary = "---------------------------" + (Date.now().toString(16));
4028 if (options.contentType === 'multipart
/form
-data
') {
4029 xhr.setRequestHeader('Content
-Type
', ("multipart/form-data; boundary=" + boundary));
4031 xhr.setRequestHeader('Content
-Type
', options.contentType);
4034 var data$1 = Utils.serializeObject(options.data);
4035 if (options.contentType === 'multipart
/form
-data
') {
4036 data$1 = data$1.split('&');
4038 for (var i = 0; i < data$1.length; i += 1) {
4039 newData.push(("Content-Disposition: form-data; name=\"" + (data$1[i].split('=')[0]) + "\"\r\n\r\n" + (data$1[i].split('=')[1]) + "\r\n"));
4041 postData = "--" + boundary + "\r\n" + (newData.join(("--" + boundary + "\r\n"))) + "--" + boundary + "--\r\n";
4042 } else if (options.contentType === 'application
/json
') {
4043 postData = JSON.stringify(options.data);
4049 postData = options.data;
4050 xhr.setRequestHeader('Content
-Type
', options.contentType);
4054 // Additional headers
4055 if (options.headers) {
4056 Object.keys(options.headers).forEach(function (headerName) {
4057 xhr.setRequestHeader(headerName, options.headers[headerName]);
4061 // Check for crossDomain
4062 if (typeof options.crossDomain === 'undefined') {
4063 // eslint-disable-next-line
4064 options.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(options.url) && RegExp.$2 !== win.location.host;
4067 if (!options.crossDomain) {
4068 xhr.setRequestHeader('X
-Requested
-With
', 'XMLHttpRequest
');
4071 if (options.xhrFields) {
4072 Utils.extend(xhr, options.xhrFields);
4078 xhr.onload = function onload() {
4079 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4080 if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {
4082 if (options.dataType === 'json
') {
4085 responseData = JSON.parse(xhr.responseText);
4090 fireCallback('success
', responseData, xhr.status, xhr);
4092 fireCallback('error
', xhr, 'parseerror
');
4095 responseData = xhr.responseType === 'text
' || xhr.responseType === '' ? xhr.responseText : xhr.response;
4096 fireCallback('success
', responseData, xhr.status, xhr);
4099 fireCallback('error
', xhr, xhr.status);
4101 if (options.statusCode) {
4102 if (globals.statusCode && globals.statusCode[xhr.status]) { globals.statusCode[xhr.status](xhr); }
4103 if (options.statusCode[xhr.status]) { options.statusCode[xhr.status](xhr); }
4105 fireCallback('complete
', xhr, xhr.status);
4108 xhr.onerror = function onerror() {
4109 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4110 fireCallback('error
', xhr, xhr.status);
4111 fireCallback('complete
', xhr, 'error
');
4115 if (options.timeout > 0) {
4116 xhr.onabort = function onabort() {
4117 if (xhrTimeout) { clearTimeout(xhrTimeout); }
4119 xhrTimeout = setTimeout(function () {
4121 fireCallback('error
', xhr, 'timeout
');
4122 fireCallback('complete
', xhr, 'timeout
');
4123 }, options.timeout);
4126 // Ajax start callback
4127 proceedRequest = fireCallback('beforeSend
', xhr, options);
4128 if (proceedRequest === false) { return xhr; }
4133 // Return XHR object
4136 function RequestShortcut(method) {
4137 var assign, assign$1;
4139 var args = [], len = arguments.length - 1;
4140 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
4144 var success = ref[2];
4146 var dataType = ref[4];
4147 if (typeof args[1] === 'function') {
4148 (assign = args, url = assign[0], success = assign[1], error = assign[2], dataType = assign[3]);
4150 (assign$1 = args, url = assign$1[0], data = assign$1[1], success = assign$1[2], error = assign$1[3], dataType = assign$1[4]);
4152 [success, error].forEach(function (callback) {
4153 if (typeof callback === 'string
') {
4154 dataType = callback;
4155 if (callback === success) { success = undefined; }
4156 else { error = undefined; }
4159 dataType = dataType || (method === 'json
' || method === 'postJSON
' ? 'json
' : undefined);
4160 var requestOptions = {
4162 method: method === 'post
' || method === 'postJSON
' ? 'POST
' : 'GET
',
4168 if (method === 'postJSON
') {
4169 Utils.extend(requestOptions, {
4170 contentType: 'application
/json
',
4173 data: typeof data === 'string
' ? data : JSON.stringify(data),
4176 return Request(requestOptions);
4178 function RequestShortcutPromise(method) {
4179 var args = [], len = arguments.length - 1;
4180 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
4184 var dataType = args[2];
4185 return new Promise(function (resolve, reject) {
4190 function (response) {
4193 function (xhr, status) {
4200 Object.assign(Request, {
4202 var args = [], len = arguments.length;
4203 while ( len-- ) args[ len ] = arguments[ len ];
4205 return RequestShortcut.apply(void 0, [ 'get' ].concat( args ));
4208 var args = [], len = arguments.length;
4209 while ( len-- ) args[ len ] = arguments[ len ];
4211 return RequestShortcut.apply(void 0, [ 'post
' ].concat( args ));
4214 var args = [], len = arguments.length;
4215 while ( len-- ) args[ len ] = arguments[ len ];
4217 return RequestShortcut.apply(void 0, [ 'json
' ].concat( args ));
4219 getJSON: function () {
4220 var args = [], len = arguments.length;
4221 while ( len-- ) args[ len ] = arguments[ len ];
4223 return RequestShortcut.apply(void 0, [ 'json
' ].concat( args ));
4225 postJSON: function () {
4226 var args = [], len = arguments.length;
4227 while ( len-- ) args[ len ] = arguments[ len ];
4229 return RequestShortcut.apply(void 0, [ 'postJSON
' ].concat( args ));
4233 Request.promise = function requestPromise(requestOptions) {
4234 return new Promise(function (resolve, reject) {
4235 Request(Object.assign(requestOptions, {
4236 success: function success(data) {
4239 error: function error(xhr, status) {
4245 Object.assign(Request.promise, {
4247 var args = [], len = arguments.length;
4248 while ( len-- ) args[ len ] = arguments[ len ];
4250 return RequestShortcutPromise.apply(void 0, [ 'get' ].concat( args ));
4253 var args = [], len = arguments.length;
4254 while ( len-- ) args[ len ] = arguments[ len ];
4256 return RequestShortcutPromise.apply(void 0, [ 'post
' ].concat( args ));
4259 var args = [], len = arguments.length;
4260 while ( len-- ) args[ len ] = arguments[ len ];
4262 return RequestShortcutPromise.apply(void 0, [ 'json
' ].concat( args ));
4264 getJSON: function () {
4265 var args = [], len = arguments.length;
4266 while ( len-- ) args[ len ] = arguments[ len ];
4268 return RequestShortcutPromise.apply(void 0, [ 'json
' ].concat( args ));
4270 postJSON: function () {
4271 var args = [], len = arguments.length;
4272 while ( len-- ) args[ len ] = arguments[ len ];
4274 return RequestShortcutPromise.apply(void 0, [ 'postJSON
' ].concat( args ));
4278 Request.setup = function setup(options) {
4279 if (options.type && !options.method) {
4280 Utils.extend(options, { method: options.type });
4282 Utils.extend(globals, options);
4285 /* eslint no-param-reassign: "off" */
4287 var RequestModule = {
4297 function initTouch() {
4299 var params = app.params.touch;
4300 var useRipple = params[((app.theme) + "TouchRipple")];
4302 if (Device.ios && Device.webView) {
4303 // Strange hack required for iOS 8 webview to work on inputs
4304 win.addEventListener('touchstart
', function () {});
4312 var activeSelection;
4320 var activableElement;
4324 var needsFastClickTimeOut;
4330 function findActivableElement(el) {
4332 var parents = target.parents(params.activeStateElements);
4334 if (target.is(params.activeStateElements)) {
4337 if (parents.length > 0) {
4338 activable = activable ? activable.add(parents) : parents;
4340 return activable || target;
4343 function isInsideScrollableViewLight(el) {
4344 var pageContent = el.parents('.page
-content
');
4345 return pageContent.length > 0;
4347 function isInsideScrollableView(el) {
4348 var pageContent = el.parents('.page
-content
');
4350 if (pageContent.length === 0) {
4354 // This event handler covers the "tap to stop scrolling".
4355 if (pageContent.prop('scrollHandlerSet
') !== 'yes
') {
4356 pageContent.on('scroll
', function () {
4357 clearTimeout(activeTimeout);
4358 clearTimeout(rippleTimeout);
4360 pageContent.prop('scrollHandlerSet
', 'yes
');
4365 function addActive() {
4366 if (!activableElement) { return; }
4367 activableElement.addClass('active
-state
');
4369 function removeActive() {
4370 if (!activableElement) { return; }
4371 activableElement.removeClass('active
-state
');
4372 activableElement = null;
4374 function isFormElement(el) {
4375 var nodes = ('input select textarea label
').split(' ');
4376 if (el.nodeName && nodes.indexOf(el.nodeName.toLowerCase()) >= 0) { return true; }
4379 function androidNeedsBlur(el) {
4380 var noBlur = ('button input textarea select
').split(' ');
4381 if (doc.activeElement && el !== doc.activeElement && doc.activeElement !== doc.body) {
4382 if (noBlur.indexOf(el.nodeName.toLowerCase()) >= 0) {
4389 function targetNeedsFastClick(el) {
4395 Device.osVersion.split('.')[0] > 9
4397 (Device.osVersion.split('.')[0] * 1 === 9 && Device.osVersion.split('.')[1] >= 1)
4404 if (el.nodeName.toLowerCase() === 'input
' && (el.type === 'file
' || el.type === 'range
')) { return false; }
4405 if (el.nodeName.toLowerCase() === 'select
' && Device.android) { return false; }
4406 if ($el.hasClass('no
-fastclick
') || $el.parents('.no
-fastclick
').length > 0) { return false; }
4407 if (params.fastClicksExclude && $el.closest(params.fastClicksExclude).length > 0) { return false; }
4411 function targetNeedsFocus(el) {
4412 if (doc.activeElement === el) {
4415 var tag = el.nodeName.toLowerCase();
4416 var skipInputs = ('button checkbox file image radio submit
').split(' ');
4417 if (el.disabled || el.readOnly) { return false; }
4418 if (tag === 'textarea
') { return true; }
4419 if (tag === 'select
') {
4420 if (Device.android) { return false; }
4423 if (tag === 'input
' && skipInputs.indexOf(el.type) < 0) { return true; }
4426 function targetNeedsPrevent(el) {
4429 if ($el.is('label
') || $el.parents('label
').length > 0) {
4430 if (Device.android) {
4432 } else if (Device.ios && $el.is('input
')) {
4434 } else { prevent = false; }
4440 function findRippleElement(el) {
4441 var rippleElements = params.touchRippleElements;
4443 if ($el.is(rippleElements)) {
4444 if ($el.hasClass('no
-ripple
')) {
4449 if ($el.parents(rippleElements).length > 0) {
4450 var rippleParent = $el.parents(rippleElements).eq(0);
4451 if (rippleParent.hasClass('no
-ripple
')) {
4454 return rippleParent;
4458 function createRipple($el, x, y) {
4459 if (!$el) { return; }
4460 rippleWave = app.touchRipple.create($el, x, y);
4463 function removeRipple() {
4464 if (!rippleWave) { return; }
4465 rippleWave.remove();
4466 rippleWave = undefined;
4467 rippleTarget = undefined;
4469 function rippleTouchStart(el) {
4470 rippleTarget = findRippleElement(el);
4471 if (!rippleTarget || rippleTarget.length === 0) {
4472 rippleTarget = undefined;
4475 var inScrollable = params.fastClicks
4476 ? isInsideScrollableView(rippleTarget)
4477 : isInsideScrollableViewLight(rippleTarget);
4479 if (!inScrollable) {
4480 createRipple(rippleTarget, touchStartX, touchStartY);
4482 rippleTimeout = setTimeout(function () {
4483 createRipple(rippleTarget, touchStartX, touchStartY);
4487 function rippleTouchMove() {
4488 clearTimeout(rippleTimeout);
4491 function rippleTouchEnd() {
4494 } else if (rippleTarget && !isMoved) {
4495 clearTimeout(rippleTimeout);
4496 createRipple(rippleTarget, touchStartX, touchStartY);
4497 setTimeout(removeRipple, 0);
4504 function handleMouseDown(e) {
4505 findActivableElement(e.target).addClass('active
-state
');
4506 if ('which
' in e && e.which === 3) {
4507 setTimeout(function () {
4508 $('.active
-state
').removeClass('active
-state
');
4512 touchStartX = e.pageX;
4513 touchStartY = e.pageY;
4514 rippleTouchStart(e.target, e.pageX, e.pageY);
4517 function handleMouseMove() {
4518 $('.active
-state
').removeClass('active
-state
');
4523 function handleMouseUp() {
4524 $('.active
-state
').removeClass('active
-state
');
4531 function sendClick(e) {
4532 var touch = e.changedTouches[0];
4533 var evt = doc.createEvent('MouseEvents
');
4534 var eventType = 'click
';
4535 if (Device.android && targetElement.nodeName.toLowerCase() === 'select
') {
4536 eventType = 'mousedown
';
4538 evt.initMouseEvent(eventType, true, true, win, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
4539 evt.forwardedTouchEvent = true;
4541 if (app.device.ios && win.navigator.standalone) {
4542 // Fix the issue happens in iOS home screen apps where the wrong element is selected during a momentum scroll.
4543 // Upon tapping, we give the scrolling time to stop, then we grab the element based where the user tapped.
4544 setTimeout(function () {
4545 targetElement = doc.elementFromPoint(e.changedTouches[0].clientX, e.changedTouches[0].clientY);
4546 targetElement.dispatchEvent(evt);
4549 targetElement.dispatchEvent(evt);
4554 function handleTouchStart(e) {
4558 tapHoldFired = false;
4559 if (e.targetTouches.length > 1) {
4560 if (activableElement) { removeActive(); }
4563 if (e.touches.length > 1 && activableElement) {
4566 if (params.tapHold) {
4567 if (tapHoldTimeout) { clearTimeout(tapHoldTimeout); }
4568 tapHoldTimeout = setTimeout(function () {
4569 if (e && e.touches && e.touches.length > 1) { return; }
4570 tapHoldFired = true;
4572 $(e.target).trigger('taphold
');
4573 }, params.tapHoldDelay);
4575 if (needsFastClickTimeOut) { clearTimeout(needsFastClickTimeOut); }
4576 needsFastClick = targetNeedsFastClick(e.target);
4578 if (!needsFastClick) {
4582 if (Device.ios || (Device.android && 'getSelection
' in win)) {
4583 var selection = win.getSelection();
4585 selection.rangeCount
4586 && selection.focusNode !== doc.body
4587 && (!selection.isCollapsed || doc.activeElement === selection.focusNode)
4589 activeSelection = true;
4593 activeSelection = false;
4595 if (Device.android) {
4596 if (androidNeedsBlur(e.target)) {
4597 doc.activeElement.blur();
4602 targetElement = e.target;
4603 touchStartTime = (new Date()).getTime();
4604 touchStartX = e.targetTouches[0].pageX;
4605 touchStartY = e.targetTouches[0].pageY;
4607 // Detect scroll parent
4609 scrollParent = undefined;
4610 $(targetElement).parents().each(function () {
4611 var parent = this$1;
4612 if (parent.scrollHeight > parent.offsetHeight && !scrollParent) {
4613 scrollParent = parent;
4614 scrollParent.f7ScrollTop = scrollParent.scrollTop;
4618 if ((touchStartTime - lastClickTime) < params.fastClicksDelayBetweenClicks) {
4622 if (params.activeState) {
4623 activableElement = findActivableElement(targetElement);
4624 activeTimeout = setTimeout(addActive, 0);
4627 rippleTouchStart(targetElement, touchStartX, touchStartY);
4631 function handleTouchMove(e) {
4632 if (!trackClick) { return; }
4633 var distance = params.fastClicksDistanceThreshold;
4635 var pageX = e.targetTouches[0].pageX;
4636 var pageY = e.targetTouches[0].pageY;
4637 if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
4645 targetElement = null;
4647 if (params.tapHold) {
4648 clearTimeout(tapHoldTimeout);
4650 if (params.activeState) {
4651 clearTimeout(activeTimeout);
4659 function handleTouchEnd(e) {
4660 clearTimeout(activeTimeout);
4661 clearTimeout(tapHoldTimeout);
4663 var touchEndTime = (new Date()).getTime();
4666 if (!activeSelection && needsFastClick) {
4667 if (!(Device.android && !e.cancelable) && e.cancelable) {
4671 if (params.activeState) { removeActive(); }
4678 if (doc.activeElement === e.target) {
4679 if (params.activeState) { removeActive(); }
4686 if (!activeSelection) {
4690 if ((touchEndTime - lastClickTime) < params.fastClicksDelayBetweenClicks) {
4691 setTimeout(removeActive, 0);
4698 lastClickTime = touchEndTime;
4702 if (Device.ios && scrollParent) {
4703 if (scrollParent.scrollTop !== scrollParent.f7ScrollTop) {
4708 // Add active-state here because, in a very fast tap, the timeout didn't
4709 // have the chance to execute. Removing active-state in a timeout gives
4710 // the chance to the animation execute.
4711 if (params
.activeState
) {
4713 setTimeout(removeActive
, 0);
4720 // Trigger focus when required
4721 if (targetNeedsFocus(targetElement
)) {
4722 if (Device
.ios
&& Device
.webView
) {
4723 targetElement
.focus();
4727 targetElement
.focus();
4730 // Blur active elements
4731 if (doc
.activeElement
&& targetElement
!== doc
.activeElement
&& doc
.activeElement
!== doc
.body
&& targetElement
.nodeName
.toLowerCase() !== 'label') {
4732 doc
.activeElement
.blur();
4737 if (params
.tapHoldPreventClicks
&& tapHoldFired
) {
4743 function handleTouchCancel() {
4745 targetElement
= null;
4747 // Remove Active State
4748 clearTimeout(activeTimeout
);
4749 clearTimeout(tapHoldTimeout
);
4750 if (params
.activeState
) {
4760 function handleClick(e
) {
4761 var allowClick
= false;
4763 targetElement
= null;
4767 if ((e
.target
.type
=== 'submit' && e
.detail
=== 0) || e
.target
.type
=== 'file') {
4770 if (!targetElement
) {
4771 if (!isFormElement(e
.target
)) {
4775 if (!needsFastClick
) {
4778 if (doc
.activeElement
=== targetElement
) {
4781 if (e
.forwardedTouchEvent
) {
4784 if (!e
.cancelable
) {
4787 if (params
.tapHold
&& params
.tapHoldPreventClicks
&& tapHoldFired
) {
4791 e
.stopImmediatePropagation();
4792 e
.stopPropagation();
4793 if (targetElement
) {
4794 if (targetNeedsPrevent(targetElement
) || isMoved
) {
4800 targetElement
= null;
4802 needsFastClickTimeOut
= setTimeout(function () {
4803 needsFastClick
= false;
4804 }, (Device
.ios
|| Device
.androidChrome
? 100 : 400));
4806 if (params
.tapHold
) {
4807 tapHoldTimeout
= setTimeout(function () {
4808 tapHoldFired
= false;
4809 }, (Device
.ios
|| Device
.androidChrome
? 100 : 400));
4815 function handleTouchStartLight(e
) {
4817 tapHoldFired
= false;
4818 preventClick
= false;
4819 if (e
.targetTouches
.length
> 1) {
4820 if (activableElement
) { removeActive(); }
4823 if (e
.touches
.length
> 1 && activableElement
) {
4826 if (params
.tapHold
) {
4827 if (tapHoldTimeout
) { clearTimeout(tapHoldTimeout
); }
4828 tapHoldTimeout
= setTimeout(function () {
4829 if (e
&& e
.touches
&& e
.touches
.length
> 1) { return; }
4830 tapHoldFired
= true;
4832 preventClick
= true;
4833 $(e
.target
).trigger('taphold');
4834 }, params
.tapHoldDelay
);
4836 targetElement
= e
.target
;
4837 touchStartX
= e
.targetTouches
[0].pageX
;
4838 touchStartY
= e
.targetTouches
[0].pageY
;
4840 if (params
.activeState
) {
4841 activableElement
= findActivableElement(targetElement
);
4842 if (!isInsideScrollableViewLight(activableElement
)) {
4845 activeTimeout
= setTimeout(addActive
, 80);
4849 rippleTouchStart(targetElement
, touchStartX
, touchStartY
);
4853 function handleTouchMoveLight(e
) {
4854 var distance
= params
.fastClicks
? params
.fastClicksDistanceThreshold
: 0;
4856 var pageX
= e
.targetTouches
[0].pageX
;
4857 var pageY
= e
.targetTouches
[0].pageY
;
4858 if (Math
.abs(pageX
- touchStartX
) > distance
|| Math
.abs(pageY
- touchStartY
) > distance
) {
4865 preventClick
= true;
4866 if (params
.tapHold
) {
4867 clearTimeout(tapHoldTimeout
);
4869 if (params
.activeState
) {
4870 clearTimeout(activeTimeout
);
4878 function handleTouchEndLight(e
) {
4879 clearTimeout(activeTimeout
);
4880 clearTimeout(tapHoldTimeout
);
4881 if (doc
.activeElement
=== e
.target
) {
4882 if (params
.activeState
) { removeActive(); }
4888 if (params
.activeState
) {
4890 setTimeout(removeActive
, 0);
4895 if ((params
.tapHoldPreventClicks
&& tapHoldFired
) || preventClick
) {
4896 if (e
.cancelable
) { e
.preventDefault(); }
4897 preventClick
= true;
4902 function handleClickLight(e
) {
4903 var localPreventClick
= preventClick
;
4904 if (targetElement
&& e
.target
!== targetElement
) {
4905 localPreventClick
= true;
4907 if (params
.tapHold
&& params
.tapHoldPreventClicks
&& tapHoldFired
) {
4908 localPreventClick
= true;
4910 if (localPreventClick
) {
4911 e
.stopImmediatePropagation();
4912 e
.stopPropagation();
4916 if (params
.tapHold
) {
4917 tapHoldTimeout
= setTimeout(
4919 tapHoldFired
= false;
4921 (Device
.ios
|| Device
.androidChrome
? 100 : 400)
4924 preventClick
= false;
4925 targetElement
= null;
4927 return !localPreventClick
;
4930 function emitAppTouchEvent(name
, e
) {
4936 function appClick(e
) {
4937 emitAppTouchEvent('click', e
);
4939 function appTouchStartActive(e
) {
4940 emitAppTouchEvent('touchstart touchstart:active', e
);
4942 function appTouchMoveActive(e
) {
4943 emitAppTouchEvent('touchmove touchmove:active', e
);
4945 function appTouchEndActive(e
) {
4946 emitAppTouchEvent('touchend touchend:active', e
);
4948 function appTouchStartPassive(e
) {
4949 emitAppTouchEvent('touchstart:passive', e
);
4951 function appTouchMovePassive(e
) {
4952 emitAppTouchEvent('touchmove:passive', e
);
4954 function appTouchEndPassive(e
) {
4955 emitAppTouchEvent('touchend:passive', e
);
4958 var passiveListener
= Support
.passiveListener
? { passive
: true } : false;
4959 var activeListener
= Support
.passiveListener
? { passive
: false } : false;
4961 doc
.addEventListener('click', appClick
, true);
4963 if (Support
.passiveListener
) {
4964 doc
.addEventListener(app
.touchEvents
.start
, appTouchStartActive
, activeListener
);
4965 doc
.addEventListener(app
.touchEvents
.move, appTouchMoveActive
, activeListener
);
4966 doc
.addEventListener(app
.touchEvents
.end
, appTouchEndActive
, activeListener
);
4968 doc
.addEventListener(app
.touchEvents
.start
, appTouchStartPassive
, passiveListener
);
4969 doc
.addEventListener(app
.touchEvents
.move, appTouchMovePassive
, passiveListener
);
4970 doc
.addEventListener(app
.touchEvents
.end
, appTouchEndPassive
, passiveListener
);
4972 doc
.addEventListener(app
.touchEvents
.start
, function (e
) {
4973 appTouchStartActive(e
);
4974 appTouchStartPassive(e
);
4976 doc
.addEventListener(app
.touchEvents
.move, function (e
) {
4977 appTouchMoveActive(e
);
4978 appTouchMovePassive(e
);
4980 doc
.addEventListener(app
.touchEvents
.end
, function (e
) {
4981 appTouchEndActive(e
);
4982 appTouchEndPassive(e
);
4986 if (Support
.touch
) {
4987 if (params
.fastClicks
) {
4988 app
.on('click', handleClick
);
4989 app
.on('touchstart', handleTouchStart
);
4990 app
.on('touchmove', handleTouchMove
);
4991 app
.on('touchend', handleTouchEnd
);
4993 app
.on('click', handleClickLight
);
4994 app
.on('touchstart', handleTouchStartLight
);
4995 app
.on('touchmove', handleTouchMoveLight
);
4996 app
.on('touchend', handleTouchEndLight
);
4999 doc
.addEventListener('touchcancel', handleTouchCancel
, { passive
: true });
5000 } else if (params
.activeState
) {
5001 app
.on('touchstart', handleMouseDown
);
5002 app
.on('touchmove', handleMouseMove
);
5003 app
.on('touchend', handleMouseUp
);
5005 doc
.addEventListener('contextmenu', function (e
) {
5006 if (params
.disableContextMenu
&& (Device
.ios
|| Device
.android
|| Device
.cordova
)) {
5010 if (activableElement
) { removeActive(); }
5022 fastClicksDistanceThreshold
: 10,
5023 fastClicksDelayBetweenClicks
: 50,
5024 fastClicksExclude
: '', // CSS selector
5026 disableContextMenu
: false,
5030 tapHoldPreventClicks
: true,
5033 activeStateElements
: 'a, button, label, span, .actions-button, .stepper-button, .stepper-button-plus, .stepper-button-minus, .card-expandable, .menu-item',
5034 mdTouchRipple
: true,
5035 iosTouchRipple
: false,
5036 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',
5041 start
: Support
.touch
? 'touchstart' : 'mousedown',
5042 move: Support
.touch
? 'touchmove' : 'mousemove',
5043 end
: Support
.touch
? 'touchend' : 'mouseup',
5052 * Expose `pathToRegexp`.
5054 var pathToRegexp_1
= pathToRegexp
;
5055 var parse_1
= parse
;
5056 var compile_1
= compile
;
5057 var tokensToFunction_1
= tokensToFunction
;
5058 var tokensToRegExp_1
= tokensToRegExp
;
5063 var DEFAULT_DELIMITER
= '/';
5066 * The main path matching regexp utility.
5070 var PATH_REGEXP
= new RegExp([
5071 // Match escaped characters that would otherwise appear in future matches.
5072 // This allows the user to escape special characters that won't transform.
5074 // Match Express-style parameters and un-named parameters with a prefix
5075 // and optional suffixes. Matches appear as:
5077 // ":test(\\d+)?" => ["test", "\d+", undefined, "?"]
5078 // "(\\d+)" => [undefined, undefined, "\d+", undefined]
5079 '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'
5083 * Parse a string for the raw tokens.
5085 * @param {string} str
5086 * @param {Object=} options
5089 function parse (str
, options
) {
5094 var defaultDelimiter
= (options
&& options
.delimiter
) || DEFAULT_DELIMITER
;
5095 var whitelist
= (options
&& options
.whitelist
) || undefined;
5096 var pathEscaped
= false;
5099 while ((res
= PATH_REGEXP
.exec(str
)) !== null) {
5101 var escaped
= res
[1];
5102 var offset
= res
.index
;
5103 path
+= str
.slice(index
, offset
);
5104 index
= offset
+ m
.length
;
5106 // Ignore already escaped sequences.
5115 var capture
= res
[3];
5117 var modifier
= res
[5];
5119 if (!pathEscaped
&& path
.length
) {
5120 var k
= path
.length
- 1;
5122 var matches
= whitelist
? whitelist
.indexOf(c
) > -1 : true;
5126 path
= path
.slice(0, k
);
5130 // Push the current path onto the tokens.
5134 pathEscaped
= false;
5137 var repeat
= modifier
=== '+' || modifier
=== '*';
5138 var optional
= modifier
=== '?' || modifier
=== '*';
5139 var pattern
= capture
|| group
;
5140 var delimiter
= prev
|| defaultDelimiter
;
5143 name
: name
|| key
++,
5145 delimiter
: delimiter
,
5149 ? escapeGroup(pattern
)
5150 : '[^' + escapeString(delimiter
=== defaultDelimiter
? delimiter
: (delimiter
+ defaultDelimiter
)) + ']+?'
5154 // Push any remaining characters.
5155 if (path
|| index
< str
.length
) {
5156 tokens
.push(path
+ str
.substr(index
));
5163 * Compile a string to a template function for the path.
5165 * @param {string} str
5166 * @param {Object=} options
5167 * @return {!function(Object=, Object=)}
5169 function compile (str
, options
) {
5170 return tokensToFunction(parse(str
, options
))
5174 * Expose a method for transforming tokens into the path function.
5176 function tokensToFunction (tokens
) {
5177 // Compile all the tokens into regexps.
5178 var matches
= new Array(tokens
.length
);
5180 // Compile all the patterns before compilation.
5181 for (var i
= 0; i
< tokens
.length
; i
++) {
5182 if (typeof tokens
[i
] === 'object') {
5183 matches
[i
] = new RegExp('^(?:' + tokens
[i
].pattern
+ ')$');
5187 return function (data
, options
) {
5189 var encode
= (options
&& options
.encode
) || encodeURIComponent
;
5191 for (var i
= 0; i
< tokens
.length
; i
++) {
5192 var token
= tokens
[i
];
5194 if (typeof token
=== 'string') {
5199 var value
= data
? data
[token
.name
] : undefined;
5202 if (Array
.isArray(value
)) {
5203 if (!token
.repeat
) {
5204 throw new TypeError('Expected "' + token
.name
+ '" to not repeat, but got array')
5207 if (value
.length
=== 0) {
5208 if (token
.optional
) { continue }
5210 throw new TypeError('Expected "' + token
.name
+ '" to not be empty')
5213 for (var j
= 0; j
< value
.length
; j
++) {
5214 segment
= encode(value
[j
], token
);
5216 if (!matches
[i
].test(segment
)) {
5217 throw new TypeError('Expected all "' + token
.name
+ '" to match "' + token
.pattern
+ '"')
5220 path
+= (j
=== 0 ? token
.prefix
: token
.delimiter
) + segment
;
5226 if (typeof value
=== 'string' || typeof value
=== 'number' || typeof value
=== 'boolean') {
5227 segment
= encode(String(value
), token
);
5229 if (!matches
[i
].test(segment
)) {
5230 throw new TypeError('Expected "' + token
.name
+ '" to match "' + token
.pattern
+ '", but got "' + segment
+ '"')
5233 path
+= token
.prefix
+ segment
;
5237 if (token
.optional
) { continue }
5239 throw new TypeError('Expected "' + token
.name
+ '" to be ' + (token
.repeat
? 'an array' : 'a string'))
5247 * Escape a regular expression string.
5249 * @param {string} str
5252 function escapeString (str
) {
5253 return str
.replace(/([.+*?=^!:${}()[\]|/\\])/g
, '\\$1')
5257 * Escape the capturing group by escaping special characters and meaning.
5259 * @param {string} group
5262 function escapeGroup (group
) {
5263 return group
.replace(/([=!:$/()])/g
, '\\$1')
5267 * Get the flags for a regexp from the options.
5269 * @param {Object} options
5272 function flags (options
) {
5273 return options
&& options
.sensitive
? '' : 'i'
5277 * Pull out keys from a regexp.
5279 * @param {!RegExp} path
5280 * @param {Array=} keys
5283 function regexpToRegexp (path
, keys
) {
5284 if (!keys
) { return path
}
5286 // Use a negative lookahead to match only capturing groups.
5287 var groups
= path
.source
.match(/\((?!\?)/g);
5290 for (var i
= 0; i
< groups
.length
; i
++) {
5306 * Transform an array into a regexp.
5308 * @param {!Array} path
5309 * @param {Array=} keys
5310 * @param {Object=} options
5313 function arrayToRegexp (path
, keys
, options
) {
5316 for (var i
= 0; i
< path
.length
; i
++) {
5317 parts
.push(pathToRegexp(path
[i
], keys
, options
).source
);
5320 return new RegExp('(?:' + parts
.join('|') + ')', flags(options
))
5324 * Create a path regexp from string input.
5326 * @param {string} path
5327 * @param {Array=} keys
5328 * @param {Object=} options
5331 function stringToRegexp (path
, keys
, options
) {
5332 return tokensToRegExp(parse(path
, options
), keys
, options
)
5336 * Expose a function for taking tokens and returning a RegExp.
5338 * @param {!Array} tokens
5339 * @param {Array=} keys
5340 * @param {Object=} options
5343 function tokensToRegExp (tokens
, keys
, options
) {
5344 options
= options
|| {};
5346 var strict
= options
.strict
;
5347 var start
= options
.start
!== false;
5348 var end
= options
.end
!== false;
5349 var delimiter
= options
.delimiter
|| DEFAULT_DELIMITER
;
5350 var endsWith
= [].concat(options
.endsWith
|| []).map(escapeString
).concat('$').join('|');
5351 var route
= start
? '^' : '';
5353 // Iterate over the tokens and create our regexp string.
5354 for (var i
= 0; i
< tokens
.length
; i
++) {
5355 var token
= tokens
[i
];
5357 if (typeof token
=== 'string') {
5358 route
+= escapeString(token
);
5360 var capture
= token
.repeat
5361 ? '(?:' + token
.pattern
+ ')(?:' + escapeString(token
.delimiter
) + '(?:' + token
.pattern
+ '))*'
5364 if (keys
) { keys
.push(token
); }
5366 if (token
.optional
) {
5367 if (!token
.prefix
) {
5368 route
+= '(' + capture
+ ')?';
5370 route
+= '(?:' + escapeString(token
.prefix
) + '(' + capture
+ '))?';
5373 route
+= escapeString(token
.prefix
) + '(' + capture
+ ')';
5379 if (!strict
) { route
+= '(?:' + escapeString(delimiter
) + ')?'; }
5381 route
+= endsWith
=== '$' ? '$' : '(?=' + endsWith
+ ')';
5383 var endToken
= tokens
[tokens
.length
- 1];
5384 var isEndDelimited
= typeof endToken
=== 'string'
5385 ? endToken
[endToken
.length
- 1] === delimiter
5386 : endToken
=== undefined;
5388 if (!strict
) { route
+= '(?:' + escapeString(delimiter
) + '(?=' + endsWith
+ '))?'; }
5389 if (!isEndDelimited
) { route
+= '(?=' + escapeString(delimiter
) + '|' + endsWith
+ ')'; }
5392 return new RegExp(route
, flags(options
))
5396 * Normalize the given path string, returning a regular expression.
5398 * An empty array can be passed in for the keys, which will hold the
5399 * placeholder key descriptions. For example, using `/user/:id`, `keys` will
5400 * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
5402 * @param {(string|RegExp|Array)} path
5403 * @param {Array=} keys
5404 * @param {Object=} options
5407 function pathToRegexp (path
, keys
, options
) {
5408 if (path
instanceof RegExp
) {
5409 return regexpToRegexp(path
, keys
)
5412 if (Array
.isArray(path
)) {
5413 return arrayToRegexp(/** @type {!Array} */ (path
), keys
, options
)
5416 return stringToRegexp(/** @type {string} */ (path
), keys
, options
)
5418 pathToRegexp_1
.parse
= parse_1
;
5419 pathToRegexp_1
.compile
= compile_1
;
5420 pathToRegexp_1
.tokensToFunction
= tokensToFunction_1
;
5421 pathToRegexp_1
.tokensToRegExp
= tokensToRegExp_1
;
5425 clearQueue
: function clearQueue() {
5426 if (History
.queue
.length
=== 0) { return; }
5427 var currentQueue
= History
.queue
.shift();
5431 clearRouterQueue
: function clearRouterQueue() {
5432 if (History
.routerQueue
.length
=== 0) { return; }
5433 var currentQueue
= History
.routerQueue
.pop();
5434 var router
= currentQueue
.router
;
5435 var stateUrl
= currentQueue
.stateUrl
;
5436 var action
= currentQueue
.action
;
5438 var animate
= router
.params
.animate
;
5439 if (router
.params
.pushStateAnimate
=== false) { animate
= false; }
5441 if (action
=== 'back') {
5442 router
.back({ animate
: animate
, pushState
: false });
5444 if (action
=== 'load') {
5445 router
.navigate(stateUrl
, { animate
: animate
, pushState
: false });
5448 handle
: function handle(e
) {
5449 if (History
.blockPopstate
) { return; }
5451 // const mainView = app.views.main;
5452 var state
= e
.state
;
5453 History
.previousState
= History
.state
;
5454 History
.state
= state
;
5456 History
.allowChange
= true;
5457 History
.clearQueue();
5459 state
= History
.state
;
5460 if (!state
) { state
= {}; }
5462 app
.views
.forEach(function (view
) {
5463 var router
= view
.router
;
5464 var viewState
= state
[view
.id
];
5465 if (!viewState
&& view
.params
.pushState
) {
5467 url
: view
.router
.history
[0],
5470 if (!viewState
) { return; }
5471 var stateUrl
= viewState
.url
|| undefined;
5473 var animate
= router
.params
.animate
;
5474 if (router
.params
.pushStateAnimate
=== false) { animate
= false; }
5476 if (stateUrl
!== router
.url
) {
5477 if (router
.history
.indexOf(stateUrl
) >= 0) {
5479 if (router
.allowPageChange
) {
5480 router
.back({ animate
: animate
, pushState
: false });
5482 History
.routerQueue
.push({
5487 } else if (router
.allowPageChange
) {
5489 router
.navigate(stateUrl
, { animate
: animate
, pushState
: false });
5491 History
.routerQueue
.unshift({
5500 initViewState
: function initViewState(viewId
, viewState
) {
5503 var newState
= Utils
.extend({}, (History
.state
|| {}), ( obj
= {}, obj
[viewId
] = viewState
, obj
));
5504 History
.state
= newState
;
5505 win
.history
.replaceState(newState
, '');
5507 push
: function push(viewId
, viewState
, url
) {
5510 if (!History
.allowChange
) {
5511 History
.queue
.push(function () {
5512 History
.push(viewId
, viewState
, url
);
5516 History
.previousState
= History
.state
;
5517 var newState
= Utils
.extend({}, (History
.previousState
|| {}), ( obj
= {}, obj
[viewId
] = viewState
, obj
));
5518 History
.state
= newState
;
5519 win
.history
.pushState(newState
, '', url
);
5521 replace
: function replace(viewId
, viewState
, url
) {
5524 if (!History
.allowChange
) {
5525 History
.queue
.push(function () {
5526 History
.replace(viewId
, viewState
, url
);
5530 History
.previousState
= History
.state
;
5531 var newState
= Utils
.extend({}, (History
.previousState
|| {}), ( obj
= {}, obj
[viewId
] = viewState
, obj
));
5532 History
.state
= newState
;
5533 win
.history
.replaceState(newState
, '', url
);
5535 go
: function go(index
) {
5536 History
.allowChange
= false;
5537 win
.history
.go(index
);
5539 back
: function back() {
5540 History
.allowChange
= false;
5545 state
: win
.history
.state
,
5546 blockPopstate
: true,
5547 init
: function init(app
) {
5548 $(win
).on('load', function () {
5549 setTimeout(function () {
5550 History
.blockPopstate
= false;
5554 if (doc
.readyState
&& doc
.readyState
=== 'complete') {
5555 History
.blockPopstate
= false;
5558 $(win
).on('popstate', History
.handle
.bind(app
));
5562 function SwipeBack(r
) {
5564 var $el
= router
.$el
;
5565 var $navbarEl
= router
.$navbarEl
;
5566 var app
= router
.app
;
5567 var params
= router
.params
;
5568 var isTouched
= false;
5569 var isMoved
= false;
5570 var touchesStart
= {};
5572 var currentPage
= [];
5573 var previousPage
= [];
5574 var viewContainerWidth
;
5576 var allowViewTouchMove
= true;
5578 var $currentNavbarInner
= [];
5579 var $previousNavbarInner
= [];
5585 var animatableNavEls
;
5587 var paramsSwipeBackAnimateShadow
= params
[((app
.theme
) + "SwipeBackAnimateShadow")];
5588 var paramsSwipeBackAnimateOpacity
= params
[((app
.theme
) + "SwipeBackAnimateOpacity")];
5589 var paramsSwipeBackActiveArea
= params
[((app
.theme
) + "SwipeBackActiveArea")];
5590 var paramsSwipeBackThreshold
= params
[((app
.theme
) + "SwipeBackThreshold")];
5592 var transformOrigin
= app
.rtl
? 'right center' : 'left center';
5594 function animatableNavElements() {
5596 var inverter
= app
.rtl
? -1 : 1;
5597 var currentNavIsLarge
= $currentNavbarInner
.hasClass('navbar-inner-large');
5598 var previousNavIsLarge
= $previousNavbarInner
.hasClass('navbar-inner-large');
5599 var fromLarge
= currentNavIsLarge
&& !$currentNavbarInner
.hasClass('navbar-inner-large-collapsed');
5600 var toLarge
= previousNavIsLarge
&& !$previousNavbarInner
.hasClass('navbar-inner-large-collapsed');
5601 var $currentNavElements
= $currentNavbarInner
.children('.left, .title, .right, .subnavbar, .fading, .title-large');
5602 var $previousNavElements
= $previousNavbarInner
.children('.left, .title, .right, .subnavbar, .fading, .title-large');
5603 var activeNavBackIconText
;
5604 var previousNavBackIconText
;
5606 if (params
.iosAnimateNavbarBackIcon
) {
5607 if ($currentNavbarInner
.hasClass('sliding')) {
5608 activeNavBackIconText
= $currentNavbarInner
.children('.left').find('.back .icon + span').eq(0);
5610 activeNavBackIconText
= $currentNavbarInner
.children('.left.sliding').find('.back .icon + span').eq(0);
5612 if ($previousNavbarInner
.hasClass('sliding')) {
5613 previousNavBackIconText
= $previousNavbarInner
.children('.left').find('.back .icon + span').eq(0);
5615 previousNavBackIconText
= $previousNavbarInner
.children('.left.sliding').find('.back .icon + span').eq(0);
5617 if (activeNavBackIconText
.length
) {
5618 $previousNavElements
.each(function (index
, el
) {
5619 if (!$(el
).hasClass('title')) { return; }
5620 el
.f7NavbarLeftOffset
+= activeNavBackIconText
.prev('.icon')[0].offsetWidth
;
5625 .each(function (index
, navEl
) {
5626 var $navEl
= $(navEl
);
5627 var isSubnavbar
= $navEl
.hasClass('subnavbar');
5628 var isLeft
= $navEl
.hasClass('left');
5629 var isTitle
= $navEl
.hasClass('title');
5630 if (!fromLarge
&& $navEl
.hasClass('.title-large')) { return; }
5635 if (isTitle
) { return; }
5636 if ($navEl
.hasClass('title-large')) {
5637 if (!separateNavbar
) { return; }
5639 if (els
.indexOf(el
) < 0) { els
.push(el
); }
5640 el
.overflow
= 'visible';
5641 el
.transform
= 'translateX(100%)';
5642 $navEl
.find('.title-large-text, .title-large-inner').each(function (subIndex
, subNavEl
) {
5645 transform: function (progress
) { return ("translateX(" + (-100 + progress
* 100 * inverter
) + "%)"); },
5649 if (els
.indexOf(el
) < 0) { els
.push(el
); }
5650 el
.overflow
= 'hidden';
5651 el
.transform = function (progress
) { return ("translateY(calc(" + (-progress
) + " * var(--f7-navbar-large-title-height)))"); };
5652 $navEl
.find('.title-large-text, .title-large-inner').each(function (subIndex
, subNavEl
) {
5655 transform: function (progress
) { return ("translateX(" + (progress
* 100 * inverter
) + "%) translateY(calc(" + progress
+ " * var(--f7-navbar-large-title-height)))"); },
5664 if ($navEl
.hasClass('title-large')) {
5665 if (!separateNavbar
) { return; }
5666 if (els
.indexOf(el
) < 0) { els
.push(el
); }
5670 if (isLeft
&& separateNavbar
) {
5671 if (els
.indexOf(el
) < 0) { els
.push(el
); }
5672 el
.opacity = function (progress
) { return (1 - (Math
.pow( progress
, 0.33 ))); };
5673 $navEl
.find('.back span').each(function (subIndex
, subNavEl
) {
5676 'transform-origin': transformOrigin
,
5677 transform: function (progress
) { return ("translateY(calc(var(--f7-navbar-height) * " + progress
+ ")) scale(" + (1 + (1 * progress
)) + ")"); },
5683 if ($navEl
.hasClass('title-large')) { return; }
5684 var isSliding
= $navEl
.hasClass('sliding') || $currentNavbarInner
.hasClass('sliding');
5685 if (els
.indexOf(el
) < 0) { els
.push(el
); }
5686 if (!isSubnavbar
|| (isSubnavbar
&& !isSliding
)) {
5687 el
.opacity = function (progress
) { return (1 - (Math
.pow( progress
, 0.33 ))); };
5690 var transformTarget
= el
;
5691 if (isLeft
&& activeNavBackIconText
.length
&& params
.iosAnimateNavbarBackIcon
) {
5692 var textEl
= { el
: activeNavBackIconText
[0] };
5693 transformTarget
= textEl
;
5696 transformTarget
.transform = function (progress
) {
5697 var activeNavTranslate
= progress
* transformTarget
.el
.f7NavbarRightOffset
;
5698 if (Device
.pixelRatio
=== 1) { activeNavTranslate
= Math
.round(activeNavTranslate
); }
5699 if (isSubnavbar
&& currentNavIsLarge
&& separateNavbar
) {
5700 return ("translate3d(" + activeNavTranslate
+ "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
5702 return ("translate3d(" + activeNavTranslate
+ "px,0,0)");
5706 $previousNavElements
5707 .each(function (index
, navEl
) {
5708 var $navEl
= $(navEl
);
5709 var isSubnavbar
= $navEl
.hasClass('subnavbar');
5710 var isLeft
= $navEl
.hasClass('left');
5711 var isTitle
= $navEl
.hasClass('title');
5716 if (isTitle
) { return; }
5717 if (els
.indexOf(el
) < 0) { els
.push(el
); }
5719 if ($navEl
.hasClass('title-large')) {
5720 if (!separateNavbar
) { return; }
5723 el
.overflow
= 'visible';
5724 el
.transform
= 'translateY(0)';
5725 $navEl
.find('.title-large-text').each(function (subIndex
, subNavEl
) {
5728 'transform-origin': transformOrigin
,
5729 opacity: function (progress
) { return (Math
.pow( progress
, 3 )); },
5730 transform: function (progress
) { return ("translateY(calc(" + (-1 + progress
* 1) + " * var(--f7-navbar-large-title-height))) scale(" + (0.5 + progress
* 0.5) + ")"); },
5734 el
.transform = function (progress
) { return ("translateY(calc(" + (progress
- 1) + " * var(--f7-navbar-large-title-height)))"); };
5736 el
.overflow
= 'hidden';
5737 $navEl
.find('.title-large-text').each(function (subIndex
, subNavEl
) {
5740 'transform-origin': transformOrigin
,
5741 opacity: function (progress
) { return (Math
.pow( progress
, 3 )); },
5742 transform: function (progress
) { return ("scale(" + (0.5 + progress
* 0.5) + ")"); },
5746 $navEl
.find('.title-large-inner').each(function (subIndex
, subNavEl
) {
5749 'transform-origin': transformOrigin
,
5750 opacity: function (progress
) { return (Math
.pow( progress
, 3 )); },
5751 transform: function (progress
) { return ("translateX(" + (-100 * (1 - progress
) * inverter
) + "%)"); },
5757 if ($navEl
.hasClass('title-large')) { return; }
5758 var isSliding
= $navEl
.hasClass('sliding') || $previousNavbarInner
.hasClass('sliding');
5759 if (els
.indexOf(el
) < 0) { els
.push(el
); }
5760 if (!isSubnavbar
|| (isSubnavbar
&& !isSliding
)) {
5761 el
.opacity = function (progress
) { return (Math
.pow( progress
, 3 )); };
5764 var transformTarget
= el
;
5765 if (isLeft
&& previousNavBackIconText
.length
&& params
.iosAnimateNavbarBackIcon
) {
5766 var textEl
= { el
: activeNavBackIconText
[0] };
5767 transformTarget
= textEl
;
5770 transformTarget
.transform = function (progress
) {
5771 var previousNavTranslate
= transformTarget
.el
.f7NavbarLeftOffset
* (1 - progress
);
5772 if (Device
.pixelRatio
=== 1) { previousNavTranslate
= Math
.round(previousNavTranslate
); }
5773 if (isSubnavbar
&& previousNavIsLarge
&& separateNavbar
) {
5774 return ("translate3d(" + previousNavTranslate
+ "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
5776 return ("translate3d(" + previousNavTranslate
+ "px,0,0)");
5783 function setAnimatableNavElements(ref
) {
5784 if ( ref
=== void 0 ) ref
= {};
5785 var progress
= ref
.progress
;
5786 var reset
= ref
.reset
;
5787 var transition
= ref
.transition
;
5789 var styles
= ['overflow', 'transform', 'transform-origin', 'opacity'];
5790 for (var i
= 0; i
< animatableNavEls
.length
; i
+= 1) {
5791 var el
= animatableNavEls
[i
];
5793 if (transition
=== true) { el
.el
.classList
.add('navbar-page-transitioning'); }
5794 if (transition
=== false) { el
.el
.classList
.remove('navbar-page-transitioning'); }
5795 for (var j
= 0; j
< styles
.length
; j
+= 1) {
5796 var styleProp
= styles
[j
];
5797 if (el
[styleProp
]) {
5799 el
.el
.style
[styleProp
] = '';
5800 } else if (typeof el
[styleProp
] === 'function') {
5801 el
.el
.style
[styleProp
] = el
[styleProp
](progress
);
5803 el
.el
.style
[styleProp
] = el
[styleProp
];
5811 function handleTouchStart(e
) {
5812 var swipeBackEnabled
= params
[((app
.theme
) + "SwipeBack")];
5813 if (!allowViewTouchMove
|| !swipeBackEnabled
|| isTouched
|| (app
.swipeout
&& app
.swipeout
.el
) || !router
.allowPageChange
) { return; }
5814 if ($(e
.target
).closest('.range-slider, .calendar-months').length
> 0) { return; }
5815 if ($(e
.target
).closest('.page-master, .page-master-detail').length
> 0 && params
.masterDetailBreakpoint
> 0 && app
.width
>= params
.masterDetailBreakpoint
) { return; }
5818 isScrolling
= undefined;
5819 touchesStart
.x
= e
.type
=== 'touchstart' ? e
.targetTouches
[0].pageX
: e
.pageX
;
5820 touchesStart
.y
= e
.type
=== 'touchstart' ? e
.targetTouches
[0].pageY
: e
.pageY
;
5821 touchStartTime
= Utils
.now();
5822 dynamicNavbar
= router
.dynamicNavbar
;
5823 separateNavbar
= router
.separateNavbar
;
5825 function handleTouchMove(e
) {
5826 if (!isTouched
) { return; }
5827 var pageX
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageX
: e
.pageX
;
5828 var pageY
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageY
: e
.pageY
;
5829 if (typeof isScrolling
=== 'undefined') {
5830 isScrolling
= !!(isScrolling
|| Math
.abs(pageY
- touchesStart
.y
) > Math
.abs(pageX
- touchesStart
.x
)) || (pageX
< touchesStart
.x
&& !app
.rtl
) || (pageX
> touchesStart
.x
&& app
.rtl
);
5832 if (isScrolling
|| e
.f7PreventSwipeBack
|| app
.preventSwipeBack
) {
5837 // Calc values during first move fired
5839 var target
= $(e
.target
);
5841 var swipeout
= target
.closest('.swipeout');
5842 if (swipeout
.length
> 0) {
5843 if (!app
.rtl
&& swipeout
.find('.swipeout-actions-left').length
> 0) { cancel
= true; }
5844 if (app
.rtl
&& swipeout
.find('.swipeout-actions-right').length
> 0) { cancel
= true; }
5847 currentPage
= target
.closest('.page');
5848 if (currentPage
.hasClass('no-swipeback') || target
.closest('.no-swipeback, .card-opened').length
> 0) { cancel
= true; }
5849 previousPage
= $el
.find('.page-previous:not(.stacked)');
5851 var notFromBorder
= touchesStart
.x
- $el
.offset().left
> paramsSwipeBackActiveArea
;
5852 viewContainerWidth
= $el
.width();
5854 notFromBorder
= touchesStart
.x
< ($el
.offset().left
- $el
[0].scrollLeft
) + (viewContainerWidth
- paramsSwipeBackActiveArea
);
5856 notFromBorder
= touchesStart
.x
- $el
.offset().left
> paramsSwipeBackActiveArea
;
5858 if (notFromBorder
) { cancel
= true; }
5859 if (previousPage
.length
=== 0 || currentPage
.length
=== 0) { cancel
= true; }
5865 if (paramsSwipeBackAnimateShadow
) {
5866 pageShadow
= currentPage
.find('.page-shadow-effect');
5867 if (pageShadow
.length
=== 0) {
5868 pageShadow
= $('<div class="page-shadow-effect"></div>');
5869 currentPage
.append(pageShadow
);
5872 if (paramsSwipeBackAnimateOpacity
) {
5873 pageOpacity
= previousPage
.find('.page-opacity-effect');
5874 if (pageOpacity
.length
=== 0) {
5875 pageOpacity
= $('<div class="page-opacity-effect"></div>');
5876 previousPage
.append(pageOpacity
);
5880 if (dynamicNavbar
) {
5881 if (separateNavbar
) {
5882 $currentNavbarInner
= $navbarEl
.find('.navbar-current:not(.stacked)');
5883 $previousNavbarInner
= $navbarEl
.find('.navbar-previous:not(.stacked)');
5885 $currentNavbarInner
= currentPage
.children('.navbar').children('.navbar-inner');
5886 $previousNavbarInner
= previousPage
.children('.navbar').children('.navbar-inner');
5889 animatableNavEls
= animatableNavElements($previousNavbarInner
, $currentNavbarInner
);
5892 // Close/Hide Any Picker
5893 if ($('.sheet.modal-in').length
> 0 && app
.sheet
) {
5894 app
.sheet
.close($('.sheet.modal-in'));
5897 e
.f7PreventPanelSwipe
= true;
5899 app
.preventSwipePanelBySwipeBack
= true;
5903 var inverter
= app
.rtl
? -1 : 1;
5906 touchesDiff
= (pageX
- touchesStart
.x
- paramsSwipeBackThreshold
) * inverter
;
5907 if (touchesDiff
< 0) { touchesDiff
= 0; }
5908 var percentage
= Math
.min(Math
.max(touchesDiff
/ viewContainerWidth
, 0), 1);
5910 // Swipe Back Callback
5911 var callbackData
= {
5912 percentage
: percentage
,
5913 progress
: percentage
,
5914 currentPageEl
: currentPage
[0],
5915 previousPageEl
: previousPage
[0],
5916 currentNavbarEl
: $currentNavbarInner
[0],
5917 previousNavbarEl
: $previousNavbarInner
[0],
5919 $el
.trigger('swipeback:move', callbackData
);
5920 router
.emit('swipebackMove', callbackData
);
5923 var currentPageTranslate
= touchesDiff
* inverter
;
5924 var previousPageTranslate
= ((touchesDiff
/ 5) - (viewContainerWidth
/ 5)) * inverter
;
5926 currentPageTranslate
= Math
.min(currentPageTranslate
, viewContainerWidth
);
5927 previousPageTranslate
= Math
.min(previousPageTranslate
, 0);
5929 currentPageTranslate
= Math
.max(currentPageTranslate
, -viewContainerWidth
);
5930 previousPageTranslate
= Math
.max(previousPageTranslate
, 0);
5932 if (Device
.pixelRatio
=== 1) {
5933 currentPageTranslate
= Math
.round(currentPageTranslate
);
5934 previousPageTranslate
= Math
.round(previousPageTranslate
);
5937 router
.swipeBackActive
= true;
5938 $([currentPage
[0], previousPage
[0]]).addClass('page-swipeback-active');
5940 currentPage
.transform(("translate3d(" + currentPageTranslate
+ "px,0,0)"));
5941 if (paramsSwipeBackAnimateShadow
) { pageShadow
[0].style
.opacity
= 1 - (1 * percentage
); }
5943 if (app
.theme
!== 'md') {
5944 previousPage
.transform(("translate3d(" + previousPageTranslate
+ "px,0,0)"));
5946 if (paramsSwipeBackAnimateOpacity
) { pageOpacity
[0].style
.opacity
= 1 - (1 * percentage
); }
5948 // Dynamic Navbars Animation
5949 if (!dynamicNavbar
) { return; }
5951 setAnimatableNavElements({ progress
: percentage
});
5953 function handleTouchEnd() {
5954 app
.preventSwipePanelBySwipeBack
= false;
5955 if (!isTouched
|| !isMoved
) {
5962 router
.swipeBackActive
= false;
5963 $([currentPage
[0], previousPage
[0]]).removeClass('page-swipeback-active');
5964 if (touchesDiff
=== 0) {
5965 $([currentPage
[0], previousPage
[0]]).transform('');
5966 if (pageShadow
&& pageShadow
.length
> 0) { pageShadow
.remove(); }
5967 if (pageOpacity
&& pageOpacity
.length
> 0) { pageOpacity
.remove(); }
5968 if (dynamicNavbar
) {
5969 setAnimatableNavElements({ reset
: true });
5973 var timeDiff
= Utils
.now() - touchStartTime
;
5974 var pageChanged
= false;
5975 // Swipe back to previous page
5977 (timeDiff
< 300 && touchesDiff
> 10)
5978 || (timeDiff
>= 300 && touchesDiff
> viewContainerWidth
/ 2)
5980 currentPage
.removeClass('page-current').addClass(("page-next" + (app
.theme
=== 'md' ? ' page-next-on-right' : '')));
5981 previousPage
.removeClass('page-previous').addClass('page-current').removeAttr('aria-hidden');
5982 if (pageShadow
) { pageShadow
[0].style
.opacity
= ''; }
5983 if (pageOpacity
) { pageOpacity
[0].style
.opacity
= ''; }
5984 if (dynamicNavbar
) {
5985 $currentNavbarInner
.removeClass('navbar-current').addClass('navbar-next');
5986 $previousNavbarInner
.removeClass('navbar-previous').addClass('navbar-current').removeAttr('aria-hidden');
5990 // Reset custom styles
5991 // Add transitioning class for transition-duration
5992 $([currentPage
[0], previousPage
[0]]).addClass('page-transitioning page-transitioning-swipeback').transform('');
5994 if (dynamicNavbar
) {
5995 setAnimatableNavElements({ progress
: pageChanged
? 1 : 0, transition
: true });
5997 allowViewTouchMove
= false;
5998 router
.allowPageChange
= false;
6000 // Swipe Back Callback
6001 var callbackData
= {
6002 currentPageEl
: currentPage
[0],
6003 previousPageEl
: previousPage
[0],
6004 currentNavbarEl
: $currentNavbarInner
[0],
6005 previousNavbarEl
: $previousNavbarInner
[0],
6010 router
.currentRoute
= previousPage
[0].f7Page
.route
;
6011 router
.currentPage
= previousPage
[0];
6013 // Page before animation callback
6014 router
.pageCallback('beforeOut', currentPage
, $currentNavbarInner
, 'current', 'next', { route
: currentPage
[0].f7Page
.route
, swipeBack
: true });
6015 router
.pageCallback('beforeIn', previousPage
, $previousNavbarInner
, 'previous', 'current', { route
: previousPage
[0].f7Page
.route
, swipeBack
: true });
6017 $el
.trigger('swipeback:beforechange', callbackData
);
6018 router
.emit('swipebackBeforeChange', callbackData
);
6020 $el
.trigger('swipeback:beforereset', callbackData
);
6021 router
.emit('swipebackBeforeReset', callbackData
);
6024 currentPage
.transitionEnd(function () {
6025 $([currentPage
[0], previousPage
[0]]).removeClass('page-transitioning page-transitioning-swipeback');
6026 if (dynamicNavbar
) {
6027 setAnimatableNavElements({ reset
: true, transition
: false });
6029 allowViewTouchMove
= true;
6030 router
.allowPageChange
= true;
6033 if (router
.history
.length
=== 1) {
6034 router
.history
.unshift(router
.url
);
6036 router
.history
.pop();
6037 router
.saveHistory();
6039 // Update push state
6040 if (params
.pushState
) {
6044 // Page after animation callback
6045 router
.pageCallback('afterOut', currentPage
, $currentNavbarInner
, 'current', 'next', { route
: currentPage
[0].f7Page
.route
, swipeBack
: true });
6046 router
.pageCallback('afterIn', previousPage
, $previousNavbarInner
, 'previous', 'current', { route
: previousPage
[0].f7Page
.route
, swipeBack
: true });
6049 if (params
.stackPages
&& router
.initialPages
.indexOf(currentPage
[0]) >= 0) {
6050 currentPage
.addClass('stacked');
6051 if (separateNavbar
) {
6052 $currentNavbarInner
.addClass('stacked');
6055 router
.pageCallback('beforeRemove', currentPage
, $currentNavbarInner
, 'next', { swipeBack
: true });
6056 router
.removePage(currentPage
);
6057 if (separateNavbar
) {
6058 router
.removeNavbar($currentNavbarInner
);
6062 $el
.trigger('swipeback:afterchange', callbackData
);
6063 router
.emit('swipebackAfterChange', callbackData
);
6065 router
.emit('routeChanged', router
.currentRoute
, router
.previousRoute
, router
);
6067 if (params
.preloadPreviousPage
) {
6068 router
.back(router
.history
[router
.history
.length
- 2], { preload
: true });
6071 $el
.trigger('swipeback:afterreset', callbackData
);
6072 router
.emit('swipebackAfterReset', callbackData
);
6074 if (pageShadow
&& pageShadow
.length
> 0) { pageShadow
.remove(); }
6075 if (pageOpacity
&& pageOpacity
.length
> 0) { pageOpacity
.remove(); }
6079 function attachEvents() {
6080 var passiveListener
= (app
.touchEvents
.start
=== 'touchstart' && Support
.passiveListener
) ? { passive
: true, capture
: false } : false;
6081 $el
.on(app
.touchEvents
.start
, handleTouchStart
, passiveListener
);
6082 app
.on('touchmove:active', handleTouchMove
);
6083 app
.on('touchend:passive', handleTouchEnd
);
6085 function detachEvents() {
6086 var passiveListener
= (app
.touchEvents
.start
=== 'touchstart' && Support
.passiveListener
) ? { passive
: true, capture
: false } : false;
6087 $el
.off(app
.touchEvents
.start
, handleTouchStart
, passiveListener
);
6088 app
.off('touchmove:active', handleTouchMove
);
6089 app
.off('touchend:passive', handleTouchEnd
);
6094 router
.on('routerDestroy', detachEvents
);
6097 function redirect (direction
, route
, options
) {
6099 var redirect
= route
.route
.redirect
;
6100 if (options
.initial
&& router
.params
.pushState
) {
6101 options
.replaceState
= true; // eslint-disable-line
6102 options
.history
= true; // eslint-disable-line
6104 function redirectResolve(redirectUrl
, redirectOptions
) {
6105 if ( redirectOptions
=== void 0 ) redirectOptions
= {};
6107 router
.allowPageChange
= true;
6108 router
[direction
](redirectUrl
, Utils
.extend({}, options
, redirectOptions
));
6110 function redirectReject() {
6111 router
.allowPageChange
= true;
6113 if (typeof redirect
=== 'function') {
6114 router
.allowPageChange
= false;
6115 var redirectUrl
= redirect
.call(router
, route
, redirectResolve
, redirectReject
);
6116 if (redirectUrl
&& typeof redirectUrl
=== 'string') {
6117 router
.allowPageChange
= true;
6118 return router
[direction
](redirectUrl
, options
);
6122 return router
[direction
](redirect
, options
);
6125 function processQueue(router
, routerQueue
, routeQueue
, to
, from, resolve
, reject
) {
6128 if (Array
.isArray(routeQueue
)) {
6129 queue
.push
.apply(queue
, routeQueue
);
6130 } else if (routeQueue
&& typeof routeQueue
=== 'function') {
6131 queue
.push(routeQueue
);
6134 if (Array
.isArray(routerQueue
)) {
6135 queue
.push
.apply(queue
, routerQueue
);
6137 queue
.push(routerQueue
);
6142 if (queue
.length
=== 0) {
6146 var queueItem
= queue
.shift();
6163 function processRouteQueue (to
, from, resolve
, reject
) {
6165 function enterNextRoute() {
6166 if (to
&& to
.route
&& (router
.params
.routesBeforeEnter
|| to
.route
.beforeEnter
)) {
6167 router
.allowPageChange
= false;
6170 router
.params
.routesBeforeEnter
,
6171 to
.route
.beforeEnter
,
6175 router
.allowPageChange
= true;
6186 function leaveCurrentRoute() {
6187 if (from && from.route
&& (router
.params
.routesBeforeLeave
|| from.route
.beforeLeave
)) {
6188 router
.allowPageChange
= false;
6191 router
.params
.routesBeforeLeave
,
6192 from.route
.beforeLeave
,
6196 router
.allowPageChange
= true;
6207 leaveCurrentRoute();
6210 function appRouterCheck (router
, method
) {
6212 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
+ "(...)"));
6216 function refreshPage() {
6218 appRouterCheck(router
, 'refreshPage');
6219 return router
.navigate(router
.currentRoute
.url
, {
6221 reloadCurrent
: true,
6225 function forward(el
, forwardOptions
) {
6226 if ( forwardOptions
=== void 0 ) forwardOptions
= {};
6230 var app
= router
.app
;
6231 var view
= router
.view
;
6232 var options
= Utils
.extend(false, {
6233 animate
: router
.params
.animate
,
6235 replaceState
: false,
6237 reloadCurrent
: router
.params
.reloadPages
,
6238 reloadPrevious
: false,
6240 clearPreviousHistory
: false,
6241 reloadDetail
: router
.params
.reloadDetail
,
6245 var masterDetailEnabled
= router
.params
.masterDetailBreakpoint
> 0;
6246 var isMaster
= masterDetailEnabled
&& options
.route
&& options
.route
.route
&& options
.route
.route
.master
=== true;
6248 var otherDetailPageEl
;
6250 var currentRouteIsModal
= router
.currentRoute
.modal
;
6252 if (!currentRouteIsModal
) {
6253 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp
) {
6254 if (router
.currentRoute
&& router
.currentRoute
.route
&& router
.currentRoute
.route
[modalLoadProp
]) {
6255 currentRouteIsModal
= true;
6256 modalType
= modalLoadProp
;
6261 if (currentRouteIsModal
) {
6262 var modalToClose
= router
.currentRoute
.modal
6263 || router
.currentRoute
.route
.modalInstance
6264 || app
[modalType
].get();
6265 var previousUrl
= router
.history
[router
.history
.length
- 2];
6266 var previousRoute
= router
.findMatchingRoute(previousUrl
);
6267 if (!previousRoute
&& previousUrl
) {
6270 path
: previousUrl
.split('?')[0],
6271 query
: Utils
.parseUrlQuery(previousUrl
),
6273 path
: previousUrl
.split('?')[0],
6279 router
.modalRemove(modalToClose
);
6282 var dynamicNavbar
= router
.dynamicNavbar
;
6283 var separateNavbar
= router
.separateNavbar
;
6285 var $viewEl
= router
.$el
;
6287 var reload
= options
.reloadPrevious
|| options
.reloadCurrent
|| options
.reloadAll
;
6291 var $newNavbarInner
;
6292 var $oldNavbarInner
;
6294 router
.allowPageChange
= false;
6295 if ($newPage
.length
=== 0) {
6296 router
.allowPageChange
= true;
6300 if ($newPage
.length
) {
6301 // Remove theme elements
6302 router
.removeThemeElements($newPage
);
6305 if (dynamicNavbar
) {
6306 $newNavbarInner
= $newPage
.children('.navbar').children('.navbar-inner');
6307 if (separateNavbar
) {
6308 $navbarEl
= router
.$navbarEl
;
6309 if ($newNavbarInner
.length
> 0) {
6310 $newPage
.children('.navbar').remove();
6312 if ($newNavbarInner
.length
=== 0 && $newPage
[0] && $newPage
[0].f7Page
) {
6313 // Try from pageData
6314 $newNavbarInner
= $newPage
[0].f7Page
.$navbarEl
;
6319 // Save Keep Alive Cache
6320 if (options
.route
&& options
.route
.route
&& options
.route
.route
.keepAlive
&& !options
.route
.route
.keepAliveData
) {
6321 options
.route
.route
.keepAliveData
= {
6327 var $pagesInView
= $viewEl
6328 .children('.page:not(.stacked)')
6329 .filter(function (index
, pageInView
) { return pageInView
!== $newPage
[0]; });
6333 if (separateNavbar
) {
6334 $navbarsInView
= $navbarEl
6335 .children('.navbar-inner:not(.stacked)')
6336 .filter(function (index
, navbarInView
) { return navbarInView
!== $newNavbarInner
[0]; });
6339 // Exit when reload previous and only 1 page in view so nothing ro reload
6340 if (options
.reloadPrevious
&& $pagesInView
.length
< 2) {
6341 router
.allowPageChange
= true;
6345 // Find Detail' master page
6348 if (masterDetailEnabled
&& !options
.reloadAll
) {
6349 for (var i
= 0; i
< $pagesInView
.length
; i
+= 1) {
6351 && $pagesInView
[i
].classList
.contains('page-master')
6353 masterPageEl
= $pagesInView
[i
];
6354 continue; // eslint-disable-line
6357 isDetail
= !isMaster
&& masterPageEl
;
6360 // Find Other Detail
6362 for (var i
$1 = 0; i
$1 < $pagesInView
.length
; i
$1 += 1) {
6363 if ($pagesInView
[i
$1].classList
.contains('page-master-detail')
6365 otherDetailPageEl
= $pagesInView
[i
$1];
6366 continue; // eslint-disable-line
6371 reloadDetail
= isDetail
&& options
.reloadDetail
&& app
.width
>= router
.params
.masterDetailBreakpoint
&& masterPageEl
;
6375 var newPagePosition
= 'next';
6376 if (options
.reloadCurrent
|| options
.reloadAll
|| reloadDetail
) {
6377 newPagePosition
= 'current';
6378 } else if (options
.reloadPrevious
) {
6379 newPagePosition
= 'previous';
6382 .addClass(("page-" + newPagePosition
+ (isMaster
? ' page-master' : '') + (isDetail
? ' page-master-detail' : '')))
6383 .removeClass('stacked')
6384 .trigger('page:unstack')
6385 .trigger('page:position', { position
: newPagePosition
});
6386 if (isMaster
|| isDetail
) {
6387 $newPage
.trigger('page:role', { role
: isMaster
? 'master' : 'detail' });
6391 if (dynamicNavbar
&& $newNavbarInner
.length
) {
6393 .addClass(("navbar-" + newPagePosition
+ (isMaster
? ' navbar-master' : '') + (isDetail
? ' navbar-master-detail' : '')))
6394 .removeClass('stacked');
6398 if (options
.reloadCurrent
|| reloadDetail
) {
6399 $oldPage
= $pagesInView
.eq($pagesInView
.length
- 1);
6400 if (separateNavbar
) {
6401 // $oldNavbarInner = $navbarsInView.eq($pagesInView.length - 1);
6402 $oldNavbarInner
= $(app
.navbar
.getElByPage($oldPage
));
6404 } else if (options
.reloadPrevious
) {
6405 $oldPage
= $pagesInView
.eq($pagesInView
.length
- 2);
6406 if (separateNavbar
) {
6407 // $oldNavbarInner = $navbarsInView.eq($pagesInView.length - 2);
6408 $oldNavbarInner
= $(app
.navbar
.getElByPage($oldPage
));
6410 } else if (options
.reloadAll
) {
6411 $oldPage
= $pagesInView
.filter(function (index
, pageEl
) { return pageEl
!== $newPage
[0]; });
6412 if (separateNavbar
) {
6413 $oldNavbarInner
= $navbarsInView
.filter(function (index
, navbarEl
) { return navbarEl
!== $newNavbarInner
[0]; });
6416 if ($pagesInView
.length
> 1) {
6418 for (i
$2 = 0; i
$2 < $pagesInView
.length
- 1; i
$2 += 1) {
6420 && $pagesInView
[i
$2] === masterPageEl
6422 $pagesInView
.eq(i
$2).addClass('page-master-stacked');
6423 $pagesInView
.eq(i
$2).trigger('page:masterstack');
6424 if (separateNavbar
) {
6425 $(app
.navbar
.getElByPage(masterPageEl
)).addClass('navbar-master-stacked');
6427 continue; // eslint-disable-line
6429 var oldNavbarInnerEl
= app
.navbar
.getElByPage($pagesInView
.eq(i
$2));
6430 if (router
.params
.stackPages
) {
6431 $pagesInView
.eq(i
$2).addClass('stacked');
6432 $pagesInView
.eq(i
$2).trigger('page:stack');
6433 if (separateNavbar
) {
6434 $(oldNavbarInnerEl
).addClass('stacked');
6437 // Page remove event
6438 router
.pageCallback('beforeRemove', $pagesInView
[i
$2], $navbarsInView
&& $navbarsInView
[i
$2], 'previous', undefined, options
);
6439 router
.removePage($pagesInView
[i
$2]);
6440 if (separateNavbar
&& oldNavbarInnerEl
) {
6441 router
.removeNavbar(oldNavbarInnerEl
);
6447 .children('.page:not(.stacked)')
6448 .filter(function (index
, page
) { return page
!== $newPage
[0]; });
6449 if (separateNavbar
) {
6450 $oldNavbarInner
= $navbarEl
6451 .children('.navbar-inner:not(.stacked)')
6452 .filter(function (index
, navbarInner
) { return navbarInner
!== $newNavbarInner
[0]; });
6456 if (dynamicNavbar
&& !separateNavbar
) {
6457 $oldNavbarInner
= $oldPage
.children('.navbar').children('.navbar-inner');
6459 if (isDetail
&& !options
.reloadAll
) {
6460 if ($oldPage
.length
> 1 || reloadDetail
) {
6461 $oldPage
= $oldPage
.filter(function (pageIndex
, pageEl
) { return !pageEl
.classList
.contains('page-master'); });
6463 if ($oldNavbarInner
&& ($oldNavbarInner
.length
> 1 || reloadDetail
)) {
6464 $oldNavbarInner
= $oldNavbarInner
.filter(function (navbarIndex
, navbarEl
) { return !navbarEl
.classList
.contains('navbar-master'); });
6469 if (router
.params
.pushState
&& (options
.pushState
|| options
.replaceState
) && !options
.reloadPrevious
) {
6470 var pushStateRoot
= router
.params
.pushStateRoot
|| '';
6471 History
[options
.reloadCurrent
|| (reloadDetail
&& otherDetailPageEl
) || options
.reloadAll
|| options
.replaceState
? 'replace' : 'push'](
6474 url
: options
.route
.url
,
6476 pushStateRoot
+ router
.params
.pushStateSeparator
+ options
.route
.url
6480 if (!options
.reloadPrevious
) {
6481 // Current Page & Navbar
6482 router
.currentPageEl
= $newPage
[0];
6483 if (dynamicNavbar
&& $newNavbarInner
.length
) {
6484 router
.currentNavbarEl
= $newNavbarInner
[0];
6486 delete router
.currentNavbarEl
;
6490 router
.currentRoute
= options
.route
;
6493 // Update router history
6494 var url
= options
.route
.url
;
6496 if (options
.history
) {
6497 if (((options
.reloadCurrent
|| (reloadDetail
&& otherDetailPageEl
)) && router
.history
.length
) > 0 || options
.replaceState
) {
6498 router
.history
[router
.history
.length
- (options
.reloadPrevious
? 2 : 1)] = url
;
6499 } else if (options
.reloadPrevious
) {
6500 router
.history
[router
.history
.length
- 2] = url
;
6501 } else if (options
.reloadAll
) {
6502 router
.history
= [url
];
6504 router
.history
.push(url
);
6507 router
.saveHistory();
6509 // Insert new page and navbar
6510 var newPageInDom
= $newPage
.parents(doc
).length
> 0;
6511 var f7Component
= $newPage
[0].f7Component
;
6512 if (options
.reloadPrevious
) {
6513 if (f7Component
&& !newPageInDom
) {
6514 f7Component
.$mount(function (componentEl
) {
6515 $(componentEl
).insertBefore($oldPage
);
6518 $newPage
.insertBefore($oldPage
);
6520 if (separateNavbar
&& $newNavbarInner
.length
) {
6521 if ($newNavbarInner
.children('.title-large').length
) {
6522 $newNavbarInner
.addClass('navbar-inner-large');
6524 if ($oldNavbarInner
.length
) {
6525 $newNavbarInner
.insertBefore($oldNavbarInner
);
6527 if (!router
.$navbarEl
.parents(doc
).length
) {
6528 router
.$el
.prepend(router
.$navbarEl
);
6530 $navbarEl
.append($newNavbarInner
);
6534 if ($oldPage
.next('.page')[0] !== $newPage
[0]) {
6535 if (f7Component
&& !newPageInDom
) {
6536 f7Component
.$mount(function (componentEl
) {
6537 $viewEl
.append(componentEl
);
6540 $viewEl
.append($newPage
[0]);
6543 if (separateNavbar
&& $newNavbarInner
.length
) {
6544 if ($newNavbarInner
.children('.title-large').length
) {
6545 $newNavbarInner
.addClass('navbar-inner-large');
6547 if (!router
.$navbarEl
.parents(doc
).length
) {
6548 router
.$el
.prepend(router
.$navbarEl
);
6550 $navbarEl
.append($newNavbarInner
[0]);
6553 if (!newPageInDom
) {
6554 router
.pageCallback('mounted', $newPage
, $newNavbarInner
, newPagePosition
, reload
? newPagePosition
: 'current', options
, $oldPage
);
6555 } else if (options
.route
&& options
.route
.route
&& options
.route
.route
.keepAlive
&& !$newPage
[0].f7PageMounted
) {
6556 $newPage
[0].f7PageMounted
= true;
6557 router
.pageCallback('mounted', $newPage
, $newNavbarInner
, newPagePosition
, reload
? newPagePosition
: 'current', options
, $oldPage
);
6561 if ((options
.reloadCurrent
|| reloadDetail
) && $oldPage
.length
> 0) {
6562 if (router
.params
.stackPages
&& router
.initialPages
.indexOf($oldPage
[0]) >= 0) {
6563 $oldPage
.addClass('stacked');
6564 $oldPage
.trigger('page:stack');
6565 if (separateNavbar
) {
6566 $oldNavbarInner
.addClass('stacked');
6569 // Page remove event
6570 router
.pageCallback('beforeRemove', $oldPage
, $oldNavbarInner
, 'previous', undefined, options
);
6571 router
.removePage($oldPage
);
6572 if (separateNavbar
&& $oldNavbarInner
&& $oldNavbarInner
.length
) {
6573 router
.removeNavbar($oldNavbarInner
);
6576 } else if (options
.reloadAll
) {
6577 $oldPage
.each(function (index
, pageEl
) {
6578 var $oldPageEl
= $(pageEl
);
6579 var $oldNavbarInnerEl
= $(app
.navbar
.getElByPage($oldPageEl
));
6580 if (router
.params
.stackPages
&& router
.initialPages
.indexOf($oldPageEl
[0]) >= 0) {
6581 $oldPageEl
.addClass('stacked');
6582 $oldPageEl
.trigger('page:stack');
6583 if (separateNavbar
) {
6584 $oldNavbarInnerEl
.addClass('stacked');
6587 // Page remove event
6588 router
.pageCallback('beforeRemove', $oldPageEl
, $oldNavbarInner
&& $oldNavbarInner
.eq(index
), 'previous', undefined, options
);
6589 router
.removePage($oldPageEl
);
6590 if (separateNavbar
&& $oldNavbarInnerEl
.length
) {
6591 router
.removeNavbar($oldNavbarInnerEl
);
6595 } else if (options
.reloadPrevious
) {
6596 if (router
.params
.stackPages
&& router
.initialPages
.indexOf($oldPage
[0]) >= 0) {
6597 $oldPage
.addClass('stacked');
6598 $oldPage
.trigger('page:stack');
6599 if (separateNavbar
) {
6600 $oldNavbarInner
.addClass('stacked');
6603 // Page remove event
6604 router
.pageCallback('beforeRemove', $oldPage
, $oldNavbarInner
, 'previous', undefined, options
);
6605 router
.removePage($oldPage
);
6606 if (separateNavbar
&& $oldNavbarInner
&& $oldNavbarInner
.length
) {
6607 router
.removeNavbar($oldNavbarInner
);
6613 if (options
.route
.route
.tab
) {
6614 router
.tabLoad(options
.route
.route
.tab
, Utils
.extend({}, options
, {
6620 // Page init and before init events
6621 router
.pageCallback('init', $newPage
, $newNavbarInner
, newPagePosition
, reload
? newPagePosition
: 'current', options
, $oldPage
);
6623 if (options
.reloadCurrent
|| options
.reloadAll
|| reloadDetail
) {
6624 router
.allowPageChange
= true;
6625 router
.pageCallback('beforeIn', $newPage
, $newNavbarInner
, newPagePosition
, 'current', options
);
6626 router
.pageCallback('afterIn', $newPage
, $newNavbarInner
, newPagePosition
, 'current', options
);
6627 if (options
.reloadCurrent
&& options
.clearPreviousHistory
) { router
.clearPreviousHistory(); }
6629 masterPageEl
.classList
.add('page-previous');
6630 masterPageEl
.classList
.remove('page-current');
6631 $(masterPageEl
).trigger('page:position', { position
: 'previous' });
6632 if (masterPageEl
.f7Page
&& masterPageEl
.f7Page
.navbarEl
) {
6633 masterPageEl
.f7Page
.navbarEl
.classList
.add('navbar-previous');
6634 masterPageEl
.f7Page
.navbarEl
.classList
.remove('navbar-current');
6639 if (options
.reloadPrevious
) {
6640 router
.allowPageChange
= true;
6644 // Before animation event
6645 router
.pageCallback('beforeIn', $newPage
, $newNavbarInner
, 'next', 'current', options
);
6646 router
.pageCallback('beforeOut', $oldPage
, $oldNavbarInner
, 'current', 'previous', options
);
6649 function afterAnimation() {
6650 var pageClasses
= 'page-previous page-current page-next';
6651 var navbarClasses
= 'navbar-previous navbar-current navbar-next';
6652 $newPage
.removeClass(pageClasses
).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position
: 'current' });
6653 $oldPage
.removeClass(pageClasses
).addClass('page-previous').trigger('page:position', { position
: 'previous' });
6654 if (!$oldPage
.hasClass('page-master')) {
6655 $oldPage
.attr('aria-hidden', 'true');
6657 if (dynamicNavbar
) {
6658 $newNavbarInner
.removeClass(navbarClasses
).addClass('navbar-current').removeAttr('aria-hidden');
6659 $oldNavbarInner
.removeClass(navbarClasses
).addClass('navbar-previous');
6660 if (!$oldNavbarInner
.hasClass('navbar-master')) {
6661 $oldNavbarInner
.attr('aria-hidden', 'true');
6664 // After animation event
6665 router
.allowPageChange
= true;
6666 router
.pageCallback('afterIn', $newPage
, $newNavbarInner
, 'next', 'current', options
);
6667 router
.pageCallback('afterOut', $oldPage
, $oldNavbarInner
, 'current', 'previous', options
);
6669 var keepOldPage
= (router
.params
.preloadPreviousPage
|| (app
.theme
=== 'ios' ? router
.params
.iosSwipeBack
: router
.params
.mdSwipeBack
)) && !isMaster
;
6671 if ($newPage
.hasClass('smart-select-page') || $newPage
.hasClass('photo-browser-page') || $newPage
.hasClass('autocomplete-page')) {
6676 if (router
.params
.stackPages
) {
6677 $oldPage
.addClass('stacked');
6678 $oldPage
.trigger('page:stack');
6679 if (separateNavbar
) {
6680 $oldNavbarInner
.addClass('stacked');
6682 } else if (!($newPage
.attr('data-name') && $newPage
.attr('data-name') === 'smart-select-page')) {
6684 router
.pageCallback('beforeRemove', $oldPage
, $oldNavbarInner
, 'previous', undefined, options
);
6685 router
.removePage($oldPage
);
6686 if (separateNavbar
&& $oldNavbarInner
.length
) {
6687 router
.removeNavbar($oldNavbarInner
);
6691 if (options
.clearPreviousHistory
) { router
.clearPreviousHistory(); }
6692 router
.emit('routeChanged', router
.currentRoute
, router
.previousRoute
, router
);
6694 if (router
.params
.pushState
) {
6695 History
.clearRouterQueue();
6698 function setPositionClasses() {
6699 var pageClasses
= 'page-previous page-current page-next';
6700 var navbarClasses
= 'navbar-previous navbar-current navbar-next';
6701 $oldPage
.removeClass(pageClasses
).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position
: 'current' });
6702 $newPage
.removeClass(pageClasses
).addClass('page-next').removeAttr('aria-hidden').trigger('page:position', { position
: 'next' });
6703 if (dynamicNavbar
) {
6704 $oldNavbarInner
.removeClass(navbarClasses
).addClass('navbar-current').removeAttr('aria-hidden');
6705 $newNavbarInner
.removeClass(navbarClasses
).addClass('navbar-next').removeAttr('aria-hidden');
6708 if (options
.animate
&& !(isMaster
&& app
.width
>= router
.params
.masterDetailBreakpoint
)) {
6709 var delay
= router
.app
.theme
=== 'md' ? router
.params
.mdPageLoadDelay
: router
.params
.iosPageLoadDelay
;
6711 setTimeout(function () {
6712 setPositionClasses();
6713 router
.animate($oldPage
, $newPage
, $oldNavbarInner
, $newNavbarInner
, 'forward', function () {
6718 setPositionClasses();
6719 router
.animate($oldPage
, $newPage
, $oldNavbarInner
, $newNavbarInner
, 'forward', function () {
6728 function load(loadParams
, loadOptions
, ignorePageChange
) {
6729 if ( loadParams
=== void 0 ) loadParams
= {};
6730 if ( loadOptions
=== void 0 ) loadOptions
= {};
6733 if (!router
.allowPageChange
&& !ignorePageChange
) { return router
; }
6734 var params
= loadParams
;
6735 var options
= loadOptions
;
6736 var url
= params
.url
;
6737 var content
= params
.content
;
6739 var pageName
= params
.pageName
;
6740 var template
= params
.template
;
6741 var templateUrl
= params
.templateUrl
;
6742 var component
= params
.component
;
6743 var componentUrl
= params
.componentUrl
;
6745 if (!options
.reloadCurrent
6747 && options
.route
.route
6748 && options
.route
.route
.parentPath
6749 && router
.currentRoute
.route
6750 && router
.currentRoute
.route
.parentPath
=== options
.route
.route
.parentPath
) {
6751 // Do something nested
6752 if (options
.route
.url
=== router
.url
) {
6753 router
.allowPageChange
= true;
6756 // Check for same params
6757 var sameParams
= Object
.keys(options
.route
.params
).length
=== Object
.keys(router
.currentRoute
.params
).length
;
6759 // Check for equal params name
6760 Object
.keys(options
.route
.params
).forEach(function (paramName
) {
6762 !(paramName
in router
.currentRoute
.params
)
6763 || (router
.currentRoute
.params
[paramName
] !== options
.route
.params
[paramName
])
6770 if (options
.route
.route
.tab
) {
6771 return router
.tabLoad(options
.route
.route
.tab
, options
);
6776 && options
.route
.route
.tab
6777 && router
.currentRoute
.route
.tab
6778 && router
.currentRoute
.parentPath
=== options
.route
.parentPath
6780 return router
.tabLoad(options
.route
.route
.tab
, options
);
6786 && options
.route
.url
6787 && router
.url
=== options
.route
.url
6788 && !(options
.reloadCurrent
|| options
.reloadPrevious
)
6789 && !router
.params
.allowDuplicateUrls
6791 router
.allowPageChange
= true;
6795 if (!options
.route
&& url
) {
6796 options
.route
= router
.parseRouteUrl(url
);
6797 Utils
.extend(options
.route
, { route
: { url
: url
, path
: url
} });
6800 // Component Callbacks
6801 function resolve(pageEl
, newOptions
) {
6802 return router
.forward(pageEl
, Utils
.extend(options
, newOptions
));
6805 router
.allowPageChange
= true;
6809 if (url
|| templateUrl
|| componentUrl
) {
6810 router
.allowPageChange
= false;
6815 router
.forward(router
.getPageEl(content
), options
);
6816 } else if (template
|| templateUrl
) {
6817 // Parse template and send page element
6819 router
.pageTemplateLoader(template
, templateUrl
, options
, resolve
, reject
);
6821 router
.allowPageChange
= true;
6825 // Load page from specified HTMLElement or by page name in pages container
6826 router
.forward(router
.getPageEl(el
), options
);
6827 } else if (pageName
) {
6828 // Load page by page name in pages container
6829 router
.forward(router
.$el
.children((".page[data-name=\"" + pageName
+ "\"]")).eq(0), options
);
6830 } else if (component
|| componentUrl
) {
6831 // Load from component (F7/Vue/React/...)
6833 router
.pageComponentLoader(router
.el
, component
, componentUrl
, options
, resolve
, reject
);
6835 router
.allowPageChange
= true;
6844 router
.xhrRequest(url
, options
)
6845 .then(function (pageContent
) {
6846 router
.forward(router
.getPageEl(pageContent
), options
);
6848 .catch(function () {
6849 router
.allowPageChange
= true;
6854 function navigate(navigateParams
, navigateOptions
) {
6855 if ( navigateOptions
=== void 0 ) navigateOptions
= {};
6858 if (router
.swipeBackActive
) { return router
; }
6865 if (typeof navigateParams
=== 'string') {
6866 url
= navigateParams
;
6868 url
= navigateParams
.url
;
6869 createRoute
= navigateParams
.route
;
6870 name
= navigateParams
.name
;
6871 query
= navigateParams
.query
;
6872 params
= navigateParams
.params
;
6875 // find route by name
6876 route
= router
.findRouteByKey('name', name
);
6878 throw new Error(("Framework7: route with name \"" + name
+ "\" not found"));
6880 url
= router
.constructRouteUrl(route
, { params
: params
, query
: query
});
6882 return router
.navigate(url
, navigateOptions
);
6884 throw new Error(("Framework7: can't construct URL for route with name \"" + name
+ "\""));
6886 var app
= router
.app
;
6887 appRouterCheck(router
, 'navigate');
6888 if (url
=== '#' || url
=== '') {
6892 var navigateUrl
= url
.replace('./', '');
6893 if (navigateUrl
[0] !== '/' && navigateUrl
.indexOf('#') !== 0) {
6894 var currentPath
= router
.currentRoute
.parentPath
|| router
.currentRoute
.path
;
6895 navigateUrl
= ((currentPath
? (currentPath
+ "/") : '/') + navigateUrl
)
6896 .replace('///', '/')
6897 .replace('//', '/');
6900 route
= Utils
.extend(router
.parseRouteUrl(navigateUrl
), {
6901 route
: Utils
.extend({}, createRoute
),
6904 route
= router
.findMatchingRoute(navigateUrl
);
6911 if (route
.route
.redirect
) {
6912 return redirect
.call(router
, 'navigate', route
, navigateOptions
);
6917 if (route
.route
.options
) {
6918 Utils
.extend(options
, route
.route
.options
, navigateOptions
);
6920 Utils
.extend(options
, navigateOptions
);
6922 options
.route
= route
;
6924 if (options
&& options
.context
) {
6925 route
.context
= options
.context
;
6926 options
.route
.context
= options
.context
;
6929 function resolve() {
6930 var routerLoaded
= false;
6931 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp
) {
6932 if (route
.route
[modalLoadProp
] && !routerLoaded
) {
6933 routerLoaded
= true;
6934 router
.modalLoad(modalLoadProp
, route
, options
);
6937 if (route
.route
.keepAlive
&& route
.route
.keepAliveData
) {
6938 router
.load({ el
: route
.route
.keepAliveData
.pageEl
}, options
, false);
6939 routerLoaded
= true;
6941 ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp
) {
6944 if (route
.route
[pageLoadProp
] && !routerLoaded
) {
6945 routerLoaded
= true;
6946 router
.load(( obj
= {}, obj
[pageLoadProp
] = route
.route
[pageLoadProp
], obj
), options
, false);
6949 if (routerLoaded
) { return; }
6951 function asyncResolve(resolveParams
, resolveOptions
) {
6952 router
.allowPageChange
= false;
6953 var resolvedAsModal
= false;
6954 if (resolveOptions
&& resolveOptions
.context
) {
6955 if (!route
.context
) { route
.context
= resolveOptions
.context
; }
6956 else { route
.context
= Utils
.extend({}, route
.context
, resolveOptions
.context
); }
6957 options
.route
.context
= route
.context
;
6959 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp
) {
6960 if (resolveParams
[modalLoadProp
]) {
6961 resolvedAsModal
= true;
6962 var modalRoute
= Utils
.extend({}, route
, { route
: resolveParams
});
6963 router
.allowPageChange
= true;
6964 router
.modalLoad(modalLoadProp
, modalRoute
, Utils
.extend(options
, resolveOptions
));
6967 if (resolvedAsModal
) { return; }
6968 router
.load(resolveParams
, Utils
.extend(options
, resolveOptions
), true);
6970 function asyncReject() {
6971 router
.allowPageChange
= true;
6973 if (route
.route
.async
) {
6974 router
.allowPageChange
= false;
6976 route
.route
.async
.call(router
, options
.route
, router
.currentRoute
, asyncResolve
, asyncReject
);
6980 router
.allowPageChange
= true;
6983 if (router
.params
.masterDetailBreakpoint
> 0 && route
.route
.masterRoute
) {
6984 // load detail route
6985 var preloadMaster
= true;
6986 if (router
.currentRoute
&& router
.currentRoute
.route
) {
6987 if (router
.currentRoute
.route
.master
&& (router
.currentRoute
.route
=== route
.route
.masterRoute
|| router
.currentRoute
.route
.path
=== route
.route
.masterRoute
.path
)) {
6988 preloadMaster
= false;
6990 if (router
.currentRoute
.route
.masterRoute
&& ((router
.currentRoute
.route
.masterRoute
=== route
.route
.masterRoute
) || (router
.currentRoute
.route
.masterRoute
.path
=== route
.route
.masterRoute
.path
))) {
6991 preloadMaster
= false;
6994 if (preloadMaster
) {
6995 router
.navigate(route
.route
.masterRoute
.path
, {
6997 reloadAll
: navigateOptions
.reloadAll
,
6998 reloadCurrent
: navigateOptions
.reloadCurrent
,
6999 reloadPrevious
: navigateOptions
.reloadPrevious
,
7001 pageAfterIn
: function pageAfterIn() {
7002 router
.navigate(navigateParams
, Utils
.extend({}, navigateOptions
, {
7005 reloadCurrent
: false,
7006 reloadPrevious
: false,
7015 processRouteQueue
.call(
7018 router
.currentRoute
,
7020 if (route
.route
.modules
) {
7022 .loadModules(Array
.isArray(route
.route
.modules
) ? route
.route
.modules
: [route
.route
.modules
])
7026 .catch(function () {
7042 function tabLoad(tabRoute
, loadOptions
) {
7043 if ( loadOptions
=== void 0 ) loadOptions
= {};
7046 var options
= Utils
.extend({
7047 animate
: router
.params
.animate
,
7057 if (options
.route
) {
7059 if (!options
.preload
&& options
.route
!== router
.currentRoute
) {
7060 previousRoute
= router
.previousRoute
;
7061 router
.currentRoute
= options
.route
;
7063 if (options
.preload
) {
7064 currentRoute
= options
.route
;
7065 previousRoute
= router
.currentRoute
;
7067 currentRoute
= router
.currentRoute
;
7068 if (!previousRoute
) { previousRoute
= router
.previousRoute
; }
7071 // Update Browser History
7072 if (router
.params
.pushState
&& options
.pushState
&& !options
.reloadPrevious
) {
7076 url
: options
.route
.url
,
7078 (router
.params
.pushStateRoot
|| '') + router
.params
.pushStateSeparator
+ options
.route
.url
7082 // Update Router History
7083 if (options
.history
) {
7084 router
.history
[Math
.max(router
.history
.length
- 1, 0)] = options
.route
.url
;
7085 router
.saveHistory();
7090 var $parentPageEl
= $(options
.parentPageEl
|| router
.currentPageEl
);
7092 if ($parentPageEl
.length
&& $parentPageEl
.find(("#" + (tabRoute
.id
))).length
) {
7093 tabEl
= $parentPageEl
.find(("#" + (tabRoute
.id
))).eq(0);
7094 } else if (router
.view
.selector
) {
7095 tabEl
= (router
.view
.selector
) + " #" + (tabRoute
.id
);
7097 tabEl
= "#" + (tabRoute
.id
);
7099 var tabShowResult
= router
.app
.tab
.show({
7101 animate
: options
.animate
,
7102 tabRoute
: options
.route
,
7105 var $newTabEl
= tabShowResult
.$newTabEl
;
7106 var $oldTabEl
= tabShowResult
.$oldTabEl
;
7107 var animated
= tabShowResult
.animated
;
7108 var onTabsChanged
= tabShowResult
.onTabsChanged
;
7110 if ($newTabEl
&& $newTabEl
.parents('.page').length
> 0 && options
.route
) {
7111 var tabParentPageData
= $newTabEl
.parents('.page')[0].f7Page
;
7112 if (tabParentPageData
&& options
.route
) {
7113 tabParentPageData
.route
= options
.route
;
7117 // Tab Content Loaded
7118 function onTabLoaded(contentEl
) {
7119 // Remove theme elements
7120 router
.removeThemeElements($newTabEl
);
7122 var tabEventTarget
= $newTabEl
;
7123 if (typeof contentEl
!== 'string') { tabEventTarget
= $(contentEl
); }
7125 tabEventTarget
.trigger('tab:init tab:mounted', tabRoute
);
7126 router
.emit('tabInit tabMounted', $newTabEl
[0], tabRoute
);
7128 if ($oldTabEl
&& $oldTabEl
.length
) {
7130 onTabsChanged(function () {
7131 router
.emit('routeChanged', router
.currentRoute
, router
.previousRoute
, router
);
7132 if (router
.params
.unloadTabContent
) {
7133 router
.tabRemove($oldTabEl
, $newTabEl
, tabRoute
);
7137 router
.emit('routeChanged', router
.currentRoute
, router
.previousRoute
, router
);
7138 if (router
.params
.unloadTabContent
) {
7139 router
.tabRemove($oldTabEl
, $newTabEl
, tabRoute
);
7145 if ($newTabEl
[0].f7RouterTabLoaded
) {
7146 if (!$oldTabEl
|| !$oldTabEl
.length
) { return router
; }
7148 onTabsChanged(function () {
7149 router
.emit('routeChanged', router
.currentRoute
, router
.previousRoute
, router
);
7152 router
.emit('routeChanged', router
.currentRoute
, router
.previousRoute
, router
);
7158 function loadTab(loadTabParams
, loadTabOptions
) {
7160 var url
= loadTabParams
.url
;
7161 var content
= loadTabParams
.content
;
7162 var el
= loadTabParams
.el
;
7163 var template
= loadTabParams
.template
;
7164 var templateUrl
= loadTabParams
.templateUrl
;
7165 var component
= loadTabParams
.component
;
7166 var componentUrl
= loadTabParams
.componentUrl
;
7167 // Component/Template Callbacks
7168 function resolve(contentEl
) {
7169 router
.allowPageChange
= true;
7170 if (!contentEl
) { return; }
7171 if (typeof contentEl
=== 'string') {
7172 $newTabEl
.html(contentEl
);
7175 if (contentEl
.f7Component
) {
7176 contentEl
.f7Component
.$mount(function (componentEl
) {
7177 $newTabEl
.append(componentEl
);
7180 $newTabEl
.append(contentEl
);
7183 $newTabEl
[0].f7RouterTabLoaded
= true;
7184 onTabLoaded(contentEl
);
7187 router
.allowPageChange
= true;
7193 } else if (template
|| templateUrl
) {
7195 router
.tabTemplateLoader(template
, templateUrl
, loadTabOptions
, resolve
, reject
);
7197 router
.allowPageChange
= true;
7202 } else if (component
|| componentUrl
) {
7203 // Load from component (F7/Vue/React/...)
7205 router
.tabComponentLoader($newTabEl
[0], component
, componentUrl
, loadTabOptions
, resolve
, reject
);
7207 router
.allowPageChange
= true;
7216 router
.xhrRequest(url
, loadTabOptions
)
7217 .then(function (tabContent
) {
7218 resolve(tabContent
);
7220 .catch(function () {
7221 router
.allowPageChange
= true;
7226 var hasContentLoadProp
;
7227 ('url content component el componentUrl template templateUrl').split(' ').forEach(function (tabLoadProp
) {
7230 if (tabRoute
[tabLoadProp
]) {
7231 hasContentLoadProp
= true;
7232 loadTab(( obj
= {}, obj
[tabLoadProp
] = tabRoute
[tabLoadProp
], obj
), options
);
7237 function asyncResolve(resolveParams
, resolveOptions
) {
7238 loadTab(resolveParams
, Utils
.extend(options
, resolveOptions
));
7240 function asyncReject() {
7241 router
.allowPageChange
= true;
7243 if (tabRoute
.async
) {
7244 tabRoute
.async
.call(router
, currentRoute
, previousRoute
, asyncResolve
, asyncReject
);
7245 } else if (!hasContentLoadProp
) {
7246 router
.allowPageChange
= true;
7251 function tabRemove($oldTabEl
, $newTabEl
, tabRoute
) {
7254 var hasTabComponentChild
;
7256 $oldTabEl
[0].f7RouterTabLoaded
= false;
7257 delete $oldTabEl
[0].f7RouterTabLoaded
;
7259 $oldTabEl
.children().each(function (index
, tabChild
) {
7260 if (tabChild
.f7Component
) {
7261 hasTabComponentChild
= true;
7262 $(tabChild
).trigger('tab:beforeremove', tabRoute
);
7263 tabChild
.f7Component
.$destroy();
7266 if (!hasTabComponentChild
) {
7267 $oldTabEl
.trigger('tab:beforeremove', tabRoute
);
7269 router
.emit('tabBeforeRemove', $oldTabEl
[0], $newTabEl
[0], tabRoute
);
7270 router
.removeTabContent($oldTabEl
[0], tabRoute
);
7273 function modalLoad(modalType
, route
, loadOptions
) {
7274 if ( loadOptions
=== void 0 ) loadOptions
= {};
7277 var app
= router
.app
;
7278 var isPanel
= modalType
=== 'panel';
7279 var modalOrPanel
= isPanel
? 'panel' : 'modal';
7281 var options
= Utils
.extend({
7282 animate
: router
.params
.animate
,
7288 var modalParams
= Utils
.extend({}, route
.route
[modalType
]);
7289 var modalRoute
= route
.route
;
7291 function onModalLoaded() {
7293 var modal
= app
[modalType
].create(modalParams
);
7294 modalRoute
.modalInstance
= modal
;
7296 var hasEl
= modal
.el
;
7298 function closeOnSwipeBack() {
7301 modal
.on((modalOrPanel
+ "Open"), function () {
7303 // Remove theme elements
7304 router
.removeThemeElements(modal
.el
);
7307 modal
.$el
.trigger(((modalType
.toLowerCase()) + ":init " + (modalType
.toLowerCase()) + ":mounted"), route
, modal
);
7308 router
.emit(((!isPanel
? 'modalInit' : '') + " " + modalType
+ "Init " + modalType
+ "Mounted"), modal
.el
, route
, modal
);
7310 router
.once('swipeBackMove', closeOnSwipeBack
);
7312 modal
.on((modalOrPanel
+ "Close"), function () {
7313 router
.off('swipeBackMove', closeOnSwipeBack
);
7314 if (!modal
.closeByRouter
) {
7319 modal
.on((modalOrPanel
+ "Closed"), function () {
7320 modal
.$el
.trigger(((modalType
.toLowerCase()) + ":beforeremove"), route
, modal
);
7321 modal
.emit(("" + (!isPanel
? 'modalBeforeRemove ' : '') + modalType
+ "BeforeRemove"), modal
.el
, route
, modal
);
7322 var modalComponent
= modal
.el
.f7Component
;
7323 if (modalComponent
) {
7324 modalComponent
.$destroy();
7326 Utils
.nextTick(function () {
7327 if (modalComponent
|| modalParams
.component
) {
7328 router
.removeModal(modal
.el
);
7332 delete modalRoute
.modalInstance
;
7336 if (options
.route
) {
7337 // Update Browser History
7338 if (router
.params
.pushState
&& options
.pushState
) {
7342 url
: options
.route
.url
,
7345 (router
.params
.pushStateRoot
|| '') + router
.params
.pushStateSeparator
+ options
.route
.url
7350 if (options
.route
!== router
.currentRoute
) {
7351 modal
.route
= Utils
.extend(options
.route
, { modal
: modal
});
7352 router
.currentRoute
= modal
.route
;
7355 // Update Router History
7356 if (options
.history
) {
7357 router
.history
.push(options
.route
.url
);
7358 router
.saveHistory();
7363 // Remove theme elements
7364 router
.removeThemeElements(modal
.el
);
7367 modal
.$el
.trigger(((modalType
.toLowerCase()) + ":init " + (modalType
.toLowerCase()) + ":mounted"), route
, modal
);
7368 router
.emit((modalOrPanel
+ "Init " + modalType
+ "Init " + modalType
+ "Mounted"), modal
.el
, route
, modal
);
7375 // Load Modal Content
7376 function loadModal(loadModalParams
, loadModalOptions
) {
7378 var url
= loadModalParams
.url
;
7379 var content
= loadModalParams
.content
;
7380 var template
= loadModalParams
.template
;
7381 var templateUrl
= loadModalParams
.templateUrl
;
7382 var component
= loadModalParams
.component
;
7383 var componentUrl
= loadModalParams
.componentUrl
;
7385 // Component/Template Callbacks
7386 function resolve(contentEl
) {
7388 if (typeof contentEl
=== 'string') {
7389 modalParams
.content
= contentEl
;
7390 } else if (contentEl
.f7Component
) {
7391 contentEl
.f7Component
.$mount(function (componentEl
) {
7392 modalParams
.el
= componentEl
;
7393 app
.root
.append(componentEl
);
7396 modalParams
.el
= contentEl
;
7402 router
.allowPageChange
= true;
7408 } else if (template
|| templateUrl
) {
7410 router
.modalTemplateLoader(template
, templateUrl
, loadModalOptions
, resolve
, reject
);
7412 router
.allowPageChange
= true;
7415 } else if (component
|| componentUrl
) {
7416 // Load from component (F7/Vue/React/...)
7418 router
.modalComponentLoader(app
.root
[0], component
, componentUrl
, loadModalOptions
, resolve
, reject
);
7420 router
.allowPageChange
= true;
7429 router
.xhrRequest(url
, loadModalOptions
)
7430 .then(function (modalContent
) {
7431 modalParams
.content
= modalContent
;
7434 .catch(function () {
7435 router
.allowPageChange
= true;
7443 ('url content component el componentUrl template templateUrl').split(' ').forEach(function (modalLoadProp
) {
7446 if (modalParams
[modalLoadProp
] && !foundLoadProp
) {
7447 foundLoadProp
= true;
7448 loadModal(( obj
= {}, obj
[modalLoadProp
] = modalParams
[modalLoadProp
], obj
), options
);
7451 if (!foundLoadProp
&& modalType
=== 'actions') {
7456 function asyncResolve(resolveParams
, resolveOptions
) {
7457 loadModal(resolveParams
, Utils
.extend(options
, resolveOptions
));
7459 function asyncReject() {
7460 router
.allowPageChange
= true;
7462 if (modalParams
.async
) {
7463 modalParams
.async
.call(router
, options
.route
, router
.currentRoute
, asyncResolve
, asyncReject
);
7467 function modalRemove(modal
) {
7468 Utils
.extend(modal
, { closeByRouter
: true });
7472 function backward(el
, backwardOptions
) {
7475 var app
= router
.app
;
7476 var view
= router
.view
;
7478 var options
= Utils
.extend({
7479 animate
: router
.params
.animate
,
7481 }, backwardOptions
);
7483 var masterDetailEnabled
= router
.params
.masterDetailBreakpoint
> 0;
7484 var isMaster
= masterDetailEnabled
&& options
.route
&& options
.route
.route
&& options
.route
.route
.master
=== true;
7487 var dynamicNavbar
= router
.dynamicNavbar
;
7488 var separateNavbar
= router
.separateNavbar
;
7491 var $oldPage
= router
.$el
.children('.page-current');
7492 var currentIsMaster
= masterDetailEnabled
&& $oldPage
.hasClass('page-master');
7494 if ($newPage
.length
) {
7495 // Remove theme elements
7496 router
.removeThemeElements($newPage
);
7500 var $newNavbarInner
;
7501 var $oldNavbarInner
;
7503 if (dynamicNavbar
) {
7504 $newNavbarInner
= $newPage
.children('.navbar').children('.navbar-inner');
7505 if (separateNavbar
) {
7506 $navbarEl
= router
.$navbarEl
;
7507 if ($newNavbarInner
.length
> 0) {
7508 $newPage
.children('.navbar').remove();
7510 if ($newNavbarInner
.length
=== 0 && $newPage
[0] && $newPage
[0].f7Page
) {
7511 // Try from pageData
7512 $newNavbarInner
= $newPage
[0].f7Page
.$navbarEl
;
7514 $oldNavbarInner
= $navbarEl
.find('.navbar-current');
7516 $oldNavbarInner
= $oldPage
.children('.navbar').children('.navbar-inner');
7520 router
.allowPageChange
= false;
7521 if ($newPage
.length
=== 0 || $oldPage
.length
=== 0) {
7522 router
.allowPageChange
= true;
7526 // Remove theme elements
7527 router
.removeThemeElements($newPage
);
7529 // Save Keep Alive Cache
7530 if (options
.route
&& options
.route
.route
&& options
.route
.route
.keepAlive
&& !options
.route
.route
.keepAliveData
) {
7531 options
.route
.route
.keepAliveData
= {
7538 if (masterDetailEnabled
) {
7539 var $pagesInView
= router
.$el
7540 .children('.page:not(.stacked)')
7541 .filter(function (index
, pageInView
) { return pageInView
!== $newPage
[0]; });
7543 // Find Detail' master page
7544 for (var i
= 0; i
< $pagesInView
.length
; i
+= 1) {
7546 && $pagesInView
[i
].classList
.contains('page-master')
7548 masterPageEl
= $pagesInView
[i
];
7549 continue; // eslint-disable-line
7553 isDetail
= !isMaster
7555 && (router
.history
.indexOf(options
.route
.url
) > router
.history
.indexOf(masterPageEl
.f7Page
.route
.url
));
7561 .addClass(("page-previous" + (isMaster
? ' page-master' : '') + (isDetail
? ' page-master-detail' : '')))
7562 .removeClass('stacked')
7563 .removeAttr('aria-hidden')
7564 .trigger('page:unstack')
7565 .trigger('page:position', { position
: 'previous' });
7566 if (isMaster
|| isDetail
) {
7567 $newPage
.trigger('page:role', { role
: isMaster
? 'master' : 'detail' });
7570 if (dynamicNavbar
&& $newNavbarInner
.length
> 0) {
7572 .addClass(("navbar-previous" + (isMaster
? ' navbar-master' : '') + (isDetail
? ' navbar-master-detail' : '')))
7573 .removeClass('stacked')
7574 .removeAttr('aria-hidden');
7577 // Remove previous page in case of "forced"
7579 if (options
.force
) {
7580 if ($oldPage
.prev('.page-previous:not(.stacked)').length
> 0 || $oldPage
.prev('.page-previous').length
=== 0) {
7581 if (router
.history
.indexOf(options
.route
.url
) >= 0) {
7582 backIndex
= router
.history
.length
- router
.history
.indexOf(options
.route
.url
) - 1;
7583 router
.history
= router
.history
.slice(0, router
.history
.indexOf(options
.route
.url
) + 2);
7584 view
.history
= router
.history
;
7585 } else if (router
.history
[[router
.history
.length
- 2]]) {
7586 router
.history
[router
.history
.length
- 2] = options
.route
.url
;
7588 router
.history
.unshift(router
.url
);
7591 if (backIndex
&& router
.params
.stackPages
) {
7592 $oldPage
.prevAll('.page-previous').each(function (index
, pageToRemove
) {
7593 var $pageToRemove
= $(pageToRemove
);
7594 var $navbarToRemove
;
7595 if (separateNavbar
) {
7596 // $navbarToRemove = $oldNavbarInner.prevAll('.navbar-previous').eq(index);
7597 $navbarToRemove
= $(app
.navbar
.getElByPage($pageToRemove
));
7599 if ($pageToRemove
[0] !== $newPage
[0] && $pageToRemove
.index() > $newPage
.index()) {
7600 if (router
.initialPages
.indexOf($pageToRemove
[0]) >= 0) {
7601 $pageToRemove
.addClass('stacked');
7602 $pageToRemove
.trigger('page:stack');
7603 if (separateNavbar
) {
7604 $navbarToRemove
.addClass('stacked');
7607 router
.pageCallback('beforeRemove', $pageToRemove
, $navbarToRemove
, 'previous', undefined, options
);
7608 router
.removePage($pageToRemove
);
7609 if (separateNavbar
&& $navbarToRemove
.length
> 0) {
7610 router
.removeNavbar($navbarToRemove
);
7616 var $pageToRemove
= $oldPage
.prev('.page-previous:not(.stacked)');
7617 var $navbarToRemove
;
7618 if (separateNavbar
) {
7619 // $navbarToRemove = $oldNavbarInner.prev('.navbar-inner:not(.stacked)');
7620 $navbarToRemove
= $(app
.navbar
.getElByPage($pageToRemove
));
7622 if (router
.params
.stackPages
&& router
.initialPages
.indexOf($pageToRemove
[0]) >= 0) {
7623 $pageToRemove
.addClass('stacked');
7624 $pageToRemove
.trigger('page:stack');
7625 $navbarToRemove
.addClass('stacked');
7626 } else if ($pageToRemove
.length
> 0) {
7627 router
.pageCallback('beforeRemove', $pageToRemove
, $navbarToRemove
, 'previous', undefined, options
);
7628 router
.removePage($pageToRemove
);
7629 if (separateNavbar
&& $navbarToRemove
.length
) {
7630 router
.removeNavbar($navbarToRemove
);
7638 var newPageInDom
= $newPage
.parents(doc
).length
> 0;
7639 var f7Component
= $newPage
[0].f7Component
;
7641 function insertPage() {
7642 if ($newPage
.next($oldPage
).length
=== 0) {
7643 if (!newPageInDom
&& f7Component
) {
7644 f7Component
.$mount(function (componentEl
) {
7645 $(componentEl
).insertBefore($oldPage
);
7648 $newPage
.insertBefore($oldPage
);
7651 if (separateNavbar
&& $newNavbarInner
.length
) {
7652 if ($newNavbarInner
.children('.title-large').length
) {
7653 $newNavbarInner
.addClass('navbar-inner-large');
7655 $newNavbarInner
.insertBefore($oldNavbarInner
);
7656 if ($oldNavbarInner
.length
> 0) {
7657 $newNavbarInner
.insertBefore($oldNavbarInner
);
7659 if (!router
.$navbarEl
.parents(doc
).length
) {
7660 router
.$el
.prepend(router
.$navbarEl
);
7662 $navbarEl
.append($newNavbarInner
);
7665 if (!newPageInDom
) {
7666 router
.pageCallback('mounted', $newPage
, $newNavbarInner
, 'previous', 'current', options
, $oldPage
);
7667 } else if (options
.route
&& options
.route
.route
&& options
.route
.route
.keepAlive
&& !$newPage
[0].f7PageMounted
) {
7668 $newPage
[0].f7PageMounted
= true;
7669 router
.pageCallback('mounted', $newPage
, $newNavbarInner
, 'previous', 'current', options
, $oldPage
);
7673 if (options
.preload
) {
7677 if (options
.route
.route
.tab
) {
7678 router
.tabLoad(options
.route
.route
.tab
, Utils
.extend({}, options
, {
7686 .removeClass('page-master-stacked')
7687 .trigger('page:masterunstack');
7688 if (separateNavbar
) {
7689 $(app
.navbar
.getElByPage($newPage
)).removeClass('navbar-master-stacked');
7692 // Page init and before init events
7693 router
.pageCallback('init', $newPage
, $newNavbarInner
, 'previous', 'current', options
, $oldPage
);
7694 var $previousPages
= $newPage
.prevAll('.page-previous:not(.stacked):not(.page-master)');
7695 if ($previousPages
.length
> 0) {
7696 $previousPages
.each(function (index
, pageToRemove
) {
7697 var $pageToRemove
= $(pageToRemove
);
7698 var $navbarToRemove
;
7699 if (separateNavbar
) {
7700 // $navbarToRemove = $newNavbarInner.prevAll('.navbar-previous:not(.stacked)').eq(index);
7701 $navbarToRemove
= $(app
.navbar
.getElByPage($pageToRemove
));
7703 if (router
.params
.stackPages
&& router
.initialPages
.indexOf(pageToRemove
) >= 0) {
7704 $pageToRemove
.addClass('stacked');
7705 $pageToRemove
.trigger('page:stack');
7706 if (separateNavbar
) {
7707 $navbarToRemove
.addClass('stacked');
7710 router
.pageCallback('beforeRemove', $pageToRemove
, $navbarToRemove
, 'previous', undefined);
7711 router
.removePage($pageToRemove
);
7712 if (separateNavbar
&& $navbarToRemove
.length
) {
7713 router
.removeNavbar($navbarToRemove
);
7718 router
.allowPageChange
= true;
7723 if (!(Device
.ie
|| Device
.edge
|| (Device
.firefox
&& !Device
.ios
))) {
7724 if (router
.params
.pushState
&& options
.pushState
) {
7725 if (backIndex
) { History
.go(-backIndex
); }
7726 else { History
.back(); }
7731 if (router
.history
.length
=== 1) {
7732 router
.history
.unshift(router
.url
);
7734 router
.history
.pop();
7735 router
.saveHistory();
7737 // Current Page & Navbar
7738 router
.currentPageEl
= $newPage
[0];
7739 if (dynamicNavbar
&& $newNavbarInner
.length
) {
7740 router
.currentNavbarEl
= $newNavbarInner
[0];
7742 delete router
.currentNavbarEl
;
7746 router
.currentRoute
= options
.route
;
7749 if (Device
.ie
|| Device
.edge
|| (Device
.firefox
&& !Device
.ios
)) {
7750 if (router
.params
.pushState
&& options
.pushState
) {
7751 if (backIndex
) { History
.go(-backIndex
); }
7752 else { History
.back(); }
7760 if (options
.route
.route
.tab
) {
7761 router
.tabLoad(options
.route
.route
.tab
, Utils
.extend({}, options
, {
7767 // Page init and before init events
7768 router
.pageCallback('init', $newPage
, $newNavbarInner
, 'previous', 'current', options
, $oldPage
);
7770 // Before animation callback
7771 router
.pageCallback('beforeIn', $newPage
, $newNavbarInner
, 'previous', 'current', options
);
7772 router
.pageCallback('beforeOut', $oldPage
, $oldNavbarInner
, 'current', 'next', options
);
7775 function afterAnimation() {
7777 var pageClasses
= 'page-previous page-current page-next';
7778 var navbarClasses
= 'navbar-previous navbar-current navbar-next';
7779 $newPage
.removeClass(pageClasses
).addClass('page-current').removeAttr('aria-hidden').trigger('page:position', { position
: 'current' });
7780 $oldPage
.removeClass(pageClasses
).addClass('page-next').attr('aria-hidden', 'true').trigger('page:position', { position
: 'next' });
7781 if (dynamicNavbar
) {
7782 $newNavbarInner
.removeClass(navbarClasses
).addClass('navbar-current').removeAttr('aria-hidden');
7783 $oldNavbarInner
.removeClass(navbarClasses
).addClass('navbar-next').attr('aria-hidden', 'true');
7786 // After animation event
7787 router
.pageCallback('afterIn', $newPage
, $newNavbarInner
, 'previous', 'current', options
);
7788 router
.pageCallback('afterOut', $oldPage
, $oldNavbarInner
, 'current', 'next', options
);
7791 if (router
.params
.stackPages
&& router
.initialPages
.indexOf($oldPage
[0]) >= 0) {
7792 $oldPage
.addClass('stacked');
7793 $oldPage
.trigger('page:stack');
7794 if (separateNavbar
) {
7795 $oldNavbarInner
.addClass('stacked');
7798 router
.pageCallback('beforeRemove', $oldPage
, $oldNavbarInner
, 'next', undefined, options
);
7799 router
.removePage($oldPage
);
7800 if (separateNavbar
&& $oldNavbarInner
.length
) {
7801 router
.removeNavbar($oldNavbarInner
);
7805 router
.allowPageChange
= true;
7806 router
.emit('routeChanged', router
.currentRoute
, router
.previousRoute
, router
);
7808 // Preload previous page
7809 var preloadPreviousPage
= router
.params
.preloadPreviousPage
|| (app
.theme
.ios
? router
.params
.iosSwipeBack
: router
.params
.mdSwipeBack
);
7810 if (preloadPreviousPage
&& router
.history
[router
.history
.length
- 2] && !isMaster
) {
7811 router
.back(router
.history
[router
.history
.length
- 2], { preload
: true });
7813 if (router
.params
.pushState
) {
7814 History
.clearRouterQueue();
7818 function setPositionClasses() {
7819 var pageClasses
= 'page-previous page-current page-next';
7820 var navbarClasses
= 'navbar-previous navbar-current navbar-next';
7821 $oldPage
.removeClass(pageClasses
).addClass('page-current').trigger('page:position', { position
: 'current' });
7822 $newPage
.removeClass(pageClasses
).addClass('page-previous').removeAttr('aria-hidden').trigger('page:position', { position
: 'previous' });
7823 if (dynamicNavbar
) {
7824 $oldNavbarInner
.removeClass(navbarClasses
).addClass('navbar-current');
7825 $newNavbarInner
.removeClass(navbarClasses
).addClass('navbar-previous').removeAttr('aria-hidden');
7829 if (options
.animate
&& !(currentIsMaster
&& app
.width
>= router
.params
.masterDetailBreakpoint
)) {
7830 setPositionClasses();
7831 router
.animate($oldPage
, $newPage
, $oldNavbarInner
, $newNavbarInner
, 'backward', function () {
7840 function loadBack(backParams
, backOptions
, ignorePageChange
) {
7843 if (!router
.allowPageChange
&& !ignorePageChange
) { return router
; }
7844 var params
= backParams
;
7845 var options
= backOptions
;
7846 var url
= params
.url
;
7847 var content
= params
.content
;
7849 var pageName
= params
.pageName
;
7850 var template
= params
.template
;
7851 var templateUrl
= params
.templateUrl
;
7852 var component
= params
.component
;
7853 var componentUrl
= params
.componentUrl
;
7857 && router
.url
=== options
.route
.url
7858 && !(options
.reloadCurrent
|| options
.reloadPrevious
)
7859 && !router
.params
.allowDuplicateUrls
7864 if (!options
.route
&& url
) {
7865 options
.route
= router
.parseRouteUrl(url
);
7868 // Component Callbacks
7869 function resolve(pageEl
, newOptions
) {
7870 return router
.backward(pageEl
, Utils
.extend(options
, newOptions
));
7873 router
.allowPageChange
= true;
7877 if (url
|| templateUrl
|| componentUrl
) {
7878 router
.allowPageChange
= false;
7883 router
.backward(router
.getPageEl(content
), options
);
7884 } else if (template
|| templateUrl
) {
7885 // Parse template and send page element
7887 router
.pageTemplateLoader(template
, templateUrl
, options
, resolve
, reject
);
7889 router
.allowPageChange
= true;
7893 // Load page from specified HTMLElement or by page name in pages container
7894 router
.backward(router
.getPageEl(el
), options
);
7895 } else if (pageName
) {
7896 // Load page by page name in pages container
7897 router
.backward(router
.$el
.children((".page[data-name=\"" + pageName
+ "\"]")).eq(0), options
);
7898 } else if (component
|| componentUrl
) {
7899 // Load from component (F7/Vue/React/...)
7901 router
.pageComponentLoader(router
.el
, component
, componentUrl
, options
, resolve
, reject
);
7903 router
.allowPageChange
= true;
7912 router
.xhrRequest(url
, options
)
7913 .then(function (pageContent
) {
7914 router
.backward(router
.getPageEl(pageContent
), options
);
7916 .catch(function () {
7917 router
.allowPageChange
= true;
7923 var args
= [], len
= arguments
.length
;
7924 while ( len
-- ) args
[ len
] = arguments
[ len
];
7927 if (router
.swipeBackActive
) { return router
; }
7929 var navigateOptions
;
7931 if (typeof args
[0] === 'object') {
7932 navigateOptions
= args
[0] || {};
7934 navigateUrl
= args
[0];
7935 navigateOptions
= args
[1] || {};
7938 var name
= navigateOptions
.name
;
7939 var params
= navigateOptions
.params
;
7940 var query
= navigateOptions
.query
;
7942 // find route by name
7943 route
= router
.findRouteByKey('name', name
);
7945 throw new Error(("Framework7: route with name \"" + name
+ "\" not found"));
7947 navigateUrl
= router
.constructRouteUrl(route
, { params
: params
, query
: query
});
7949 return router
.back(navigateUrl
, Utils
.extend({}, navigateOptions
, {
7955 throw new Error(("Framework7: can't construct URL for route with name \"" + name
+ "\""));
7958 var app
= router
.app
;
7959 appRouterCheck(router
, 'back');
7961 var currentRouteIsModal
= router
.currentRoute
.modal
;
7963 if (!currentRouteIsModal
) {
7964 ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp
) {
7965 if (router
.currentRoute
.route
[modalLoadProp
]) {
7966 currentRouteIsModal
= true;
7967 modalType
= modalLoadProp
;
7971 if (currentRouteIsModal
) {
7972 var modalToClose
= router
.currentRoute
.modal
7973 || router
.currentRoute
.route
.modalInstance
7974 || app
[modalType
].get();
7975 var previousUrl
= router
.history
[router
.history
.length
- 2];
7977 // check if previous route is modal too
7978 if (modalToClose
&& modalToClose
.$el
) {
7979 var prevOpenedModals
= modalToClose
.$el
.prevAll('.modal-in');
7980 if (prevOpenedModals
.length
&& prevOpenedModals
[0].f7Modal
) {
7981 previousRoute
= prevOpenedModals
[0].f7Modal
.route
;
7984 if (!previousRoute
) {
7985 previousRoute
= router
.findMatchingRoute(previousUrl
);
7988 if (!previousRoute
&& previousUrl
) {
7991 path
: previousUrl
.split('?')[0],
7992 query
: Utils
.parseUrlQuery(previousUrl
),
7994 path
: previousUrl
.split('?')[0],
7999 if (!navigateUrl
|| navigateUrl
.replace(/[# ]/g, '').trim().length
=== 0) {
8000 if (!previousRoute
|| !modalToClose
) {
8004 var forceOtherUrl
= navigateOptions
.force
&& previousRoute
&& navigateUrl
;
8005 if (previousRoute
&& modalToClose
) {
8006 if (router
.params
.pushState
&& navigateOptions
.pushState
!== false) {
8009 router
.currentRoute
= previousRoute
;
8010 router
.history
.pop();
8011 router
.saveHistory();
8012 router
.modalRemove(modalToClose
);
8013 if (forceOtherUrl
) {
8014 router
.navigate(navigateUrl
, { reloadCurrent
: true });
8016 } else if (modalToClose
) {
8017 router
.modalRemove(modalToClose
);
8019 router
.navigate(navigateUrl
, { reloadCurrent
: true });
8024 var $previousPage
= router
.$el
.children('.page-current').prevAll('.page-previous:not(.page-master)').eq(0);
8027 if (router
.params
.masterDetailBreakpoint
> 0) {
8028 var $previousMaster
= router
.$el
.children('.page-current').prevAll('.page-master').eq(0);
8029 if ($previousMaster
.length
) {
8030 var expectedPreviousPageUrl
= router
.history
[router
.history
.length
- 2];
8031 var expectedPreviousPageRoute
= router
.findMatchingRoute(expectedPreviousPageUrl
);
8032 if (expectedPreviousPageRoute
&& expectedPreviousPageRoute
.route
=== $previousMaster
[0].f7Page
.route
.route
) {
8033 $previousPage
= $previousMaster
;
8034 if (!navigateOptions
.preload
) {
8035 skipMaster
= app
.width
>= router
.params
.masterDetailBreakpoint
;
8040 if (!navigateOptions
.force
&& $previousPage
.length
&& !skipMaster
) {
8041 if (router
.params
.pushState
8042 && $previousPage
[0].f7Page
8043 && router
.history
[router
.history
.length
- 2] !== $previousPage
[0].f7Page
.route
.url
8046 router
.history
[router
.history
.length
- 2],
8047 Utils
.extend(navigateOptions
, { force
: true })
8051 var previousPageRoute
= $previousPage
[0].f7Page
.route
;
8053 processRouteQueue
.call(
8056 router
.currentRoute
,
8058 router
.loadBack({ el
: $previousPage
}, Utils
.extend(navigateOptions
, {
8059 route
: previousPageRoute
,
8069 if (navigateUrl
=== '#') {
8070 navigateUrl
= undefined;
8072 if (navigateUrl
&& navigateUrl
[0] !== '/' && navigateUrl
.indexOf('#') !== 0) {
8073 navigateUrl
= ((router
.path
|| '/') + navigateUrl
).replace('//', '/');
8075 if (!navigateUrl
&& router
.history
.length
> 1) {
8076 navigateUrl
= router
.history
[router
.history
.length
- 2];
8078 if (skipMaster
&& !navigateOptions
.force
&& router
.history
[router
.history
.length
- 3]) {
8079 return router
.back(router
.history
[router
.history
.length
- 3], Utils
.extend({}, navigateOptions
|| {}, {
8084 if (skipMaster
&& !navigateOptions
.force
) {
8088 // Find route to load
8089 route
= router
.findMatchingRoute(navigateUrl
);
8094 path
: navigateUrl
.split('?')[0],
8095 query
: Utils
.parseUrlQuery(navigateUrl
),
8097 path
: navigateUrl
.split('?')[0],
8107 if (route
.route
.redirect
) {
8108 return redirect
.call(router
, 'back', route
, navigateOptions
);
8112 if (route
.route
.options
) {
8113 Utils
.extend(options
, route
.route
.options
, navigateOptions
);
8115 Utils
.extend(options
, navigateOptions
);
8117 options
.route
= route
;
8119 if (options
&& options
.context
) {
8120 route
.context
= options
.context
;
8121 options
.route
.context
= options
.context
;
8124 var backForceLoaded
;
8125 if (options
.force
&& router
.params
.stackPages
) {
8126 router
.$el
.children('.page-previous.stacked').each(function (index
, pageEl
) {
8127 if (pageEl
.f7Page
&& pageEl
.f7Page
.route
&& pageEl
.f7Page
.route
.url
=== route
.url
) {
8128 backForceLoaded
= true;
8129 router
.loadBack({ el
: pageEl
}, options
);
8132 if (backForceLoaded
) {
8136 function resolve() {
8137 var routerLoaded
= false;
8138 if (route
.route
.keepAlive
&& route
.route
.keepAliveData
) {
8139 router
.loadBack({ el
: route
.route
.keepAliveData
.pageEl
}, options
);
8140 routerLoaded
= true;
8142 ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp
) {
8145 if (route
.route
[pageLoadProp
] && !routerLoaded
) {
8146 routerLoaded
= true;
8147 router
.loadBack(( obj
= {}, obj
[pageLoadProp
] = route
.route
[pageLoadProp
], obj
), options
);
8150 if (routerLoaded
) { return; }
8152 function asyncResolve(resolveParams
, resolveOptions
) {
8153 router
.allowPageChange
= false;
8154 if (resolveOptions
&& resolveOptions
.context
) {
8155 if (!route
.context
) { route
.context
= resolveOptions
.context
; }
8156 else { route
.context
= Utils
.extend({}, route
.context
, resolveOptions
.context
); }
8157 options
.route
.context
= route
.context
;
8159 router
.loadBack(resolveParams
, Utils
.extend(options
, resolveOptions
), true);
8161 function asyncReject() {
8162 router
.allowPageChange
= true;
8164 if (route
.route
.async
) {
8165 router
.allowPageChange
= false;
8167 route
.route
.async
.call(router
, route
, router
.currentRoute
, asyncResolve
, asyncReject
);
8171 router
.allowPageChange
= true;
8174 if (options
.preload
) {
8177 processRouteQueue
.call(
8180 router
.currentRoute
,
8182 if (route
.route
.modules
) {
8184 .loadModules(Array
.isArray(route
.route
.modules
) ? route
.route
.modules
: [route
.route
.modules
])
8188 .catch(function () {
8205 function clearPreviousPages() {
8207 appRouterCheck(router
, 'clearPreviousPages');
8208 var app
= router
.app
;
8209 var separateNavbar
= router
.separateNavbar
;
8211 var $pagesToRemove
= router
.$el
8213 .filter(function (index
, pageInView
) {
8214 if (router
.currentRoute
&& (router
.currentRoute
.modal
|| router
.currentRoute
.panel
)) { return true; }
8215 return pageInView
!== router
.currentPageEl
;
8218 $pagesToRemove
.each(function (index
, pageEl
) {
8219 var $oldPageEl
= $(pageEl
);
8220 var $oldNavbarInnerEl
= $(app
.navbar
.getElByPage($oldPageEl
));
8221 if (router
.params
.stackPages
&& router
.initialPages
.indexOf($oldPageEl
[0]) >= 0) {
8222 $oldPageEl
.addClass('stacked');
8223 if (separateNavbar
) {
8224 $oldNavbarInnerEl
.addClass('stacked');
8227 // Page remove event
8228 router
.pageCallback('beforeRemove', $oldPageEl
, $oldNavbarInnerEl
, 'previous', undefined, {});
8229 router
.removePage($oldPageEl
);
8230 if (separateNavbar
&& $oldNavbarInnerEl
.length
) {
8231 router
.removeNavbar($oldNavbarInnerEl
);
8237 function clearPreviousHistory() {
8239 appRouterCheck(router
, 'clearPreviousHistory');
8240 var url
= router
.history
[router
.history
.length
- 1];
8242 router
.clearPreviousPages();
8244 router
.history
= [url
];
8245 router
.view
.history
= [url
];
8246 router
.saveHistory();
8249 var Router
= /*@__PURE__*/(function (Framework7Class
$$1) {
8250 function Router(app
, view
) {
8251 Framework7Class
$$1.call(this, {}, [typeof view
=== 'undefined' ? app
: view
]);
8255 router
.isAppRouter
= typeof view
=== 'undefined';
8257 if (router
.isAppRouter
) {
8259 Utils
.extend(false, router
, {
8261 params
: app
.params
.view
,
8262 routes
: app
.routes
|| [],
8267 Utils
.extend(false, router
, {
8271 params
: view
.params
,
8272 routes
: view
.routes
,
8275 $navbarEl
: view
.$navbarEl
,
8276 navbarEl
: view
.navbarEl
,
8277 history
: view
.history
,
8278 scrollHistory
: view
.scrollHistory
,
8280 dynamicNavbar
: app
.theme
=== 'ios' && view
.params
.iosDynamicNavbar
,
8281 separateNavbar
: app
.theme
=== 'ios' && view
.params
.iosDynamicNavbar
&& view
.params
.iosSeparateDynamicNavbar
,
8288 router
.useModules();
8291 router
.tempDom
= doc
.createElement('div');
8294 router
.allowPageChange
= true;
8297 var currentRoute
= {};
8298 var previousRoute
= {};
8299 Object
.defineProperty(router
, 'currentRoute', {
8302 set: function set(newRoute
) {
8303 if ( newRoute
=== void 0 ) newRoute
= {};
8305 previousRoute
= Utils
.extend({}, currentRoute
);
8306 currentRoute
= newRoute
;
8307 if (!currentRoute
) { return; }
8308 router
.url
= currentRoute
.url
;
8309 router
.emit('routeChange', newRoute
, previousRoute
, router
);
8311 get: function get() {
8312 return currentRoute
;
8315 Object
.defineProperty(router
, 'previousRoute', {
8318 get: function get() {
8319 return previousRoute
;
8321 set: function set(newRoute
) {
8322 previousRoute
= newRoute
;
8329 if ( Framework7Class
$$1 ) Router
.__proto__
= Framework7Class
$$1;
8330 Router
.prototype = Object
.create( Framework7Class
$$1 && Framework7Class
$$1.prototype );
8331 Router
.prototype.constructor = Router
;
8333 Router
.prototype.animatableNavElements
= function animatableNavElements (newNavbarInner
, oldNavbarInner
, toLarge
, fromLarge
, direction
) {
8335 var dynamicNavbar
= router
.dynamicNavbar
;
8336 var separateNavbar
= router
.separateNavbar
;
8337 var animateIcon
= router
.params
.iosAnimateNavbarBackIcon
;
8341 function animatableNavEl($el
, navbarInner
) {
8342 var isSliding
= $el
.hasClass('sliding') || navbarInner
.hasClass('sliding');
8343 var isSubnavbar
= $el
.hasClass('subnavbar');
8344 var needsOpacityTransition
= isSliding
? !isSubnavbar
: true;
8345 var $iconEl
= $el
.find('.back .icon');
8347 if (isSliding
&& animateIcon
&& $el
.hasClass('left') && $iconEl
.length
> 0 && $iconEl
.next('span').length
) {
8348 $el
= $iconEl
.next('span'); // eslint-disable-line
8353 isIconLabel
: isIconLabel
,
8354 leftOffset
: $el
[0].f7NavbarLeftOffset
,
8355 rightOffset
: $el
[0].f7NavbarRightOffset
,
8356 isSliding
: isSliding
,
8357 isSubnavbar
: isSubnavbar
,
8358 needsOpacityTransition
: needsOpacityTransition
,
8361 if (dynamicNavbar
) {
8364 newNavbarInner
.children('.left, .right, .title, .subnavbar').each(function (index
, navEl
) {
8365 var $navEl
= $(navEl
);
8366 if ($navEl
.hasClass('left') && fromLarge
&& direction
=== 'forward' && separateNavbar
) { return; }
8367 if ($navEl
.hasClass('title') && toLarge
) { return; }
8368 newNavEls
.push(animatableNavEl($navEl
, newNavbarInner
));
8370 if (!(oldNavbarInner
.hasClass('navbar-master') && router
.params
.masterDetailBreakpoint
> 0 && router
.app
.width
>= router
.params
.masterDetailBreakpoint
)) {
8371 oldNavbarInner
.children('.left, .right, .title, .subnavbar').each(function (index
, navEl
) {
8372 var $navEl
= $(navEl
);
8373 if ($navEl
.hasClass('left') && toLarge
&& !fromLarge
&& direction
=== 'forward' && separateNavbar
) { return; }
8374 if ($navEl
.hasClass('left') && toLarge
&& direction
=== 'backward' && separateNavbar
) { return; }
8375 if ($navEl
.hasClass('title') && fromLarge
) {
8378 oldNavEls
.push(animatableNavEl($navEl
, oldNavbarInner
));
8381 [oldNavEls
, newNavEls
].forEach(function (navEls
) {
8382 navEls
.forEach(function (navEl
) {
8384 var isSliding
= navEl
.isSliding
;
8385 var $el
= navEl
.$el
;
8386 var otherEls
= navEls
=== oldNavEls
? newNavEls
: oldNavEls
;
8387 if (!(isSliding
&& $el
.hasClass('title') && otherEls
)) { return; }
8388 otherEls
.forEach(function (otherNavEl
) {
8389 if (otherNavEl
.isIconLabel
) {
8390 var iconTextEl
= otherNavEl
.$el
[0];
8391 n
.leftOffset
+= iconTextEl
? (iconTextEl
.offsetLeft
|| 0) : 0;
8398 return { newNavEls
: newNavEls
, oldNavEls
: oldNavEls
};
8401 Router
.prototype.animate
= function animate (oldPage
, newPage
, oldNavbarInner
, newNavbarInner
, direction
, callback
) {
8403 if (router
.params
.animateCustom
) {
8404 router
.params
.animateCustom
.apply(router
, [oldPage
, newPage
, oldNavbarInner
, newNavbarInner
, direction
, callback
]);
8407 var dynamicNavbar
= router
.dynamicNavbar
;
8408 var ios
= router
.app
.theme
=== 'ios';
8409 // Router Animation class
8410 var routerTransitionClass
= "router-transition-" + direction
+ " router-transition";
8421 if (ios
&& dynamicNavbar
) {
8422 oldIsLarge
= oldNavbarInner
&& oldNavbarInner
.hasClass('navbar-inner-large');
8423 newIsLarge
= newNavbarInner
&& newNavbarInner
.hasClass('navbar-inner-large');
8424 fromLarge
= oldIsLarge
&& !oldNavbarInner
.hasClass('navbar-inner-large-collapsed');
8425 toLarge
= newIsLarge
&& !newNavbarInner
.hasClass('navbar-inner-large-collapsed');
8426 var navEls
= router
.animatableNavElements(newNavbarInner
, oldNavbarInner
, toLarge
, fromLarge
, direction
);
8427 newNavEls
= navEls
.newNavEls
;
8428 oldNavEls
= navEls
.oldNavEls
;
8431 function animateNavbars(progress
) {
8432 if (!(ios
&& dynamicNavbar
)) { return; }
8433 if (progress
=== 1) {
8435 newNavbarInner
.addClass('router-navbar-transition-to-large');
8436 oldNavbarInner
.addClass('router-navbar-transition-to-large');
8439 newNavbarInner
.addClass('router-navbar-transition-from-large');
8440 oldNavbarInner
.addClass('router-navbar-transition-from-large');
8443 newNavEls
.forEach(function (navEl
) {
8444 var $el
= navEl
.$el
;
8445 var offset
= direction
=== 'forward' ? navEl
.rightOffset
: navEl
.leftOffset
;
8446 if (navEl
.isSliding
) {
8447 if (navEl
.isSubnavbar
&& newIsLarge
) {
8448 $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');
8450 $el
.transform(("translate3d(" + (offset
* (1 - progress
)) + "px,0,0)"));
8454 oldNavEls
.forEach(function (navEl
) {
8455 var $el
= navEl
.$el
;
8456 var offset
= direction
=== 'forward' ? navEl
.leftOffset
: navEl
.rightOffset
;
8457 if (navEl
.isSliding
) {
8458 if (navEl
.isSubnavbar
&& oldIsLarge
) {
8459 $el
.transform(("translate3d(" + (offset
* (progress
)) + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)"));
8461 $el
.transform(("translate3d(" + (offset
* (progress
)) + "px,0,0)"));
8467 // AnimationEnd Callback
8469 if (router
.dynamicNavbar
) {
8470 if (newNavbarInner
) {
8471 newNavbarInner
.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
8472 newNavbarInner
.addClass('navbar-no-title-large-transition');
8473 Utils
.nextFrame(function () {
8474 newNavbarInner
.removeClass('navbar-no-title-large-transition');
8477 if (oldNavbarInner
) {
8478 oldNavbarInner
.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
8480 if (newNavbarInner
.hasClass('sliding')) {
8481 newNavbarInner
.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
8483 newNavbarInner
.find('.sliding').transform('');
8485 if (oldNavbarInner
.hasClass('sliding')) {
8486 oldNavbarInner
.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
8488 oldNavbarInner
.find('.sliding').transform('');
8491 router
.$el
.removeClass(routerTransitionClass
);
8492 if (callback
) { callback(); }
8495 (direction
=== 'forward' ? newPage
: oldPage
).animationEnd(function () {
8500 if (dynamicNavbar
) {
8503 Utils
.nextFrame(function () {
8504 // Add class, start animation
8506 router
.$el
.addClass(routerTransitionClass
);
8509 // Add class, start animation
8510 router
.$el
.addClass(routerTransitionClass
);
8514 Router
.prototype.removeModal
= function removeModal (modalEl
) {
8516 router
.removeEl(modalEl
);
8518 // eslint-disable-next-line
8519 Router
.prototype.removeTabContent
= function removeTabContent (tabEl
) {
8520 var $tabEl
= $(tabEl
);
8524 Router
.prototype.removeNavbar
= function removeNavbar (el
) {
8526 router
.removeEl(el
);
8529 Router
.prototype.removePage
= function removePage (el
) {
8531 var f7Page
= $el
&& $el
[0] && $el
[0].f7Page
;
8533 if (f7Page
&& f7Page
.route
&& f7Page
.route
.route
&& f7Page
.route
.route
.keepAlive
) {
8537 router
.removeEl(el
);
8540 Router
.prototype.removeEl
= function removeEl (el
) {
8541 if (!el
) { return; }
8544 if ($el
.length
=== 0) { return; }
8545 $el
.find('.tab').each(function (tabIndex
, tabEl
) {
8546 $(tabEl
).children().each(function (index
, tabChild
) {
8547 if (tabChild
.f7Component
) {
8548 $(tabChild
).trigger('tab:beforeremove');
8549 tabChild
.f7Component
.$destroy();
8553 if ($el
[0].f7Component
&& $el
[0].f7Component
.$destroy
) {
8554 $el
[0].f7Component
.$destroy();
8556 if (!router
.params
.removeElements
) {
8559 if (router
.params
.removeElementsWithTimeout
) {
8560 setTimeout(function () {
8562 }, router
.params
.removeElementsTimeout
);
8568 Router
.prototype.getPageEl
= function getPageEl (content
) {
8570 if (typeof content
=== 'string') {
8571 router
.tempDom
.innerHTML
= content
;
8573 if ($(content
).hasClass('page')) {
8576 router
.tempDom
.innerHTML
= '';
8577 $(router
.tempDom
).append(content
);
8580 return router
.findElement('.page', router
.tempDom
);
8583 Router
.prototype.findElement
= function findElement (stringSelector
, container
, notStacked
) {
8585 var view
= router
.view
;
8586 var app
= router
.app
;
8589 var modalsSelector
= '.popup, .dialog, .popover, .actions-modal, .sheet-modal, .login-screen, .page';
8591 var $container
= $(container
);
8592 var selector
= stringSelector
;
8593 if (notStacked
) { selector
+= ':not(.stacked)'; }
8595 var found
= $container
8597 .filter(function (index
, el
) { return $(el
).parents(modalsSelector
).length
=== 0; });
8599 if (found
.length
> 1) {
8600 if (typeof view
.selector
=== 'string') {
8601 // Search in related view
8602 found
= $container
.find(((view
.selector
) + " " + selector
));
8604 if (found
.length
> 1) {
8605 // Search in main view
8606 found
= $container
.find(("." + (app
.params
.viewMainClass
) + " " + selector
));
8609 if (found
.length
=== 1) { return found
; }
8611 // Try to find not stacked
8612 if (!notStacked
) { found
= router
.findElement(selector
, $container
, true); }
8613 if (found
&& found
.length
=== 1) { return found
; }
8614 if (found
&& found
.length
> 1) { return $(found
[0]); }
8618 Router
.prototype.flattenRoutes
= function flattenRoutes (routes
) {
8619 if ( routes
=== void 0 ) routes
= this.routes
;
8622 var flattenedRoutes
= [];
8623 routes
.forEach(function (route
) {
8624 var hasTabRoutes
= false;
8625 if ('tabs' in route
&& route
.tabs
) {
8626 var mergedPathsRoutes
= route
.tabs
.map(function (tabRoute
) {
8627 var tRoute
= Utils
.extend({}, route
, {
8628 path
: (((route
.path
) + "/" + (tabRoute
.path
))).replace('///', '/').replace('//', '/'),
8629 parentPath
: route
.path
,
8633 delete tRoute
.routes
;
8636 hasTabRoutes
= true;
8637 flattenedRoutes
= flattenedRoutes
.concat(router
.flattenRoutes(mergedPathsRoutes
));
8639 if ('detailRoutes' in route
) {
8640 var mergedPathsRoutes
$1 = route
.detailRoutes
.map(function (detailRoute
) {
8641 var dRoute
= Utils
.extend({}, detailRoute
);
8642 dRoute
.masterRoute
= route
;
8643 dRoute
.masterRoutePath
= route
.path
;
8646 flattenedRoutes
= flattenedRoutes
.concat(route
, router
.flattenRoutes(mergedPathsRoutes
$1));
8648 if ('routes' in route
) {
8649 var mergedPathsRoutes
$2 = route
.routes
.map(function (childRoute
) {
8650 var cRoute
= Utils
.extend({}, childRoute
);
8651 cRoute
.path
= (((route
.path
) + "/" + (cRoute
.path
))).replace('///', '/').replace('//', '/');
8655 flattenedRoutes
= flattenedRoutes
.concat(router
.flattenRoutes(mergedPathsRoutes
$2));
8657 flattenedRoutes
= flattenedRoutes
.concat(route
, router
.flattenRoutes(mergedPathsRoutes
$2));
8660 if (!('routes' in route
) && !('tabs' in route
&& route
.tabs
) && !('detailRoutes' in route
)) {
8661 flattenedRoutes
.push(route
);
8664 return flattenedRoutes
;
8667 // eslint-disable-next-line
8668 Router
.prototype.parseRouteUrl
= function parseRouteUrl (url
) {
8669 if (!url
) { return {}; }
8670 var query
= Utils
.parseUrlQuery(url
);
8671 var hash
= url
.split('#')[1];
8673 var path
= url
.split('#')[0].split('?')[0];
8683 // eslint-disable-next-line
8684 Router
.prototype.constructRouteUrl
= function constructRouteUrl (route
, ref
) {
8685 if ( ref
=== void 0 ) ref
= {};
8686 var params
= ref
.params
;
8687 var query
= ref
.query
;
8689 var path
= route
.path
;
8690 var toUrl
= pathToRegexp_1
.compile(path
);
8693 url
= toUrl(params
|| {});
8695 throw new Error(("Framework7: error constructing route URL from passed params:\nRoute: " + path
+ "\n" + (error
.toString())));
8699 if (typeof query
=== 'string') { url
+= "?" + query
; }
8700 else { url
+= "?" + (Utils
.serializeObject(query
)); }
8706 Router
.prototype.findTabRoute
= function findTabRoute (tabEl
) {
8708 var $tabEl
= $(tabEl
);
8709 var parentPath
= router
.currentRoute
.route
.parentPath
;
8710 var tabId
= $tabEl
.attr('id');
8711 var flattenedRoutes
= router
.flattenRoutes(router
.routes
);
8713 flattenedRoutes
.forEach(function (route
) {
8715 route
.parentPath
=== parentPath
8717 && route
.tab
.id
=== tabId
8719 foundTabRoute
= route
;
8722 return foundTabRoute
;
8725 Router
.prototype.findRouteByKey
= function findRouteByKey (key
, value
) {
8727 var routes
= router
.routes
;
8728 var flattenedRoutes
= router
.flattenRoutes(routes
);
8731 flattenedRoutes
.forEach(function (route
) {
8732 if (matchingRoute
) { return; }
8733 if (route
[key
] === value
) {
8734 matchingRoute
= route
;
8737 return matchingRoute
;
8740 Router
.prototype.findMatchingRoute
= function findMatchingRoute (url
) {
8741 if (!url
) { return undefined; }
8743 var routes
= router
.routes
;
8744 var flattenedRoutes
= router
.flattenRoutes(routes
);
8745 var ref
= router
.parseRouteUrl(url
);
8746 var path
= ref
.path
;
8747 var query
= ref
.query
;
8748 var hash
= ref
.hash
;
8749 var params
= ref
.params
;
8751 flattenedRoutes
.forEach(function (route
) {
8752 if (matchingRoute
) { return; }
8755 var pathsToMatch
= [route
.path
];
8757 if (typeof route
.alias
=== 'string') { pathsToMatch
.push(route
.alias
); }
8758 else if (Array
.isArray(route
.alias
)) {
8759 route
.alias
.forEach(function (aliasPath
) {
8760 pathsToMatch
.push(aliasPath
);
8766 pathsToMatch
.forEach(function (pathToMatch
) {
8767 if (matched
) { return; }
8768 matched
= pathToRegexp_1(pathToMatch
, keys
).exec(path
);
8772 keys
.forEach(function (keyObj
, index
) {
8773 if (typeof keyObj
.name
=== 'number') { return; }
8774 var paramValue
= matched
[index
+ 1];
8775 params
[keyObj
.name
] = paramValue
;
8779 if (route
.parentPath
) {
8780 parentPath
= path
.split('/').slice(0, route
.parentPath
.split('/').length
- 1).join('/');
8789 parentPath
: parentPath
,
8795 return matchingRoute
;
8798 // eslint-disable-next-line
8799 Router
.prototype.replaceRequestUrlParams
= function replaceRequestUrlParams (url
, options
) {
8800 if ( url
=== void 0 ) url
= '';
8801 if ( options
=== void 0 ) options
= {};
8803 var compiledUrl
= url
;
8804 if (typeof compiledUrl
=== 'string'
8805 && compiledUrl
.indexOf('{{') >= 0
8808 && options
.route
.params
8809 && Object
.keys(options
.route
.params
).length
8811 Object
.keys(options
.route
.params
).forEach(function (paramName
) {
8812 var regExp
= new RegExp(("{{" + paramName
+ "}}"), 'g');
8813 compiledUrl
= compiledUrl
.replace(regExp
, options
.route
.params
[paramName
] || '');
8819 Router
.prototype.removeFromXhrCache
= function removeFromXhrCache (url
) {
8821 var xhrCache
= router
.cache
.xhr
;
8823 for (var i
= 0; i
< xhrCache
.length
; i
+= 1) {
8824 if (xhrCache
[i
].url
=== url
) { index
= i
; }
8826 if (index
!== false) { xhrCache
.splice(index
, 1); }
8829 Router
.prototype.xhrRequest
= function xhrRequest (requestUrl
, options
) {
8831 var params
= router
.params
;
8832 var ignoreCache
= options
.ignoreCache
;
8833 var url
= requestUrl
;
8835 var hasQuery
= url
.indexOf('?') >= 0;
8836 if (params
.passRouteQueryToRequest
8839 && options
.route
.query
8840 && Object
.keys(options
.route
.query
).length
8842 url
+= "" + (hasQuery
? '&' : '?') + (Utils
.serializeObject(options
.route
.query
));
8846 if (params
.passRouteParamsToRequest
8849 && options
.route
.params
8850 && Object
.keys(options
.route
.params
).length
8852 url
+= "" + (hasQuery
? '&' : '?') + (Utils
.serializeObject(options
.route
.params
));
8856 if (url
.indexOf('{{') >= 0) {
8857 url
= router
.replaceRequestUrlParams(url
, options
);
8859 // should we ignore get params or not
8860 if (params
.xhrCacheIgnoreGetParameters
&& url
.indexOf('?') >= 0) {
8861 url
= url
.split('?')[0];
8863 return new Promise(function (resolve
, reject
) {
8864 if (params
.xhrCache
&& !ignoreCache
&& url
.indexOf('nocache') < 0 && params
.xhrCacheIgnore
.indexOf(url
) < 0) {
8865 for (var i
= 0; i
< router
.cache
.xhr
.length
; i
+= 1) {
8866 var cachedUrl
= router
.cache
.xhr
[i
];
8867 if (cachedUrl
.url
=== url
) {
8869 if (Utils
.now() - cachedUrl
.time
< params
.xhrCacheDuration
) {
8871 resolve(cachedUrl
.content
);
8877 router
.xhr
= router
.app
.request({
8880 beforeSend
: function beforeSend(xhr
) {
8881 router
.emit('routerAjaxStart', xhr
, options
);
8883 complete
: function complete(xhr
, status
) {
8884 router
.emit('routerAjaxComplete', xhr
);
8885 if ((status
!== 'error' && status
!== 'timeout' && (xhr
.status
>= 200 && xhr
.status
< 300)) || xhr
.status
=== 0) {
8886 if (params
.xhrCache
&& xhr
.responseText
!== '') {
8887 router
.removeFromXhrCache(url
);
8888 router
.cache
.xhr
.push({
8891 content
: xhr
.responseText
,
8894 router
.emit('routerAjaxSuccess', xhr
, options
);
8895 resolve(xhr
.responseText
);
8897 router
.emit('routerAjaxError', xhr
, options
);
8901 error
: function error(xhr
) {
8902 router
.emit('routerAjaxError', xhr
, options
);
8909 // Remove theme elements
8910 Router
.prototype.removeThemeElements
= function removeThemeElements (el
) {
8912 var theme
= router
.app
.theme
;
8913 $(el
).find(("." + (theme
=== 'md' ? 'ios' : 'md') + "-only, .if-" + (theme
=== 'md' ? 'ios' : 'md'))).remove();
8916 Router
.prototype.getPageData
= function getPageData (pageEl
, navbarEl
, from, to
, route
, pageFromEl
) {
8917 if ( route
=== void 0 ) route
= {};
8920 var $pageEl
= $(pageEl
).eq(0);
8921 var $navbarEl
= $(navbarEl
).eq(0);
8922 var currentPage
= $pageEl
[0].f7Page
|| {};
8925 if ((from === 'next' && to
=== 'current') || (from === 'current' && to
=== 'previous')) { direction
= 'forward'; }
8926 if ((from === 'current' && to
=== 'next') || (from === 'previous' && to
=== 'current')) { direction
= 'backward'; }
8927 if (currentPage
&& !currentPage
.fromPage
) {
8928 var $pageFromEl
= $(pageFromEl
);
8929 if ($pageFromEl
.length
) {
8930 pageFrom
= $pageFromEl
[0].f7Page
;
8933 pageFrom
= currentPage
.pageFrom
|| pageFrom
;
8934 if (pageFrom
&& pageFrom
.pageFrom
) {
8935 pageFrom
.pageFrom
= null;
8945 $navbarEl
: $navbarEl
,
8946 navbarEl
: $navbarEl
[0],
8947 name
: $pageEl
.attr('data-name'),
8951 direction
: direction
,
8952 route
: currentPage
.route
? currentPage
.route
: route
,
8956 $pageEl
[0].f7Page
= page
;
8961 Router
.prototype.pageCallback
= function pageCallback (callback
, pageEl
, navbarEl
, from, to
, options
, pageFromEl
) {
8962 if ( options
=== void 0 ) options
= {};
8964 if (!pageEl
) { return; }
8966 var $pageEl
= $(pageEl
);
8967 if (!$pageEl
.length
) { return; }
8968 var $navbarEl
= $(navbarEl
);
8969 var route
= options
.route
;
8970 var restoreScrollTopOnBack
= router
.params
.restoreScrollTopOnBack
8972 router
.params
.masterDetailBreakpoint
> 0
8973 && $pageEl
.hasClass('page-master')
8974 && router
.app
.width
>= router
.params
.masterDetailBreakpoint
8976 var keepAlive
= $pageEl
[0].f7Page
&& $pageEl
[0].f7Page
.route
&& $pageEl
[0].f7Page
.route
.route
&& $pageEl
[0].f7Page
.route
.route
.keepAlive
;
8978 if (callback
=== 'beforeRemove' && keepAlive
) {
8979 callback
= 'beforeUnmount'; // eslint-disable-line
8982 var camelName
= "page" + (callback
[0].toUpperCase() + callback
.slice(1, callback
.length
));
8983 var colonName
= "page:" + (callback
.toLowerCase());
8986 if (callback
=== 'beforeRemove' && $pageEl
[0].f7Page
) {
8987 page
= Utils
.extend($pageEl
[0].f7Page
, { from: from, to
: to
, position
: from });
8989 page
= router
.getPageData($pageEl
[0], $navbarEl
[0], from, to
, route
, pageFromEl
);
8991 page
.swipeBack
= !!options
.swipeBack
;
8993 var ref
= options
.route
? options
.route
.route
: {};
8994 var on
= ref
.on
; if ( on
=== void 0 ) on
= {};
8995 var once
= ref
.once
; if ( once
=== void 0 ) once
= {};
8997 Utils
.extend(on
, options
.on
);
9000 Utils
.extend(once
, options
.once
);
9003 function attachEvents() {
9004 if ($pageEl
[0].f7RouteEventsAttached
) { return; }
9005 $pageEl
[0].f7RouteEventsAttached
= true;
9006 if (on
&& Object
.keys(on
).length
> 0) {
9007 $pageEl
[0].f7RouteEventsOn
= on
;
9008 Object
.keys(on
).forEach(function (eventName
) {
9009 on
[eventName
] = on
[eventName
].bind(router
);
9010 $pageEl
.on(Utils
.eventNameToColonCase(eventName
), on
[eventName
]);
9013 if (once
&& Object
.keys(once
).length
> 0) {
9014 $pageEl
[0].f7RouteEventsOnce
= once
;
9015 Object
.keys(once
).forEach(function (eventName
) {
9016 once
[eventName
] = once
[eventName
].bind(router
);
9017 $pageEl
.once(Utils
.eventNameToColonCase(eventName
), once
[eventName
]);
9022 function detachEvents() {
9023 if (!$pageEl
[0].f7RouteEventsAttached
) { return; }
9024 if ($pageEl
[0].f7RouteEventsOn
) {
9025 Object
.keys($pageEl
[0].f7RouteEventsOn
).forEach(function (eventName
) {
9026 $pageEl
.off(Utils
.eventNameToColonCase(eventName
), $pageEl
[0].f7RouteEventsOn
[eventName
]);
9029 if ($pageEl
[0].f7RouteEventsOnce
) {
9030 Object
.keys($pageEl
[0].f7RouteEventsOnce
).forEach(function (eventName
) {
9031 $pageEl
.off(Utils
.eventNameToColonCase(eventName
), $pageEl
[0].f7RouteEventsOnce
[eventName
]);
9034 $pageEl
[0].f7RouteEventsAttached
= null;
9035 $pageEl
[0].f7RouteEventsOn
= null;
9036 $pageEl
[0].f7RouteEventsOnce
= null;
9037 delete $pageEl
[0].f7RouteEventsAttached
;
9038 delete $pageEl
[0].f7RouteEventsOn
;
9039 delete $pageEl
[0].f7RouteEventsOnce
;
9042 if (callback
=== 'mounted') {
9045 if (callback
=== 'init') {
9046 if (restoreScrollTopOnBack
&& (from === 'previous' || !from) && to
=== 'current' && router
.scrollHistory
[page
.route
.url
] && !$pageEl
.hasClass('no-restore-scroll')) {
9047 var $pageContent
= $pageEl
.find('.page-content');
9048 if ($pageContent
.length
> 0) {
9049 // eslint-disable-next-line
9050 $pageContent
= $pageContent
.filter(function (pageContentIndex
, pageContentEl
) {
9052 $(pageContentEl
).parents('.tab:not(.tab-active)').length
=== 0
9053 && !$(pageContentEl
).is('.tab:not(.tab-active)')
9057 $pageContent
.scrollTop(router
.scrollHistory
[page
.route
.url
]);
9060 if ($pageEl
[0].f7PageInitialized
) {
9061 $pageEl
.trigger('page:reinit', page
);
9062 router
.emit('pageReinit', page
);
9065 $pageEl
[0].f7PageInitialized
= true;
9067 if (restoreScrollTopOnBack
&& callback
=== 'beforeOut' && from === 'current' && to
=== 'previous') {
9068 // Save scroll position
9069 var $pageContent
$1 = $pageEl
.find('.page-content');
9070 if ($pageContent
$1.length
> 0) {
9071 // eslint-disable-next-line
9072 $pageContent
$1 = $pageContent
$1.filter(function (pageContentIndex
, pageContentEl
) {
9074 $(pageContentEl
).parents('.tab:not(.tab-active)').length
=== 0
9075 && !$(pageContentEl
).is('.tab:not(.tab-active)')
9079 router
.scrollHistory
[page
.route
.url
] = $pageContent
$1.scrollTop();
9081 if (restoreScrollTopOnBack
&& callback
=== 'beforeOut' && from === 'current' && to
=== 'next') {
9082 // Delete scroll position
9083 delete router
.scrollHistory
[page
.route
.url
];
9086 $pageEl
.trigger(colonName
, page
);
9087 router
.emit(camelName
, page
);
9089 if (callback
=== 'beforeRemove' || callback
=== 'beforeUnmount') {
9092 if ($pageEl
[0].f7Page
&& $pageEl
[0].f7Page
.navbarEl
) {
9093 delete $pageEl
[0].f7Page
.navbarEl
.f7Page
;
9095 $pageEl
[0].f7Page
= null;
9100 Router
.prototype.saveHistory
= function saveHistory () {
9102 router
.view
.history
= router
.history
;
9103 if (router
.params
.pushState
) {
9104 win
.localStorage
[("f7router-" + (router
.view
.id
) + "-history")] = JSON
.stringify(router
.history
);
9108 Router
.prototype.restoreHistory
= function restoreHistory () {
9110 if (router
.params
.pushState
&& win
.localStorage
[("f7router-" + (router
.view
.id
) + "-history")]) {
9111 router
.history
= JSON
.parse(win
.localStorage
[("f7router-" + (router
.view
.id
) + "-history")]);
9112 router
.view
.history
= router
.history
;
9116 Router
.prototype.clearHistory
= function clearHistory () {
9118 router
.history
= [];
9119 if (router
.view
) { router
.view
.history
= []; }
9120 router
.saveHistory();
9123 Router
.prototype.updateCurrentUrl
= function updateCurrentUrl (newUrl
) {
9125 appRouterCheck(router
, 'updateCurrentUrl');
9127 if (router
.history
.length
) {
9128 router
.history
[router
.history
.length
- 1] = newUrl
;
9130 router
.history
.push(newUrl
);
9133 // Update current route params
9134 var ref
= router
.parseRouteUrl(newUrl
);
9135 var query
= ref
.query
;
9136 var hash
= ref
.hash
;
9137 var params
= ref
.params
;
9139 var path
= ref
.path
;
9140 if (router
.currentRoute
) {
9141 Utils
.extend(router
.currentRoute
, {
9150 if (router
.params
.pushState
) {
9151 var pushStateRoot
= router
.params
.pushStateRoot
|| '';
9157 pushStateRoot
+ router
.params
.pushStateSeparator
+ newUrl
9162 router
.saveHistory();
9164 router
.emit('routeUrlUpdate', router
.currentRoute
, router
);
9167 Router
.prototype.init
= function init () {
9169 var app
= router
.app
;
9170 var view
= router
.view
;
9175 (view
&& router
.params
.iosSwipeBack
&& app
.theme
=== 'ios')
9176 || (view
&& router
.params
.mdSwipeBack
&& app
.theme
=== 'md')
9182 // Dynamic not separated navbbar
9183 if (router
.dynamicNavbar
&& !router
.separateNavbar
) {
9184 router
.$el
.addClass('router-dynamic-navbar-inside');
9187 var initUrl
= router
.params
.url
;
9188 var documentUrl
= doc
.location
.href
.split(doc
.location
.origin
)[1];
9189 var historyRestored
;
9190 var ref
= router
.params
;
9191 var pushState
= ref
.pushState
;
9192 var pushStateOnLoad
= ref
.pushStateOnLoad
;
9193 var pushStateSeparator
= ref
.pushStateSeparator
;
9194 var pushStateAnimateOnLoad
= ref
.pushStateAnimateOnLoad
;
9195 var ref
$1 = router
.params
;
9196 var pushStateRoot
= ref
$1.pushStateRoot
;
9197 if (win
.cordova
&& pushState
&& !pushStateSeparator
&& !pushStateRoot
&& doc
.location
.pathname
.indexOf('index.html')) {
9198 // eslint-disable-next-line
9199 console
.warn('Framework7: wrong or not complete pushState configuration, trying to guess pushStateRoot');
9200 pushStateRoot
= doc
.location
.pathname
.split('index.html')[0];
9203 if (!pushState
|| !pushStateOnLoad
) {
9205 initUrl
= documentUrl
;
9207 if (doc
.location
.search
&& initUrl
.indexOf('?') < 0) {
9208 initUrl
+= doc
.location
.search
;
9210 if (doc
.location
.hash
&& initUrl
.indexOf('#') < 0) {
9211 initUrl
+= doc
.location
.hash
;
9214 if (pushStateRoot
&& documentUrl
.indexOf(pushStateRoot
) >= 0) {
9215 documentUrl
= documentUrl
.split(pushStateRoot
)[1];
9216 if (documentUrl
=== '') { documentUrl
= '/'; }
9218 if (pushStateSeparator
.length
> 0 && documentUrl
.indexOf(pushStateSeparator
) >= 0) {
9219 initUrl
= documentUrl
.split(pushStateSeparator
)[1];
9221 initUrl
= documentUrl
;
9223 router
.restoreHistory();
9224 if (router
.history
.indexOf(initUrl
) >= 0) {
9225 router
.history
= router
.history
.slice(0, router
.history
.indexOf(initUrl
) + 1);
9226 } else if (router
.params
.url
=== initUrl
) {
9227 router
.history
= [initUrl
];
9228 } else if (History
.state
&& History
.state
[view
.id
] && History
.state
[view
.id
].url
=== router
.history
[router
.history
.length
- 1]) {
9229 initUrl
= router
.history
[router
.history
.length
- 1];
9231 router
.history
= [documentUrl
.split(pushStateSeparator
)[0] || '/', initUrl
];
9233 if (router
.history
.length
> 1) {
9234 historyRestored
= true;
9236 router
.history
= [];
9238 router
.saveHistory();
9241 if (router
.history
.length
> 1) {
9243 currentRoute
= router
.findMatchingRoute(router
.history
[0]);
9244 if (!currentRoute
) {
9245 currentRoute
= Utils
.extend(router
.parseRouteUrl(router
.history
[0]), {
9247 url
: router
.history
[0],
9248 path
: router
.history
[0].split('?')[0],
9254 currentRoute
= router
.findMatchingRoute(initUrl
);
9255 if (!currentRoute
) {
9256 currentRoute
= Utils
.extend(router
.parseRouteUrl(initUrl
), {
9259 path
: initUrl
.split('?')[0],
9265 if (router
.params
.stackPages
) {
9266 router
.$el
.children('.page').each(function (index
, pageEl
) {
9267 var $pageEl
= $(pageEl
);
9268 router
.initialPages
.push($pageEl
[0]);
9269 if (router
.separateNavbar
&& $pageEl
.children('.navbar').length
> 0) {
9270 router
.initialNavbars
.push($pageEl
.children('.navbar').find('.navbar-inner')[0]);
9275 if (router
.$el
.children('.page:not(.stacked)').length
=== 0 && initUrl
) {
9276 // No pages presented in DOM, reload new page
9277 router
.navigate(initUrl
, {
9279 reloadCurrent
: true,
9283 // Init current DOM page
9285 router
.currentRoute
= currentRoute
;
9286 router
.$el
.children('.page:not(.stacked)').each(function (index
, pageEl
) {
9287 var $pageEl
= $(pageEl
);
9289 $pageEl
.addClass('page-current');
9290 if (router
.separateNavbar
) {
9291 $navbarInnerEl
= $pageEl
.children('.navbar').children('.navbar-inner');
9292 if ($navbarInnerEl
.length
> 0) {
9293 if (!router
.$navbarEl
.parents(doc
).length
) {
9294 router
.$el
.prepend(router
.$navbarEl
);
9296 $navbarInnerEl
.addClass('navbar-current');
9297 router
.$navbarEl
.append($navbarInnerEl
);
9298 if ($navbarInnerEl
.children('.title-large').length
) {
9299 $navbarInnerEl
.addClass('navbar-inner-large');
9301 $pageEl
.children('.navbar').remove();
9303 router
.$navbarEl
.addClass('navbar-hidden');
9304 if ($navbarInnerEl
.children('.title-large').length
) {
9305 router
.$navbarEl
.addClass('navbar-hidden navbar-large-hidden');
9309 if (router
.currentRoute
&& router
.currentRoute
.route
&& router
.currentRoute
.route
.master
&& router
.params
.masterDetailBreakpoint
> 0) {
9310 $pageEl
.addClass('page-master');
9311 $pageEl
.trigger('page:role', { role
: 'master' });
9312 if ($navbarInnerEl
&& $navbarInnerEl
.length
) {
9313 $navbarInnerEl
.addClass('navbar-master');
9317 route
: router
.currentRoute
,
9319 if (router
.currentRoute
&& router
.currentRoute
.route
&& router
.currentRoute
.route
.options
) {
9320 Utils
.extend(initOptions
, router
.currentRoute
.route
.options
);
9322 router
.currentPageEl
= $pageEl
[0];
9323 if (router
.separateNavbar
&& $navbarInnerEl
.length
) {
9324 router
.currentNavbarEl
= $navbarInnerEl
[0];
9326 router
.removeThemeElements($pageEl
);
9327 if (router
.separateNavbar
&& $navbarInnerEl
.length
) {
9328 router
.removeThemeElements($navbarInnerEl
);
9330 if (initOptions
.route
.route
.tab
) {
9332 router
.tabLoad(initOptions
.route
.route
.tab
, Utils
.extend({}, initOptions
));
9334 router
.pageCallback('init', $pageEl
, $navbarInnerEl
, 'current', undefined, initOptions
);
9336 if (historyRestored
) {
9337 router
.navigate(initUrl
, {
9341 animate
: pushStateAnimateOnLoad
,
9343 pageAfterIn
: function pageAfterIn() {
9344 if (router
.history
.length
> 2) {
9345 router
.back({ preload
: true });
9351 if (!historyRestored
&& !hasTabRoute
) {
9352 router
.history
.push(initUrl
);
9353 router
.saveHistory();
9356 if (initUrl
&& pushState
&& pushStateOnLoad
&& (!History
.state
|| !History
.state
[view
.id
])) {
9357 History
.initViewState(view
.id
, {
9361 router
.emit('local::init routerInit', router
);
9364 Router
.prototype.destroy
= function destroy () {
9367 router
.emit('local::destroy routerDestroy', router
);
9369 // Delete props & methods
9370 Object
.keys(router
).forEach(function (routerProp
) {
9371 router
[routerProp
] = null;
9372 delete router
[routerProp
];
9379 }(Framework7Class
));
9382 Router
.prototype.forward
= forward
;
9383 Router
.prototype.load
= load
;
9384 Router
.prototype.navigate
= navigate
;
9385 Router
.prototype.refreshPage
= refreshPage
;
9387 Router
.prototype.tabLoad
= tabLoad
;
9388 Router
.prototype.tabRemove
= tabRemove
;
9390 Router
.prototype.modalLoad
= modalLoad
;
9391 Router
.prototype.modalRemove
= modalRemove
;
9393 Router
.prototype.backward
= backward
;
9394 Router
.prototype.loadBack
= loadBack
;
9395 Router
.prototype.back
= back
;
9396 // Clear previoius pages from the DOM
9397 Router
.prototype.clearPreviousPages
= clearPreviousPages
;
9399 Router
.prototype.clearPreviousHistory
= clearPreviousHistory
;
9413 create
: function create() {
9414 var instance
= this;
9417 if (instance
.params
.router
) {
9418 instance
.router
= new Router(instance
.app
, instance
);
9422 instance
.router
= new Router(instance
);
9427 var View
= /*@__PURE__*/(function (Framework7Class
$$1) {
9428 function View(appInstance
, el
, viewParams
) {
9429 if ( viewParams
=== void 0 ) viewParams
= {};
9431 Framework7Class
$$1.call(this, viewParams
, [appInstance
]);
9433 var app
= appInstance
;
9442 // Default View params
9443 view
.params
= Utils
.extend(defaults
, app
.params
.view
, viewParams
);
9446 if (view
.params
.routes
.length
> 0) {
9447 view
.routes
= view
.params
.routes
;
9449 view
.routes
= [].concat(app
.routes
, view
.params
.routesAdd
);
9454 if (typeof el
=== 'string') { selector
= el
; }
9456 // Supposed to be HTMLElement or Dom7
9457 selector
= ($el
.attr('id') ? ("#" + ($el
.attr('id'))) : '') + ($el
.attr('class') ? ("." + ($el
.attr('class').replace(/ /g
, '.').replace('.active', ''))) : '');
9462 if (app
.theme
=== 'ios' && view
.params
.iosDynamicNavbar
&& view
.params
.iosSeparateDynamicNavbar
) {
9463 $navbarEl
= $el
.children('.navbar').eq(0);
9464 if ($navbarEl
.length
=== 0) {
9465 $navbarEl
= $('<div class="navbar"></div>');
9470 Utils
.extend(false, view
, {
9474 name
: view
.params
.name
,
9475 main
: view
.params
.main
|| $el
.hasClass('view-main'),
9476 $navbarEl
: $navbarEl
,
9477 navbarEl
: $navbarEl
? $navbarEl
[0] : undefined,
9484 $el
[0].f7View
= view
;
9490 app
.views
.push(view
);
9492 app
.views
.main
= view
;
9495 app
.views
[view
.name
] = view
;
9499 view
.index
= app
.views
.indexOf(view
);
9504 viewId
= "view_" + (view
.name
);
9505 } else if (view
.main
) {
9506 viewId
= 'view_main';
9508 viewId
= "view_" + (view
.index
);
9513 if (app
.initialized
) {
9516 app
.on('init', function () {
9524 if ( Framework7Class
$$1 ) View
.__proto__
= Framework7Class
$$1;
9525 View
.prototype = Object
.create( Framework7Class
$$1 && Framework7Class
$$1.prototype );
9526 View
.prototype.constructor = View
;
9528 View
.prototype.destroy
= function destroy () {
9532 view
.$el
.trigger('view:beforedestroy', view
);
9533 view
.emit('local::beforeDestroy viewBeforeDestroy', view
);
9535 app
.off('resize', view
.checkmasterDetailBreakpoint
);
9538 app
.views
.main
= null;
9539 delete app
.views
.main
;
9540 } else if (view
.name
) {
9541 app
.views
[view
.name
] = null;
9542 delete app
.views
[view
.name
];
9544 view
.$el
[0].f7View
= null;
9545 delete view
.$el
[0].f7View
;
9547 app
.views
.splice(app
.views
.indexOf(view
), 1);
9550 if (view
.params
.router
&& view
.router
) {
9551 view
.router
.destroy();
9554 view
.emit('local::destroy viewDestroy', view
);
9556 // Delete props & methods
9557 Object
.keys(view
).forEach(function (viewProp
) {
9558 view
[viewProp
] = null;
9559 delete view
[viewProp
];
9565 View
.prototype.checkmasterDetailBreakpoint
= function checkmasterDetailBreakpoint () {
9568 var wasMasterDetail
= view
.$el
.hasClass('view-master-detail');
9569 if (app
.width
>= view
.params
.masterDetailBreakpoint
) {
9570 view
.$el
.addClass('view-master-detail');
9571 if (!wasMasterDetail
) {
9572 view
.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint');
9573 view
.$el
.trigger('view:masterDetailBreakpoint', view
);
9576 view
.$el
.removeClass('view-master-detail');
9577 if (wasMasterDetail
) {
9578 view
.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint');
9579 view
.$el
.trigger('view:masterDetailBreakpoint', view
);
9584 View
.prototype.initMasterDetail
= function initMasterDetail () {
9587 view
.checkmasterDetailBreakpoint
= view
.checkmasterDetailBreakpoint
.bind(view
);
9588 view
.checkmasterDetailBreakpoint();
9589 app
.on('resize', view
.checkmasterDetailBreakpoint
);
9592 View
.prototype.init
= function init () {
9594 if (view
.params
.router
) {
9595 if (view
.params
.masterDetailBreakpoint
> 0) {
9596 view
.initMasterDetail();
9599 view
.$el
.trigger('view:init', view
);
9600 view
.emit('local::init viewInit', view
);
9605 }(Framework7Class
));
9610 function initClicks(app
) {
9611 function handleClicks(e
) {
9612 var $clickedEl
= $(e
.target
);
9613 var $clickedLinkEl
= $clickedEl
.closest('a');
9614 var isLink
= $clickedLinkEl
.length
> 0;
9615 var url
= isLink
&& $clickedLinkEl
.attr('href');
9616 var isTabLink
= isLink
&& $clickedLinkEl
.hasClass('tab-link') && ($clickedLinkEl
.attr('data-tab') || (url
&& url
.indexOf('#') === 0));
9618 // Check if link is external
9620 // eslint-disable-next-line
9621 if ($clickedLinkEl
.is(app
.params
.clicks
.externalLinks
) || (url
&& url
.indexOf('javascript:') >= 0)) {
9622 var target
= $clickedLinkEl
.attr('target');
9626 && win
.cordova
.InAppBrowser
9627 && (target
=== '_system' || target
=== '_blank')
9630 win
.cordova
.InAppBrowser
.open(url
, target
);
9637 Object
.keys(app
.modules
).forEach(function (moduleName
) {
9638 var moduleClicks
= app
.modules
[moduleName
].clicks
;
9639 if (!moduleClicks
) { return; }
9640 Object
.keys(moduleClicks
).forEach(function (clickSelector
) {
9641 var matchingClickedElement
= $clickedEl
.closest(clickSelector
).eq(0);
9642 if (matchingClickedElement
.length
> 0) {
9643 moduleClicks
[clickSelector
].call(app
, matchingClickedElement
, matchingClickedElement
.dataset(), e
);
9650 var clickedLinkData
= {};
9653 clickedLinkData
= $clickedLinkEl
.dataset();
9657 if ($clickedLinkEl
.hasClass('prevent-router') || $clickedLinkEl
.hasClass('router-prevent')) { return; }
9659 var validUrl
= url
&& url
.length
> 0 && url
!== '#' && !isTabLink
;
9660 if (validUrl
|| $clickedLinkEl
.hasClass('back')) {
9662 if (clickedLinkData
.view
) {
9663 view
= $(clickedLinkData
.view
)[0].f7View
;
9665 view
= $clickedEl
.parents('.view')[0] && $clickedEl
.parents('.view')[0].f7View
;
9666 if (!$clickedLinkEl
.hasClass('back') && view
&& view
.params
.linksView
) {
9667 if (typeof view
.params
.linksView
=== 'string') { view
= $(view
.params
.linksView
)[0].f7View
; }
9668 else if (view
.params
.linksView
instanceof View
) { view
= view
.params
.linksView
; }
9672 if (app
.views
.main
) { view
= app
.views
.main
; }
9674 if (!view
|| !view
.router
) { return; }
9675 if (clickedLinkData
.context
&& typeof clickedLinkData
.context
=== 'string') {
9677 clickedLinkData
.context
= JSON
.parse(clickedLinkData
.context
);
9679 // something wrong there
9682 if ($clickedLinkEl
[0].f7RouteProps
) {
9683 clickedLinkData
.props
= $clickedLinkEl
[0].f7RouteProps
;
9685 if ($clickedLinkEl
.hasClass('back')) { view
.router
.back(url
, clickedLinkData
); }
9686 else { view
.router
.navigate(url
, clickedLinkData
); }
9690 app
.on('click', handleClicks
);
9692 // TODO: check if need this in iOS
9693 // Prevent scrolling on overlays
9694 // function preventScrolling(e) {
9695 // e.preventDefault();
9697 // if (Support.touch && !Device.android) {
9698 // const activeListener = Support.passiveListener ? { passive: false, capture: false } : false;
9699 // $(document).on((app.params.touch.fastClicks ? 'touchstart' : 'touchmove'), '.panel-backdrop, .dialog-backdrop, .preloader-backdrop, .popup-backdrop, .searchbar-backdrop', preventScrolling, activeListener);
9702 var ClicksModule
= {
9707 externalLinks
: '.external',
9711 init
: function init() {
9718 var RouterTemplateLoaderModule
= {
9719 name
: 'routerTemplateLoader',
9721 templateLoader
: function templateLoader(template
, templateUrl
, options
, resolve
, reject
) {
9723 function compile(t
) {
9727 context
= options
.context
|| {};
9728 if (typeof context
=== 'function') { context
= context
.call(router
); }
9729 else if (typeof context
=== 'string') {
9731 context
= JSON
.parse(context
);
9737 if (typeof t
=== 'function') {
9738 compiledHtml
= t(context
);
9740 compiledHtml
= Template7
.compile(t
)(Utils
.extend({}, context
|| {}, {
9742 $root
: Utils
.extend({}, router
.app
.data
, router
.app
.methods
),
9743 $route
: options
.route
,
9744 $f7route
: options
.route
,
9748 ios
: router
.app
.theme
=== 'ios',
9749 md
: router
.app
.theme
=== 'md',
9757 resolve(compiledHtml
, { context
: context
});
9766 .xhrRequest(templateUrl
, options
)
9767 .then(function (templateContent
) {
9768 compile(templateContent
);
9770 .catch(function () {
9778 modalTemplateLoader
: function modalTemplateLoader(template
, templateUrl
, options
, resolve
, reject
) {
9780 return router
.templateLoader(template
, templateUrl
, options
, function (html
) {
9785 tabTemplateLoader
: function tabTemplateLoader(template
, templateUrl
, options
, resolve
, reject
) {
9787 return router
.templateLoader(template
, templateUrl
, options
, function (html
) {
9792 pageTemplateLoader
: function pageTemplateLoader(template
, templateUrl
, options
, resolve
, reject
) {
9794 return router
.templateLoader(template
, templateUrl
, options
, function (html
, newOptions
) {
9795 if ( newOptions
=== void 0 ) newOptions
= {};
9797 resolve(router
.getPageEl(html
), newOptions
);
9803 var RouterComponentLoaderModule
= {
9804 name
: 'routerComponentLoader',
9806 componentLoader
: function componentLoader(component
, componentUrl
, options
, resolve
, reject
) {
9807 if ( options
=== void 0 ) options
= {};
9810 var app
= router
.app
;
9811 var url
= typeof component
=== 'string' ? component
: componentUrl
;
9812 var compiledUrl
= router
.replaceRequestUrlParams(url
, options
);
9813 function compile(componentOptions
) {
9814 var context
= options
.context
|| {};
9815 if (typeof context
=== 'function') { context
= context
.call(router
); }
9816 else if (typeof context
=== 'string') {
9818 context
= JSON
.parse(context
);
9824 var extendContext
= Utils
.merge(
9828 $route
: options
.route
,
9829 $f7route
: options
.route
,
9833 ios
: app
.theme
=== 'ios',
9834 md
: app
.theme
=== 'md',
9838 var createdComponent
= app
.component
.create(componentOptions
, extendContext
);
9839 resolve(createdComponent
.el
);
9841 var cachedComponent
;
9843 router
.cache
.components
.forEach(function (cached
) {
9844 if (cached
.url
=== compiledUrl
) { cachedComponent
= cached
.component
; }
9847 if (compiledUrl
&& cachedComponent
) {
9848 compile(cachedComponent
);
9849 } else if (compiledUrl
&& !cachedComponent
) {
9856 .xhrRequest(url
, options
)
9857 .then(function (loadedComponent
) {
9858 var parsedComponent
= app
.component
.parse(loadedComponent
);
9859 router
.cache
.components
.push({
9861 component
: parsedComponent
,
9863 compile(parsedComponent
);
9865 .catch(function (err
) {
9874 modalComponentLoader
: function modalComponentLoader(rootEl
, component
, componentUrl
, options
, resolve
, reject
) {
9876 router
.componentLoader(component
, componentUrl
, options
, function (el
) {
9881 tabComponentLoader
: function tabComponentLoader(tabEl
, component
, componentUrl
, options
, resolve
, reject
) {
9883 router
.componentLoader(component
, componentUrl
, options
, function (el
) {
9888 pageComponentLoader
: function pageComponentLoader(routerEl
, component
, componentUrl
, options
, resolve
, reject
) {
9890 router
.componentLoader(component
, componentUrl
, options
, function (el
, newOptions
) {
9891 if ( newOptions
=== void 0 ) newOptions
= {};
9893 resolve(el
, newOptions
);
9899 var HistoryModule
= {
9905 init
: function init() {
9911 var keyPrefix
= 'f7storage-';
9913 get: function get(key
) {
9914 return new Promise(function (resolve
, reject
) {
9916 var value
= JSON
.parse(win
.localStorage
.getItem(("" + keyPrefix
+ key
)));
9923 set: function set(key
, value
) {
9924 return new Promise(function (resolve
, reject
) {
9926 win
.localStorage
.setItem(("" + keyPrefix
+ key
), JSON
.stringify(value
));
9933 remove
: function remove(key
) {
9934 return new Promise(function (resolve
, reject
) {
9936 win
.localStorage
.removeItem(("" + keyPrefix
+ key
));
9943 clear
: function clear() {
9946 length
: function length() {
9949 keys
: function keys() {
9950 return new Promise(function (resolve
, reject
) {
9952 var keys
= Object
.keys(win
.localStorage
)
9953 .filter(function (keyName
) { return keyName
.indexOf(keyPrefix
) === 0; })
9954 .map(function (keyName
) { return keyName
.replace(keyPrefix
, ''); });
9961 forEach
: function forEach(callback
) {
9962 return new Promise(function (resolve
, reject
) {
9964 Object
.keys(win
.localStorage
)
9965 .filter(function (keyName
) { return keyName
.indexOf(keyPrefix
) === 0; })
9966 .forEach(function (keyName
, index
) {
9967 var key
= keyName
.replace(keyPrefix
, '');
9968 Storage
.get(key
).then(function (value
) {
9969 callback(key
, value
, index
);
9980 var StorageModule
= {
9988 function vnode(sel
, data
, children
, text
, elm
) {
9989 var key
= data
=== undefined ? undefined : data
.key
;
9990 return { sel
: sel
, data
: data
, children
: children
,
9991 text
: text
, elm
: elm
, key
: key
};
9994 var array
= Array
.isArray
;
9995 function primitive(s
) {
9996 return typeof s
=== 'string' || typeof s
=== 'number';
9999 function addNS(data
, children
, sel
) {
10000 data
.ns
= 'http://www.w3.org/2000/svg';
10001 if (sel
!== 'foreignObject' && children
!== undefined) {
10002 for (var i
= 0; i
< children
.length
; ++i
) {
10003 var childData
= children
[i
].data
;
10004 if (childData
!== undefined) {
10005 addNS(childData
, children
[i
].children
, children
[i
].sel
);
10010 function h(sel
, b
, c
) {
10011 var data
= {}, children
, text
, i
;
10012 if (c
!== undefined) {
10017 else if (primitive(c
)) {
10020 else if (c
&& c
.sel
) {
10024 else if (b
!== undefined) {
10028 else if (primitive(b
)) {
10031 else if (b
&& b
.sel
) {
10038 if (array(children
)) {
10039 for (i
= 0; i
< children
.length
; ++i
) {
10040 if (primitive(children
[i
]))
10041 { children
[i
] = vnode(undefined, undefined, undefined, children
[i
], undefined); }
10044 if (sel
[0] === 's' && sel
[1] === 'v' && sel
[2] === 'g' &&
10045 (sel
.length
=== 3 || sel
[3] === '.' || sel
[3] === '#')) {
10046 addNS(data
, children
, sel
);
10048 return vnode(sel
, data
, children
, text
, undefined);
10051 /* eslint no-use-before-define: "off" */
10053 var selfClosing
= 'area base br col command embed hr img input keygen link menuitem meta param source track wbr'.split(' ');
10054 var propsAttrs
= 'hidden checked disabled readonly selected autocomplete autofocus autoplay required multiple value'.split(' ');
10055 var booleanProps
= 'hidden checked disabled readonly selected autocomplete autofocus autoplay required multiple readOnly'.split(' ');
10056 var tempDom
= doc
.createElement('div');
10058 function getHooks(data
, app
, initial
, isRoot
) {
10060 if (!data
|| !data
.attrs
|| !data
.attrs
.class) { return hooks
; }
10061 var classNames
= data
.attrs
.class;
10065 var postpatch
= [];
10066 classNames
.split(' ').forEach(function (className
) {
10068 insert
.push
.apply(insert
, app
.getVnodeHooks('insert', className
));
10070 destroy
.push
.apply(destroy
, app
.getVnodeHooks('destroy', className
));
10071 update
.push
.apply(update
, app
.getVnodeHooks('update', className
));
10072 postpatch
.push
.apply(postpatch
, app
.getVnodeHooks('postpatch', className
));
10075 if (isRoot
&& !initial
) {
10076 postpatch
.push(function (oldVnode
, vnode
) {
10077 var vn
= vnode
|| oldVnode
;
10078 if (!vn
) { return; }
10079 if (vn
.data
&& vn
.data
.context
&& vn
.data
.context
.$options
.updated
) {
10080 vn
.data
.context
.$options
.updated();
10084 if (insert
.length
=== 0 && destroy
.length
=== 0 && update
.length
=== 0 && postpatch
.length
=== 0) {
10087 if (insert
.length
) {
10088 hooks
.insert = function (vnode
) {
10089 insert
.forEach(function (f
) { return f(vnode
); });
10092 if (destroy
.length
) {
10093 hooks
.destroy = function (vnode
) {
10094 destroy
.forEach(function (f
) { return f(vnode
); });
10097 if (update
.length
) {
10098 hooks
.update = function (oldVnode
, vnode
) {
10099 update
.forEach(function (f
) { return f(oldVnode
, vnode
); });
10102 if (postpatch
.length
) {
10103 hooks
.postpatch = function (oldVnode
, vnode
) {
10104 postpatch
.forEach(function (f
) { return f(oldVnode
, vnode
); });
10110 function getEventHandler(handlerString
, context
, ref
) {
10111 if ( ref
=== void 0 ) ref
= {};
10112 var stop
= ref
.stop
;
10113 var prevent
= ref
.prevent
;
10114 var once
= ref
.once
;
10120 var customArgs
= [];
10121 var needMethodBind
= true;
10123 if (handlerString
.indexOf('(') < 0) {
10124 methodName
= handlerString
;
10126 methodName
= handlerString
.split('(')[0];
10128 if (methodName
.indexOf('.') >= 0) {
10129 methodName
.split('.').forEach(function (path
, pathIndex
) {
10130 if (pathIndex
=== 0 && path
=== 'this') { return; }
10131 if (pathIndex
=== 0 && path
=== 'window') {
10132 // eslint-disable-next-line
10134 needMethodBind
= false;
10137 if (!method
) { method
= context
; }
10138 if (method
[path
]) { method
= method
[path
]; }
10140 throw new Error(("Framework7: Component doesn't have method \"" + (methodName
.split('.').slice(0, pathIndex
+ 1).join('.')) + "\""));
10144 if (!context
[methodName
]) {
10145 throw new Error(("Framework7: Component doesn't have method \"" + methodName
+ "\""));
10147 method
= context
[methodName
];
10149 if (needMethodBind
) {
10150 method
= method
.bind(context
);
10153 function handler() {
10154 var args
= [], len
= arguments
.length
;
10155 while ( len
-- ) args
[ len
] = arguments
[ len
];
10158 if (once
&& fired
) { return; }
10159 if (stop
) { e
.stopPropagation(); }
10160 if (prevent
) { e
.preventDefault(); }
10163 if (handlerString
.indexOf('(') < 0) {
10166 handlerString
.split('(')[1].split(')')[0].split(',').forEach(function (argument
) {
10167 var arg
= argument
.trim();
10168 // eslint-disable-next-line
10169 if (!isNaN(arg
)) { arg
= parseFloat(arg
); }
10170 else if (arg
=== 'true') { arg
= true; }
10171 else if (arg
=== 'false') { arg
= false; }
10172 else if (arg
=== 'null') { arg
= null; }
10173 else if (arg
=== 'undefined') { arg
= undefined; }
10174 else if (arg
[0] === '"') { arg
= arg
.replace(/"/g, ''); }
10175 else if (arg[0] === '\'') { arg = arg.replace(/'/g, ''); }
10176 else if (arg.indexOf('.') > 0) {
10178 arg.split('.').forEach(function (path) {
10179 if (!deepArg) { deepArg = context; }
10180 deepArg = deepArg[path];
10184 arg = context[arg];
10186 customArgs.push(arg);
10190 method.apply(void 0, customArgs);
10196 function getData(el, context, app, initial, isRoot) {
10200 var attributes = el.attributes;
10201 Array.prototype.forEach.call(attributes, function (attr) {
10202 var attrName = attr.name;
10203 var attrValue = attr.value;
10204 if (propsAttrs.indexOf(attrName) >= 0) {
10206 if (!data.props) { data.props = {}; }
10207 if (attrName === 'readonly') {
10208 attrName = 'readOnly';
10210 if (booleanProps.indexOf(attrName) >= 0) {
10211 // eslint-disable-next-line
10212 data.props[attrName] = attrValue === false ? false : true;
10214 data.props[attrName] = attrValue;
10216 } else if (attrName === 'key') {
10218 data.key = attrValue;
10219 } else if (attrName.indexOf('@') === 0) {
10221 if (!data.on) { data.on = {}; }
10222 var eventName = attrName.substr(1);
10224 var prevent = false;
10226 if (eventName.indexOf('.') >= 0) {
10227 eventName.split('.').forEach(function (eventNamePart, eventNameIndex) {
10228 if (eventNameIndex === 0) { eventName = eventNamePart; }
10230 if (eventNamePart === 'stop') { stop = true; }
10231 if (eventNamePart === 'prevent') { prevent = true; }
10232 if (eventNamePart === 'once') { once = true; }
10236 data.on[eventName] = getEventHandler(attrValue, context, { stop: stop, prevent: prevent, once: once });
10237 } else if (attrName === 'style') {
10239 if (attrValue.indexOf('{') >= 0 && attrValue.indexOf('}') >= 0) {
10241 data.style = JSON.parse(attrValue);
10243 if (!data.attrs) { data.attrs = {}; }
10244 data.attrs.style = attrValue;
10247 if (!data.attrs) { data.attrs = {}; }
10248 data.attrs.style = attrValue;
10251 // Rest of attribures
10252 if (!data.attrs) { data.attrs = {}; }
10253 data.attrs[attrName] = attrValue;
10256 if (attrName === 'id' && !data.key && !isRoot) {
10257 data.key = attrValue;
10261 var hooks = getHooks(data, app, initial, isRoot);
10262 hooks.prepatch = function (oldVnode, vnode) {
10263 if (!oldVnode || !vnode) { return; }
10264 if (oldVnode && oldVnode.data && oldVnode.data.props) {
10265 Object.keys(oldVnode.data.props).forEach(function (key) {
10266 if (booleanProps.indexOf(key) < 0) { return; }
10267 if (!vnode.data) { vnode.data = {}; }
10268 if (!vnode.data.props) { vnode.data.props = {}; }
10269 if (oldVnode.data.props[key] === true && !(key in vnode.data.props)) {
10270 vnode.data.props[key] = false;
10281 function getChildren(el, context, app, initial) {
10283 var nodes = el.childNodes;
10284 for (var i = 0; i < nodes.length; i += 1) {
10285 var childNode = nodes[i];
10286 var child = elementToVNode(childNode, context, app, initial);
10288 children.push(child);
10294 function elementToVNode(el, context, app, initial, isRoot) {
10295 if (el.nodeType === 1) {
10297 var tagName = el.nodeName.toLowerCase();
10300 getData(el, context, app, initial, isRoot),
10301 selfClosing.indexOf(tagName) >= 0 ? [] : getChildren(el, context, app, initial)
10304 if (el.nodeType === 3) {
10306 return el.textContent;
10311 function vdom (html, context, app, initial) {
10312 if ( html === void 0 ) html = '';
10314 // Save to temp dom
10315 tempDom.innerHTML = html.trim();
10319 for (var i = 0; i < tempDom.childNodes.length; i += 1) {
10320 if (!rootEl && tempDom.childNodes[i].nodeType === 1) {
10321 rootEl = tempDom.childNodes[i];
10324 var result = elementToVNode(rootEl, context, app, initial, true);
10327 tempDom.innerHTML = '';
10332 function createElement(tagName) {
10333 return document.createElement(tagName);
10335 function createElementNS(namespaceURI, qualifiedName) {
10336 return document.createElementNS(namespaceURI, qualifiedName);
10338 function createTextNode(text) {
10339 return document.createTextNode(text);
10341 function createComment(text) {
10342 return document.createComment(text);
10344 function insertBefore$1(parentNode, newNode, referenceNode) {
10345 parentNode.insertBefore(newNode, referenceNode);
10347 function removeChild(node, child) {
10348 if (!node) { return; }
10349 node.removeChild(child);
10351 function appendChild(node, child) {
10352 node.appendChild(child);
10354 function parentNode(node) {
10355 return node.parentNode;
10357 function nextSibling(node) {
10358 return node.nextSibling;
10360 function tagName(elm) {
10361 return elm.tagName;
10363 function setTextContent(node, text) {
10364 node.textContent = text;
10366 function getTextContent(node) {
10367 return node.textContent;
10369 function isElement(node) {
10370 return node.nodeType === 1;
10372 function isText(node) {
10373 return node.nodeType === 3;
10375 function isComment(node) {
10376 return node.nodeType === 8;
10379 createElement: createElement,
10380 createElementNS: createElementNS,
10381 createTextNode: createTextNode,
10382 createComment: createComment,
10383 insertBefore: insertBefore$1,
10384 removeChild: removeChild,
10385 appendChild: appendChild,
10386 parentNode: parentNode,
10387 nextSibling: nextSibling,
10389 setTextContent: setTextContent,
10390 getTextContent: getTextContent,
10391 isElement: isElement,
10393 isComment: isComment,
10396 function isUndef(s) { return s === undefined; }
10397 function isDef(s) { return s !== undefined; }
10398 var emptyNode = vnode('', {}, [], undefined, undefined);
10399 function sameVnode(vnode1, vnode2) {
10400 return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
10402 function isVnode(vnode$$1) {
10403 return vnode$$1.sel !== undefined;
10405 function createKeyToOldIdx(children, beginIdx, endIdx) {
10406 var i, map = {}, key, ch;
10407 for (i = beginIdx; i <= endIdx; ++i) {
10411 if (key !== undefined)
10417 var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
10418 function init$1(modules, domApi) {
10419 var i, j, cbs = {};
10420 var api = domApi !== undefined ? domApi : htmlDomApi;
10421 for (i = 0; i < hooks.length; ++i) {
10422 cbs[hooks[i]] = [];
10423 for (j = 0; j < modules.length; ++j) {
10424 var hook = modules[j][hooks[i]];
10425 if (hook !== undefined) {
10426 cbs[hooks[i]].push(hook);
10430 function emptyNodeAt(elm) {
10431 var id = elm.id ? '#' + elm.id : '';
10432 var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
10433 return vnode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
10435 function createRmCb(childElm, listeners) {
10436 return function rmCb() {
10437 if (--listeners === 0) {
10438 var parent_1 = api.parentNode(childElm);
10439 api.removeChild(parent_1, childElm);
10443 function createElm(vnode$$1, insertedVnodeQueue) {
10444 var i, data = vnode$$1.data;
10445 if (data !== undefined) {
10446 if (isDef(i = data.hook) && isDef(i = i.init)) {
10448 data = vnode$$1.data;
10451 var children = vnode$$1.children, sel = vnode$$1.sel;
10453 if (isUndef(vnode$$1.text)) {
10454 vnode$$1.text = '';
10456 vnode$$1.elm = api.createComment(vnode$$1.text);
10458 else if (sel !== undefined) {
10460 var hashIdx = sel.indexOf('#');
10461 var dotIdx = sel.indexOf('.', hashIdx);
10462 var hash = hashIdx > 0 ? hashIdx : sel.length;
10463 var dot = dotIdx > 0 ? dotIdx : sel.length;
10464 var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
10465 var elm = vnode$$1.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
10466 : api.createElement(tag);
10468 { elm.setAttribute('id', sel.slice(hash + 1, dot)); }
10470 { elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' ')); }
10471 for (i = 0; i < cbs.create.length; ++i)
10472 { cbs.create[i](emptyNode, vnode$$1); }
10473 if (array(children)) {
10474 for (i = 0; i < children.length; ++i) {
10475 var ch = children[i];
10477 api.appendChild(elm, createElm(ch, insertedVnodeQueue));
10481 else if (primitive(vnode$$1.text)) {
10482 api.appendChild(elm, api.createTextNode(vnode$$1.text));
10484 i = vnode$$1.data.hook; // Reuse variable
10487 { i.create(emptyNode, vnode$$1); }
10489 { insertedVnodeQueue.push(vnode$$1); }
10493 vnode$$1.elm = api.createTextNode(vnode$$1.text);
10495 return vnode$$1.elm;
10497 function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
10498 for (; startIdx <= endIdx; ++startIdx) {
10499 var ch = vnodes[startIdx];
10501 api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
10505 function invokeDestroyHook(vnode$$1) {
10506 var i, j, data = vnode$$1.data;
10507 if (data !== undefined) {
10508 if (isDef(i = data.hook) && isDef(i = i.destroy))
10510 for (i = 0; i < cbs.destroy.length; ++i)
10511 { cbs.destroy[i](vnode$$1); }
10512 if (vnode$$1.children !== undefined) {
10513 for (j = 0; j < vnode$$1.children.length; ++j) {
10514 i = vnode$$1.children[j];
10515 if (i != null && typeof i !== "string
") {
10516 invokeDestroyHook(i);
10522 function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
10523 for (; startIdx <= endIdx; ++startIdx) {
10524 var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];
10526 if (isDef(ch.sel)) {
10527 invokeDestroyHook(ch);
10528 listeners = cbs.remove.length + 1;
10529 rm = createRmCb(ch.elm, listeners);
10530 for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)
10531 { cbs.remove[i_1](ch, rm); }
10532 if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
10540 api.removeChild(parentElm, ch.elm);
10545 function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
10546 var oldStartIdx = 0, newStartIdx = 0;
10547 var oldEndIdx = oldCh.length - 1;
10548 var oldStartVnode = oldCh[0];
10549 var oldEndVnode = oldCh[oldEndIdx];
10550 var newEndIdx = newCh.length - 1;
10551 var newStartVnode = newCh[0];
10552 var newEndVnode = newCh[newEndIdx];
10557 while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
10558 if (oldStartVnode == null) {
10559 oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
10561 else if (oldEndVnode == null) {
10562 oldEndVnode = oldCh[--oldEndIdx];
10564 else if (newStartVnode == null) {
10565 newStartVnode = newCh[++newStartIdx];
10567 else if (newEndVnode == null) {
10568 newEndVnode = newCh[--newEndIdx];
10570 else if (sameVnode(oldStartVnode, newStartVnode)) {
10571 patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
10572 oldStartVnode = oldCh[++oldStartIdx];
10573 newStartVnode = newCh[++newStartIdx];
10575 else if (sameVnode(oldEndVnode, newEndVnode)) {
10576 patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
10577 oldEndVnode = oldCh[--oldEndIdx];
10578 newEndVnode = newCh[--newEndIdx];
10580 else if (sameVnode(oldStartVnode, newEndVnode)) {
10581 patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
10582 api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
10583 oldStartVnode = oldCh[++oldStartIdx];
10584 newEndVnode = newCh[--newEndIdx];
10586 else if (sameVnode(oldEndVnode, newStartVnode)) {
10587 patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
10588 api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
10589 oldEndVnode = oldCh[--oldEndIdx];
10590 newStartVnode = newCh[++newStartIdx];
10593 if (oldKeyToIdx === undefined) {
10594 oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
10596 idxInOld = oldKeyToIdx[newStartVnode.key];
10597 if (isUndef(idxInOld)) {
10598 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
10599 newStartVnode = newCh[++newStartIdx];
10602 elmToMove = oldCh[idxInOld];
10603 if (elmToMove.sel !== newStartVnode.sel) {
10604 api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
10607 patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
10608 oldCh[idxInOld] = undefined;
10609 api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
10611 newStartVnode = newCh[++newStartIdx];
10615 if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
10616 if (oldStartIdx > oldEndIdx) {
10617 before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
10618 addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
10621 removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
10625 function patchVnode(oldVnode, vnode$$1, insertedVnodeQueue) {
10627 if (isDef(i = vnode$$1.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
10628 i(oldVnode, vnode$$1);
10630 var elm = vnode$$1.elm = oldVnode.elm;
10631 var oldCh = oldVnode.children;
10632 var ch = vnode$$1.children;
10633 if (oldVnode === vnode$$1)
10635 if (vnode$$1.data !== undefined) {
10636 for (i = 0; i < cbs.update.length; ++i)
10637 { cbs.update[i](oldVnode, vnode$$1); }
10638 i = vnode$$1.data.hook;
10639 if (isDef(i) && isDef(i = i.update))
10640 { i(oldVnode, vnode$$1); }
10642 if (isUndef(vnode$$1.text)) {
10643 if (isDef(oldCh) && isDef(ch)) {
10645 { updateChildren(elm, oldCh, ch, insertedVnodeQueue); }
10647 else if (isDef(ch)) {
10648 if (isDef(oldVnode.text))
10649 { api.setTextContent(elm, ''); }
10650 addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
10652 else if (isDef(oldCh)) {
10653 removeVnodes(elm, oldCh, 0, oldCh.length - 1);
10655 else if (isDef(oldVnode.text)) {
10656 api.setTextContent(elm, '');
10659 else if (oldVnode.text !== vnode$$1.text) {
10660 api.setTextContent(elm, vnode$$1.text);
10662 if (isDef(hook) && isDef(i = hook.postpatch)) {
10663 i(oldVnode, vnode$$1);
10666 return function patch(oldVnode, vnode$$1) {
10667 var i, elm, parent;
10668 var insertedVnodeQueue = [];
10669 for (i = 0; i < cbs.pre.length; ++i)
10671 if (!isVnode(oldVnode)) {
10672 oldVnode = emptyNodeAt(oldVnode);
10674 if (sameVnode(oldVnode, vnode$$1)) {
10675 patchVnode(oldVnode, vnode$$1, insertedVnodeQueue);
10678 elm = oldVnode.elm;
10679 parent = api.parentNode(elm);
10680 createElm(vnode$$1, insertedVnodeQueue);
10681 if (parent !== null) {
10682 api.insertBefore(parent, vnode$$1.elm, api.nextSibling(elm));
10683 removeVnodes(parent, [oldVnode], 0, 0);
10686 for (i = 0; i < insertedVnodeQueue.length; ++i) {
10687 insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
10689 for (i = 0; i < cbs.post.length; ++i)
10695 var xlinkNS = 'http://www.w3.org/1999/xlink';
10696 var xmlNS = 'http://www.w3.org/XML/1998/namespace';
10697 var colonChar = 58;
10699 function updateAttrs(oldVnode, vnode) {
10700 var key, elm = vnode.elm, oldAttrs = oldVnode.data.attrs, attrs = vnode.data.attrs;
10701 if (!oldAttrs && !attrs)
10703 if (oldAttrs === attrs)
10705 oldAttrs = oldAttrs || {};
10706 attrs = attrs || {};
10707 // update modified attributes, add new attributes
10708 for (key in attrs) {
10709 var cur = attrs[key];
10710 var old = oldAttrs[key];
10712 if (cur === true) {
10713 elm.setAttribute(key, "");
10715 else if (cur === false) {
10716 elm.removeAttribute(key);
10719 if (key.charCodeAt(0) !== xChar) {
10720 elm.setAttribute(key, cur);
10722 else if (key.charCodeAt(3) === colonChar) {
10723 // Assume xml namespace
10724 elm.setAttributeNS(xmlNS, key, cur);
10726 else if (key.charCodeAt(5) === colonChar) {
10727 // Assume xlink namespace
10728 elm.setAttributeNS(xlinkNS, key, cur);
10731 elm.setAttribute(key, cur);
10736 // remove removed attributes
10737 // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
10738 // the other option is to remove all attributes with value == undefined
10739 for (key in oldAttrs) {
10740 if (!(key in attrs)) {
10741 elm.removeAttribute(key);
10745 var attributesModule = { create: updateAttrs, update: updateAttrs };
10747 function updateProps(oldVnode, vnode) {
10748 var key, cur, old, elm = vnode.elm, oldProps = oldVnode.data.props, props = vnode.data.props;
10749 if (!oldProps && !props)
10751 if (oldProps === props)
10753 oldProps = oldProps || {};
10754 props = props || {};
10755 for (key in oldProps) {
10760 for (key in props) {
10762 old = oldProps[key];
10763 if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
10768 var propsModule = { create: updateProps, update: updateProps };
10770 var raf = (typeof window !== 'undefined' && window.requestAnimationFrame) || setTimeout;
10771 var nextFrame = function (fn) { raf(function () { raf(fn); }); };
10772 function setNextFrame(obj, prop, val) {
10773 nextFrame(function () { obj[prop] = val; });
10775 function updateStyle(oldVnode, vnode) {
10776 var cur, name, elm = vnode.elm, oldStyle = oldVnode.data.style, style = vnode.data.style;
10777 if (!oldStyle && !style)
10779 if (oldStyle === style)
10781 oldStyle = oldStyle || {};
10782 style = style || {};
10783 var oldHasDel = 'delayed' in oldStyle;
10784 for (name in oldStyle) {
10785 if (!style[name]) {
10786 if (name[0] === '-' && name[1] === '-') {
10787 elm.style.removeProperty(name);
10790 elm.style[name] = '';
10794 for (name in style) {
10796 if (name === 'delayed' && style.delayed) {
10797 for (var name2 in style.delayed) {
10798 cur = style.delayed[name2];
10799 if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
10800 setNextFrame(elm.style, name2, cur);
10804 else if (name !== 'remove' && cur !== oldStyle[name]) {
10805 if (name[0] === '-' && name[1] === '-') {
10806 elm.style.setProperty(name, cur);
10809 elm.style[name] = cur;
10814 function applyDestroyStyle(vnode) {
10815 var style, name, elm = vnode.elm, s = vnode.data.style;
10816 if (!s || !(style = s.destroy))
10818 for (name in style) {
10819 elm.style[name] = style[name];
10822 function applyRemoveStyle(vnode, rm) {
10823 var s = vnode.data.style;
10824 if (!s || !s.remove) {
10828 var name, elm = vnode.elm, i = 0, compStyle, style = s.remove, amount = 0, applied = [];
10829 for (name in style) {
10830 applied.push(name);
10831 elm.style[name] = style[name];
10833 compStyle = getComputedStyle(elm);
10834 var props = compStyle['transition-property'].split(', ');
10835 for (; i < props.length; ++i) {
10836 if (applied.indexOf(props[i]) !== -1)
10839 elm.addEventListener('transitionend', function (ev) {
10840 if (ev.target === elm)
10846 var styleModule = {
10847 create: updateStyle,
10848 update: updateStyle,
10849 destroy: applyDestroyStyle,
10850 remove: applyRemoveStyle
10853 function invokeHandler(handler, event, args) {
10854 if (typeof handler === 'function') {
10855 // call function handler
10856 handler.apply(void 0, [ event ].concat( args ));
10859 function handleEvent(event, args, vnode) {
10860 var name = event.type;
10861 var on = vnode.data.on;
10862 // call event handler(s) if exists
10863 if (on && on[name]) {
10864 invokeHandler(on[name], event, args, vnode);
10867 function createListener() {
10868 return function handler(event) {
10869 var args = [], len = arguments.length - 1;
10870 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
10872 handleEvent(event, args, handler.vnode);
10875 function updateEvents(oldVnode, vnode) {
10876 var oldOn = oldVnode.data.on;
10877 var oldListener = oldVnode.listener;
10878 var oldElm = oldVnode.elm;
10879 var on = vnode && vnode.data.on;
10880 var elm = (vnode && vnode.elm);
10881 // optimization for reused immutable handlers
10882 if (oldOn === on) {
10885 // remove existing listeners which no longer used
10886 if (oldOn && oldListener) {
10887 // if element changed or deleted we remove all existing listeners unconditionally
10889 Object.keys(oldOn).forEach(function (name) {
10890 $(oldElm).off(name, oldListener);
10893 Object.keys(oldOn).forEach(function (name) {
10895 $(oldElm).off(name, oldListener);
10900 // add new listeners which has not already attached
10902 // reuse existing listener or create new
10903 var listener = oldVnode.listener || createListener();
10904 vnode.listener = listener;
10905 // update vnode for listener
10906 listener.vnode = vnode;
10907 // if element changed or added we add all needed listeners unconditionally
10909 Object.keys(on).forEach(function (name) {
10910 $(elm).on(name, listener);
10913 Object.keys(on).forEach(function (name) {
10914 if (!oldOn[name]) {
10915 $(elm).on(name, listener);
10922 var eventListenersModule = {
10923 create: updateEvents,
10924 update: updateEvents,
10925 destroy: updateEvents,
10928 /* eslint import/no-named-as-default: off */
10930 var patch = init$1([
10934 eventListenersModule ]);
10936 var Framework7Component = function Framework7Component(app, options, extendContext) {
10937 if ( extendContext === void 0 ) extendContext = {};
10939 var id = Utils.id();
10940 var self = Utils.merge(
10949 $options: Utils.extend({ id: id }, options),
10952 var $options = self.$options;
10954 // Root data and methods
10955 Object.defineProperty(self, '$root', {
10957 configurable: true,
10958 get: function get() {
10959 var root = Utils.merge({}, app.data, app.methods);
10960 if (win && win.Proxy) {
10961 root = new win.Proxy(root, {
10962 set: function set(target, name, val) {
10963 app.data[name] = val;
10965 deleteProperty: function deleteProperty(target, name) {
10966 delete app.data[name];
10967 delete app.methods[name];
10969 has: function has(target, name) {
10970 return (name in app.data || name in app.methods);
10976 set: function set() {},
10980 ('beforeCreate created beforeMount mounted beforeDestroy destroyed updated').split(' ').forEach(function (cycleKey) {
10981 if ($options[cycleKey]) { $options[cycleKey] = $options[cycleKey].bind(self); }
10984 if ($options.data) {
10985 $options.data = $options.data.bind(self);
10987 Utils.extend(self, $options.data());
10989 if ($options.render) { $options.render = $options.render.bind(self); }
10990 if ($options.methods) {
10991 Object.keys($options.methods).forEach(function (methodName) {
10992 self[methodName] = $options.methods[methodName].bind(self);
10998 Object.keys($options.on).forEach(function (eventName) {
10999 $options.on[eventName] = $options.on[eventName].bind(self);
11002 if ($options.once) {
11003 Object.keys($options.once).forEach(function (eventName) {
11004 $options.once[eventName] = $options.once[eventName].bind(self);
11008 // Before create hook
11009 if ($options.beforeCreate) { $options.beforeCreate(); }
11012 var html = self.$render();
11015 if (html && typeof html === 'string') {
11016 html = html.trim();
11017 self.$vnode = vdom(html, self, app, true);
11018 self.el = doc.createElement('div');
11019 patch(self.el, self.$vnode);
11023 self.$el = $(self.el);
11025 // Set styles scope ID
11026 if ($options.style) {
11027 self.$styleEl = doc.createElement('style');
11028 self.$styleEl.innerHTML = $options.style;
11029 if ($options.styleScoped) {
11030 self.el.setAttribute(("data
-f7
-" + ($options.id)), '');
11034 self.$attachEvents();
11036 // Created callback
11037 if ($options.created) { $options.created(); }
11039 // Store component instance
11040 self.el.f7Component = self;
11045 Framework7Component.prototype.$attachEvents = function $attachEvents () {
11047 var $options = self.$options;
11048 var $el = self.$el;
11050 Object.keys($options.on).forEach(function (eventName) {
11051 $el.on(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
11054 if ($options.once) {
11055 Object.keys($options.once).forEach(function (eventName) {
11056 $el.once(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
11061 Framework7Component.prototype.$detachEvents = function $detachEvents () {
11063 var $options = self.$options;
11064 var $el = self.$el;
11066 Object.keys($options.on).forEach(function (eventName) {
11067 $el.off(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
11070 if ($options.once) {
11071 Object.keys($options.once).forEach(function (eventName) {
11072 $el.off(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
11077 Framework7Component.prototype.$render = function $render () {
11079 var $options = self.$options;
11081 if ($options.render) {
11082 html = $options.render();
11083 } else if ($options.template) {
11084 if (typeof $options.template === 'string') {
11086 html = Template7.compile($options.template)(self);
11091 // Supposed to be function
11092 html = $options.template(self);
11098 Framework7Component.prototype.$forceUpdate = function $forceUpdate () {
11100 var html = self.$render();
11103 if (html && typeof html === 'string') {
11104 html = html.trim();
11105 var newVNode = vdom(html, self, self.$app);
11106 self.$vnode = patch(self.$vnode, newVNode);
11110 Framework7Component.prototype.$setState = function $setState (mergeState) {
11112 Utils.merge(self, mergeState);
11113 self.$forceUpdate();
11116 Framework7Component.prototype.$mount = function $mount (mountMethod) {
11118 if (self.$options.beforeMount) { self.$options.beforeMount(); }
11119 if (self.$styleEl) { $('head').append(self.$styleEl); }
11120 if (mountMethod) { mountMethod(self.el); }
11121 if (self.$options.mounted) { self.$options.mounted(); }
11124 Framework7Component.prototype.$destroy = function $destroy () {
11126 if (self.$options.beforeDestroy) { self.$options.beforeDestroy(); }
11127 if (self.$styleEl) { $(self.$styleEl).remove(); }
11128 self.$detachEvents();
11129 if (self.$options.destroyed) { self.$options.destroyed(); }
11130 // Delete component instance
11131 if (self.el && self.el.f7Component) {
11132 self.el.f7Component = null;
11133 delete self.el.f7Component;
11135 // Patch with empty node
11137 self.$vnode = patch(self.$vnode, { sel: self.$vnode.sel, data: {} });
11139 Utils.deleteProps(self);
11142 function parseComponent(componentString) {
11143 var id = Utils.id();
11144 var callbackCreateName = "f7_component_create_callback_
" + id;
11145 var callbackRenderName = "f7_component_render_callback_
" + id;
11149 var hasTemplate = componentString.match(/<template([ ]?)([a-z0-9-]*)>/);
11150 var templateType = hasTemplate[2] || 't7';
11152 template = componentString
11153 .split(/<template[ ]?[a-z0-9-]*>/)
11154 .filter(function (item, index) { return index > 0; })
11155 .join('<template>')
11156 .split('</template>')
11157 .filter(function (item, index, arr) { return index < arr.length - 1; })
11158 .join('</template>')
11159 .replace(/{{#raw}}([ \n]*)<template/g, '{{#raw}}<template')
11160 .replace(/\/template>([ \n]*){{\/raw}}/g, '/template>{{/raw}}')
11161 .replace(/([ \n])<template/g, '$1{{#raw}}<template')
11162 .replace(/\/template>([ \n])/g, '/template>{{/raw}}$1');
11167 var styleScoped = false;
11169 if (componentString.indexOf('<style>') >= 0) {
11170 style = componentString.split('<style>')[1].split('</style>')[0];
11171 } else if (componentString.indexOf('<style scoped>') >= 0) {
11172 styleScoped = true;
11173 style = componentString.split('<style scoped>')[1].split('</style>')[0];
11174 style = style.split('\n').map(function (line) {
11175 var trimmedLine = line.trim();
11176 if (trimmedLine.indexOf('@') === 0) { return line; }
11177 if (line.indexOf('{') >= 0) {
11178 if (line.indexOf('{{this}}') >= 0) {
11179 return line.replace('{{this}}', ("[data
-f7
-" + id + "]"));
11181 return ("[data
-f7
-" + id + "] " + (line.trim()));
11190 if (componentString.indexOf('<script>') >= 0) {
11191 var scripts = componentString.split('<script>');
11192 scriptContent = scripts[scripts.length - 1].split('</script>')[0].trim();
11194 scriptContent = 'return {}';
11196 if (!scriptContent || !scriptContent.trim()) { scriptContent = 'return {}'; }
11198 scriptContent = "window
." + callbackCreateName + " = function () {" + scriptContent + "}";
11200 // Insert Script El
11201 scriptEl = doc.createElement('script');
11202 scriptEl.innerHTML = scriptContent;
11203 $('head').append(scriptEl);
11205 var component = win[callbackCreateName]();
11207 // Remove Script El
11208 $(scriptEl).remove();
11209 win[callbackCreateName] = null;
11210 delete win[callbackCreateName];
11213 if (!component.template && !component.render) {
11214 component.template = template;
11215 component.templateType = templateType;
11217 if (component.template) {
11218 if (component.templateType === 't7') {
11219 component.template = Template7.compile(component.template);
11221 if (component.templateType === 'es') {
11222 var renderContent = "window
." + callbackRenderName + " = function () {\n return function render() {\n return `" + (component.template) + "`;\n }\n }";
11223 scriptEl = doc.createElement('script');
11224 scriptEl.innerHTML = renderContent;
11225 $('head').append(scriptEl);
11227 component.render = win[callbackRenderName]();
11229 // Remove Script El
11230 $(scriptEl).remove();
11231 win[callbackRenderName] = null;
11232 delete win[callbackRenderName];
11238 component.style = style;
11239 component.styleScoped = styleScoped;
11247 var ComponentModule = {
11249 create: function create() {
11252 parse: function parse(componentString) {
11253 return parseComponent(componentString);
11255 create: function create(options, extendContext) {
11256 return new Framework7Component(app, options, extendContext);
11264 register: function register(path, scope) {
11266 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
11267 return new Promise(function (resolve, reject) {
11268 reject(new Error('Service worker is not supported'));
11271 return new Promise(function (resolve, reject) {
11272 app.serviceWorker.container.register(path, (scope ? { scope: scope } : {}))
11273 .then(function (reg) {
11274 SW.registrations.push(reg);
11275 app.emit('serviceWorkerRegisterSuccess', reg);
11277 }).catch(function (error) {
11278 app.emit('serviceWorkerRegisterError', error);
11283 unregister: function unregister(registration) {
11285 if (!('serviceWorker' in window.navigator) || !app.serviceWorker.container) {
11286 return new Promise(function (resolve, reject) {
11287 reject(new Error('Service worker is not supported'));
11291 if (!registration) { registrations = SW.registrations; }
11292 else if (Array.isArray(registration)) { registrations = registration; }
11293 else { registrations = [registration]; }
11294 return Promise.all(registrations.map(function (reg) { return new Promise(function (resolve, reject) {
11296 .then(function () {
11297 if (SW.registrations.indexOf(reg) >= 0) {
11298 SW.registrations.splice(SW.registrations.indexOf(reg), 1);
11300 app.emit('serviceWorkerUnregisterSuccess', reg);
11303 .catch(function (error) {
11304 app.emit('serviceWorkerUnregisterError', reg, error);
11311 var ServiceWorkerModule = {
11319 create: function create() {
11321 Utils.extend(app, {
11323 container: ('serviceWorker' in window.navigator) ? window.navigator.serviceWorker : undefined,
11324 registrations: SW.registrations,
11325 register: SW.register.bind(app),
11326 unregister: SW.unregister.bind(app),
11331 init: function init() {
11332 if (!('serviceWorker' in window.navigator)) { return; }
11334 if (!app.serviceWorker.container) { return; }
11335 var paths = app.params.serviceWorker.path;
11336 var scope = app.params.serviceWorker.scope;
11337 if (!paths || (Array.isArray(paths) && !paths.length)) { return; }
11338 var toRegister = Array.isArray(paths) ? paths : [paths];
11339 toRegister.forEach(function (path) {
11340 app.serviceWorker.register(path, scope);
11347 hide: function hide() {
11348 $('html').removeClass('with-statusbar');
11349 if (Device.cordova && win.StatusBar) {
11350 win.StatusBar.hide();
11353 show: function show() {
11354 if (Device.cordova && win.StatusBar) {
11355 win.StatusBar.show();
11356 Utils.nextTick(function () {
11357 if (Device.needsStatusbarOverlay()) {
11358 $('html').addClass('with-statusbar');
11363 $('html').addClass('with-statusbar');
11365 onClick: function onClick() {
11368 if ($('.popup.modal-in').length > 0) {
11369 // Check for opened popup
11370 pageContent = $('.popup.modal-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11371 } else if ($('.panel.panel-active').length > 0) {
11372 // Check for opened panel
11373 pageContent = $('.panel.panel-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11374 } else if ($('.views > .view.tab-active').length > 0) {
11375 // View in tab bar app layout
11376 pageContent = $('.views > .view.tab-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11377 } else if ($('.views').length > 0) {
11378 pageContent = $('.views').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11380 pageContent = app.root.children('.view').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
11383 if (pageContent && pageContent.length > 0) {
11385 if (pageContent.hasClass('tab')) {
11386 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
11388 if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
11391 setTextColor: function setTextColor(color) {
11392 if (Device.cordova && win.StatusBar) {
11393 if (color === 'white') {
11394 win.StatusBar.styleLightContent();
11396 win.StatusBar.styleDefault();
11400 setIosTextColor: function setIosTextColor(color) {
11401 if (!Device.ios) { return; }
11402 Statusbar.setTextColor(color);
11404 setBackgroundColor: function setBackgroundColor(color) {
11405 $('.statusbar').css('background-color', color);
11406 if (Device.cordova && win.StatusBar) {
11407 win.StatusBar.backgroundColorByHexString(color);
11410 isVisible: function isVisible() {
11411 if (Device.cordova && win.StatusBar) {
11412 return win.StatusBar.isVisible;
11416 overlaysWebView: function overlaysWebView(overlays) {
11417 if ( overlays === void 0 ) overlays = true;
11419 if (Device.cordova && win.StatusBar) {
11420 win.StatusBar.overlaysWebView(overlays);
11422 $('html').addClass('with-statusbar');
11424 $('html').removeClass('with-statusbar');
11428 checkOverlay: function checkOverlay() {
11429 if (Device.needsStatusbarOverlay()) {
11430 $('html').addClass('with-statusbar');
11432 $('html').removeClass('with-statusbar');
11435 init: function init() {
11437 var params = app.params.statusbar;
11438 if (!params.enabled) { return; }
11440 if (params.overlay === 'auto') {
11441 if (Device.needsStatusbarOverlay()) {
11442 $('html').addClass('with-statusbar');
11444 $('html').removeClass('with-statusbar');
11447 if (Device.ios && (Device.cordova || Device.webView)) {
11448 if (win.orientation === 0) {
11449 app.once('resize', function () {
11450 Statusbar.checkOverlay();
11454 $(doc).on('resume', function () {
11455 Statusbar.checkOverlay();
11458 app.on(Device.ios ? 'orientationchange' : 'orientationchange resize', function () {
11459 Statusbar.checkOverlay();
11462 } else if (params.overlay === true) {
11463 $('html').addClass('with-statusbar');
11464 } else if (params.overlay === false) {
11465 $('html').removeClass('with-statusbar');
11468 if (Device.cordova && win.StatusBar) {
11469 if (params.scrollTopOnClick) {
11470 $(win).on('statusTap', Statusbar.onClick.bind(app));
11473 if (params.iosOverlaysWebView) {
11474 win.StatusBar.overlaysWebView(true);
11476 win.StatusBar.overlaysWebView(false);
11478 if (params.iosTextColor === 'white') {
11479 win.StatusBar.styleLightContent();
11481 win.StatusBar.styleDefault();
11484 if (Device.android) {
11485 if (params.androidOverlaysWebView) {
11486 win.StatusBar.overlaysWebView(true);
11488 win.StatusBar.overlaysWebView(false);
11490 if (params.androidTextColor === 'white') {
11491 win.StatusBar.styleLightContent();
11493 win.StatusBar.styleDefault();
11497 if (params.iosBackgroundColor && Device.ios) {
11498 Statusbar.setBackgroundColor(params.iosBackgroundColor);
11500 if ((params.materialBackgroundColor || params.androidBackgroundColor) && Device.android) {
11501 Statusbar.setBackgroundColor(params.materialBackgroundColor || params.androidBackgroundColor);
11506 var Statusbar$1 = {
11512 scrollTopOnClick: true,
11514 iosOverlaysWebView: true,
11515 iosTextColor: 'black',
11516 iosBackgroundColor: null,
11518 androidOverlaysWebView: false,
11519 androidTextColor: 'black',
11520 androidBackgroundColor: null,
11523 create: function create() {
11525 Utils.extend(app, {
11527 checkOverlay: Statusbar.checkOverlay,
11528 hide: Statusbar.hide,
11529 show: Statusbar.show,
11530 overlaysWebView: Statusbar.overlaysWebView,
11531 setTextColor: Statusbar.setTextColor,
11532 setBackgroundColor: Statusbar.setBackgroundColor,
11533 isVisible: Statusbar.isVisible,
11534 init: Statusbar.init.bind(app),
11539 init: function init() {
11541 Statusbar.init.call(app);
11545 '.statusbar': function onStatusbarClick() {
11547 if (!app.params.statusbar.enabled) { return; }
11548 if (!app.params.statusbar.scrollTopOnClick) { return; }
11549 Statusbar.onClick.call(app);
11554 function getCurrentView(app) {
11555 var popoverView = $('.popover.modal-in .view');
11556 var popupView = $('.popup.modal-in .view');
11557 var panelView = $('.panel.panel-active .view');
11558 var appViews = $('.views');
11559 if (appViews.length === 0) { appViews = app.root; }
11560 // Find active view as tab
11561 var appView = appViews.children('.view');
11562 // Propably in tabs or split view
11563 if (appView.length > 1) {
11564 if (appView.hasClass('tab')) {
11566 appView = appViews.children('.view.tab-active');
11569 if (popoverView.length > 0 && popoverView[0].f7View) { return popoverView[0].f7View; }
11570 if (popupView.length > 0 && popupView[0].f7View) { return popupView[0].f7View; }
11571 if (panelView.length > 0 && panelView[0].f7View) { return panelView[0].f7View; }
11572 if (appView.length > 0) {
11573 if (appView.length === 1 && appView[0].f7View) { return appView[0].f7View; }
11574 if (appView.length > 1) {
11575 return app.views.main;
11591 xhrCacheIgnore: [],
11592 xhrCacheIgnoreGetParameters: false,
11593 xhrCacheDuration: 1000 * 60 * 10, // Ten minutes
11594 preloadPreviousPage: true,
11595 allowDuplicateUrls: false,
11596 reloadPages: false,
11597 reloadDetail: false,
11598 masterDetailBreakpoint: 0,
11599 removeElements: true,
11600 removeElementsWithTimeout: false,
11601 removeElementsTimeout: 0,
11602 restoreScrollTopOnBack: true,
11603 unloadTabContent: true,
11604 passRouteQueryToRequest: true,
11605 passRouteParamsToRequest: false,
11607 iosSwipeBack: true,
11608 iosSwipeBackAnimateShadow: true,
11609 iosSwipeBackAnimateOpacity: true,
11610 iosSwipeBackActiveArea: 30,
11611 iosSwipeBackThreshold: 0,
11612 mdSwipeBack: false,
11613 mdSwipeBackAnimateShadow: true,
11614 mdSwipeBackAnimateOpacity: false,
11615 mdSwipeBackActiveArea: 30,
11616 mdSwipeBackThreshold: 0,
11619 pushStateRoot: undefined,
11620 pushStateAnimate: true,
11621 pushStateAnimateOnLoad: false,
11622 pushStateSeparator: '#!',
11623 pushStateOnLoad: true,
11626 // iOS Dynamic Navbar
11627 iosDynamicNavbar: true,
11628 iosSeparateDynamicNavbar: true,
11629 // Animate iOS Navbar Back Icon
11630 iosAnimateNavbarBackIcon: true,
11632 iosPageLoadDelay: 0,
11633 mdPageLoadDelay: 0,
11635 routesBeforeEnter: null,
11636 routesBeforeLeave: null,
11642 create: function create() {
11644 Utils.extend(app, {
11645 views: Utils.extend([], {
11646 create: function create(el, params) {
11647 return new View(app, el, params);
11649 get: function get(viewEl) {
11650 var $viewEl = $(viewEl);
11651 if ($viewEl.length && $viewEl[0].f7View) { return $viewEl[0].f7View; }
11656 Object.defineProperty(app.views, 'current', {
11658 configurable: true,
11659 get: function get() {
11660 return getCurrentView(app);
11664 app.view = app.views;
11667 init: function init() {
11669 $('.view-init').each(function (index, viewEl) {
11670 if (viewEl.f7View) { return; }
11671 var viewParams = $(viewEl).dataset();
11672 app.views.create(viewEl, viewParams);
11675 modalOpen: function modalOpen(modal) {
11677 modal.$el.find('.view-init').each(function (index, viewEl) {
11678 if (viewEl.f7View) { return; }
11679 var viewParams = $(viewEl).dataset();
11680 app.views.create(viewEl, viewParams);
11683 modalBeforeDestroy: function modalBeforeDestroy(modal) {
11684 if (!modal || !modal.$el) { return; }
11685 modal.$el.find('.view-init').each(function (index, viewEl) {
11686 var view = viewEl.f7View;
11687 if (!view) { return; }
11695 size: function size(el) {
11697 if (app.theme === 'md' && !app.params.navbar.mdCenterTitle) { return; }
11699 if ($el.hasClass('navbar')) {
11700 $el = $el.children('.navbar-inner').each(function (index, navbarEl) {
11701 app.navbar.size(navbarEl);
11707 $el.hasClass('stacked')
11708 || $el.parents('.stacked').length > 0
11709 || $el.parents('.tab:not(.tab-active)').length > 0
11710 || $el.parents('.popup:not(.modal-in)').length > 0
11715 if (app.theme === 'md' && app.params.navbar.mdCenterTitle) {
11716 $el.addClass('navbar-inner-centered-title');
11718 if (app.theme === 'ios' && !app.params.navbar.iosCenterTitle) {
11719 $el.addClass('navbar-inner-left-title');
11722 var $viewEl = $el.parents('.view').eq(0);
11723 var left = app.rtl ? $el.children('.right') : $el.children('.left');
11724 var right = app.rtl ? $el.children('.left') : $el.children('.right');
11725 var title = $el.children('.title');
11726 var subnavbar = $el.children('.subnavbar');
11727 var noLeft = left.length === 0;
11728 var noRight = right.length === 0;
11729 var leftWidth = noLeft ? 0 : left.outerWidth(true);
11730 var rightWidth = noRight ? 0 : right.outerWidth(true);
11731 var titleWidth = title.outerWidth(true);
11732 var navbarStyles = $el.styles();
11733 var navbarWidth = $el[0].offsetWidth;
11734 var navbarInnerWidth = navbarWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10);
11735 var isPrevious = $el.hasClass('navbar-previous');
11736 var sliding = $el.hasClass('sliding');
11740 var separateNavbar;
11741 var separateNavbarRightOffset = 0;
11742 var separateNavbarLeftOffset = 0;
11744 if ($viewEl.length > 0 && $viewEl[0].f7View) {
11745 router = $viewEl[0].f7View.router;
11746 dynamicNavbar = router && router.dynamicNavbar;
11747 separateNavbar = router && router.separateNavbar;
11748 if (!separateNavbar) {
11749 separateNavbarRightOffset = navbarWidth;
11750 separateNavbarLeftOffset = navbarWidth / 5;
11757 currLeft = navbarInnerWidth - titleWidth;
11762 if (!noLeft && !noRight) {
11763 currLeft = ((navbarInnerWidth - rightWidth - titleWidth) + leftWidth) / 2;
11765 var requiredLeft = (navbarInnerWidth - titleWidth) / 2;
11766 if (navbarInnerWidth - leftWidth - rightWidth > titleWidth) {
11767 if (requiredLeft < leftWidth) {
11768 requiredLeft = leftWidth;
11770 if (requiredLeft + titleWidth > navbarInnerWidth - rightWidth) {
11771 requiredLeft = navbarInnerWidth - rightWidth - titleWidth;
11773 diff = requiredLeft - currLeft;
11779 var inverter = app.rtl ? -1 : 1;
11781 if (dynamicNavbar && app.theme === 'ios') {
11782 if (title.hasClass('sliding') || (title.length > 0 && sliding)) {
11783 var titleLeftOffset = (-(currLeft + diff) * inverter) + separateNavbarLeftOffset;
11784 var titleRightOffset = ((navbarInnerWidth - currLeft - diff - titleWidth) * inverter) - separateNavbarRightOffset;
11787 if (router && router.params.iosAnimateNavbarBackIcon) {
11788 var activeNavbarBackLink = $el.parent().find('.navbar-current').children('.left.sliding').find('.back .icon ~ span');
11789 if (activeNavbarBackLink.length > 0) {
11790 titleLeftOffset += activeNavbarBackLink[0].offsetLeft;
11794 title[0].f7NavbarLeftOffset = titleLeftOffset;
11795 title[0].f7NavbarRightOffset = titleRightOffset;
11797 if (!noLeft && (left.hasClass('sliding') || sliding)) {
11799 left[0].f7NavbarLeftOffset = (-(navbarInnerWidth - left[0].offsetWidth) / 2) * inverter;
11800 left[0].f7NavbarRightOffset = leftWidth * inverter;
11802 left[0].f7NavbarLeftOffset = -leftWidth + separateNavbarLeftOffset;
11803 left[0].f7NavbarRightOffset = ((navbarInnerWidth - left[0].offsetWidth) / 2) - separateNavbarRightOffset;
11804 if (router && router.params.iosAnimateNavbarBackIcon && left.find('.back .icon').length > 0) {
11805 if (left.find('.back .icon ~ span').length) {
11806 var leftOffset = left[0].f7NavbarLeftOffset;
11807 var rightOffset = left[0].f7NavbarRightOffset;
11808 left[0].f7NavbarLeftOffset = 0;
11809 left[0].f7NavbarRightOffset = 0;
11810 left.find('.back .icon ~ span')[0].f7NavbarLeftOffset = leftOffset;
11811 left.find('.back .icon ~ span')[0].f7NavbarRightOffset = rightOffset - left.find('.back .icon')[0].offsetWidth;
11816 if (!noRight && (right.hasClass('sliding') || sliding)) {
11818 right[0].f7NavbarLeftOffset = -rightWidth * inverter;
11819 right[0].f7NavbarRightOffset = ((navbarInnerWidth - right[0].offsetWidth) / 2) * inverter;
11821 right[0].f7NavbarLeftOffset = (-(navbarInnerWidth - right[0].offsetWidth) / 2) + separateNavbarLeftOffset;
11822 right[0].f7NavbarRightOffset = rightWidth - separateNavbarRightOffset;
11825 if (subnavbar.length && (subnavbar.hasClass('sliding') || sliding)) {
11826 subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : (-subnavbar[0].offsetWidth + separateNavbarLeftOffset);
11827 subnavbar[0].f7NavbarRightOffset = (-subnavbar[0].f7NavbarLeftOffset - separateNavbarRightOffset) + separateNavbarLeftOffset;
11833 (app.theme === 'ios' && app.params.navbar.iosCenterTitle)
11834 || (app.theme === 'md' && app.params.navbar.mdCenterTitle)
11836 var titleLeft = diff;
11837 if (app.rtl && noLeft && noRight && title.length > 0) { titleLeft = -titleLeft; }
11838 title.css({ left: (titleLeft + "px
") });
11841 hide: function hide(el, animate) {
11842 if ( animate === void 0 ) animate = true;
11846 if ($el.hasClass('navbar-inner')) { $el = $el.parents('.navbar'); }
11847 if (!$el.length) { return; }
11848 if ($el.hasClass('navbar-hidden')) { return; }
11849 var className = "navbar
-hidden
" + (animate ? ' navbar-transitioning' : '');
11850 var currentIsLarge = app.theme === 'ios' ? $el.find('.navbar-current .title-large').length : $el.find('.title-large').length;
11851 if (currentIsLarge) {
11852 className += ' navbar-large-hidden';
11854 $el.transitionEnd(function () {
11855 $el.removeClass('navbar-transitioning');
11857 $el.addClass(className);
11859 show: function show(el, animate) {
11860 if ( el === void 0 ) el = '.navbar-hidden';
11861 if ( animate === void 0 ) animate = true;
11864 if ($el.hasClass('navbar-inner')) { $el = $el.parents('.navbar'); }
11865 if (!$el.length) { return; }
11866 if (!$el.hasClass('navbar-hidden')) { return; }
11868 $el.addClass('navbar-transitioning');
11869 $el.transitionEnd(function () {
11870 $el.removeClass('navbar-transitioning');
11873 $el.removeClass('navbar-hidden navbar-large-hidden');
11875 getElByPage: function getElByPage(page) {
11877 var $navbarInnerEl;
11879 if (page.$navbarEl || page.$el) {
11881 $pageEl = page.$el;
11884 if ($pageEl.length > 0) { pageData = $pageEl[0].f7Page; }
11886 if (pageData && pageData.$navbarEl && pageData.$navbarEl.length > 0) {
11887 $navbarInnerEl = pageData.$navbarEl;
11888 } else if ($pageEl) {
11889 $navbarInnerEl = $pageEl.children('.navbar').children('.navbar-inner');
11891 if (!$navbarInnerEl || ($navbarInnerEl && $navbarInnerEl.length === 0)) { return undefined; }
11892 return $navbarInnerEl[0];
11894 getPageByEl: function getPageByEl(navbarInnerEl) {
11895 var $navbarInnerEl = $(navbarInnerEl);
11896 if ($navbarInnerEl.hasClass('navbar')) {
11897 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner');
11898 if ($navbarInnerEl.length > 1) { return undefined; }
11900 if ($navbarInnerEl.parents('.page').length) {
11901 return $navbarInnerEl.parents('.page')[0];
11904 $navbarInnerEl.parents('.view').find('.page').each(function (index, el) {
11905 if (el && el.f7Page && el.f7Page.navbarEl && $navbarInnerEl[0] === el.f7Page.navbarEl) {
11912 collapseLargeTitle: function collapseLargeTitle(navbarInnerEl) {
11914 var $navbarInnerEl = $(navbarInnerEl);
11915 if ($navbarInnerEl.hasClass('navbar')) {
11916 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
11917 if ($navbarInnerEl.length > 1) {
11918 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
11920 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
11924 var $pageEl = $(app.navbar.getPageByEl($navbarInnerEl));
11925 $navbarInnerEl.addClass('navbar-inner-large-collapsed');
11926 $pageEl.eq(0).addClass('page-with-navbar-large-collapsed').trigger('page:navbarlargecollapsed');
11927 if (app.theme === 'md') {
11928 $navbarInnerEl.parents('.navbar').addClass('navbar-large-collapsed');
11931 expandLargeTitle: function expandLargeTitle(navbarInnerEl) {
11933 var $navbarInnerEl = $(navbarInnerEl);
11934 if ($navbarInnerEl.hasClass('navbar')) {
11935 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
11936 if ($navbarInnerEl.length > 1) {
11937 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
11939 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
11943 var $pageEl = $(app.navbar.getPageByEl($navbarInnerEl));
11944 $navbarInnerEl.removeClass('navbar-inner-large-collapsed');
11945 $pageEl.eq(0).removeClass('page-with-navbar-large-collapsed').trigger('page:navbarlargeexpanded');
11946 if (app.theme === 'md') {
11947 $navbarInnerEl.parents('.navbar').removeClass('navbar-large-collapsed');
11950 toggleLargeTitle: function toggleLargeTitle(navbarInnerEl) {
11952 var $navbarInnerEl = $(navbarInnerEl);
11953 if ($navbarInnerEl.hasClass('navbar')) {
11954 $navbarInnerEl = $navbarInnerEl.find('.navbar-inner-large');
11955 if ($navbarInnerEl.length > 1) {
11956 $navbarInnerEl = $(navbarInnerEl).find('.navbar-inner-large.navbar-current');
11958 if ($navbarInnerEl.length > 1 || !$navbarInnerEl.length) {
11962 if ($navbarInnerEl.hasClass('navbar-inner-large-collapsed')) {
11963 app.navbar.expandLargeTitle($navbarInnerEl);
11965 app.navbar.collapseLargeTitle($navbarInnerEl);
11968 initNavbarOnScroll: function initNavbarOnScroll(pageEl, navbarInnerEl, needHide, needCollapse) {
11970 var $pageEl = $(pageEl);
11971 var $navbarInnerEl = $(navbarInnerEl);
11972 var $navbarEl = app.theme === 'md'
11973 ? $navbarInnerEl.parents('.navbar')
11974 : $(navbarInnerEl || app.navbar.getElByPage(pageEl)).closest('.navbar');
11975 var isLarge = $navbarInnerEl.find('.title-large').length || $navbarInnerEl.hasClass('.navbar-inner-large');
11976 var navbarHideHeight = 44;
11977 var snapPageScrollToLargeTitle = app.params.navbar.snapPageScrollToLargeTitle;
11979 var previousScrollTop;
11980 var currentScrollTop;
11988 var navbarCollapsed;
11989 var navbarTitleLargeHeight;
11990 if (needCollapse || (needHide && isLarge)) {
11991 navbarTitleLargeHeight = $navbarInnerEl.css('--f7-navbar-large-title-height');
11992 if (navbarTitleLargeHeight && navbarTitleLargeHeight.indexOf('px') >= 0) {
11993 navbarTitleLargeHeight = parseInt(navbarTitleLargeHeight, 10);
11994 if (Number.isNaN(navbarTitleLargeHeight)) {
11995 navbarTitleLargeHeight = app.theme === 'ios' ? 52 : 48;
11998 navbarTitleLargeHeight = app.theme === 'ios' ? 52 : 48;
12001 if (needHide && isLarge) {
12002 navbarHideHeight += navbarTitleLargeHeight;
12007 var scrollTimeoutId;
12008 var touchEndTimeoutId;
12009 var touchSnapTimeout = 70;
12010 var desktopSnapTimeout = 300;
12012 function snapLargeNavbar() {
12013 var inSearchbarExpanded = $navbarInnerEl.hasClass('with-searchbar-expandable-enabled');
12014 if (inSearchbarExpanded) { return; }
12015 if (!scrollContent || currentScrollTop < 0) { return; }
12016 if (currentScrollTop >= navbarTitleLargeHeight / 2 && currentScrollTop < navbarTitleLargeHeight) {
12017 $(scrollContent).scrollTop(navbarTitleLargeHeight, 100);
12018 } else if (currentScrollTop < navbarTitleLargeHeight) {
12019 $(scrollContent).scrollTop(0, 200);
12023 function handleLargeNavbarCollapse() {
12024 var collapseProgress = Math.min(Math.max((currentScrollTop / navbarTitleLargeHeight), 0), 1);
12025 var inSearchbarExpanded = $navbarInnerEl.hasClass('with-searchbar-expandable-enabled');
12026 if (inSearchbarExpanded) { return; }
12027 navbarCollapsed = $navbarInnerEl.hasClass('navbar-inner-large-collapsed');
12028 if (collapseProgress === 0 && navbarCollapsed) {
12029 app.navbar.expandLargeTitle($navbarInnerEl[0]);
12030 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12031 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12032 $navbarInnerEl[0].style.overflow = '';
12033 if (app.theme === 'md') {
12034 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12036 } else if (collapseProgress === 1 && !navbarCollapsed) {
12037 app.navbar.collapseLargeTitle($navbarInnerEl[0]);
12038 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12039 $navbarInnerEl[0].style.overflow = '';
12040 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12041 if (app.theme === 'md') {
12042 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12044 } else if ((collapseProgress === 1 && navbarCollapsed) || (collapseProgress === 0 && !navbarCollapsed)) {
12045 $navbarInnerEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12046 $navbarInnerEl[0].style.overflow = '';
12047 $pageEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12048 if (app.theme === 'md') {
12049 $navbarEl[0].style.removeProperty('--f7-navbar-large-collapse-progress');
12052 $navbarInnerEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12053 $navbarInnerEl[0].style.overflow = 'visible';
12054 $pageEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12055 if (app.theme === 'md') {
12056 $navbarEl[0].style.setProperty('--f7-navbar-large-collapse-progress', collapseProgress);
12060 if (snapPageScrollToLargeTitle) {
12061 if (!Support.touch) {
12062 clearTimeout(scrollTimeoutId);
12063 scrollTimeoutId = setTimeout(function () {
12065 }, desktopSnapTimeout);
12066 } else if (touchEndTimeoutId) {
12067 clearTimeout(touchEndTimeoutId);
12068 touchEndTimeoutId = null;
12069 touchEndTimeoutId = setTimeout(function () {
12071 clearTimeout(touchEndTimeoutId);
12072 touchEndTimeoutId = null;
12073 }, touchSnapTimeout);
12078 function handleTitleHideShow() {
12079 scrollHeight = scrollContent.scrollHeight;
12080 offsetHeight = scrollContent.offsetHeight;
12081 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
12082 navbarHidden = $navbarEl.hasClass('navbar-hidden');
12085 if (app.params.navbar.showOnPageScrollEnd) {
12088 } else if (previousScrollTop > currentScrollTop) {
12089 if (app.params.navbar.showOnPageScrollTop || currentScrollTop <= navbarHideHeight) {
12094 } else if (currentScrollTop > navbarHideHeight) {
12100 if (action === 'show' && navbarHidden) {
12101 app.navbar.show($navbarEl);
12102 navbarHidden = false;
12103 } else if (action === 'hide' && !navbarHidden) {
12104 app.navbar.hide($navbarEl);
12105 navbarHidden = true;
12107 previousScrollTop = currentScrollTop;
12110 function handleScroll() {
12111 scrollContent = this;
12112 currentScrollTop = scrollContent.scrollTop;
12113 scrollChanged = currentScrollTop;
12115 if (needCollapse) {
12116 handleLargeNavbarCollapse();
12118 if ($pageEl.hasClass('page-previous')) { return; }
12120 handleTitleHideShow();
12123 function handeTouchStart() {
12124 scrollChanged = false;
12126 function handleTouchEnd() {
12127 clearTimeout(touchEndTimeoutId);
12128 touchEndTimeoutId = null;
12129 touchEndTimeoutId = setTimeout(function () {
12130 if (scrollChanged !== false) {
12132 clearTimeout(touchEndTimeoutId);
12133 touchEndTimeoutId = null;
12135 }, touchSnapTimeout);
12137 $pageEl.on('scroll', '.page-content', handleScroll, true);
12138 if (Support.touch && needCollapse && snapPageScrollToLargeTitle) {
12139 app.on('touchstart:passive', handeTouchStart);
12140 app.on('touchend:passive', handleTouchEnd);
12142 if (needCollapse) {
12143 $pageEl.find('.page-content').each(function (pageContentIndex, pageContentEl) {
12144 if (pageContentEl.scrollTop > 0) { handleScroll.call(pageContentEl); }
12147 $pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
12148 delete $pageEl[0].f7DetachNavbarScrollHandlers;
12149 $pageEl.off('scroll', '.page-content', handleScroll, true);
12150 if (Support.touch && needCollapse && snapPageScrollToLargeTitle) {
12151 app.off('touchstart:passive', handeTouchStart);
12152 app.off('touchend:passive', handleTouchEnd);
12159 create: function create() {
12161 Utils.extend(app, {
12163 size: Navbar.size.bind(app),
12164 hide: Navbar.hide.bind(app),
12165 show: Navbar.show.bind(app),
12166 getElByPage: Navbar.getElByPage.bind(app),
12167 getPageByEl: Navbar.getPageByEl.bind(app),
12168 collapseLargeTitle: Navbar.collapseLargeTitle.bind(app),
12169 expandLargeTitle: Navbar.expandLargeTitle.bind(app),
12170 toggleLargeTitle: Navbar.toggleLargeTitle.bind(app),
12171 initNavbarOnScroll: Navbar.initNavbarOnScroll.bind(app),
12177 scrollTopOnTitleClick: true,
12178 iosCenterTitle: true,
12179 mdCenterTitle: false,
12180 hideOnPageScroll: false,
12181 showOnPageScrollEnd: true,
12182 showOnPageScrollTop: true,
12183 collapseLargeTitleOnScroll: true,
12184 snapPageScrollToLargeTitle: true,
12188 'panelBreakpoint resize viewMasterDetailBreakpoint': function onResize() {
12190 $('.navbar').each(function (index, navbarEl) {
12191 app.navbar.size(navbarEl);
12194 pageBeforeRemove: function pageBeforeRemove(page) {
12195 if (page.$el[0].f7DetachNavbarScrollHandlers) {
12196 page.$el[0].f7DetachNavbarScrollHandlers();
12199 pageBeforeIn: function pageBeforeIn(page) {
12201 if (app.theme !== 'ios') { return; }
12203 var view = page.$el.parents('.view')[0].f7View;
12204 var navbarInnerEl = app.navbar.getElByPage(page);
12205 if (!navbarInnerEl) {
12206 $navbarEl = page.$el.parents('.view').children('.navbar');
12208 $navbarEl = $(navbarInnerEl).parents('.navbar');
12210 if (page.$el.hasClass('no-navbar') || (view.router.dynamicNavbar && !navbarInnerEl)) {
12211 var animate = !!(page.pageFrom && page.router.history.length > 0);
12212 app.navbar.hide($navbarEl, animate);
12214 app.navbar.show($navbarEl);
12217 pageReinit: function pageReinit(page) {
12219 var $navbarInnerEl = $(app.navbar.getElByPage(page));
12220 if (!$navbarInnerEl || $navbarInnerEl.length === 0) { return; }
12221 app.navbar.size($navbarInnerEl);
12223 pageInit: function pageInit(page) {
12225 var $navbarInnerEl = $(app.navbar.getElByPage(page));
12226 if (!$navbarInnerEl || $navbarInnerEl.length === 0) { return; }
12229 app.navbar.size($navbarInnerEl);
12231 // Need Collapse On Scroll
12232 var needCollapseOnScrollHandler;
12233 if ($navbarInnerEl.children('.title-large').length > 0) {
12234 $navbarInnerEl.addClass('navbar-inner-large');
12236 if ($navbarInnerEl.hasClass('navbar-inner-large')) {
12237 if (app.params.navbar.collapseLargeTitleOnScroll) { needCollapseOnScrollHandler = true; }
12238 if (app.theme === 'md') {
12239 $navbarInnerEl.parents('.navbar').addClass('navbar-large');
12241 page.$el.addClass('page-with-navbar-large');
12244 // Need Hide On Scroll
12245 var needHideOnScrollHandler;
12247 app.params.navbar.hideOnPageScroll
12248 || page.$el.find('.hide-navbar-on-scroll').length
12249 || page.$el.hasClass('hide-navbar-on-scroll')
12250 || page.$el.find('.hide-bars-on-scroll').length
12251 || page.$el.hasClass('hide-bars-on-scroll')
12254 page.$el.find('.keep-navbar-on-scroll').length
12255 || page.$el.hasClass('keep-navbar-on-scroll')
12256 || page.$el.find('.keep-bars-on-scroll').length
12257 || page.$el.hasClass('keep-bars-on-scroll')
12259 needHideOnScrollHandler = false;
12261 needHideOnScrollHandler = true;
12265 if (needCollapseOnScrollHandler || needHideOnScrollHandler) {
12266 app.navbar.initNavbarOnScroll(page.el, $navbarInnerEl[0], needHideOnScrollHandler, needCollapseOnScrollHandler);
12269 modalOpen: function modalOpen(modal) {
12272 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12273 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12277 modal.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12278 app.navbar.size(navbarEl);
12281 panelOpen: function panelOpen(panel) {
12284 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12285 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12289 panel.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12290 app.navbar.size(navbarEl);
12293 panelSwipeOpen: function panelSwipeOpen(panel) {
12296 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12297 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12301 panel.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12302 app.navbar.size(navbarEl);
12305 tabShow: function tabShow(tabEl) {
12308 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12309 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12313 $(tabEl).find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
12314 app.navbar.size(navbarEl);
12319 '.navbar .title': function onTitleClick($clickedEl) {
12321 if (!app.params.navbar.scrollTopOnTitleClick) { return; }
12322 if ($clickedEl.closest('a').length > 0) {
12326 // Find active page
12327 var navbar = $clickedEl.parents('.navbar');
12330 pageContent = navbar.parents('.page-content');
12332 if (pageContent.length === 0) {
12334 if (navbar.parents('.page').length > 0) {
12335 pageContent = navbar.parents('.page').find('.page-content');
12338 if (pageContent.length === 0) {
12339 if (navbar.nextAll('.page-current:not(.stacked)').length > 0) {
12340 pageContent = navbar.nextAll('.page-current:not(.stacked)').find('.page-content');
12344 if (pageContent && pageContent.length > 0) {
12346 if (pageContent.hasClass('tab')) {
12347 pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
12349 if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
12355 postpatch: function postpatch(vnode) {
12358 (app.theme === 'ios' && !app.params.navbar.iosCenterTitle)
12359 || (app.theme === 'md' && !app.params.navbar.mdCenterTitle)
12363 app.navbar.size(vnode.elm);
12370 setHighlight: function setHighlight(tabbarEl) {
12372 if (app.theme !== 'md') { return; }
12374 var $tabbarEl = $(tabbarEl);
12376 if ($tabbarEl.length === 0 || !($tabbarEl.hasClass('tabbar') || $tabbarEl.hasClass('tabbar-labels'))) { return; }
12378 var $highlightEl = $tabbarEl.find('.tab-link-highlight');
12379 var tabLinksCount = $tabbarEl.find('.tab-link').length;
12380 if (tabLinksCount === 0) {
12381 $highlightEl.remove();
12385 if ($highlightEl.length === 0) {
12386 $tabbarEl.children('.toolbar-inner').append('<span class="tab
-link
-highlight
"></span>');
12387 $highlightEl = $tabbarEl.find('.tab-link-highlight');
12388 } else if ($highlightEl.next().length) {
12389 $tabbarEl.children('.toolbar-inner').append($highlightEl);
12392 var $activeLink = $tabbarEl.find('.tab-link-active');
12393 var highlightWidth;
12394 var highlightTranslate;
12396 if ($tabbarEl.hasClass('tabbar-scrollable') && $activeLink && $activeLink[0]) {
12397 highlightWidth = ($activeLink[0].offsetWidth) + "px
";
12398 highlightTranslate = ($activeLink[0].offsetLeft) + "px
";
12400 var activeIndex = $activeLink.index();
12401 highlightWidth = (100 / tabLinksCount) + "%";
12402 highlightTranslate = ((app.rtl ? -activeIndex : activeIndex) * 100) + "%";
12405 Utils.nextFrame(function () {
12407 .css('width', highlightWidth)
12408 .transform(("translate3d(" + highlightTranslate + ",0,0)"));
12411 init: function init(tabbarEl) {
12413 app.toolbar.setHighlight(tabbarEl);
12415 hide: function hide(el, animate) {
12416 if ( animate === void 0 ) animate = true;
12419 if ($el.hasClass('toolbar-hidden')) { return; }
12420 var className = "toolbar
-hidden
" + (animate ? ' toolbar-transitioning' : '');
12421 $el.transitionEnd(function () {
12422 $el.removeClass('toolbar-transitioning');
12424 $el.addClass(className);
12426 show: function show(el, animate) {
12427 if ( animate === void 0 ) animate = true;
12430 if (!$el.hasClass('toolbar-hidden')) { return; }
12432 $el.addClass('toolbar-transitioning');
12433 $el.transitionEnd(function () {
12434 $el.removeClass('toolbar-transitioning');
12437 $el.removeClass('toolbar-hidden');
12439 initHideToolbarOnScroll: function initHideToolbarOnScroll(pageEl) {
12441 var $pageEl = $(pageEl);
12442 var $toolbarEl = $pageEl.parents('.view').children('.toolbar');
12443 if ($toolbarEl.length === 0) {
12444 $toolbarEl = $pageEl.find('.toolbar');
12446 if ($toolbarEl.length === 0) {
12447 $toolbarEl = $pageEl.parents('.views').children('.tabbar, .tabbar-labels');
12449 if ($toolbarEl.length === 0) {
12453 var previousScrollTop;
12454 var currentScrollTop;
12461 function handleScroll() {
12462 var scrollContent = this;
12463 if ($pageEl.hasClass('page-previous')) { return; }
12464 currentScrollTop = scrollContent.scrollTop;
12465 scrollHeight = scrollContent.scrollHeight;
12466 offsetHeight = scrollContent.offsetHeight;
12467 reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
12468 toolbarHidden = $toolbarEl.hasClass('toolbar-hidden');
12471 if (app.params.toolbar.showOnPageScrollEnd) {
12474 } else if (previousScrollTop > currentScrollTop) {
12475 if (app.params.toolbar.showOnPageScrollTop || currentScrollTop <= 44) {
12480 } else if (currentScrollTop > 44) {
12486 if (action === 'show' && toolbarHidden) {
12487 app.toolbar.show($toolbarEl);
12488 toolbarHidden = false;
12489 } else if (action === 'hide' && !toolbarHidden) {
12490 app.toolbar.hide($toolbarEl);
12491 toolbarHidden = true;
12494 previousScrollTop = currentScrollTop;
12496 $pageEl.on('scroll', '.page-content', handleScroll, true);
12497 $pageEl[0].f7ScrollToolbarHandler = handleScroll;
12502 create: function create() {
12504 Utils.extend(app, {
12506 hide: Toolbar.hide.bind(app),
12507 show: Toolbar.show.bind(app),
12508 setHighlight: Toolbar.setHighlight.bind(app),
12509 initHideToolbarOnScroll: Toolbar.initHideToolbarOnScroll.bind(app),
12510 init: Toolbar.init.bind(app),
12516 hideOnPageScroll: false,
12517 showOnPageScrollEnd: true,
12518 showOnPageScrollTop: true,
12522 pageBeforeRemove: function pageBeforeRemove(page) {
12523 if (page.$el[0].f7ScrollToolbarHandler) {
12524 page.$el.off('scroll', '.page-content', page.$el[0].f7ScrollToolbarHandler, true);
12527 pageBeforeIn: function pageBeforeIn(page) {
12529 var $toolbarEl = page.$el.parents('.view').children('.toolbar');
12530 if ($toolbarEl.length === 0) {
12531 $toolbarEl = page.$el.parents('.views').children('.tabbar, .tabbar-labels');
12533 if ($toolbarEl.length === 0) {
12534 $toolbarEl = page.$el.find('.toolbar');
12536 if ($toolbarEl.length === 0) {
12539 if (page.$el.hasClass('no-toolbar')) {
12540 app.toolbar.hide($toolbarEl);
12542 app.toolbar.show($toolbarEl);
12545 pageInit: function pageInit(page) {
12547 page.$el.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
12548 app.toolbar.init(tabbarEl);
12551 app.params.toolbar.hideOnPageScroll
12552 || page.$el.find('.hide-toolbar-on-scroll').length
12553 || page.$el.hasClass('hide-toolbar-on-scroll')
12554 || page.$el.find('.hide-bars-on-scroll').length
12555 || page.$el.hasClass('hide-bars-on-scroll')
12558 page.$el.find('.keep-toolbar-on-scroll').length
12559 || page.$el.hasClass('keep-toolbar-on-scroll')
12560 || page.$el.find('.keep-bars-on-scroll').length
12561 || page.$el.hasClass('keep-bars-on-scroll')
12565 app.toolbar.initHideToolbarOnScroll(page.el);
12568 init: function init() {
12570 app.root.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
12571 app.toolbar.init(tabbarEl);
12580 pageInit: function pageInit(page) {
12581 if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length) {
12582 page.$el.addClass('page-with-subnavbar');
12584 if (page.$el.find('.subnavbar').length) {
12585 page.$el.addClass('page-with-subnavbar');
12591 var TouchRipple = function TouchRipple($el, x, y) {
12593 if (!$el) { return undefined; }
12594 var box = $el[0].getBoundingClientRect();
12599 var width = box.width;
12600 var height = box.height;
12601 var diameter = Math.max((Math.pow( ((Math.pow( height, 2 )) + (Math.pow( width, 2 ))), 0.5 )), 48);
12603 ripple.$rippleWaveEl = $(("<div
class=\"ripple
-wave
\" style
=\"width
: " + diameter + "px
; height
: " + diameter + "px
; margin
-top
:-" + (diameter / 2) + "px
; margin
-left
:-" + (diameter / 2) + "px
; left
:" + (center.x) + "px
; top
:" + (center.y) + "px
;\"></div
>"));
12605 $el.prepend(ripple.$rippleWaveEl);
12607 /* eslint no-underscore-dangle: ["error
", { "allow
": ["_clientLeft
"] }] */
12608 // ripple._clientLeft = ripple.$rippleWaveEl[0].clientLeft;
12609 ripple.rippleTransform = "translate3d(" + (-center.x + (width / 2)) + "px
, " + (-center.y + (height / 2)) + "px
, 0) scale(1)";
12611 Utils.nextFrame(function () {
12612 if (!ripple || !ripple.$rippleWaveEl) { return; }
12613 ripple.$rippleWaveEl.transform(ripple.rippleTransform);
12619 TouchRipple.prototype.onRemove = function onRemove () {
12621 if (ripple.$rippleWaveEl) {
12622 ripple.$rippleWaveEl.remove();
12624 Object.keys(ripple).forEach(function (key) {
12625 ripple[key] = null;
12626 delete ripple[key];
12631 TouchRipple.prototype.remove = function remove () {
12633 if (ripple.removing) { return; }
12634 var $rippleWaveEl = this.$rippleWaveEl;
12635 var rippleTransform = this.rippleTransform;
12636 var removeTimeout = Utils.nextTick(function () {
12639 ripple.removing = true;
12641 .addClass('ripple-wave-fill')
12642 .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'))
12643 .transitionEnd(function () {
12644 clearTimeout(removeTimeout);
12645 Utils.nextFrame(function () {
12647 .addClass('ripple-wave-out')
12648 .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'));
12650 removeTimeout = Utils.nextTick(function () {
12654 $rippleWaveEl.transitionEnd(function () {
12655 clearTimeout(removeTimeout);
12662 var TouchRipple$1 = {
12663 name: 'touch-ripple',
12665 TouchRipple: TouchRipple,
12667 create: function create() {
12669 app.touchRipple = {
12670 create: function create() {
12671 var args = [], len = arguments.length;
12672 while ( len-- ) args[ len ] = arguments[ len ];
12674 return new (Function.prototype.bind.apply( TouchRipple, [ null ].concat( args) ));
12680 var openedModals = [];
12681 var dialogsQueue = [];
12682 function clearDialogsQueue() {
12683 if (dialogsQueue.length === 0) { return; }
12684 var dialog = dialogsQueue.shift();
12687 var Modal = /*@__PURE__*/(function (Framework7Class$$1) {
12688 function Modal(app, params) {
12689 Framework7Class$$1.call(this, params, [app]);
12695 // Extend defaults with modules params
12696 modal.useModulesParams(defaults);
12698 modal.params = Utils.extend(defaults, params);
12699 modal.opened = false;
12702 modal.useModules();
12707 if ( Framework7Class$$1 ) Modal.__proto__ = Framework7Class$$1;
12708 Modal.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
12709 Modal.prototype.constructor = Modal;
12711 Modal.prototype.onOpen = function onOpen () {
12713 modal.opened = true;
12714 openedModals.push(modal);
12715 $('html').addClass(("with-modal
-" + (modal.type.toLowerCase())));
12716 modal.$el.trigger(("modal
:open
" + (modal.type.toLowerCase()) + ":open
"), modal);
12717 modal.emit(("local
::open modalOpen
" + (modal.type) + "Open
"), modal);
12720 Modal.prototype.onOpened = function onOpened () {
12722 modal.$el.trigger(("modal
:opened
" + (modal.type.toLowerCase()) + ":opened
"), modal);
12723 modal.emit(("local
::opened modalOpened
" + (modal.type) + "Opened
"), modal);
12726 Modal.prototype.onClose = function onClose () {
12728 modal.opened = false;
12729 if (!modal.type || !modal.$el) { return; }
12730 openedModals.splice(openedModals.indexOf(modal), 1);
12731 $('html').removeClass(("with-modal
-" + (modal.type.toLowerCase())));
12732 modal.$el.trigger(("modal
:close
" + (modal.type.toLowerCase()) + ":close
"), modal);
12733 modal.emit(("local
::close modalClose
" + (modal.type) + "Close
"), modal);
12736 Modal.prototype.onClosed = function onClosed () {
12738 if (!modal.type || !modal.$el) { return; }
12739 modal.$el.removeClass('modal-out');
12741 modal.$el.trigger(("modal
:closed
" + (modal.type.toLowerCase()) + ":closed
"), modal);
12742 modal.emit(("local
::closed modalClosed
" + (modal.type) + "Closed
"), modal);
12745 Modal.prototype.open = function open (animateModal) {
12747 var app = modal.app;
12748 var $el = modal.$el;
12749 var $backdropEl = modal.$backdropEl;
12750 var type = modal.type;
12751 var animate = true;
12752 if (typeof animateModal !== 'undefined') { animate = animateModal; }
12753 else if (typeof modal.params.animate !== 'undefined') {
12754 animate = modal.params.animate;
12757 if (!$el || $el.hasClass('modal-in')) {
12761 if (type === 'dialog' && app.params.modal.queueDialogs) {
12763 if ($('.dialog.modal-in').length > 0) {
12764 pushToQueue = true;
12765 } else if (openedModals.length > 0) {
12766 openedModals.forEach(function (openedModal) {
12767 if (openedModal.type === 'dialog') { pushToQueue = true; }
12771 dialogsQueue.push(modal);
12776 var $modalParentEl = $el.parent();
12777 var wasInDom = $el.parents(doc).length > 0;
12778 if (app.params.modal.moveToRoot && !$modalParentEl.is(app.root)) {
12779 app.root.append($el);
12780 modal.once((type + "Closed
"), function () {
12782 $modalParentEl.append($el);
12791 /* eslint no-underscore-dangle: ["error
", { "allow
": ["_clientLeft
"] }] */
12792 modal._clientLeft = $el[0].clientLeft;
12795 function transitionEnd() {
12796 if ($el.hasClass('modal-out')) {
12798 } else if ($el.hasClass('modal-in')) {
12804 $backdropEl.removeClass('not-animated');
12805 $backdropEl.addClass('backdrop-in');
12808 .animationEnd(function () {
12812 .transitionEnd(function () {
12816 .removeClass('modal-out not-animated')
12817 .addClass('modal-in');
12821 $backdropEl.addClass('backdrop-in not-animated');
12823 $el.removeClass('modal-out').addClass('modal-in not-animated');
12831 Modal.prototype.close = function close (animateModal) {
12833 var $el = modal.$el;
12834 var $backdropEl = modal.$backdropEl;
12836 var animate = true;
12837 if (typeof animateModal !== 'undefined') { animate = animateModal; }
12838 else if (typeof modal.params.animate !== 'undefined') {
12839 animate = modal.params.animate;
12842 if (!$el || !$el.hasClass('modal-in')) {
12848 var needToHideBackdrop = true;
12849 if (modal.type === 'popup') {
12850 modal.$el.prevAll('.popup.modal-in').each(function (index, popupEl) {
12851 var popupInstance = popupEl.f7Modal;
12852 if (!popupInstance) { return; }
12854 popupInstance.params.closeByBackdropClick
12855 && popupInstance.params.backdrop
12856 && popupInstance.backdropEl === modal.backdropEl
12858 needToHideBackdrop = false;
12862 if (needToHideBackdrop) {
12863 $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
12864 $backdropEl.removeClass('backdrop-in');
12869 $el[animate ? 'removeClass' : 'addClass']('not-animated');
12870 function transitionEnd() {
12871 if ($el.hasClass('modal-out')) {
12873 } else if ($el.hasClass('modal-in')) {
12879 .animationEnd(function () {
12883 .transitionEnd(function () {
12887 .removeClass('modal-in')
12888 .addClass('modal-out');
12893 .addClass('not-animated')
12894 .removeClass('modal-in')
12895 .addClass('modal-out');
12901 if (modal.type === 'dialog') {
12902 clearDialogsQueue();
12908 Modal.prototype.destroy = function destroy () {
12910 if (modal.destroyed) { return; }
12911 modal.emit(("local
::beforeDestroy modalBeforeDestroy
" + (modal.type) + "BeforeDestroy
"), modal);
12913 modal.$el.trigger(("modal
:beforedestroy
" + (modal.type.toLowerCase()) + ":beforedestroy
"), modal);
12914 if (modal.$el.length && modal.$el[0].f7Modal) {
12915 delete modal.$el[0].f7Modal;
12918 Utils.deleteProps(modal);
12919 modal.destroyed = true;
12923 }(Framework7Class));
12925 var CustomModal = /*@__PURE__*/(function (Modal$$1) {
12926 function CustomModal(app, params) {
12927 var extendedParams = Utils.extend({
12929 closeByBackdropClick: true,
12933 // Extends with open/close Modal methods;
12934 Modal$$1.call(this, app, extendedParams);
12936 var customModal = this;
12938 customModal.params = extendedParams;
12942 if (!customModal.params.el) {
12943 $el = $(customModal.params.content);
12945 $el = $(customModal.params.el);
12948 if ($el && $el.length > 0 && $el[0].f7Modal) {
12949 return $el[0].f7Modal;
12952 if ($el.length === 0) {
12953 return customModal.destroy();
12956 if (customModal.params.backdrop) {
12957 $backdropEl = app.root.children('.custom-modal-backdrop');
12958 if ($backdropEl.length === 0) {
12959 $backdropEl = $('<div class="custom
-modal
-backdrop
"></div>');
12960 app.root.append($backdropEl);
12964 function handleClick(e) {
12965 if (!customModal || customModal.destroyed) { return; }
12966 if ($backdropEl && e.target === $backdropEl[0]) {
12967 customModal.close();
12971 customModal.on('customModalOpened', function () {
12972 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
12973 app.on('click', handleClick);
12976 customModal.on('customModalClose', function () {
12977 if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
12978 app.off('click', handleClick);
12982 Utils.extend(customModal, {
12986 $backdropEl: $backdropEl,
12987 backdropEl: $backdropEl && $backdropEl[0],
12988 type: 'customModal',
12991 $el[0].f7Modal = customModal;
12993 return customModal;
12996 if ( Modal$$1 ) CustomModal.__proto__ = Modal$$1;
12997 CustomModal.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
12998 CustomModal.prototype.constructor = CustomModal;
13000 return CustomModal;
13007 CustomModal: CustomModal,
13009 create: function create() {
13011 app.customModal = {
13012 create: function create(params) {
13013 return new CustomModal(app, params);
13020 queueDialogs: true,
13025 var Dialog = /*@__PURE__*/(function (Modal$$1) {
13026 function Dialog(app, params) {
13027 var extendedParams = Utils.extend({
13028 title: app.params.dialog.title,
13032 verticalButtons: false,
13033 onClick: undefined,
13034 cssClass: undefined,
13035 destroyOnClose: false,
13038 if (typeof extendedParams.closeByBackdropClick === 'undefined') {
13039 extendedParams.closeByBackdropClick = app.params.dialog.closeByBackdropClick;
13042 // Extends with open/close Modal methods;
13043 Modal$$1.call(this, app, extendedParams);
13047 var title = extendedParams.title;
13048 var text = extendedParams.text;
13049 var content = extendedParams.content;
13050 var buttons = extendedParams.buttons;
13051 var verticalButtons = extendedParams.verticalButtons;
13052 var cssClass = extendedParams.cssClass;
13054 dialog.params = extendedParams;
13058 if (!dialog.params.el) {
13059 var dialogClasses = ['dialog'];
13060 if (buttons.length === 0) { dialogClasses.push('dialog-no-buttons'); }
13061 if (buttons.length > 0) { dialogClasses.push(("dialog
-buttons
-" + (buttons.length))); }
13062 if (verticalButtons) { dialogClasses.push('dialog-buttons-vertical'); }
13063 if (cssClass) { dialogClasses.push(cssClass); }
13065 var buttonsHTML = '';
13066 if (buttons.length > 0) {
13067 buttonsHTML = "\n <div
class=\"dialog
-buttons
\">\n " + (buttons.map(function (button) { return ("\n <span
class=\"dialog
-button
" + (button.bold ? ' dialog-button-bold' : '') + (button.color ? (" color
-" + (button.color)) : '') + (button.cssClass ? (" " + (button.cssClass)) : '') + "\">" + (button.text) + "</span>\n "); }).join('')) + "\n </div>\n ";
13070 var dialogHtml = "\n <div
class=\"" + (dialogClasses.join(' ')) + "\">\n <div
class=\"dialog
-inner
\">\n " + (title ? ("<div
class=\"dialog
-title
\">" + title + "</div>") : '') + "\n " + (text ? ("<div class=\"dialog-text\">" + text + "</div>") : '') + "\n " + content + "\n </div>\n " + buttonsHTML + "\n </div>\n ";
13071 $el = $(dialogHtml);
13073 $el = $(dialog.params.el);
13076 if ($el && $el.length > 0 && $el[0].f7Modal) {
13077 return $el[0].f7Modal;
13080 if ($el.length === 0) {
13081 return dialog.destroy();
13084 var $backdropEl = app.root.children('.dialog-backdrop');
13085 if ($backdropEl.length === 0) {
13086 $backdropEl = $('<div class="dialog
-backdrop
"></div>');
13087 app.root.append($backdropEl);
13091 function buttonOnClick(e) {
13092 var buttonEl = this;
13093 var index = $(buttonEl).index();
13094 var button = buttons[index];
13095 if (button.onClick) { button.onClick(dialog, e); }
13096 if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
13097 if (button.close !== false) { dialog.close(); }
13099 var addKeyboardHander;
13100 function onKeyPress(e) {
13101 var keyCode = e.keyCode;
13102 buttons.forEach(function (button, index) {
13103 if (button.keyCodes && button.keyCodes.indexOf(keyCode) >= 0) {
13104 if (doc.activeElement) { doc.activeElement.blur(); }
13105 if (button.onClick) { button.onClick(dialog, e); }
13106 if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
13107 if (button.close !== false) { dialog.close(); }
13111 if (buttons && buttons.length > 0) {
13112 dialog.on('open', function () {
13113 $el.find('.dialog-button').each(function (index, buttonEl) {
13114 var button = buttons[index];
13115 if (button.keyCodes) { addKeyboardHander = true; }
13116 $(buttonEl).on('click', buttonOnClick);
13121 && !app.device.android
13122 && !app.device.cordova
13124 $(doc).on('keydown', onKeyPress);
13127 dialog.on('close', function () {
13128 $el.find('.dialog-button').each(function (index, buttonEl) {
13129 $(buttonEl).off('click', buttonOnClick);
13134 && !app.device.android
13135 && !app.device.cordova
13137 $(doc).off('keydown', onKeyPress);
13139 addKeyboardHander = false;
13142 Utils.extend(dialog, {
13146 $backdropEl: $backdropEl,
13147 backdropEl: $backdropEl[0],
13149 setProgress: function setProgress(progress, duration) {
13150 app.progressbar.set($el.find('.progressbar'), progress, duration);
13153 setText: function setText(newText) {
13154 var $textEl = $el.find('.dialog-text');
13155 if ($textEl.length === 0) {
13156 $textEl = $('<div class="dialog
-text
"></div>');
13157 if (typeof title !== 'undefined') {
13158 $textEl.insertAfter($el.find('.dialog-title'));
13160 $el.find('.dialog-inner').prepend($textEl);
13163 $textEl.html(newText);
13164 dialog.params.text = newText;
13167 setTitle: function setTitle(newTitle) {
13168 var $titleEl = $el.find('.dialog-title');
13169 if ($titleEl.length === 0) {
13170 $titleEl = $('<div class="dialog
-title
"></div>');
13171 $el.find('.dialog-inner').prepend($titleEl);
13173 $titleEl.html(newTitle);
13174 dialog.params.title = newTitle;
13179 function handleClick(e) {
13180 var target = e.target;
13181 var $target = $(target);
13182 if ($target.closest(dialog.el).length === 0) {
13184 dialog.params.closeByBackdropClick
13185 && dialog.backdropEl
13186 && dialog.backdropEl === target
13193 dialog.on('opened', function () {
13194 if (dialog.params.closeByBackdropClick) {
13195 app.on('click', handleClick);
13198 dialog.on('close', function () {
13199 if (dialog.params.closeByBackdropClick) {
13200 app.off('click', handleClick);
13204 $el[0].f7Modal = dialog;
13206 if (dialog.params.destroyOnClose) {
13207 dialog.once('closed', function () {
13208 setTimeout(function () {
13217 if ( Modal$$1 ) Dialog.__proto__ = Modal$$1;
13218 Dialog.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13219 Dialog.prototype.constructor = Dialog;
13230 buttonCancel: 'Cancel',
13231 usernamePlaceholder: 'Username',
13232 passwordPlaceholder: 'Password',
13233 preloaderTitle: 'Loading... ',
13234 progressTitle: 'Loading... ',
13235 closeByBackdropClick: false,
13236 destroyPredefinedDialogs: true,
13237 keyboardActions: true,
13243 create: function create() {
13245 function defaultDialogTitle() {
13246 return app.params.dialog.title || app.name;
13248 var destroyOnClose = app.params.dialog.destroyPredefinedDialogs;
13249 var keyboardActions = app.params.dialog.keyboardActions;
13250 app.dialog = Utils.extend(
13253 constructor: Dialog,
13254 defaultSelector: '.dialog.modal-in',
13258 alert: function alert() {
13261 var args = [], len = arguments.length;
13262 while ( len-- ) args[ len ] = arguments[ len ];
13263 var text = args[0];
13264 var title = args[1];
13265 var callbackOk = args[2];
13266 if (args.length === 2 && typeof args[1] === 'function') {
13267 (assign = args, text = assign[0], callbackOk = assign[1], title = assign[2]);
13269 return new Dialog(app, {
13270 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13273 text: app.params.dialog.buttonOk,
13275 onClick: callbackOk,
13276 keyCodes: keyboardActions ? [13, 27] : null,
13278 destroyOnClose: destroyOnClose,
13281 prompt: function prompt() {
13284 var args = [], len = arguments.length;
13285 while ( len-- ) args[ len ] = arguments[ len ];
13286 var text = args[0];
13287 var title = args[1];
13288 var callbackOk = args[2];
13289 var callbackCancel = args[3];
13290 var defaultValue = args[4];
13291 if (typeof args[1] === 'function') {
13292 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], defaultValue = assign[3], title = assign[4]);
13294 defaultValue = typeof defaultValue === 'undefined' || defaultValue === null ? '' : defaultValue;
13295 return new Dialog(app, {
13296 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13298 content: ("<div
class=\"dialog
-input
-field input
\"><input type
=\"text
\" class=\"dialog
-input
\" value
=\"" + defaultValue + "\"></div
>"),
13301 text: app.params.dialog.buttonCancel,
13302 keyCodes: keyboardActions ? [27] : null,
13305 text: app.params.dialog.buttonOk,
13307 keyCodes: keyboardActions ? [13] : null,
13309 onClick: function onClick(dialog, index) {
13310 var inputValue = dialog.$el.find('.dialog-input').val();
13311 if (index === 0 && callbackCancel) { callbackCancel(inputValue); }
13312 if (index === 1 && callbackOk) { callbackOk(inputValue); }
13314 destroyOnClose: destroyOnClose,
13317 confirm: function confirm() {
13320 var args = [], len = arguments.length;
13321 while ( len-- ) args[ len ] = arguments[ len ];
13322 var text = args[0];
13323 var title = args[1];
13324 var callbackOk = args[2];
13325 var callbackCancel = args[3];
13326 if (typeof args[1] === 'function') {
13327 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13329 return new Dialog(app, {
13330 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13334 text: app.params.dialog.buttonCancel,
13335 onClick: callbackCancel,
13336 keyCodes: keyboardActions ? [27] : null,
13339 text: app.params.dialog.buttonOk,
13341 onClick: callbackOk,
13342 keyCodes: keyboardActions ? [13] : null,
13344 destroyOnClose: destroyOnClose,
13347 login: function login() {
13350 var args = [], len = arguments.length;
13351 while ( len-- ) args[ len ] = arguments[ len ];
13352 var text = args[0];
13353 var title = args[1];
13354 var callbackOk = args[2];
13355 var callbackCancel = args[3];
13356 if (typeof args[1] === 'function') {
13357 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13359 return new Dialog(app, {
13360 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13362 content: ("\n <div
class=\"dialog
-input
-field dialog
-input
-double input
\">\n <input type
=\"text
\" name
=\"dialog
-username
\" placeholder
=\"" + (app.params.dialog.usernamePlaceholder) + "\" class=\"dialog
-input
\">\n </div>\n <div class=\"dialog-input-field dialog-input-double input\">\n <input type=\"password\" name=\"dialog-password\" placeholder=\"" + (app.params.dialog.passwordPlaceholder) + "\" class=\"dialog-input\">\n </div>"),
13365 text: app.params.dialog.buttonCancel,
13366 keyCodes: keyboardActions ? [27] : null,
13369 text: app.params.dialog.buttonOk,
13371 keyCodes: keyboardActions ? [13] : null,
13373 onClick: function onClick(dialog, index) {
13374 var username = dialog.$el.find('[name="dialog
-username
"]').val();
13375 var password = dialog.$el.find('[name="dialog
-password
"]').val();
13376 if (index === 0 && callbackCancel) { callbackCancel(username, password); }
13377 if (index === 1 && callbackOk) { callbackOk(username, password); }
13379 destroyOnClose: destroyOnClose,
13382 password: function password() {
13385 var args = [], len = arguments.length;
13386 while ( len-- ) args[ len ] = arguments[ len ];
13387 var text = args[0];
13388 var title = args[1];
13389 var callbackOk = args[2];
13390 var callbackCancel = args[3];
13391 if (typeof args[1] === 'function') {
13392 (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
13394 return new Dialog(app, {
13395 title: typeof title === 'undefined' ? defaultDialogTitle() : title,
13397 content: ("\n <div
class=\"dialog
-input
-field input
\">\n <input type
=\"password
\" name
=\"dialog
-password
\" placeholder
=\"" + (app.params.dialog.passwordPlaceholder) + "\" class=\"dialog
-input
\">\n </div
>"),
13400 text: app.params.dialog.buttonCancel,
13401 keyCodes: keyboardActions ? [27] : null,
13404 text: app.params.dialog.buttonOk,
13406 keyCodes: keyboardActions ? [13] : null,
13408 onClick: function onClick(dialog, index) {
13409 var password = dialog.$el.find('[name="dialog
-password
"]').val();
13410 if (index === 0 && callbackCancel) { callbackCancel(password); }
13411 if (index === 1 && callbackOk) { callbackOk(password); }
13413 destroyOnClose: destroyOnClose,
13416 preloader: function preloader(title, color) {
13417 var preloaderInner = Utils[((app.theme) + "PreloaderContent
")] || '';
13418 return new Dialog(app, {
13419 title: typeof title === 'undefined' || title === null ? app.params.dialog.preloaderTitle : title,
13420 content: ("<div
class=\"preloader
" + (color ? (" color
-" + color) : '') + "\">" + preloaderInner + "</div
>"),
13421 cssClass: 'dialog-preloader',
13422 destroyOnClose: destroyOnClose,
13425 progress: function progress() {
13426 var assign, assign$1, assign$2;
13428 var args = [], len = arguments.length;
13429 while ( len-- ) args[ len ] = arguments[ len ];
13430 var title = args[0];
13431 var progress = args[1];
13432 var color = args[2];
13433 if (args.length === 2) {
13434 if (typeof args[0] === 'number') {
13435 (assign = args, progress = assign[0], color = assign[1], title = assign[2]);
13436 } else if (typeof args[0] === 'string' && typeof args[1] === 'string') {
13437 (assign$1 = args, title = assign$1[0], color = assign$1[1], progress = assign$1[2]);
13439 } else if (args.length === 1) {
13440 if (typeof args[0] === 'number') {
13441 (assign$2 = args, progress = assign$2[0], title = assign$2[1], color = assign$2[2]);
13444 var infinite = typeof progress === 'undefined';
13445 var dialog = new Dialog(app, {
13446 title: typeof title === 'undefined' ? app.params.dialog.progressTitle : title,
13447 cssClass: 'dialog-progress',
13448 content: ("\n <div
class=\"progressbar
" + (infinite ? '-infinite' : '') + (color ? (" color
-" + color) : '') + "\">\n " + (!infinite ? '<span></span>' : '') + "\n </div
>\n "),
13449 destroyOnClose: destroyOnClose,
13451 if (!infinite) { dialog.setProgress(progress); }
13452 return dialog.open();
13459 var Popup = /*@__PURE__*/(function (Modal$$1) {
13460 function Popup(app, params) {
13461 var extendedParams = Utils.extend(
13467 // Extends with open/close Modal methods;
13468 Modal$$1.call(this, app, extendedParams);
13472 popup.params = extendedParams;
13476 if (!popup.params.el) {
13477 $el = $(popup.params.content);
13479 $el = $(popup.params.el);
13482 if ($el && $el.length > 0 && $el[0].f7Modal) {
13483 return $el[0].f7Modal;
13486 if ($el.length === 0) {
13487 return popup.destroy();
13491 if (popup.params.backdrop) {
13492 $backdropEl = app.root.children('.popup-backdrop');
13493 if ($backdropEl.length === 0) {
13494 $backdropEl = $('<div class="popup
-backdrop
"></div>');
13495 app.root.append($backdropEl);
13499 Utils.extend(popup, {
13503 $backdropEl: $backdropEl,
13504 backdropEl: $backdropEl && $backdropEl[0],
13508 function handleClick(e) {
13509 var target = e.target;
13510 var $target = $(target);
13511 if ($target.closest(popup.el).length === 0) {
13514 && popup.params.closeByBackdropClick
13515 && popup.params.backdrop
13516 && popup.backdropEl
13517 && popup.backdropEl === target
13519 var needToClose = true;
13520 popup.$el.nextAll('.popup.modal-in').each(function (index, popupEl) {
13521 var popupInstance = popupEl.f7Modal;
13522 if (!popupInstance) { return; }
13524 popupInstance.params.closeByBackdropClick
13525 && popupInstance.params.backdrop
13526 && popupInstance.backdropEl === popup.backdropEl
13528 needToClose = false;
13538 popup.on('popupOpened', function () {
13539 if (popup.params.closeByBackdropClick) {
13540 app.on('click', handleClick);
13543 popup.on('popupClose', function () {
13544 if (popup.params.closeByBackdropClick) {
13545 app.off('click', handleClick);
13549 $el[0].f7Modal = popup;
13554 if ( Modal$$1 ) Popup.__proto__ = Modal$$1;
13555 Popup.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13556 Popup.prototype.constructor = Popup;
13566 closeByBackdropClick: true,
13572 create: function create() {
13574 app.popup = ModalMethods({
13576 constructor: Popup,
13577 defaultSelector: '.popup.modal-in',
13581 '.popup-open': function openPopup($clickedEl, data) {
13582 if ( data === void 0 ) data = {};
13585 app.popup.open(data.popup, data.animate);
13587 '.popup-close': function closePopup($clickedEl, data) {
13588 if ( data === void 0 ) data = {};
13591 app.popup.close(data.popup, data.animate);
13596 var LoginScreen = /*@__PURE__*/(function (Modal$$1) {
13597 function LoginScreen(app, params) {
13598 var extendedParams = Utils.extend({
13602 // Extends with open/close Modal methods;
13603 Modal$$1.call(this, app, extendedParams);
13605 var loginScreen = this;
13607 loginScreen.params = extendedParams;
13611 if (!loginScreen.params.el) {
13612 $el = $(loginScreen.params.content);
13614 $el = $(loginScreen.params.el);
13617 if ($el && $el.length > 0 && $el[0].f7Modal) {
13618 return $el[0].f7Modal;
13621 if ($el.length === 0) {
13622 return loginScreen.destroy();
13625 Utils.extend(loginScreen, {
13629 type: 'loginScreen',
13632 $el[0].f7Modal = loginScreen;
13634 return loginScreen;
13637 if ( Modal$$1 ) LoginScreen.__proto__ = Modal$$1;
13638 LoginScreen.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13639 LoginScreen.prototype.constructor = LoginScreen;
13641 return LoginScreen;
13644 var LoginScreen$1 = {
13645 name: 'loginScreen',
13647 LoginScreen: LoginScreen,
13649 create: function create() {
13651 app.loginScreen = ModalMethods({
13653 constructor: LoginScreen,
13654 defaultSelector: '.login-screen.modal-in',
13658 '.login-screen-open': function openLoginScreen($clickedEl, data) {
13659 if ( data === void 0 ) data = {};
13662 app.loginScreen.open(data.loginScreen, data.animate);
13664 '.login-screen-close': function closeLoginScreen($clickedEl, data) {
13665 if ( data === void 0 ) data = {};
13668 app.loginScreen.close(data.loginScreen, data.animate);
13673 var Popover = /*@__PURE__*/(function (Modal$$1) {
13674 function Popover(app, params) {
13675 var extendedParams = Utils.extend(
13677 app.params.popover,
13681 // Extends with open/close Modal methods;
13682 Modal$$1.call(this, app, extendedParams);
13684 var popover = this;
13686 popover.params = extendedParams;
13690 if (!popover.params.el) {
13691 $el = $(popover.params.content);
13693 $el = $(popover.params.el);
13696 if ($el && $el.length > 0 && $el[0].f7Modal) {
13697 return $el[0].f7Modal;
13701 var $targetEl = $(popover.params.targetEl).eq(0);
13703 if ($el.length === 0) {
13704 return popover.destroy();
13709 if (popover.params.backdrop) {
13710 $backdropEl = app.root.children('.popover-backdrop');
13711 if ($backdropEl.length === 0) {
13712 $backdropEl = $('<div class="popover
-backdrop
"></div>');
13713 app.root.append($backdropEl);
13719 if ($el.find('.popover-angle').length === 0) {
13720 $angleEl = $('<div class="popover
-angle
"></div>');
13721 $el.prepend($angleEl);
13723 $angleEl = $el.find('.popover-angle');
13727 var originalOpen = popover.open;
13729 Utils.extend(popover, {
13733 $targetEl: $targetEl,
13734 targetEl: $targetEl[0],
13735 $angleEl: $angleEl,
13736 angleEl: $angleEl[0],
13737 $backdropEl: $backdropEl,
13738 backdropEl: $backdropEl && $backdropEl[0],
13740 open: function open() {
13743 var args = [], len = arguments.length;
13744 while ( len-- ) args[ len ] = arguments[ len ];
13745 var targetEl = args[0];
13746 var animate = args[1];
13747 if (typeof args[0] === 'boolean') { (assign = args, animate = assign[0], targetEl = assign[1]); }
13749 popover.$targetEl = $(targetEl);
13750 popover.targetEl = popover.$targetEl[0];
13752 return originalOpen.call(popover, animate);
13756 function handleResize() {
13759 popover.on('popoverOpen', function () {
13761 app.on('resize', handleResize);
13762 popover.on('popoverClose popoverBeforeDestroy', function () {
13763 app.off('resize', handleResize);
13767 function handleClick(e) {
13768 var target = e.target;
13769 var $target = $(target);
13770 if ($target.closest(popover.el).length === 0) {
13772 popover.params.closeByBackdropClick
13773 && popover.params.backdrop
13774 && popover.backdropEl
13775 && popover.backdropEl === target
13778 } else if (popover.params.closeByOutsideClick) {
13784 popover.on('popoverOpened', function () {
13785 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
13786 app.on('click', handleClick);
13789 popover.on('popoverClose', function () {
13790 if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
13791 app.off('click', handleClick);
13795 $el[0].f7Modal = popover;
13800 if ( Modal$$1 ) Popover.__proto__ = Modal$$1;
13801 Popover.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
13802 Popover.prototype.constructor = Popover;
13804 Popover.prototype.resize = function resize () {
13805 var popover = this;
13806 var app = popover.app;
13807 var $el = popover.$el;
13808 var $targetEl = popover.$targetEl;
13809 var $angleEl = popover.$angleEl;
13810 var ref = popover.params;
13811 var targetX = ref.targetX;
13812 var targetY = ref.targetY;
13813 $el.css({ left: '', top: '' });
13814 var ref$1 = [$el.width(), $el.height()];
13815 var width = ref$1[0];
13816 var height = ref$1[1];
13820 if (app.theme === 'ios') {
13821 $angleEl.removeClass('on-left on-right on-top on-bottom').css({ left: '', top: '' });
13822 angleSize = $angleEl.width() / 2;
13824 $el.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom').css({ left: '', top: '' });
13829 var targetOffsetLeft;
13830 var targetOffsetTop;
13831 if ($targetEl && $targetEl.length > 0) {
13832 targetWidth = $targetEl.outerWidth();
13833 targetHeight = $targetEl.outerHeight();
13835 var targetOffset = $targetEl.offset();
13836 targetOffsetLeft = targetOffset.left - app.left;
13837 targetOffsetTop = targetOffset.top - app.top;
13839 var targetParentPage = $targetEl.parents('.page');
13840 if (targetParentPage.length > 0) {
13841 targetOffsetTop -= targetParentPage[0].scrollTop;
13843 } else if (typeof targetX !== 'undefined' && targetY !== 'undefined') {
13844 targetOffsetLeft = targetX;
13845 targetOffsetTop = targetY;
13846 targetWidth = popover.params.targetWidth || 0;
13847 targetHeight = popover.params.targetHeight || 0;
13850 var ref$2 = [0, 0, 0];
13851 var left = ref$2[0];
13852 var top = ref$2[1];
13853 var diff = ref$2[2];
13855 var position = app.theme === 'md' ? 'bottom' : 'top';
13856 if (app.theme === 'md') {
13857 if (height < app.height - targetOffsetTop - targetHeight) {
13859 position = 'bottom';
13860 top = targetOffsetTop;
13861 } else if (height < targetOffsetTop) {
13863 top = (targetOffsetTop - height) + targetHeight;
13867 position = 'bottom';
13868 top = targetOffsetTop;
13873 } else if (top + height >= app.height) {
13874 top = app.height - height - 8;
13877 // Horizontal Position
13878 left = (targetOffsetLeft + targetWidth) - width - 8;
13879 if (left + width >= app.width - 8) {
13880 left = (targetOffsetLeft + targetWidth) - width - 8;
13885 if (position === 'top') {
13886 $el.addClass('popover-on-top');
13888 if (position === 'bottom') {
13889 $el.addClass('popover-on-bottom');
13892 if ((height + angleSize) < targetOffsetTop) {
13894 top = targetOffsetTop - height - angleSize;
13895 } else if ((height + angleSize) < app.height - targetOffsetTop - targetHeight) {
13897 position = 'bottom';
13898 top = targetOffsetTop + targetHeight + angleSize;
13901 position = 'middle';
13902 top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
13906 } else if (top + height >= app.height) {
13907 top = app.height - height - 5;
13912 // Horizontal Position
13913 if (position === 'top' || position === 'bottom') {
13914 left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
13916 if (left < 5) { left = 5; }
13917 if (left + width > app.width) { left = app.width - width - 5; }
13918 if (left < 0) { left = 0; }
13919 if (position === 'top') {
13920 $angleEl.addClass('on-bottom');
13922 if (position === 'bottom') {
13923 $angleEl.addClass('on-top');
13926 angleLeft = ((width / 2) - angleSize) + diff;
13927 angleLeft = Math.max(Math.min(angleLeft, width - (angleSize * 2) - 13), 13);
13928 $angleEl.css({ left: (angleLeft + "px
") });
13929 } else if (position === 'middle') {
13930 left = targetOffsetLeft - width - angleSize;
13931 $angleEl.addClass('on-right');
13932 if (left < 5 || (left + width > app.width)) {
13933 if (left < 5) { left = targetOffsetLeft + targetWidth + angleSize; }
13934 if (left + width > app.width) { left = app.width - width - 5; }
13935 $angleEl.removeClass('on-right').addClass('on-left');
13937 angleTop = ((height / 2) - angleSize) + diff;
13938 angleTop = Math.max(Math.min(angleTop, height - (angleSize * 2) - 13), 13);
13939 $angleEl.css({ top: (angleTop + "px
") });
13944 $el.css({ top: (top + "px
"), left: (left + "px
") });
13954 closeByBackdropClick: true,
13955 closeByOutsideClick: true,
13962 create: function create() {
13964 app.popover = Utils.extend(
13967 constructor: Popover,
13968 defaultSelector: '.popover.modal-in',
13971 open: function open(popoverEl, targetEl, animate) {
13972 var $popoverEl = $(popoverEl);
13973 var popover = $popoverEl[0].f7Modal;
13974 if (!popover) { popover = new Popover(app, { el: $popoverEl, targetEl: targetEl }); }
13975 return popover.open(targetEl, animate);
13981 '.popover-open': function openPopover($clickedEl, data) {
13982 if ( data === void 0 ) data = {};
13985 app.popover.open(data.popover, $clickedEl, data.animate);
13987 '.popover-close': function closePopover($clickedEl, data) {
13988 if ( data === void 0 ) data = {};
13991 app.popover.close(data.popover, data.animate);
13996 /* eslint indent: ["off
"] */
13998 var Actions = /*@__PURE__*/(function (Modal$$1) {
13999 function Actions(app, params) {
14000 var extendedParams = Utils.extend(
14002 app.params.actions,
14006 // Extends with open/close Modal methods;
14007 Modal$$1.call(this, app, extendedParams);
14009 var actions = this;
14011 actions.params = extendedParams;
14015 if (actions.params.buttons) {
14016 groups = actions.params.buttons;
14017 if (!Array.isArray(groups[0])) { groups = [groups]; }
14019 actions.groups = groups;
14023 if (actions.params.el) {
14024 $el = $(actions.params.el);
14025 } else if (actions.params.content) {
14026 $el = $(actions.params.content);
14027 } else if (actions.params.buttons) {
14028 if (actions.params.convertToPopover) {
14029 actions.popoverHtml = actions.renderPopover();
14031 actions.actionsHtml = actions.render();
14034 if ($el && $el.length > 0 && $el[0].f7Modal) {
14035 return $el[0].f7Modal;
14038 if ($el && $el.length === 0 && !(actions.actionsHtml || actions.popoverHtml)) {
14039 return actions.destroy();
14044 if (actions.params.backdrop) {
14045 $backdropEl = app.root.children('.actions-backdrop');
14046 if ($backdropEl.length === 0) {
14047 $backdropEl = $('<div class="actions
-backdrop
"></div>');
14048 app.root.append($backdropEl);
14052 var originalOpen = actions.open;
14053 var originalClose = actions.close;
14056 function buttonOnClick(e) {
14057 var buttonEl = this;
14060 if ($(buttonEl).hasClass('list-button')) {
14061 buttonIndex = $(buttonEl).parents('li').index();
14062 groupIndex = $(buttonEl).parents('.list').index();
14064 buttonIndex = $(buttonEl).index();
14065 groupIndex = $(buttonEl).parents('.actions-group').index();
14067 if (typeof groups !== 'undefined') {
14068 var button = groups[groupIndex][buttonIndex];
14069 if (button.onClick) { button.onClick(actions, e); }
14070 if (actions.params.onClick) { actions.params.onClick(actions, e); }
14071 if (button.close !== false) { actions.close(); }
14074 actions.open = function open(animate) {
14075 var convertToPopover = false;
14076 var ref = actions.params;
14077 var targetEl = ref.targetEl;
14078 var targetX = ref.targetX;
14079 var targetY = ref.targetY;
14080 var targetWidth = ref.targetWidth;
14081 var targetHeight = ref.targetHeight;
14082 if (actions.params.convertToPopover && (targetEl || (targetX !== undefined && targetY !== undefined))) {
14085 actions.params.forceToPopover
14086 || (app.device.ios && app.device.ipad)
14087 || app.width >= 768
14089 convertToPopover = true;
14092 if (convertToPopover && actions.popoverHtml) {
14093 popover = app.popover.create({
14094 content: actions.popoverHtml,
14095 backdrop: actions.params.backdrop,
14096 targetEl: targetEl,
14099 targetWidth: targetWidth,
14100 targetHeight: targetHeight,
14102 popover.open(animate);
14103 popover.once('popoverOpened', function () {
14104 popover.$el.find('.list-button').each(function (groupIndex, buttonEl) {
14105 $(buttonEl).on('click', buttonOnClick);
14108 popover.once('popoverClosed', function () {
14109 popover.$el.find('.list-button').each(function (groupIndex, buttonEl) {
14110 $(buttonEl).off('click', buttonOnClick);
14112 Utils.nextTick(function () {
14114 popover = undefined;
14118 actions.$el = actions.actionsHtml ? $(actions.actionsHtml) : actions.$el;
14119 actions.$el[0].f7Modal = actions;
14120 if (actions.groups) {
14121 actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
14122 $(buttonEl).on('click', buttonOnClick);
14124 actions.once('actionsClosed', function () {
14125 actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
14126 $(buttonEl).off('click', buttonOnClick);
14130 actions.el = actions.$el[0];
14131 originalOpen.call(actions, animate);
14136 actions.close = function close(animate) {
14138 popover.close(animate);
14140 originalClose.call(actions, animate);
14145 Utils.extend(actions, {
14148 el: $el ? $el[0] : undefined,
14149 $backdropEl: $backdropEl,
14150 backdropEl: $backdropEl && $backdropEl[0],
14154 function handleClick(e) {
14155 var target = e.target;
14156 var $target = $(target);
14157 if ($target.closest(actions.el).length === 0) {
14159 actions.params.closeByBackdropClick
14160 && actions.params.backdrop
14161 && actions.backdropEl
14162 && actions.backdropEl === target
14165 } else if (actions.params.closeByOutsideClick) {
14171 actions.on('opened', function () {
14172 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
14173 app.on('click', handleClick);
14176 actions.on('close', function () {
14177 if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
14178 app.off('click', handleClick);
14183 $el[0].f7Modal = actions;
14189 if ( Modal$$1 ) Actions.__proto__ = Modal$$1;
14190 Actions.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
14191 Actions.prototype.constructor = Actions;
14193 Actions.prototype.render = function render () {
14194 var actions = this;
14195 if (actions.params.render) { return actions.params.render.call(actions, actions); }
14196 var groups = actions.groups;
14197 return ("\n <div
class=\"actions
-modal
" + (actions.params.grid ? ' actions-grid' : '') + "\">\n " + (groups.map(function (group) { return ("<div
class=\"actions
-group
\">\n " + (group.map(function (button) {
14198 var buttonClasses = [("actions
-" + (button.label ? 'label' : 'button'))];
14199 var color = button.color;
14200 var bg = button.bg;
14201 var bold = button.bold;
14202 var disabled = button.disabled;
14203 var label = button.label;
14204 var text = button.text;
14205 var icon = button.icon;
14206 if (color) { buttonClasses.push(("color
-" + color)); }
14207 if (bg) { buttonClasses.push(("bg
-color
-" + bg)); }
14208 if (bold) { buttonClasses.push('actions-button-bold'); }
14209 if (disabled) { buttonClasses.push('disabled'); }
14211 return ("<div
class=\"" + (buttonClasses.join(' ')) + "\">" + text + "</div
>");
14213 return ("\n <div
class=\"" + (buttonClasses.join(' ')) + "\">\n " + (icon ? ("<div
class=\"actions
-button
-media
\">" + icon + "</div>") : '') + "\n <div class=\"actions-button-text\">" + text + "</div>\n </div
>").trim();
14214 }).join('')) + "\n </div>"); }).join('')) + "\n </div>\n ").trim();
14217 Actions.prototype.renderPopover = function renderPopover () {
14218 var actions = this;
14219 if (actions.params.renderPopover) { return actions.params.renderPopover.call(actions, actions); }
14220 var groups = actions.groups;
14221 return ("\n <div
class=\"popover popover
-from-actions
\">\n <div
class=\"popover
-inner
\">\n " + (groups.map(function (group) { return ("\n <div
class=\"list
\">\n <ul
>\n " + (group.map(function (button) {
14222 var itemClasses = [];
14223 var color = button.color;
14224 var bg = button.bg;
14225 var bold = button.bold;
14226 var disabled = button.disabled;
14227 var label = button.label;
14228 var text = button.text;
14229 var icon = button.icon;
14230 if (color) { itemClasses.push(("color
-" + color)); }
14231 if (bg) { itemClasses.push(("bg
-color
-" + bg)); }
14232 if (bold) { itemClasses.push('popover-from-actions-bold'); }
14233 if (disabled) { itemClasses.push('disabled'); }
14235 itemClasses.push('popover-from-actions-label');
14236 return ("<li
class=\"" + (itemClasses.join(' ')) + "\">" + text + "</li
>");
14239 itemClasses.push('item-link item-content');
14240 return ("\n <li
>\n <a
class=\"" + (itemClasses.join(' ')) + "\">\n <div
class=\"item
-media
\">\n " + icon + "\n </div>\n <div class=\"item-inner\">\n <div class=\"item-title\">\n " + text + "\n </div>\n </div>\n </a>\n </li
>\n ");
14242 itemClasses.push('list-button');
14243 return ("\n <li
>\n <a href
=\"#\" class=\"" + (itemClasses.join(' ')) + "\">" + text + "</a>\n </li>\n ");
14244 }).join('')) + "\n </ul>\n </div>\n "); }).join('')) + "\n </div>\n </div>\n ").trim();
14254 convertToPopover: true,
14255 forceToPopover: false,
14256 closeByBackdropClick: true,
14258 renderPopover: null,
14265 create: function create() {
14267 app.actions = ModalMethods({
14269 constructor: Actions,
14270 defaultSelector: '.actions-modal.modal-in',
14274 '.actions-open': function openActions($clickedEl, data) {
14275 if ( data === void 0 ) data = {};
14278 app.actions.open(data.actions, data.animate);
14280 '.actions-close': function closeActions($clickedEl, data) {
14281 if ( data === void 0 ) data = {};
14284 app.actions.close(data.actions, data.animate);
14289 var Sheet = /*@__PURE__*/(function (Modal$$1) {
14290 function Sheet(app, params) {
14291 var extendedParams = Utils.extend(
14297 // Extends with open/close Modal methods;
14298 Modal$$1.call(this, app, extendedParams);
14302 sheet.params = extendedParams;
14306 if (!sheet.params.el) {
14307 $el = $(sheet.params.content);
14309 $el = $(sheet.params.el);
14312 if ($el && $el.length > 0 && $el[0].f7Modal) {
14313 return $el[0].f7Modal;
14316 if ($el.length === 0) {
14317 return sheet.destroy();
14320 if (sheet.params.backdrop) {
14321 $backdropEl = app.root.children('.sheet-backdrop');
14322 if ($backdropEl.length === 0) {
14323 $backdropEl = $('<div class="sheet
-backdrop
"></div>');
14324 app.root.append($backdropEl);
14328 var $pageContentEl;
14329 function scrollToOpen() {
14330 var $scrollEl = $(sheet.params.scrollToEl).eq(0);
14331 if ($scrollEl.length === 0) { return; }
14332 $pageContentEl = $scrollEl.parents('.page-content');
14333 if ($pageContentEl.length === 0) { return; }
14335 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
14336 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
14337 var pageHeight = $pageContentEl[0].offsetHeight - paddingTop - $el.height();
14338 var pageScrollHeight = $pageContentEl[0].scrollHeight - paddingTop - $el.height();
14339 var pageScroll = $pageContentEl.scrollTop();
14341 var newPaddingBottom;
14343 var scrollElTop = ($scrollEl.offset().top - paddingTop) + $scrollEl[0].offsetHeight;
14344 if (scrollElTop > pageHeight) {
14345 var scrollTop = (pageScroll + scrollElTop) - pageHeight;
14346 if (scrollTop + pageHeight > pageScrollHeight) {
14347 newPaddingBottom = ((scrollTop + pageHeight) - pageScrollHeight) + paddingBottom;
14348 if (pageHeight === pageScrollHeight) {
14349 newPaddingBottom = $el.height();
14351 $pageContentEl.css({
14352 'padding-bottom': (newPaddingBottom + "px
"),
14355 $pageContentEl.scrollTop(scrollTop, 300);
14359 function scrollToClose() {
14360 if ($pageContentEl && $pageContentEl.length > 0) {
14361 $pageContentEl.css({
14362 'padding-bottom': '',
14366 function handleClick(e) {
14367 var target = e.target;
14368 var $target = $(target);
14369 if ($target.closest(sheet.el).length === 0) {
14371 sheet.params.closeByBackdropClick
14372 && sheet.params.backdrop
14373 && sheet.backdropEl
14374 && sheet.backdropEl === target
14377 } else if (sheet.params.closeByOutsideClick) {
14383 sheet.on('sheetOpen', function () {
14384 if (sheet.params.scrollToEl) {
14388 sheet.on('sheetOpened', function () {
14389 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
14390 app.on('click', handleClick);
14393 sheet.on('sheetClose', function () {
14394 if (sheet.params.scrollToEl) {
14397 if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
14398 app.off('click', handleClick);
14402 Utils.extend(sheet, {
14406 $backdropEl: $backdropEl,
14407 backdropEl: $backdropEl && $backdropEl[0],
14411 $el[0].f7Modal = sheet;
14416 if ( Modal$$1 ) Sheet.__proto__ = Modal$$1;
14417 Sheet.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
14418 Sheet.prototype.constructor = Sheet;
14427 closeByBackdropClick: true,
14428 closeByOutsideClick: false,
14434 create: function create() {
14436 if (!app.passedParams.sheet || app.passedParams.sheet.backdrop === undefined) {
14437 app.params.sheet.backdrop = app.theme === 'md';
14439 app.sheet = Utils.extend(
14443 constructor: Sheet,
14444 defaultSelector: '.sheet-modal.modal-in',
14449 '.sheet-open': function openSheet($clickedEl, data) {
14450 if ( data === void 0 ) data = {};
14453 if ($('.sheet-modal.modal-in').length > 0 && data.sheet && $(data.sheet)[0] !== $('.sheet-modal.modal-in')[0]) {
14454 app.sheet.close('.sheet-modal.modal-in');
14456 app.sheet.open(data.sheet, data.animate);
14458 '.sheet-close': function closeSheet($clickedEl, data) {
14459 if ( data === void 0 ) data = {};
14462 app.sheet.close(data.sheet, data.animate);
14467 var Toast = /*@__PURE__*/(function (Modal$$1) {
14468 function Toast(app, params) {
14469 var extendedParams = Utils.extend({
14471 }, app.params.toast, params);
14473 // Extends with open/close Modal methods;
14474 Modal$$1.call(this, app, extendedParams);
14480 toast.params = extendedParams;
14482 var ref = toast.params;
14483 var closeButton = ref.closeButton;
14484 var closeTimeout = ref.closeTimeout;
14487 if (!toast.params.el) {
14489 var toastHtml = toast.render();
14491 $el = $(toastHtml);
14493 $el = $(toast.params.el);
14496 if ($el && $el.length > 0 && $el[0].f7Modal) {
14497 return $el[0].f7Modal;
14500 if ($el.length === 0) {
14501 return toast.destroy();
14504 Utils.extend(toast, {
14510 $el[0].f7Modal = toast;
14513 $el.find('.toast-button').on('click', function () {
14514 toast.emit('local::closeButtonClick toastCloseButtonClick', toast);
14518 toast.on('beforeDestroy', function () {
14519 $el.find('.toast-button').off('click');
14524 toast.on('open', function () {
14525 $('.toast.modal-in').each(function (index, openedEl) {
14526 var toastInstance = app.toast.get(openedEl);
14527 if (openedEl !== toast.el && toastInstance) {
14528 toastInstance.close();
14531 if (closeTimeout) {
14532 timeoutId = Utils.nextTick(function () {
14537 toast.on('close', function () {
14538 win.clearTimeout(timeoutId);
14541 if (toast.params.destroyOnClose) {
14542 toast.once('closed', function () {
14543 setTimeout(function () {
14552 if ( Modal$$1 ) Toast.__proto__ = Modal$$1;
14553 Toast.prototype = Object.create( Modal$$1 && Modal$$1.prototype );
14554 Toast.prototype.constructor = Toast;
14556 Toast.prototype.render = function render () {
14558 if (toast.params.render) { return toast.params.render.call(toast, toast); }
14559 var ref = toast.params;
14560 var position = ref.position;
14561 var cssClass = ref.cssClass;
14562 var icon = ref.icon;
14563 var text = ref.text;
14564 var closeButton = ref.closeButton;
14565 var closeButtonColor = ref.closeButtonColor;
14566 var closeButtonText = ref.closeButtonText;
14567 return ("\n <div
class=\"toast toast
-" + position + " " + (cssClass || '') + " " + (icon ? 'toast-with-icon' : '') + "\">\n <div
class=\"toast
-content
\">\n " + (icon ? ("<div
class=\"toast
-icon
\">" + icon + "</div>") : '') + "\n <div class=\"toast-text\">" + text + "</div>\n " + (closeButton && !icon ? ("\n <a
class=\"toast
-button button
" + (closeButtonColor ? ("color
-" + closeButtonColor) : '') + "\">" + closeButtonText + "</a>\n ").trim() : '') + "\n </div>\n </div
>\n ").trim();
14578 create: function create() {
14580 app.toast = Utils.extend(
14584 constructor: Toast,
14585 defaultSelector: '.toast.modal-in',
14589 show: function show(params) {
14590 Utils.extend(params, {
14591 destroyOnClose: true,
14593 return new Toast(app, params).open();
14602 position: 'bottom',
14603 closeButton: false,
14604 closeButtonColor: null,
14605 closeButtonText: 'Ok',
14606 closeTimeout: null,
14614 init: function init(el) {
14617 if ($el.length === 0 || $el.children('.preloader-inner').length > 0 || $el.children('.preloader-inner-line').length > 0) { return; }
14618 $el.append(Utils[((app.theme) + "PreloaderContent
")]);
14622 show: function show(color) {
14623 if ( color === void 0 ) color = 'white';
14626 if (Preloader.visible) { return; }
14627 var preloaderInner = Utils[((app.theme) + "PreloaderContent
")] || '';
14628 $('html').addClass('with-modal-preloader');
14629 app.root.append(("\n <div
class=\"preloader
-backdrop
\"></div>\n <div class=\"preloader-modal\">\n <div class=\"preloader color-" + color + "\">" + preloaderInner + "</div>\n </div
>\n "));
14630 Preloader.visible = true;
14632 hide: function hide() {
14634 if (!Preloader.visible) { return; }
14635 $('html').removeClass('with-modal-preloader');
14636 app.root.find('.preloader-backdrop, .preloader-modal').remove();
14637 Preloader.visible = false;
14640 var Preloader$1 = {
14642 create: function create() {
14644 Utils.extend(app, {
14646 init: Preloader.init.bind(app),
14647 show: Preloader.show.bind(app),
14648 hide: Preloader.hide.bind(app),
14653 photoBrowserOpen: function photoBrowserOpen(pb) {
14655 pb.$el.find('.preloader').each(function (index, preloaderEl) {
14656 app.preloader.init(preloaderEl);
14659 pageInit: function pageInit(page) {
14661 page.$el.find('.preloader').each(function (index, preloaderEl) {
14662 app.preloader.init(preloaderEl);
14668 insert: function insert(vnode) {
14670 var preloaderEl = vnode.elm;
14671 app.preloader.init(preloaderEl);
14677 var Progressbar = {
14678 set: function set() {
14681 var args = [], len = arguments.length;
14682 while ( len-- ) args[ len ] = arguments[ len ];
14685 var progress = args[1];
14686 var duration = args[2];
14687 if (typeof args[0] === 'number') {
14688 (assign = args, progress = assign[0], duration = assign[1]);
14691 if (typeof progress === 'undefined' || progress === null) { return el; }
14692 if (!progress) { progress = 0; }
14694 var $el = $(el || app.root);
14695 if ($el.length === 0) {
14698 var progressNormalized = Math.min(Math.max(progress, 0), 100);
14699 var $progressbarEl;
14700 if ($el.hasClass('progressbar')) { $progressbarEl = $el.eq(0); }
14702 $progressbarEl = $el.children('.progressbar');
14704 if ($progressbarEl.length === 0 || $progressbarEl.hasClass('progressbar-infinite')) {
14705 return $progressbarEl;
14707 var $progressbarLine = $progressbarEl.children('span');
14708 if ($progressbarLine.length === 0) {
14709 $progressbarLine = $('<span></span>');
14710 $progressbarEl.append($progressbarLine);
14713 .transition(typeof duration !== 'undefined' ? duration : '')
14714 .transform(("translate3d(" + ((-100 + progressNormalized)) + "%,0,0)"));
14716 return $progressbarEl[0];
14718 show: function show() {
14719 var assign, assign$1;
14721 var args = [], len = arguments.length;
14722 while ( len-- ) args[ len ] = arguments[ len ];
14725 // '.page', 50, 'multi'
14727 var progress = args[1];
14728 var color = args[2];
14729 var type = 'determined';
14731 if (args.length === 2) {
14732 if ((typeof args[0] === 'string' || typeof args[0] === 'object') && typeof args[1] === 'string') {
14733 // '.page', 'multi'
14734 (assign = args, el = assign[0], color = assign[1], progress = assign[2]);
14736 } else if (typeof args[0] === 'number' && typeof args[1] === 'string') {
14738 (assign$1 = args, progress = assign$1[0], color = assign$1[1]);
14741 } else if (args.length === 1) {
14742 if (typeof args[0] === 'number') {
14744 progress = args[0];
14745 } else if (typeof args[0] === 'string') {
14750 } else if (args.length === 0) {
14756 if ($el.length === 0) { return undefined; }
14758 var $progressbarEl;
14759 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
14760 $progressbarEl = $el;
14762 $progressbarEl = $el.children('.progressbar:not(.progressbar-out), .progressbar-infinite:not(.progressbar-out)');
14763 if ($progressbarEl.length === 0) {
14764 $progressbarEl = $(("\n <span
class=\"progressbar
" + (type === 'infinite' ? '-infinite' : '') + (color ? (" color
-" + color) : '') + " progressbar
-in\">\n " + (type === 'infinite' ? '' : '<span></span>') + "\n </span
>"));
14765 $el.append($progressbarEl);
14769 if (typeof progress !== 'undefined') {
14770 app.progressbar.set($progressbarEl, progress);
14773 return $progressbarEl[0];
14775 hide: function hide(el, removeAfterHide) {
14776 if ( removeAfterHide === void 0 ) removeAfterHide = true;
14779 var $el = $(el || app.root);
14780 if ($el.length === 0) { return undefined; }
14781 var $progressbarEl;
14782 if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
14783 $progressbarEl = $el;
14785 $progressbarEl = $el.children('.progressbar, .progressbar-infinite');
14787 if ($progressbarEl.length === 0 || !$progressbarEl.hasClass('progressbar-in') || $progressbarEl.hasClass('progressbar-out')) {
14788 return $progressbarEl;
14791 .removeClass('progressbar-in')
14792 .addClass('progressbar-out')
14793 .animationEnd(function () {
14794 if (removeAfterHide) {
14795 $progressbarEl.remove();
14798 return $progressbarEl;
14802 var Progressbar$1 = {
14803 name: 'progressbar',
14804 create: function create() {
14806 Utils.extend(app, {
14808 set: Progressbar.set.bind(app),
14809 show: Progressbar.show.bind(app),
14810 hide: Progressbar.hide.bind(app),
14815 pageInit: function pageInit(page) {
14817 page.$el.find('.progressbar').each(function (index, progressbarEl) {
14818 var $progressbarEl = $(progressbarEl);
14819 app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
14826 init: function init() {
14834 var $sortableContainer;
14835 var sortingElHeight;
14838 var $insertAfterEl;
14839 var $insertBeforeEl;
14842 var $pageContentEl;
14845 var sortingElOffsetLocal;
14846 var sortingElOffsetTop;
14847 var initialScrollTop;
14849 function handleTouchStart(e) {
14852 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
14853 $sortingEl = $(this).parent('li');
14854 indexFrom = $sortingEl.index();
14855 $sortableContainer = $sortingEl.parents('.sortable');
14856 var $listGroup = $sortingEl.parents('.list-group');
14857 if ($listGroup.length && $listGroup.parents($sortableContainer).length) {
14858 $sortableContainer = $listGroup;
14860 $sortingItems = $sortableContainer.children('ul').children('li');
14861 if (app.panel) { app.panel.allowOpen = false; }
14862 if (app.swipeout) { app.swipeout.allow = false; }
14864 function handleTouchMove(e) {
14865 if (!isTouched || !$sortingEl) { return; }
14866 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
14868 $pageEl = $sortingEl.parents('.page');
14869 $pageContentEl = $sortingEl.parents('.page-content');
14870 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
14871 var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
14872 initialScrollTop = $pageContentEl[0].scrollTop;
14873 pageOffset = $pageEl.offset().top + paddingTop;
14874 pageHeight = $pageEl.height() - paddingTop - paddingBottom;
14875 $sortingEl.addClass('sorting');
14876 $sortableContainer.addClass('sortable-sorting');
14877 sortingElOffsetLocal = $sortingEl[0].offsetTop;
14878 minTop = $sortingEl[0].offsetTop;
14879 maxTop = $sortingEl.parent().height() - sortingElOffsetLocal - $sortingEl.height();
14880 sortingElHeight = $sortingEl[0].offsetHeight;
14881 sortingElOffsetTop = $sortingEl.offset().top;
14885 e.preventDefault();
14886 e.f7PreventSwipePanel = true;
14888 touchesDiff = pageY - touchStartY;
14890 var translateScrollOffset = $pageContentEl[0].scrollTop - initialScrollTop;
14891 var translate = Math.min(Math.max(touchesDiff + translateScrollOffset, -minTop), maxTop);
14892 $sortingEl.transform(("translate3d(0," + translate + "px
,0)"));
14894 var scrollAddition = 44;
14895 var allowScroll = true;
14896 if ((touchesDiff + translateScrollOffset) + scrollAddition < -minTop) {
14897 allowScroll = false;
14899 if ((touchesDiff + translateScrollOffset) - scrollAddition > maxTop) {
14900 allowScroll = false;
14903 $insertBeforeEl = undefined;
14904 $insertAfterEl = undefined;
14908 if (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition > pageOffset + pageHeight) {
14910 scrollDiff = (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition) - (pageOffset + pageHeight);
14912 if (sortingElOffsetTop + touchesDiff < pageOffset + scrollAddition) {
14914 scrollDiff = (sortingElOffsetTop + touchesDiff) - pageOffset - scrollAddition;
14917 $pageContentEl[0].scrollTop += scrollDiff;
14921 $sortingItems.each(function (index, el) {
14922 var $currentEl = $(el);
14923 if ($currentEl[0] === $sortingEl[0]) { return; }
14924 var currentElOffset = $currentEl[0].offsetTop;
14925 var currentElHeight = $currentEl.height();
14926 var sortingElOffset = sortingElOffsetLocal + translate;
14928 if ((sortingElOffset >= currentElOffset - (currentElHeight / 2)) && $sortingEl.index() < $currentEl.index()) {
14929 $currentEl.transform(("translate3d(0, " + (-sortingElHeight) + "px
,0)"));
14930 $insertAfterEl = $currentEl;
14931 $insertBeforeEl = undefined;
14932 } else if ((sortingElOffset <= currentElOffset + (currentElHeight / 2)) && $sortingEl.index() > $currentEl.index()) {
14933 $currentEl.transform(("translate3d(0, " + sortingElHeight + "px
,0)"));
14934 $insertAfterEl = undefined;
14935 if (!$insertBeforeEl) { $insertBeforeEl = $currentEl; }
14937 $currentEl.transform('translate3d(0, 0%,0)');
14941 function handleTouchEnd() {
14942 if (!isTouched || !isMoved) {
14945 if (isTouched && !isMoved) {
14946 if (app.panel) { app.panel.allowOpen = true; }
14947 if (app.swipeout) { app.swipeout.allow = true; }
14951 if (app.panel) { app.panel.allowOpen = true; }
14952 if (app.swipeout) { app.swipeout.allow = true; }
14954 $sortingItems.transform('');
14955 $sortingEl.removeClass('sorting');
14956 $sortableContainer.removeClass('sortable-sorting');
14959 if ($insertAfterEl) { indexTo = $insertAfterEl.index(); }
14960 else if ($insertBeforeEl) { indexTo = $insertBeforeEl.index(); }
14962 if (app.params.sortable.moveElements) {
14963 if ($insertAfterEl) {
14964 $sortingEl.insertAfter($insertAfterEl);
14966 if ($insertBeforeEl) {
14967 $sortingEl.insertBefore($insertBeforeEl);
14971 if (($insertAfterEl || $insertBeforeEl)
14972 && $sortableContainer.hasClass('virtual-list')
14974 indexFrom = $sortingEl[0].f7VirtualListIndex;
14975 if (typeof indexFrom === 'undefined') { indexFrom = $sortingEl.attr('data-virtual-list-index'); }
14976 if ($insertBeforeEl) {
14977 indexTo = $insertBeforeEl[0].f7VirtualListIndex;
14978 if (typeof indexTo === 'undefined') { indexTo = $insertBeforeEl.attr('data-virtual-list-index'); }
14980 indexTo = $insertAfterEl[0].f7VirtualListIndex;
14981 if (typeof indexTo === 'undefined') { indexTo = $insertAfterEl.attr('data-virtual-list-index'); }
14983 if (indexTo !== null) { indexTo = parseInt(indexTo, 10); }
14984 else { indexTo = undefined; }
14986 var virtualList = $sortableContainer[0].f7VirtualList;
14987 if (virtualList) { virtualList.moveItem(indexFrom, indexTo); }
14989 if (typeof indexTo !== 'undefined' && !Number.isNaN(indexTo) && indexTo !== indexFrom) {
14990 $sortingEl.trigger('sortable:sort', { from: indexFrom, to: indexTo });
14991 app.emit('sortableSort', $sortingEl[0], { from: indexFrom, to: indexTo });
14994 $insertBeforeEl = undefined;
14995 $insertAfterEl = undefined;
15000 var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
15002 $(doc).on(app.touchEvents.start, '.list.sortable .sortable-handler', handleTouchStart, activeListener);
15003 app.on('touchmove:active', handleTouchMove);
15004 app.on('touchend:passive', handleTouchEnd);
15006 enable: function enable(el) {
15007 if ( el === void 0 ) el = '.list.sortable';
15011 if ($el.length === 0) { return; }
15012 $el.addClass('sortable-enabled');
15013 $el.trigger('sortable:enable');
15014 app.emit('sortableEnable', $el[0]);
15016 disable: function disable(el) {
15017 if ( el === void 0 ) el = '.list.sortable';
15021 if ($el.length === 0) { return; }
15022 $el.removeClass('sortable-enabled');
15023 $el.trigger('sortable:disable');
15024 app.emit('sortableDisable', $el[0]);
15026 toggle: function toggle(el) {
15027 if ( el === void 0 ) el = '.list.sortable';
15031 if ($el.length === 0) { return; }
15032 if ($el.hasClass('sortable-enabled')) {
15033 app.sortable.disable($el);
15035 app.sortable.enable($el);
15043 moveElements: true,
15046 create: function create() {
15048 Utils.extend(app, {
15050 init: Sortable.init.bind(app),
15051 enable: Sortable.enable.bind(app),
15052 disable: Sortable.disable.bind(app),
15053 toggle: Sortable.toggle.bind(app),
15058 init: function init() {
15060 if (!app.params.sortable) { return; }
15061 app.sortable.init();
15065 '.sortable-enable': function enable($clickedEl, data) {
15066 if ( data === void 0 ) data = {};
15069 app.sortable.enable(data.sortable);
15071 '.sortable-disable': function disable($clickedEl, data) {
15072 if ( data === void 0 ) data = {};
15075 app.sortable.disable(data.sortable);
15077 '.sortable-toggle': function toggle($clickedEl, data) {
15078 if ( data === void 0 ) data = {};
15081 app.sortable.toggle(data.sortable);
15087 init: function init() {
15089 var touchesStart = {};
15093 var touchStartTime;
15096 var $swipeoutContent;
15099 var actionsLeftWidth;
15100 var actionsRightWidth;
15103 var openedActionsSide;
15107 var $overswipeLeftButton;
15108 var $overswipeRightButton;
15110 var overswipeRight;
15112 function handleTouchStart(e) {
15113 if (!Swipeout.allow) { return; }
15116 isScrolling = undefined;
15117 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
15118 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
15119 touchStartTime = (new Date()).getTime();
15120 $swipeoutEl = $(this);
15122 function handleTouchMove(e) {
15123 if (!isTouched) { return; }
15124 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
15125 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
15126 if (typeof isScrolling === 'undefined') {
15127 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
15135 if ($('.list.sortable-opened').length > 0) { return; }
15136 $swipeoutContent = $swipeoutEl.find('.swipeout-content');
15137 $actionsRight = $swipeoutEl.find('.swipeout-actions-right');
15138 $actionsLeft = $swipeoutEl.find('.swipeout-actions-left');
15139 actionsLeftWidth = null;
15140 actionsRightWidth = null;
15141 $leftButtons = null;
15142 $rightButtons = null;
15143 $overswipeRightButton = null;
15144 $overswipeLeftButton = null;
15145 if ($actionsLeft.length > 0) {
15146 actionsLeftWidth = $actionsLeft.outerWidth();
15147 $leftButtons = $actionsLeft.children('a');
15148 $overswipeLeftButton = $actionsLeft.find('.swipeout-overswipe');
15150 if ($actionsRight.length > 0) {
15151 actionsRightWidth = $actionsRight.outerWidth();
15152 $rightButtons = $actionsRight.children('a');
15153 $overswipeRightButton = $actionsRight.find('.swipeout-overswipe');
15155 opened = $swipeoutEl.hasClass('swipeout-opened');
15157 openedActionsSide = $swipeoutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right';
15159 $swipeoutEl.removeClass('swipeout-transitioning');
15160 if (!app.params.swipeout.noFollow) {
15161 $swipeoutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
15162 $swipeoutEl.removeClass('swipeout-opened');
15166 e.preventDefault();
15168 touchesDiff = pageX - touchesStart.x;
15169 translate = touchesDiff;
15172 if (openedActionsSide === 'right') { translate -= actionsRightWidth; }
15173 else { translate += actionsLeftWidth; }
15177 (translate > 0 && $actionsLeft.length === 0)
15178 || (translate < 0 && $actionsRight.length === 0)
15183 $swipeoutContent.transform('');
15184 if ($rightButtons && $rightButtons.length > 0) {
15185 $rightButtons.transform('');
15187 if ($leftButtons && $leftButtons.length > 0) {
15188 $leftButtons.transform('');
15195 if (translate < 0) { direction = 'to-left'; }
15196 else if (translate > 0) { direction = 'to-right'; }
15197 else if (!direction) { direction = 'to-left'; }
15202 e.f7PreventSwipePanel = true;
15203 if (app.params.swipeout.noFollow) {
15205 if (openedActionsSide === 'right' && touchesDiff > 0) {
15206 app.swipeout.close($swipeoutEl);
15208 if (openedActionsSide === 'left' && touchesDiff < 0) {
15209 app.swipeout.close($swipeoutEl);
15212 if (touchesDiff < 0 && $actionsRight.length > 0) {
15213 app.swipeout.open($swipeoutEl, 'right');
15215 if (touchesDiff > 0 && $actionsLeft.length > 0) {
15216 app.swipeout.open($swipeoutEl, 'left');
15223 overswipeLeft = false;
15224 overswipeRight = false;
15225 if ($actionsRight.length > 0) {
15226 // Show right actions
15227 var buttonTranslate = translate;
15228 progress = buttonTranslate / actionsRightWidth;
15229 if (buttonTranslate < -actionsRightWidth) {
15230 buttonTranslate = -actionsRightWidth - (Math.pow( (-buttonTranslate - actionsRightWidth), 0.8 ));
15231 translate = buttonTranslate;
15232 if ($overswipeRightButton.length > 0) {
15233 overswipeRight = true;
15236 if (direction !== 'to-left') {
15238 buttonTranslate = 0;
15240 $rightButtons.each(function (index, buttonEl) {
15241 var $buttonEl = $(buttonEl);
15242 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
15243 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
15245 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15246 if ($overswipeRightButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-left') {
15247 $buttonEl.css({ left: ((overswipeRight ? -buttonOffset : 0) + "px
") });
15248 if (overswipeRight) {
15249 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
15250 $swipeoutEl.trigger('swipeout:overswipeenter');
15251 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
15253 $buttonEl.addClass('swipeout-overswipe-active');
15255 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
15256 $swipeoutEl.trigger('swipeout:overswipeexit');
15257 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
15259 $buttonEl.removeClass('swipeout-overswipe-active');
15262 $buttonEl.transform(("translate3d(" + (buttonTranslate - (buttonOffset * (1 + Math.max(progress, -1)))) + "px
,0,0)"));
15265 if ($actionsLeft.length > 0) {
15266 // Show left actions
15267 var buttonTranslate$1 = translate;
15268 progress = buttonTranslate$1 / actionsLeftWidth;
15269 if (buttonTranslate$1 > actionsLeftWidth) {
15270 buttonTranslate$1 = actionsLeftWidth + (Math.pow( (buttonTranslate$1 - actionsLeftWidth), 0.8 ));
15271 translate = buttonTranslate$1;
15272 if ($overswipeLeftButton.length > 0) {
15273 overswipeLeft = true;
15276 if (direction !== 'to-right') {
15277 buttonTranslate$1 = 0;
15280 $leftButtons.each(function (index, buttonEl) {
15281 var $buttonEl = $(buttonEl);
15282 if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
15283 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
15285 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15286 if ($overswipeLeftButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-right') {
15287 $buttonEl.css({ left: ((overswipeLeft ? buttonOffset : 0) + "px
") });
15288 if (overswipeLeft) {
15289 if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
15290 $swipeoutEl.trigger('swipeout:overswipeenter');
15291 app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
15293 $buttonEl.addClass('swipeout-overswipe-active');
15295 if ($buttonEl.hasClass('swipeout-overswipe-active')) {
15296 $swipeoutEl.trigger('swipeout:overswipeexit');
15297 app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
15299 $buttonEl.removeClass('swipeout-overswipe-active');
15302 if ($leftButtons.length > 1) {
15303 $buttonEl.css('z-index', $leftButtons.length - index);
15305 $buttonEl.transform(("translate3d(" + (buttonTranslate$1 + (buttonOffset * (1 - Math.min(progress, 1)))) + "px
,0,0)"));
15308 $swipeoutEl.trigger('swipeout', progress);
15309 app.emit('swipeout', $swipeoutEl[0], progress);
15310 $swipeoutContent.transform(("translate3d(" + translate + "px
,0,0)"));
15312 function handleTouchEnd() {
15313 if (!isTouched || !isMoved) {
15321 var timeDiff = (new Date()).getTime() - touchStartTime;
15322 var $actions = direction === 'to-left' ? $actionsRight : $actionsLeft;
15323 var actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth;
15332 (touchesDiff < -10 && direction === 'to-left')
15333 || (touchesDiff > 10 && direction === 'to-right')
15338 && (Math.abs(translate) > actionsWidth / 2)
15345 if (timeDiff < 300) {
15346 if (Math.abs(translate) === 0) { action = 'close'; }
15347 if (Math.abs(translate) === actionsWidth) { action = 'open'; }
15350 if (action === 'open') {
15351 Swipeout.el = $swipeoutEl[0];
15352 $swipeoutEl.trigger('swipeout:open');
15353 app.emit('swipeoutOpen', $swipeoutEl[0]);
15354 $swipeoutEl.addClass('swipeout-opened swipeout-transitioning');
15355 var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth;
15356 $swipeoutContent.transform(("translate3d(" + newTranslate + "px
,0,0)"));
15357 $actions.addClass('swipeout-actions-opened');
15358 $buttons = direction === 'to-left' ? $rightButtons : $leftButtons;
15360 for (i = 0; i < $buttons.length; i += 1) {
15361 $($buttons[i]).transform(("translate3d(" + newTranslate + "px
,0,0)"));
15364 if (overswipeRight) {
15365 $actionsRight.find('.swipeout-overswipe')[0].click();
15367 if (overswipeLeft) {
15368 $actionsLeft.find('.swipeout-overswipe')[0].click();
15371 $swipeoutEl.trigger('swipeout:close');
15372 app.emit('swipeoutClose', $swipeoutEl[0]);
15373 Swipeout.el = undefined;
15374 $swipeoutEl.addClass('swipeout-transitioning').removeClass('swipeout-opened');
15375 $swipeoutContent.transform('');
15376 $actions.removeClass('swipeout-actions-opened');
15380 if ($leftButtons && $leftButtons.length > 0 && $leftButtons !== $buttons) {
15381 $leftButtons.each(function (index, buttonEl) {
15382 var $buttonEl = $(buttonEl);
15383 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15384 if (typeof buttonOffset === 'undefined') {
15385 $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
15387 $buttonEl.transform(("translate3d(" + buttonOffset + "px
,0,0)"));
15390 if ($rightButtons && $rightButtons.length > 0 && $rightButtons !== $buttons) {
15391 $rightButtons.each(function (index, buttonEl) {
15392 var $buttonEl = $(buttonEl);
15393 buttonOffset = buttonEl.f7SwipeoutButtonOffset;
15394 if (typeof buttonOffset === 'undefined') {
15395 $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
15397 $buttonEl.transform(("translate3d(" + (-buttonOffset) + "px
,0,0)"));
15400 $swipeoutContent.transitionEnd(function () {
15401 if ((opened && action === 'open') || (!opened && action === 'close')) { return; }
15402 $swipeoutEl.trigger(action === 'open' ? 'swipeout:opened' : 'swipeout:closed');
15403 app.emit(action === 'open' ? 'swipeoutOpened' : 'swipeoutClosed', $swipeoutEl[0]);
15404 $swipeoutEl.removeClass('swipeout-transitioning');
15405 if (opened && action === 'close') {
15406 if ($actionsRight.length > 0) {
15407 $rightButtons.transform('');
15409 if ($actionsLeft.length > 0) {
15410 $leftButtons.transform('');
15416 var passiveListener = app.support.passiveListener ? { passive: true } : false;
15418 app.on('touchstart', function (e) {
15420 var $targetEl = $(e.target);
15422 $(Swipeout.el).is($targetEl[0])
15423 || $targetEl.parents('.swipeout').is(Swipeout.el)
15424 || $targetEl.hasClass('modal-in')
15425 || ($targetEl.attr('class') || '').indexOf('-backdrop') > 0
15426 || $targetEl.hasClass('actions-modal')
15427 || $targetEl.parents('.actions-modal.modal-in, .dialog.modal-in').length > 0
15429 app.swipeout.close(Swipeout.el);
15433 $(doc).on(app.touchEvents.start, 'li.swipeout', handleTouchStart, passiveListener);
15434 app.on('touchmove:active', handleTouchMove);
15435 app.on('touchend:passive', handleTouchEnd);
15439 open: function open() {
15442 var args = [], len = arguments.length;
15443 while ( len-- ) args[ len ] = arguments[ len ];
15446 var side = args[1];
15447 var callback = args[2];
15448 if (typeof args[1] === 'function') {
15449 (assign = args, el = assign[0], callback = assign[1], side = assign[2]);
15451 var $el = $(el).eq(0);
15453 if ($el.length === 0) { return; }
15454 if (!$el.hasClass('swipeout') || $el.hasClass('swipeout-opened')) { return; }
15456 if ($el.find('.swipeout-actions-right').length > 0) { side = 'right'; }
15457 else { side = 'left'; }
15459 var $swipeoutActions = $el.find((".swipeout
-actions
-" + side));
15460 var $swipeoutContent = $el.find('.swipeout-content');
15461 if ($swipeoutActions.length === 0) { return; }
15462 $el.trigger('swipeout:open').addClass('swipeout-opened').removeClass('swipeout-transitioning');
15463 app.emit('swipeoutOpen', $el[0]);
15464 $swipeoutActions.addClass('swipeout-actions-opened');
15465 var $buttons = $swipeoutActions.children('a');
15466 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
15467 var translate = side === 'right' ? -swipeoutActionsWidth : swipeoutActionsWidth;
15468 if ($buttons.length > 1) {
15469 $buttons.each(function (buttonIndex, buttonEl) {
15470 var $buttonEl = $(buttonEl);
15471 if (side === 'right') {
15472 $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px
,0,0)"));
15474 $buttonEl.css('z-index', $buttons.length - buttonIndex).transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px
,0,0)"));
15478 $el.addClass('swipeout-transitioning');
15479 $swipeoutContent.transitionEnd(function () {
15480 $el.trigger('swipeout:opened');
15481 app.emit('swipeoutOpened', $el[0]);
15482 if (callback) { callback.call($el[0]); }
15484 Utils.nextFrame(function () {
15485 $buttons.transform(("translate3d(" + translate + "px
,0,0)"));
15486 $swipeoutContent.transform(("translate3d(" + translate + "px
,0,0)"));
15488 Swipeout.el = $el[0];
15490 close: function close(el, callback) {
15492 var $el = $(el).eq(0);
15493 if ($el.length === 0) { return; }
15494 if (!$el.hasClass('swipeout-opened')) { return; }
15495 var side = $el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left';
15496 var $swipeoutActions = $el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
15497 var $buttons = $swipeoutActions.children('a');
15498 var swipeoutActionsWidth = $swipeoutActions.outerWidth();
15499 Swipeout.allow = false;
15500 $el.trigger('swipeout:close');
15501 app.emit('swipeoutClose', $el[0]);
15502 $el.removeClass('swipeout-opened').addClass('swipeout-transitioning');
15505 function onSwipeoutClose() {
15506 Swipeout.allow = true;
15507 if ($el.hasClass('swipeout-opened')) { return; }
15508 $el.removeClass('swipeout-transitioning');
15509 $buttons.transform('');
15510 $el.trigger('swipeout:closed');
15511 app.emit('swipeoutClosed', $el[0]);
15512 if (callback) { callback.call($el[0]); }
15513 if (closeTimeout) { clearTimeout(closeTimeout); }
15515 $el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose);
15516 closeTimeout = setTimeout(onSwipeoutClose, 500);
15518 $buttons.each(function (index, buttonEl) {
15519 var $buttonEl = $(buttonEl);
15520 if (side === 'right') {
15521 $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px
,0,0)"));
15523 $buttonEl.transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px
,0,0)"));
15525 $buttonEl.css({ left: '0px' }).removeClass('swipeout-overswipe-active');
15527 if (Swipeout.el && Swipeout.el === $el[0]) { Swipeout.el = undefined; }
15529 delete: function delete$1(el, callback) {
15531 var $el = $(el).eq(0);
15532 if ($el.length === 0) { return; }
15533 Swipeout.el = undefined;
15534 $el.trigger('swipeout:delete');
15535 app.emit('swipeoutDelete', $el[0]);
15536 $el.css({ height: (($el.outerHeight()) + "px
") });
15537 $el.transitionEnd(function () {
15538 $el.trigger('swipeout:deleted');
15539 app.emit('swipeoutDeleted', $el[0]);
15540 if (callback) { callback.call($el[0]); }
15541 if ($el.parents('.virtual-list').length > 0) {
15542 var virtualList = $el.parents('.virtual-list')[0].f7VirtualList;
15543 var virtualIndex = $el[0].f7VirtualListIndex;
15544 if (virtualList && typeof virtualIndex !== 'undefined') { virtualList.deleteItem(virtualIndex); }
15545 } else if (app.params.swipeout.removeElements) {
15546 if (app.params.swipeout.removeElementsWithTimeout) {
15547 setTimeout(function () {
15549 }, app.params.swipeout.removeElementsTimeout);
15554 $el.removeClass('swipeout-deleting swipeout-transitioning');
15557 // eslint-disable-next-line
15558 // $el[0]._clientLeft = $el[0].clientLeft;
15559 Utils.nextFrame(function () {
15561 .addClass('swipeout-deleting swipeout-transitioning')
15562 .css({ height: '0px' })
15563 .find('.swipeout-content')
15564 .transform('translate3d(-100%,0,0)');
15572 actionsNoFold: false,
15574 removeElements: true,
15575 removeElementsWithTimeout: false,
15576 removeElementsTimeout: 0,
15579 create: function create() {
15581 Utils.extend(app, {
15583 init: Swipeout.init.bind(app),
15584 open: Swipeout.open.bind(app),
15585 close: Swipeout.close.bind(app),
15586 delete: Swipeout.delete.bind(app),
15589 Object.defineProperty(app.swipeout, 'el', {
15591 configurable: true,
15592 get: function () { return Swipeout.el; },
15593 set: function set(el) {
15597 Object.defineProperty(app.swipeout, 'allow', {
15599 configurable: true,
15600 get: function () { return Swipeout.allow; },
15601 set: function set(allow) {
15602 Swipeout.allow = allow;
15607 '.swipeout-open': function openSwipeout($clickedEl, data) {
15608 if ( data === void 0 ) data = {};
15611 app.swipeout.open(data.swipeout, data.side);
15613 '.swipeout-close': function closeSwipeout($clickedEl) {
15615 var $swipeoutEl = $clickedEl.closest('.swipeout');
15616 if ($swipeoutEl.length === 0) { return; }
15617 app.swipeout.close($swipeoutEl);
15619 '.swipeout-delete': function deleteSwipeout($clickedEl, data) {
15620 if ( data === void 0 ) data = {};
15623 var $swipeoutEl = $clickedEl.closest('.swipeout');
15624 if ($swipeoutEl.length === 0) { return; }
15625 var confirm = data.confirm;
15626 var confirmTitle = data.confirmTitle;
15627 if (data.confirm) {
15628 app.dialog.confirm(confirm, confirmTitle, function () {
15629 app.swipeout.delete($swipeoutEl);
15632 app.swipeout.delete($swipeoutEl);
15637 init: function init() {
15639 if (!app.params.swipeout) { return; }
15640 app.swipeout.init();
15645 /* eslint no-underscore-dangle: ["error
", { "allow
": ["_clientLeft
"] }] */
15648 toggleClicked: function toggleClicked($clickedEl) {
15650 var $accordionItemEl = $clickedEl.closest('.accordion-item').eq(0);
15651 if (!$accordionItemEl.length) { $accordionItemEl = $clickedEl.parents('li').eq(0); }
15653 var $accordionContent = $clickedEl.parents('.accordion-item-content').eq(0);
15654 if ($accordionContent.length) {
15655 if ($accordionContent.parents($accordionItemEl).length) { return; }
15658 if ($clickedEl.parents('li').length > 1 && $clickedEl.parents('li')[0] !== $accordionItemEl[0]) { return; }
15659 app.accordion.toggle($accordionItemEl);
15661 open: function open(el) {
15664 var prevented = false;
15665 function prevent() {
15668 $el.trigger('accordion:beforeopen', { prevent: prevent }, prevent);
15669 app.emit('accordionBeforeOpen', $el[0], prevent);
15670 if (prevented) { return; }
15671 var $list = $el.parents('.accordion-list').eq(0);
15672 var $contentEl = $el.children('.accordion-item-content');
15673 $contentEl.removeAttr('aria-hidden');
15674 if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
15675 if ($contentEl.length === 0) { return; }
15676 var $openedItem = $list.length > 0 && $el.parent().children('.accordion-item-opened');
15677 if ($openedItem.length > 0) {
15678 app.accordion.close($openedItem);
15680 $contentEl.transitionEnd(function () {
15681 if ($el.hasClass('accordion-item-opened')) {
15682 $contentEl.transition(0);
15683 $contentEl.css('height', 'auto');
15684 Utils.nextFrame(function () {
15685 $contentEl.transition('');
15686 $el.trigger('accordion:opened');
15687 app.emit('accordionOpened', $el[0]);
15690 $contentEl.css('height', '');
15691 $el.trigger('accordion:closed');
15692 app.emit('accordionClosed', $el[0]);
15695 $contentEl.css('height', (($contentEl[0].scrollHeight) + "px
"));
15696 $el.trigger('accordion:open');
15697 $el.addClass('accordion-item-opened');
15698 app.emit('accordionOpen', $el[0]);
15700 close: function close(el) {
15703 var prevented = false;
15704 function prevent() {
15707 $el.trigger('accordion:beforeclose', { prevent: prevent }, prevent);
15708 app.emit('accordionBeforeClose', $el[0], prevent);
15709 if (prevented) { return; }
15710 var $contentEl = $el.children('.accordion-item-content');
15711 if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
15712 $el.removeClass('accordion-item-opened');
15713 $contentEl.attr('aria-hidden', true);
15714 $contentEl.transition(0);
15715 $contentEl.css('height', (($contentEl[0].scrollHeight) + "px
"));
15717 $contentEl.transitionEnd(function () {
15718 if ($el.hasClass('accordion-item-opened')) {
15719 $contentEl.transition(0);
15720 $contentEl.css('height', 'auto');
15721 Utils.nextFrame(function () {
15722 $contentEl.transition('');
15723 $el.trigger('accordion:opened');
15724 app.emit('accordionOpened', $el[0]);
15727 $contentEl.css('height', '');
15728 $el.trigger('accordion:closed');
15729 app.emit('accordionClosed', $el[0]);
15732 Utils.nextFrame(function () {
15733 $contentEl.transition('');
15734 $contentEl.css('height', '');
15735 $el.trigger('accordion:close');
15736 app.emit('accordionClose', $el[0]);
15739 toggle: function toggle(el) {
15742 if ($el.length === 0) { return; }
15743 if ($el.hasClass('accordion-item-opened')) { app.accordion.close(el); }
15744 else { app.accordion.open(el); }
15748 var Accordion$1 = {
15750 create: function create() {
15752 Utils.extend(app, {
15754 open: Accordion.open.bind(app),
15755 close: Accordion.close.bind(app),
15756 toggle: Accordion.toggle.bind(app),
15761 '.accordion-item .item-link, .accordion-item-toggle, .links-list.accordion-list > ul > li > a': function open($clickedEl) {
15763 Accordion.toggleClicked.call(app, $clickedEl);
15768 var ContactsList = {
15769 name: 'contactsList',
15772 var VirtualList = /*@__PURE__*/(function (Framework7Class$$1) {
15773 function VirtualList(app, params) {
15774 if ( params === void 0 ) params = {};
15776 Framework7Class$$1.call(this, params, [app]);
15781 height: app.theme === 'md' ? 48 : 44,
15783 dynamicHeightBufferSize: 1,
15784 showFilteredItemsOnly: false,
15785 renderExternal: undefined,
15786 setListHeight: true,
15787 searchByItem: undefined,
15788 searchAll: undefined,
15789 itemTemplate: undefined,
15792 renderItem: function renderItem(item) {
15793 return ("\n <li
>\n <div
class=\"item
-content
\">\n <div
class=\"item
-inner
\">\n <div
class=\"item
-title
\">" + item + "</div>\n </div>\n </div>\n </li>\n ").trim();
15798 // Extend defaults with modules params
15799 vl.useModulesParams(defaults);
15801 vl.params = Utils.extend(defaults, params);
15802 if (vl.params.height === undefined || !vl.params.height) {
15803 vl.params.height = app.theme === 'md' ? 48 : 44;
15806 vl.$el = $(params.el);
15809 if (vl.$el.length === 0) { return undefined; }
15810 vl.$el[0].f7VirtualList = vl;
15812 vl.items = vl.params.items;
15813 if (vl.params.showFilteredItemsOnly) {
15814 vl.filteredItems = [];
15816 if (vl.params.itemTemplate) {
15817 if (typeof vl.params.itemTemplate === 'string') { vl.renderItem = app.t7.compile(vl.params.itemTemplate); }
15818 else if (typeof vl.params.itemTemplate === 'function') { vl.renderItem = vl.params.itemTemplate; }
15819 } else if (vl.params.renderItem) {
15820 vl.renderItem = vl.params.renderItem;
15822 vl.$pageContentEl = vl.$el.parents('.page-content');
15823 vl.pageContentEl = vl.$pageContentEl[0];
15826 if (typeof vl.params.updatableScroll !== 'undefined') {
15827 vl.updatableScroll = vl.params.updatableScroll;
15829 vl.updatableScroll = true;
15830 if (Device.ios && Device.osVersion.split('.')[0] < 8) {
15831 vl.updatableScroll = false;
15836 var ul = vl.params.ul;
15837 vl.$ul = ul ? $(vl.params.ul) : vl.$el.children('ul');
15838 if (vl.$ul.length === 0 && vl.params.createUl) {
15839 vl.$el.append('<ul></ul>');
15840 vl.$ul = vl.$el.children('ul');
15845 if (!vl.ul && !vl.params.createUl) { $itemsWrapEl = vl.$el; }
15846 else { $itemsWrapEl = vl.$ul; }
15849 $itemsWrapEl: $itemsWrapEl,
15850 itemsWrapEl: $itemsWrapEl[0],
15851 // DOM cached items
15853 displayDomCache: {},
15854 // Temporary DOM Element
15855 tempDomElement: doc.createElement('ul'),
15856 // Last repain position
15857 lastRepaintY: null,
15859 fragment: doc.createDocumentFragment(),
15861 pageHeight: undefined,
15862 rowsPerScreen: undefined,
15863 rowsBefore: undefined,
15864 rowsAfter: undefined,
15865 rowsToRender: undefined,
15866 maxBufferHeight: 0,
15867 listHeight: undefined,
15868 dynamicHeight: typeof vl.params.height === 'function',
15875 var handleScrollBound = vl.handleScroll.bind(vl);
15876 var handleResizeBound = vl.handleResize.bind(vl);
15881 vl.attachEvents = function attachEvents() {
15882 $pageEl = vl.$el.parents('.page').eq(0);
15883 $tabEl = vl.$el.parents('.tab').eq(0);
15884 $panelEl = vl.$el.parents('.panel').eq(0);
15885 $popupEl = vl.$el.parents('.popup').eq(0);
15887 vl.$pageContentEl.on('scroll', handleScrollBound);
15888 if ($pageEl) { $pageEl.on('page:reinit', handleResizeBound); }
15889 if ($tabEl) { $tabEl.on('tab:show', handleResizeBound); }
15890 if ($panelEl) { $panelEl.on('panel:open', handleResizeBound); }
15891 if ($popupEl) { $popupEl.on('popup:open', handleResizeBound); }
15892 app.on('resize', handleResizeBound);
15894 vl.detachEvents = function attachEvents() {
15895 vl.$pageContentEl.off('scroll', handleScrollBound);
15896 if ($pageEl) { $pageEl.off('page:reinit', handleResizeBound); }
15897 if ($tabEl) { $tabEl.off('tab:show', handleResizeBound); }
15898 if ($panelEl) { $panelEl.off('panel:open', handleResizeBound); }
15899 if ($popupEl) { $popupEl.off('popup:open', handleResizeBound); }
15900 app.off('resize', handleResizeBound);
15908 if ( Framework7Class$$1 ) VirtualList.__proto__ = Framework7Class$$1;
15909 VirtualList.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
15910 VirtualList.prototype.constructor = VirtualList;
15912 VirtualList.prototype.setListSize = function setListSize () {
15914 var items = vl.filteredItems || vl.items;
15915 vl.pageHeight = vl.$pageContentEl[0].offsetHeight;
15916 if (vl.dynamicHeight) {
15919 for (var i = 0; i < items.length; i += 1) {
15920 var itemHeight = vl.params.height(items[i]);
15921 vl.listHeight += itemHeight;
15922 vl.heights.push(itemHeight);
15925 vl.listHeight = Math.ceil(items.length / vl.params.cols) * vl.params.height;
15926 vl.rowsPerScreen = Math.ceil(vl.pageHeight / vl.params.height);
15927 vl.rowsBefore = vl.params.rowsBefore || vl.rowsPerScreen * 2;
15928 vl.rowsAfter = vl.params.rowsAfter || vl.rowsPerScreen;
15929 vl.rowsToRender = (vl.rowsPerScreen + vl.rowsBefore + vl.rowsAfter);
15930 vl.maxBufferHeight = (vl.rowsBefore / 2) * vl.params.height;
15933 if (vl.updatableScroll || vl.params.setListHeight) {
15934 vl.$itemsWrapEl.css({ height: ((vl.listHeight) + "px
") });
15938 VirtualList.prototype.render = function render (force, forceScrollTop) {
15940 if (force) { vl.lastRepaintY = null; }
15942 var scrollTop = -(vl.$el[0].getBoundingClientRect().top - vl.$pageContentEl[0].getBoundingClientRect().top);
15944 if (typeof forceScrollTop !== 'undefined') { scrollTop = forceScrollTop; }
15945 if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > vl.maxBufferHeight || (!vl.updatableScroll && (vl.$pageContentEl[0].scrollTop + vl.pageHeight >= vl.$pageContentEl[0].scrollHeight))) {
15946 vl.lastRepaintY = scrollTop;
15951 var items = vl.filteredItems || vl.items;
15954 var heightBeforeFirstItem = 0;
15955 var heightBeforeLastItem = 0;
15956 if (vl.dynamicHeight) {
15959 vl.maxBufferHeight = vl.pageHeight;
15961 for (var j = 0; j < vl.heights.length; j += 1) {
15962 itemHeight = vl.heights[j];
15963 if (typeof fromIndex === 'undefined') {
15964 if (itemTop + itemHeight >= scrollTop - (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize)) { fromIndex = j; }
15965 else { heightBeforeFirstItem += itemHeight; }
15968 if (typeof toIndex === 'undefined') {
15969 if (itemTop + itemHeight >= scrollTop + (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize) || j === vl.heights.length - 1) { toIndex = j + 1; }
15970 heightBeforeLastItem += itemHeight;
15972 itemTop += itemHeight;
15974 toIndex = Math.min(toIndex, items.length);
15976 fromIndex = (parseInt(scrollTop / vl.params.height, 10) - vl.rowsBefore) * vl.params.cols;
15977 if (fromIndex < 0) {
15980 toIndex = Math.min(fromIndex + (vl.rowsToRender * vl.params.cols), items.length);
15984 var renderExternalItems = [];
15985 vl.reachEnd = false;
15987 for (i = fromIndex; i < toIndex; i += 1) {
15988 var itemEl = (void 0);
15989 // Define real item index
15990 var index = vl.items.indexOf(items[i]);
15992 if (i === fromIndex) { vl.currentFromIndex = index; }
15993 if (i === toIndex - 1) { vl.currentToIndex = index; }
15994 if (vl.filteredItems) {
15995 if (vl.items[index] === vl.filteredItems[vl.filteredItems.length - 1]) { vl.reachEnd = true; }
15996 } else if (index === vl.items.length - 1) { vl.reachEnd = true; }
15999 if (vl.params.renderExternal) {
16000 renderExternalItems.push(items[i]);
16001 } else if (vl.domCache[index]) {
16002 itemEl = vl.domCache[index];
16003 itemEl.f7VirtualListIndex = index;
16005 if (vl.renderItem) {
16006 vl.tempDomElement.innerHTML = vl.renderItem(items[i], index).trim();
16008 vl.tempDomElement.innerHTML = items[i].toString().trim();
16010 itemEl = vl.tempDomElement.childNodes[0];
16011 if (vl.params.cache) { vl.domCache[index] = itemEl; }
16012 itemEl.f7VirtualListIndex = index;
16015 // Set item top position
16016 if (i === fromIndex) {
16017 if (vl.dynamicHeight) {
16018 topPosition = heightBeforeFirstItem;
16020 topPosition = ((i * vl.params.height) / vl.params.cols);
16023 if (!vl.params.renderExternal) {
16024 itemEl.style.top = topPosition + "px
";
16026 // Before item insert
16027 vl.emit('local::itemBeforeInsert vlItemBeforeInsert', vl, itemEl, items[i]);
16029 // Append item to fragment
16030 vl.fragment.appendChild(itemEl);
16034 // Update list height with not updatable scroll
16035 if (!vl.updatableScroll) {
16036 if (vl.dynamicHeight) {
16037 vl.itemsWrapEl.style.height = heightBeforeLastItem + "px
";
16039 vl.itemsWrapEl.style.height = ((i * vl.params.height) / vl.params.cols) + "px
";
16043 // Update list html
16044 if (vl.params.renderExternal) {
16045 if (items && items.length === 0) {
16046 vl.reachEnd = true;
16049 vl.emit('local::beforeClear vlBeforeClear', vl, vl.fragment);
16050 vl.itemsWrapEl.innerHTML = '';
16052 vl.emit('local::itemsBeforeInsert vlItemsBeforeInsert', vl, vl.fragment);
16054 if (items && items.length === 0) {
16055 vl.reachEnd = true;
16056 if (vl.params.emptyTemplate) { vl.itemsWrapEl.innerHTML = vl.params.emptyTemplate; }
16058 vl.itemsWrapEl.appendChild(vl.fragment);
16061 vl.emit('local::itemsAfterInsert vlItemsAfterInsert', vl, vl.fragment);
16064 if (typeof forceScrollTop !== 'undefined' && force) {
16065 vl.$pageContentEl.scrollTop(forceScrollTop, 0);
16067 if (vl.params.renderExternal) {
16068 vl.params.renderExternal(vl, {
16069 fromIndex: fromIndex,
16071 listHeight: vl.listHeight,
16072 topPosition: topPosition,
16073 items: renderExternalItems,
16079 VirtualList.prototype.filterItems = function filterItems (indexes, resetScrollTop) {
16080 if ( resetScrollTop === void 0 ) resetScrollTop = true;
16083 vl.filteredItems = [];
16084 for (var i = 0; i < indexes.length; i += 1) {
16085 vl.filteredItems.push(vl.items[indexes[i]]);
16087 if (resetScrollTop) {
16088 vl.$pageContentEl[0].scrollTop = 0;
16093 VirtualList.prototype.resetFilter = function resetFilter () {
16095 if (vl.params.showFilteredItemsOnly) {
16096 vl.filteredItems = [];
16098 vl.filteredItems = null;
16099 delete vl.filteredItems;
16104 VirtualList.prototype.scrollToItem = function scrollToItem (index) {
16106 if (index > vl.items.length) { return false; }
16108 if (vl.dynamicHeight) {
16109 for (var i = 0; i < index; i += 1) {
16110 itemTop += vl.heights[i];
16113 itemTop = index * vl.params.height;
16115 var listTop = vl.$el[0].offsetTop;
16116 vl.render(true, (listTop + itemTop) - parseInt(vl.$pageContentEl.css('padding-top'), 10));
16120 VirtualList.prototype.handleScroll = function handleScroll () {
16125 // Handle resize event
16126 VirtualList.prototype.isVisible = function isVisible () {
16128 return !!(vl.el.offsetWidth || vl.el.offsetHeight || vl.el.getClientRects().length);
16131 VirtualList.prototype.handleResize = function handleResize () {
16133 if (vl.isVisible()) {
16140 VirtualList.prototype.appendItems = function appendItems (items) {
16142 for (var i = 0; i < items.length; i += 1) {
16143 vl.items.push(items[i]);
16148 VirtualList.prototype.appendItem = function appendItem (item) {
16150 vl.appendItems([item]);
16154 VirtualList.prototype.replaceAllItems = function replaceAllItems (items) {
16157 delete vl.filteredItems;
16162 VirtualList.prototype.replaceItem = function replaceItem (index, item) {
16164 vl.items[index] = item;
16165 if (vl.params.cache) { delete vl.domCache[index]; }
16170 VirtualList.prototype.prependItems = function prependItems (items) {
16172 for (var i = items.length - 1; i >= 0; i -= 1) {
16173 vl.items.unshift(items[i]);
16175 if (vl.params.cache) {
16177 Object.keys(vl.domCache).forEach(function (cached) {
16178 newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];
16180 vl.domCache = newCache;
16185 VirtualList.prototype.prependItem = function prependItem (item) {
16187 vl.prependItems([item]);
16191 VirtualList.prototype.moveItem = function moveItem (from, to) {
16193 var fromIndex = from;
16195 if (fromIndex === toIndex) { return; }
16196 // remove item from array
16197 var item = vl.items.splice(fromIndex, 1)[0];
16198 if (toIndex >= vl.items.length) {
16199 // Add item to the end
16200 vl.items.push(item);
16201 toIndex = vl.items.length - 1;
16203 // Add item to new index
16204 vl.items.splice(toIndex, 0, item);
16207 if (vl.params.cache) {
16209 Object.keys(vl.domCache).forEach(function (cached) {
16210 var cachedIndex = parseInt(cached, 10);
16211 var leftIndex = fromIndex < toIndex ? fromIndex : toIndex;
16212 var rightIndex = fromIndex < toIndex ? toIndex : fromIndex;
16213 var indexShift = fromIndex < toIndex ? -1 : 1;
16214 if (cachedIndex < leftIndex || cachedIndex > rightIndex) { newCache[cachedIndex] = vl.domCache[cachedIndex]; }
16215 if (cachedIndex === leftIndex) { newCache[rightIndex] = vl.domCache[cachedIndex]; }
16216 if (cachedIndex > leftIndex && cachedIndex <= rightIndex) { newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex]; }
16218 vl.domCache = newCache;
16224 VirtualList.prototype.insertItemBefore = function insertItemBefore (index, item) {
16227 vl.prependItem(item);
16230 if (index >= vl.items.length) {
16231 vl.appendItem(item);
16234 vl.items.splice(index, 0, item);
16236 if (vl.params.cache) {
16238 Object.keys(vl.domCache).forEach(function (cached) {
16239 var cachedIndex = parseInt(cached, 10);
16240 if (cachedIndex >= index) {
16241 newCache[cachedIndex + 1] = vl.domCache[cachedIndex];
16244 vl.domCache = newCache;
16250 VirtualList.prototype.deleteItems = function deleteItems (indexes) {
16253 var indexShift = 0;
16254 var loop = function ( i ) {
16255 var index = indexes[i];
16256 if (typeof prevIndex !== 'undefined') {
16257 if (index > prevIndex) {
16261 index += indexShift;
16262 prevIndex = indexes[i];
16264 var deletedItem = vl.items.splice(index, 1)[0];
16266 // Delete from filtered
16267 if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {
16268 vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);
16271 if (vl.params.cache) {
16273 Object.keys(vl.domCache).forEach(function (cached) {
16274 var cachedIndex = parseInt(cached, 10);
16275 if (cachedIndex === index) {
16276 delete vl.domCache[index];
16277 } else if (parseInt(cached, 10) > index) {
16278 newCache[cachedIndex - 1] = vl.domCache[cached];
16280 newCache[cachedIndex] = vl.domCache[cached];
16283 vl.domCache = newCache;
16287 for (var i = 0; i < indexes.length; i += 1) loop( i );
16291 VirtualList.prototype.deleteAllItems = function deleteAllItems () {
16294 delete vl.filteredItems;
16295 if (vl.params.cache) { vl.domCache = {}; }
16299 VirtualList.prototype.deleteItem = function deleteItem (index) {
16301 vl.deleteItems([index]);
16305 VirtualList.prototype.clearCache = function clearCache () {
16310 // Update Virtual List
16311 VirtualList.prototype.update = function update (deleteCache) {
16313 if (deleteCache && vl.params.cache) {
16320 VirtualList.prototype.init = function init () {
16327 VirtualList.prototype.destroy = function destroy () {
16330 vl.$el[0].f7VirtualList = null;
16331 delete vl.$el[0].f7VirtualList;
16332 Utils.deleteProps(vl);
16336 return VirtualList;
16337 }(Framework7Class));
16339 var VirtualList$1 = {
16340 name: 'virtualList',
16342 VirtualList: VirtualList,
16344 create: function create() {
16346 app.virtualList = ConstructorMethods({
16347 defaultSelector: '.virtual-list',
16348 constructor: VirtualList,
16350 domProp: 'f7VirtualList',
16355 var ListIndex = /*@__PURE__*/(function (Framework7Class$$1) {
16356 function ListIndex(app, params) {
16357 if ( params === void 0 ) params = {};
16359 Framework7Class$$1.call(this, params, [app]);
16363 el: null, // where to render indexes
16364 listEl: null, // list el to generate indexes
16365 indexes: 'auto', // or array of indexes
16370 // eslint-disable-next-line
16371 renderItem: function renderItem(itemContent, itemIndex) {
16372 return ("\n <li
>" + itemContent + "</li
>\n ").trim();
16374 renderSkipPlaceholder: function renderSkipPlaceholder() {
16375 return '<li class="list
-index
-skip
-placeholder
"></li>';
16380 // Extend defaults with modules params
16381 index.useModulesParams(defaults);
16383 index.params = Utils.extend(defaults, params);
16387 var $pageContentEl;
16390 if (index.params.el) {
16391 $el = $(index.params.el);
16396 if ($el[0].f7ListIndex) {
16397 return $el[0].f7ListIndex;
16400 $ul = $el.find('ul');
16401 if ($ul.length === 0) {
16402 $ul = $('<ul></ul>');
16406 if (index.params.listEl) {
16407 $listEl = $(index.params.listEl);
16410 if (index.params.indexes === 'auto' && !$listEl) {
16415 $pageContentEl = $listEl.parents('.page-content').eq(0);
16417 $pageContentEl = $el.siblings('.page-content').eq(0);
16418 if ($pageContentEl.length === 0) {
16419 $pageContentEl = $el.parents('.page').eq(0).find('.page-content').eq(0);
16423 $el[0].f7ListIndex = index;
16425 Utils.extend(index, {
16432 listEl: $listEl && $listEl[0],
16433 $pageContentEl: $pageContentEl,
16434 pageContentEl: $pageContentEl && $pageContentEl[0],
16435 indexes: params.indexes,
16441 index.useModules();
16444 function handleResize() {
16445 var height = { index: index };
16447 if (height !== index.height) {
16452 function handleClick(e) {
16453 var $clickedLi = $(e.target).closest('li');
16454 if (!$clickedLi.length) { return; }
16456 var itemIndex = $clickedLi.index();
16457 if (index.skipRate > 0) {
16458 var percentage = itemIndex / ($clickedLi.siblings('li').length - 1);
16459 itemIndex = Math.round((index.indexes.length - 1) * percentage);
16461 var itemContent = index.indexes[itemIndex];
16463 index.$el.trigger('listindex:click', itemContent, itemIndex);
16464 index.emit('local::click listIndexClick', index, itemContent, itemIndex);
16465 index.$el.trigger('listindex:select', itemContent, itemIndex);
16466 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
16468 if (index.$listEl && index.params.scrollList) {
16469 index.scrollListToIndex(itemContent, itemIndex);
16473 var touchesStart = {};
16479 var previousIndex = null;
16480 function handleTouchStart(e) {
16481 var $children = $ul.children();
16482 if (!$children.length) { return; }
16483 topPoint = $children[0].getBoundingClientRect().top;
16484 bottomPoint = $children[$children.length - 1].getBoundingClientRect().top + $children[0].offsetHeight;
16486 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
16487 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
16490 previousIndex = null;
16492 function handleTouchMove(e) {
16493 if (!isTouched) { return; }
16494 if (!isMoved && index.params.label) {
16495 $labelEl = $('<span class="list
-index
-label
"></span>');
16496 $el.append($labelEl);
16499 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
16500 e.preventDefault();
16502 var percentage = (pageY - topPoint) / (bottomPoint - topPoint);
16503 percentage = Math.min(Math.max(percentage, 0), 1);
16505 var itemIndex = Math.round((index.indexes.length - 1) * percentage);
16506 var itemContent = index.indexes[itemIndex];
16509 var ulHeight = bottomPoint - topPoint;
16510 var bubbleBottom = ((index.height - ulHeight) / 2) + ((1 - percentage) * ulHeight);
16512 if (itemIndex !== previousIndex) {
16513 if (index.params.label) {
16514 $labelEl.html(itemContent).transform(("translateY(-" + bubbleBottom + "px
)"));
16517 if (index.$listEl && index.params.scrollList) {
16518 index.scrollListToIndex(itemContent, itemIndex);
16522 previousIndex = itemIndex;
16524 index.$el.trigger('listindex:select', index);
16525 index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
16527 function handleTouchEnd() {
16528 if (!isTouched) { return; }
16531 if (index.params.label) {
16532 if ($labelEl) { $labelEl.remove(); }
16533 $labelEl = undefined;
16536 var passiveListener = app.support.passiveListener ? { passive: true } : false;
16537 index.attachEvents = function attachEvents() {
16538 $el.parents('.tab').on('tab:show', handleResize);
16539 $el.parents('.page').on('page:reinit', handleResize);
16540 $el.parents('.panel').on('panel:open', handleResize);
16542 .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
16543 .on('modal:open', handleResize);
16544 app.on('resize', handleResize);
16546 $el.on('click', handleClick);
16547 $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
16548 app.on('touchmove:active', handleTouchMove);
16549 app.on('touchend:passive', handleTouchEnd);
16551 index.detachEvents = function attachEvents() {
16552 $el.parents('.tab').off('tab:show', handleResize);
16553 $el.parents('.page').off('page:reinit', handleResize);
16554 $el.parents('.panel').off('panel:open', handleResize);
16556 .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
16557 .off('modal:open', handleResize);
16558 app.off('resize', handleResize);
16560 $el.off('click', handleClick);
16561 $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
16562 app.off('touchmove:active', handleTouchMove);
16563 app.off('touchend:passive', handleTouchEnd);
16571 if ( Framework7Class$$1 ) ListIndex.__proto__ = Framework7Class$$1;
16572 ListIndex.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
16573 ListIndex.prototype.constructor = ListIndex;
16574 // eslint-disable-next-line
16575 ListIndex.prototype.scrollListToIndex = function scrollListToIndex (itemContent, itemIndex) {
16577 var $listEl = index.$listEl;
16578 var $pageContentEl = index.$pageContentEl;
16579 if (!$listEl || !$pageContentEl || $pageContentEl.length === 0) { return index; }
16582 $listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
16583 if ($scrollToEl) { return; }
16585 if ($el.text() === itemContent) {
16589 if (!$scrollToEl || $scrollToEl.length === 0) { return index; }
16591 var parentTop = $scrollToEl.parent().offset().top;
16592 var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
16593 var scrollTop = $pageContentEl[0].scrollTop;
16594 var scrollToElTop = $scrollToEl.offset().top;
16596 if (parentTop <= paddingTop) {
16597 $pageContentEl.scrollTop((parentTop + scrollTop) - paddingTop);
16599 $pageContentEl.scrollTop((scrollToElTop + scrollTop) - paddingTop);
16604 ListIndex.prototype.renderSkipPlaceholder = function renderSkipPlaceholder () {
16606 return index.params.renderSkipPlaceholder.call(index);
16609 ListIndex.prototype.renderItem = function renderItem (itemContent, itemIndex) {
16611 return index.params.renderItem.call(index, itemContent, itemIndex);
16614 ListIndex.prototype.render = function render () {
16616 var $ul = index.$ul;
16617 var indexes = index.indexes;
16618 var skipRate = index.skipRate;
16621 var html = indexes.map(function (itemContent, itemIndex) {
16622 if (itemIndex % skipRate !== 0 && skipRate > 0) {
16626 var itemHtml = index.renderItem(itemContent, itemIndex);
16628 itemHtml = index.renderSkipPlaceholder() + itemHtml;
16630 wasSkipped = false;
16639 ListIndex.prototype.calcSize = function calcSize () {
16641 var app = index.app;
16642 var params = index.params;
16644 var indexes = index.indexes;
16645 var height = el.offsetHeight;
16646 var itemHeight = app.theme === 'ios' ? params.iosItemHeight : params.mdItemHeight;
16647 var maxItems = Math.floor(height / itemHeight);
16648 var items = indexes.length;
16650 if (items > maxItems) {
16651 skipRate = Math.ceil(((items * 2) - 1) / maxItems);
16654 index.height = height;
16655 index.skipRate = skipRate;
16660 ListIndex.prototype.calcIndexes = function calcIndexes () {
16662 if (index.params.indexes === 'auto') {
16663 index.indexes = [];
16665 index.$listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
16666 var elContent = $(el).text();
16667 if (index.indexes.indexOf(elContent) < 0) {
16668 index.indexes.push(elContent);
16672 index.indexes = index.params.indexes;
16677 ListIndex.prototype.update = function update () {
16679 index.calcIndexes();
16686 ListIndex.prototype.init = function init () {
16688 index.calcIndexes();
16691 index.attachEvents();
16694 ListIndex.prototype.destroy = function destroy () {
16696 index.$el.trigger('listindex:beforedestroy', index);
16697 index.emit('local::beforeDestroy listIndexBeforeDestroy', index);
16698 index.detachEvents();
16699 if (index.$el[0]) {
16700 index.$el[0].f7ListIndex = null;
16701 delete index.$el[0].f7ListIndex;
16703 Utils.deleteProps(index);
16708 }(Framework7Class));
16710 var ListIndex$1 = {
16713 ListIndex: ListIndex,
16715 create: function create() {
16717 app.listIndex = ConstructorMethods({
16718 defaultSelector: '.list-index',
16719 constructor: ListIndex,
16721 domProp: 'f7ListIndex',
16725 tabMounted: function tabMounted(tabEl) {
16727 $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
16728 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
16729 app.listIndex.create(params);
16732 tabBeforeRemove: function tabBeforeRemove(tabEl) {
16733 $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
16734 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
16737 pageInit: function pageInit(page) {
16739 page.$el.find('.list-index-init').each(function (index, listIndexEl) {
16740 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
16741 app.listIndex.create(params);
16744 pageBeforeRemove: function pageBeforeRemove(page) {
16745 page.$el.find('.list-index-init').each(function (index, listIndexEl) {
16746 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
16751 'list-index-init': {
16752 insert: function insert(vnode) {
16754 var listIndexEl = vnode.elm;
16755 var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
16756 app.listIndex.create(params);
16758 destroy: function destroy(vnode) {
16759 var listIndexEl = vnode.elm;
16760 if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
16771 show: function show() {
16772 var assign, assign$1, assign$2;
16774 var args = [], len = arguments.length;
16775 while ( len-- ) args[ len ] = arguments[ len ];
16782 if (args.length === 1 && args[0].constructor === Object) {
16783 tabEl = args[0].tabEl;
16784 tabLinkEl = args[0].tabLinkEl;
16785 animate = args[0].animate;
16786 tabRoute = args[0].tabRoute;
16788 (assign = args, tabEl = assign[0], tabLinkEl = assign[1], animate = assign[2], tabRoute = assign[3]);
16789 if (typeof args[1] === 'boolean') {
16790 (assign$1 = args, tabEl = assign$1[0], animate = assign$1[1], tabLinkEl = assign$1[2], tabRoute = assign$1[3]);
16791 if (args.length > 2 && tabLinkEl.constructor === Object) {
16792 (assign$2 = args, tabEl = assign$2[0], animate = assign$2[1], tabRoute = assign$2[2], tabLinkEl = assign$2[3]);
16796 if (typeof animate === 'undefined') { animate = true; }
16798 var $newTabEl = $(tabEl);
16799 if (tabRoute && $newTabEl[0]) {
16800 $newTabEl[0].f7TabRoute = tabRoute;
16803 if ($newTabEl.length === 0 || $newTabEl.hasClass('tab-active')) {
16805 $newTabEl: $newTabEl,
16806 newTabEl: $newTabEl[0],
16811 if (tabLinkEl) { $tabLinkEl = $(tabLinkEl); }
16813 var $tabsEl = $newTabEl.parent('.tabs');
16814 if ($tabsEl.length === 0) {
16816 $newTabEl: $newTabEl,
16817 newTabEl: $newTabEl[0],
16821 // Release swipeouts in hidden tabs
16822 if (app.swipeout) { app.swipeout.allowOpen = true; }
16825 var tabsChangedCallbacks = [];
16827 function onTabsChanged(callback) {
16828 tabsChangedCallbacks.push(callback);
16830 function tabsChanged() {
16831 tabsChangedCallbacks.forEach(function (callback) {
16836 var animated = false;
16838 if ($tabsEl.parent().hasClass('tabs-animated-wrap')) {
16839 $tabsEl.parent()[animate ? 'removeClass' : 'addClass']('not-animated');
16841 var transitionDuration = parseFloat($tabsEl.css('transition-duration').replace(',', '.'));
16842 if (animate && transitionDuration) {
16843 $tabsEl.transitionEnd(tabsChanged);
16847 var tabsTranslate = (app.rtl ? $newTabEl.index() : -$newTabEl.index()) * 100;
16848 $tabsEl.transform(("translate3d(" + tabsTranslate + "%,0,0)"));
16853 if ($tabsEl.parent().hasClass('tabs-swipeable-wrap') && app.swiper) {
16854 swiper = $tabsEl.parent()[0].swiper;
16855 if (swiper && swiper.activeIndex !== $newTabEl.index()) {
16858 .once('slideChangeTransitionEnd', function () {
16861 .slideTo($newTabEl.index(), animate ? undefined : 0);
16862 } else if (swiper && swiper.animating) {
16865 .once('slideChangeTransitionEnd', function () {
16871 // Remove active class from old tabs
16872 var $oldTabEl = $tabsEl.children('.tab-active');
16873 $oldTabEl.removeClass('tab-active');
16874 if (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute)) {
16875 $oldTabEl.trigger('tab:hide');
16876 app.emit('tabHide', $oldTabEl[0]);
16879 // Trigger 'show' event on new tab
16880 $newTabEl.addClass('tab-active');
16881 if (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute)) {
16882 $newTabEl.trigger('tab:show');
16883 app.emit('tabShow', $newTabEl[0]);
16886 // Find related link for new tab
16889 if (typeof tabEl === 'string') { $tabLinkEl = $((".tab
-link
[href
=\"" + tabEl + "\"]")); }
16890 else { $tabLinkEl = $((".tab
-link
[href
=\"#" + ($newTabEl.attr('id')) + "\"]")); }
16891 // Search by data-tab
16892 if (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0)) {
16893 $('[data-tab]').each(function (index, el) {
16894 if ($newTabEl.is($(el).attr('data-tab'))) { $tabLinkEl = $(el); }
16897 if (tabRoute && (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0))) {
16898 $tabLinkEl = $(("[data
-route
-tab
-id
=\"" + (tabRoute.route.tab.id) + "\"]"));
16899 if ($tabLinkEl.length === 0) {
16900 $tabLinkEl = $((".tab
-link
[href
=\"" + (tabRoute.url) + "\"]"));
16903 if ($tabLinkEl.length > 1 && $newTabEl.parents('.page').length) {
16904 // eslint-disable-next-line
16905 $tabLinkEl = $tabLinkEl.filter(function (index, tabLinkElement) {
16906 return $(tabLinkElement).parents('.page')[0] === $newTabEl.parents('.page')[0];
16908 if (app.theme === 'ios' && $tabLinkEl.length === 0 && tabRoute) {
16909 var $pageEl = $newTabEl.parents('.page');
16910 var $navbarEl = $(app.navbar.getElByPage($pageEl));
16911 $tabLinkEl = $navbarEl.find(("[data
-route
-tab
-id
=\"" + (tabRoute.route.tab.id) + "\"]"));
16912 if ($tabLinkEl.length === 0) {
16913 $tabLinkEl = $navbarEl.find((".tab
-link
[href
=\"" + (tabRoute.url) + "\"]"));
16918 if ($tabLinkEl.length > 0) {
16919 // Find related link for old tab
16921 if ($oldTabEl && $oldTabEl.length > 0) {
16923 var oldTabId = $oldTabEl.attr('id');
16925 $oldTabLinkEl = $((".tab
-link
[href
=\"#" + oldTabId + "\"]"));
16926 // Search by data-route-tab-id
16927 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
16928 $oldTabLinkEl = $((".tab
-link
[data
-route
-tab
-id
=\"" + oldTabId + "\"]"));
16931 // Search by data-tab
16932 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
16933 $('[data-tab]').each(function (index, tabLinkElement) {
16934 if ($oldTabEl.is($(tabLinkElement).attr('data-tab'))) { $oldTabLinkEl = $(tabLinkElement); }
16937 if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
16938 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
16940 } else if (tabRoute) {
16941 $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
16944 if ($oldTabLinkEl && $oldTabLinkEl.length > 1 && $oldTabEl && $oldTabEl.parents('.page').length) {
16945 // eslint-disable-next-line
16946 $oldTabLinkEl = $oldTabLinkEl.filter(function (index, tabLinkElement) {
16947 return $(tabLinkElement).parents('.page')[0] === $oldTabEl.parents('.page')[0];
16951 if ($oldTabLinkEl && $oldTabLinkEl.length > 0) { $oldTabLinkEl.removeClass('tab-link-active'); }
16953 // Update links' classes
16954 if ($tabLinkEl && $tabLinkEl.length > 0) {
16955 $tabLinkEl.addClass('tab-link-active');
16956 // Material Highlight
16957 if (app.theme === 'md' && app.toolbar) {
16958 var $tabbarEl = $tabLinkEl.parents('.tabbar, .tabbar-labels');
16959 if ($tabbarEl.length > 0) {
16960 app.toolbar.setHighlight($tabbarEl);
16966 $newTabEl: $newTabEl,
16967 newTabEl: $newTabEl[0],
16968 $oldTabEl: $oldTabEl,
16969 oldTabEl: $oldTabEl[0],
16970 onTabsChanged: onTabsChanged,
16971 animated: animated,
16977 create: function create() {
16979 Utils.extend(app, {
16981 show: Tab.show.bind(app),
16986 '.tab-link': function tabLinkClick($clickedEl, data) {
16987 if ( data === void 0 ) data = {};
16990 if (($clickedEl.attr('href') && $clickedEl.attr('href').indexOf('#') === 0) || $clickedEl.attr('data-tab')) {
16992 tabEl: data.tab || $clickedEl.attr('href'),
16993 tabLinkEl: $clickedEl,
16994 animate: data.animate,
17001 function swipePanel(panel) {
17002 var app = panel.app;
17003 Utils.extend(panel, {
17005 swipeInitialized: true,
17007 var params = app.params.panel;
17008 var $el = panel.$el;
17009 var $backdropEl = panel.$backdropEl;
17010 var side = panel.side;
17011 var effect = panel.effect;
17017 var touchesStart = {};
17018 var touchStartTime;
17021 var backdropOpacity;
17027 var touchMoves = 0;
17028 function handleTouchStart(e) {
17029 if (!panel.swipeable) { return; }
17030 if (!app.panel.allowOpen || (!params.swipe && !params.swipeOnlyClose) || isTouched) { return; }
17031 if ($('.modal-in:not(.toast):not(.notification), .photo-browser-in').length > 0) { return; }
17032 otherPanel = app.panel[side === 'left' ? 'right' : 'left'] || {};
17033 if (!panel.opened && otherPanel.opened) { return; }
17034 if (!(params.swipeCloseOpposite || params.swipeOnlyClose)) {
17035 if (otherPanel.opened) { return; }
17037 if (e.target && e.target.nodeName.toLowerCase() === 'input' && e.target.type === 'range') { return; }
17038 if ($(e.target).closest('.range-slider, .tabs-swipeable-wrap, .calendar-months, .no-swipe-panel, .card-opened').length > 0) { return; }
17039 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
17040 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
17041 if (params.swipeOnlyClose && !panel.opened) {
17044 if (params.swipe !== 'both' && params.swipeCloseOpposite && params.swipe !== side && !panel.opened) {
17047 if (params.swipeActiveArea && !panel.opened) {
17048 if (side === 'left') {
17049 if (touchesStart.x > params.swipeActiveArea) { return; }
17051 if (side === 'right') {
17052 if (touchesStart.x < app.width - params.swipeActiveArea) { return; }
17055 if (params.swipeCloseActiveAreaSide && panel.opened) {
17056 if (side === 'left') {
17057 if (touchesStart.x < ($el[0].offsetWidth - params.swipeCloseActiveAreaSide)) { return; }
17059 if (side === 'right') {
17060 if (touchesStart.x > ((app.width - $el[0].offsetWidth) + params.swipeCloseActiveAreaSide)) { return; }
17064 $viewEl = $(panel.getViewEl());
17067 isScrolling = undefined;
17069 touchStartTime = Utils.now();
17070 direction = undefined;
17072 function handleTouchMove(e) {
17073 if (!isTouched) { return; }
17075 if (touchMoves < 2) { return; }
17076 if (e.f7PreventSwipePanel || app.preventSwipePanelBySwipeBack || app.preventSwipePanel) {
17080 var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
17081 var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
17082 if (typeof isScrolling === 'undefined') {
17083 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
17090 if (pageX > touchesStart.x) {
17091 direction = 'to-right';
17093 direction = 'to-left';
17096 if (params.swipe === 'both') {
17097 if (params.swipeActiveArea > 0 && !panel.opened) {
17098 if (side === 'left' && touchesStart.x > params.swipeActiveArea) {
17102 if (side === 'right' && touchesStart.x < app.width - params.swipeActiveArea) {
17108 if ($el.hasClass('panel-visible-by-breakpoint')) {
17116 direction === 'to-left' && !$el.hasClass('panel-active')
17119 || (side === 'right'
17121 direction === 'to-right' && !$el.hasClass('panel-active')
17130 var threshold = panel.opened ? 0 : -params.swipeThreshold;
17131 if (side === 'right') { threshold = -threshold; }
17133 if (params.swipeNoFollow) {
17134 var touchesDiffNoFollow = (pageX - touchesStart.x);
17135 var timeDiff = (new Date()).getTime() - touchStartTime;
17137 if (!panel.opened && (
17138 (side === 'left' && touchesDiffNoFollow > -threshold)
17139 || (side === 'right' && -touchesDiffNoFollow > threshold)
17141 needToSwitch = true;
17143 if (panel.opened && (
17144 (side === 'left' && touchesDiffNoFollow < 0)
17145 || (side === 'right' && touchesDiffNoFollow > 0)
17147 needToSwitch = true;
17150 if (needToSwitch) {
17151 if (timeDiff < 300) {
17152 if (direction === 'to-left') {
17153 if (side === 'right') { app.panel.open(side); }
17154 if (side === 'left' && $el.hasClass('panel-active')) { app.panel.close(); }
17156 if (direction === 'to-right') {
17157 if (side === 'left') { app.panel.open(side); }
17158 if (side === 'right' && $el.hasClass('panel-active')) { app.panel.close(); }
17168 if (!panel.opened) {
17170 $backdropEl.show();
17171 $el.trigger('panel:swipeopen', panel);
17172 panel.emit('local::swipeOpen panelSwipeOpen', panel);
17174 panelWidth = $el[0].offsetWidth;
17180 e.preventDefault();
17182 touchesDiff = (pageX - touchesStart.x) + threshold;
17184 if (side === 'right') {
17185 if (effect === 'cover') {
17186 translate = touchesDiff + (panel.opened ? 0 : panelWidth);
17187 if (translate < 0) { translate = 0; }
17188 if (translate > panelWidth) {
17189 translate = panelWidth;
17192 translate = touchesDiff - (panel.opened ? panelWidth : 0);
17193 if (translate > 0) { translate = 0; }
17194 if (translate < -panelWidth) {
17195 translate = -panelWidth;
17199 translate = touchesDiff + (panel.opened ? panelWidth : 0);
17200 if (translate < 0) { translate = 0; }
17201 if (translate > panelWidth) {
17202 translate = panelWidth;
17205 if (effect === 'reveal') {
17206 $viewEl.transform(("translate3d(" + translate + "px
,0,0)")).transition(0);
17207 $backdropEl.transform(("translate3d(" + translate + "px
,0,0)")).transition(0);
17209 $el.trigger('panel:swipe', panel, Math.abs(translate / panelWidth));
17210 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
17212 if (side === 'left') { translate -= panelWidth; }
17213 $el.transform(("translate3d(" + translate + "px
,0,0)")).transition(0);
17215 $backdropEl.transition(0);
17216 backdropOpacity = 1 - Math.abs(translate / panelWidth);
17217 $backdropEl.css({ opacity: backdropOpacity });
17219 $el.trigger('panel:swipe', panel, Math.abs(translate / panelWidth));
17220 panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
17223 function handleTouchEnd() {
17224 if (!isTouched || !isMoved) {
17231 var timeDiff = (new Date()).getTime() - touchStartTime;
17233 var edge = (translate === 0 || Math.abs(translate) === panelWidth);
17235 var threshold = params.swipeThreshold || 0;
17237 if (!panel.opened) {
17238 if (Math.abs(touchesDiff) < threshold) {
17240 } else if (effect === 'cover') {
17241 if (translate === 0) {
17242 action = 'swap'; // open
17243 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
17244 action = 'swap'; // open
17245 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
17246 action = 'swap'; // open
17248 action = 'reset'; // close
17250 } else if (translate === 0) {
17253 (timeDiff < 300 && Math.abs(translate) > 0)
17254 || (timeDiff >= 300 && (Math.abs(translate) >= panelWidth / 2))
17260 } else if (effect === 'cover') {
17261 if (translate === 0) {
17262 action = 'reset'; // open
17263 } else if (timeDiff < 300 && Math.abs(translate) > 0) {
17264 action = 'swap'; // open
17265 } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
17266 action = 'reset'; // open
17268 action = 'swap'; // close
17270 } else if (translate === -panelWidth) {
17273 (timeDiff < 300 && Math.abs(translate) >= 0)
17274 || (timeDiff >= 300 && (Math.abs(translate) <= panelWidth / 2))
17276 if (side === 'left' && translate === panelWidth) { action = 'reset'; }
17277 else { action = 'swap'; }
17281 if (action === 'swap') {
17282 if (panel.opened) {
17283 panel.close(!edge);
17288 if (action === 'reset') {
17289 if (!panel.opened) {
17291 $el.css({ display: '' });
17293 var target = effect === 'reveal' ? $viewEl : $el;
17294 $('html').addClass('with-panel-transitioning');
17295 target.transitionEnd(function () {
17296 if ($el.hasClass('panel-active')) { return; }
17297 $el.css({ display: '' });
17298 $('html').removeClass('with-panel-transitioning');
17303 if (effect === 'reveal') {
17304 Utils.nextFrame(function () {
17305 $viewEl.transition('');
17306 $viewEl.transform('');
17309 $el.transition('').transform('');
17310 $backdropEl.css({ display: '' }).transform('').transition('').css('opacity', '');
17314 app.on('touchstart:passive', handleTouchStart);
17315 app.on('touchmove:active', handleTouchMove);
17316 app.on('touchend:passive', handleTouchEnd);
17317 panel.on('panelDestroy', function () {
17318 app.off('touchstart:passive', handleTouchStart);
17319 app.off('touchmove:active', handleTouchMove);
17320 app.off('touchend:passive', handleTouchEnd);
17324 var Panel = /*@__PURE__*/(function (Framework7Class$$1) {
17325 function Panel(app, params) {
17328 if ( params === void 0 ) params = {};
17329 Framework7Class$$1.call(this, params, [app]);
17332 var el = params.el;
17334 if (!el && params.content) {
17335 el = params.content;
17339 if ($el.length === 0) { return panel; }
17340 if ($el[0].f7Panel) { return $el[0].f7Panel; }
17342 $el[0].f7Panel = panel;
17344 var opened = params.opened;
17345 var side = params.side;
17346 var effect = params.effect;
17347 if (typeof opened === 'undefined') { opened = $el.hasClass('panel-active'); }
17348 if (typeof side === 'undefined') { side = $el.hasClass('panel-left') ? 'left' : 'right'; }
17349 if (typeof effect === 'undefined') { effect = $el.hasClass('panel-cover') ? 'cover' : 'reveal'; }
17351 if (!app.panel[side]) {
17352 Utils.extend(app.panel, ( obj = {}, obj[side] = panel, obj ));
17354 throw new Error(("Framework7
: Can
't create panel; app already has a " + side + " panel!"));
17357 var $backdropEl = $('.panel
-backdrop
');
17359 if ($backdropEl.length === 0) {
17360 $backdropEl = $('<div
class="panel-backdrop"></div
>');
17361 $backdropEl.insertBefore($el);
17364 Utils.extend(panel, {
17371 $backdropEl: $backdropEl,
17372 backdropEl: $backdropEl[0],
17376 panel.useModules();
17384 if ( Framework7Class$$1 ) Panel.__proto__ = Framework7Class$$1;
17385 Panel.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
17386 Panel.prototype.constructor = Panel;
17388 Panel.prototype.init = function init () {
17390 var app = panel.app;
17391 if (app.params.panel[((panel.side) + "Breakpoint")]) {
17392 panel.initBreakpoints();
17396 (app.params.panel.swipe === panel.side)
17397 || (app.params.panel.swipe === 'both
')
17398 || (app.params.panel.swipe && app.params.panel.swipe !== panel.side && app.params.panel.swipeCloseOpposite)
17400 panel.initSwipePanel();
17405 Panel.prototype.getViewEl = function getViewEl () {
17407 var app = panel.app;
17409 if (app.root.children('.views
').length > 0) {
17410 viewEl = app.root.children('.views
')[0];
17412 viewEl = app.root.children('.view
')[0];
17417 Panel.prototype.setBreakpoint = function setBreakpoint () {
17421 var app = panel.app;
17422 var side = panel.side;
17423 var $el = panel.$el;
17424 var $viewEl = $(panel.getViewEl());
17425 var breakpoint = app.params.panel[(side + "Breakpoint")];
17426 var wasVisible = $el.hasClass('panel
-visible
-by
-breakpoint
');
17428 if (app.width >= breakpoint) {
17430 $('html
').removeClass(("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel"));
17431 $el.css('display
', '').addClass('panel
-visible
-by
-breakpoint
').removeClass('panel
-active
');
17434 $viewEl.css(( obj = {}, obj[("margin-" + side)] = (($el.width()) + "px"), obj ));
17435 app.allowPanelOpen = true;
17436 app.emit('local
::breakpoint panelBreakpoint
');
17437 panel.$el.trigger('panel
:breakpoint
', panel);
17439 } else if (wasVisible) {
17440 $el.css('display
', '').removeClass('panel
-visible
-by
-breakpoint panel
-active
');
17443 $viewEl.css(( obj$1 = {}, obj$1[("margin-" + side)] = '', obj$1 ));
17444 app.emit('local
::breakpoint panelBreakpoint
');
17445 panel.$el.trigger('panel
:breakpoint
', panel);
17449 Panel.prototype.initBreakpoints = function initBreakpoints () {
17451 var app = panel.app;
17452 panel.resizeHandler = function resizeHandler() {
17453 panel.setBreakpoint();
17455 if (app.params.panel[((panel.side) + "Breakpoint")]) {
17456 app.on('resize
', panel.resizeHandler);
17458 panel.setBreakpoint();
17462 Panel.prototype.initSwipePanel = function initSwipePanel () {
17468 Panel.prototype.destroy = function destroy () {
17470 var app = panel.app;
17473 // Panel already destroyed
17477 panel.emit('local
::beforeDestroy panelBeforeDestroy
', panel);
17478 panel.$el.trigger('panel
:beforedestroy
', panel);
17480 if (panel.resizeHandler) {
17481 app.off('resize
', panel.resizeHandler);
17483 panel.$el.trigger('panel
:destroy
', panel);
17484 panel.emit('local
::destroy panelDestroy
');
17485 delete app.panel[panel.side];
17487 panel.el.f7Panel = null;
17488 delete panel.el.f7Panel;
17490 Utils.deleteProps(panel);
17494 Panel.prototype.open = function open (animate) {
17495 if ( animate === void 0 ) animate = true;
17498 var app = panel.app;
17499 if (!app.panel.allowOpen) { return false; }
17501 var side = panel.side;
17502 var effect = panel.effect;
17503 var $el = panel.$el;
17504 var $backdropEl = panel.$backdropEl;
17505 var opened = panel.opened;
17507 var $panelParentEl = $el.parent();
17508 var wasInDom = $el.parents(document).length > 0;
17510 if (!$panelParentEl.is(app.root) || $el.prevAll('.views
, .view
').length) {
17511 var $insertBeforeEl = app.root.children('.panel
, .views
, .view
').eq(0);
17512 var $insertAfterEl = app.root.children('.statusbar
').eq(0);
17514 if ($insertBeforeEl.length) {
17515 $el.insertBefore($insertBeforeEl);
17516 } else if ($insertAfterEl.length) {
17517 $el.insertAfter($insertBeforeEl);
17519 app.root.prepend($el);
17523 && $backdropEl.length
17526 !$backdropEl.parent().is(app.root)
17527 && $backdropEl.nextAll('.panel
').length === 0
17530 $backdropEl.parent().is(app.root)
17531 && $backdropEl.nextAll('.panel
').length === 0
17535 $backdropEl.insertBefore($el);
17538 panel.once('panelClosed
', function () {
17540 $panelParentEl.append($el);
17547 // Ignore if opened
17548 if (opened || $el.hasClass('panel
-visible
-by
-breakpoint
') || $el.hasClass('panel
-active
')) { return false; }
17550 // Close if some panel is opened
17551 app.panel.close(side === 'left
' ? 'right
' : 'left
', animate);
17553 app.panel.allowOpen = false;
17555 $el[animate ? 'removeClass
' : 'addClass
']('not
-animated
');
17557 .css({ display: 'block
' })
17558 .addClass('panel
-active
');
17560 $backdropEl[animate ? 'removeClass
' : 'addClass
']('not
-animated
');
17561 $backdropEl.show();
17563 /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
17564 panel._clientLeft = $el[0].clientLeft;
17566 $('html
').addClass(("with-panel with-panel-" + side + "-" + effect));
17570 var transitionEndTarget = effect === 'reveal
' ? $el.nextAll('.view
, .views
').eq(0) : $el;
17572 function panelTransitionEnd() {
17573 transitionEndTarget.transitionEnd(function (e) {
17574 if ($(e.target).is(transitionEndTarget)) {
17575 if ($el.hasClass('panel
-active
')) {
17577 $backdropEl.css({ display: '' });
17580 $backdropEl.css({ display: '' });
17582 } else { panelTransitionEnd(); }
17586 panelTransitionEnd();
17589 $backdropEl.css({ display: '' });
17595 Panel.prototype.close = function close (animate) {
17596 if ( animate === void 0 ) animate = true;
17599 var app = panel.app;
17601 var side = panel.side;
17602 var effect = panel.effect;
17603 var $el = panel.$el;
17604 var $backdropEl = panel.$backdropEl;
17605 var opened = panel.opened;
17607 if (!opened || $el.hasClass('panel
-visible
-by
-breakpoint
') || !$el.hasClass('panel
-active
')) { return false; }
17609 $el[animate ? 'removeClass
' : 'addClass
']('not
-animated
');
17610 $el.removeClass('panel
-active
');
17612 $backdropEl[animate ? 'removeClass
' : 'addClass
']('not
-animated
');
17614 var transitionEndTarget = effect === 'reveal
' ? $el.nextAll('.view
, .views
').eq(0) : $el;
17617 app.panel.allowOpen = false;
17620 transitionEndTarget.transitionEnd(function () {
17621 if ($el.hasClass('panel
-active
')) { return; }
17622 $el.css({ display: '' });
17623 $('html
').removeClass('with-panel
-transitioning
');
17627 .removeClass(("with-panel with-panel-" + side + "-" + effect))
17628 .addClass('with-panel
-transitioning
');
17630 $el.css({ display: '' });
17631 $el.removeClass('not
-animated
');
17632 $('html
').removeClass(("with-panel with-panel-transitioning with-panel-" + side + "-" + effect));
17638 Panel.prototype.onOpen = function onOpen () {
17640 panel.opened = true;
17641 panel.$el.trigger('panel
:open
', panel);
17642 panel.emit('local
::open panelOpen
', panel);
17645 Panel.prototype.onOpened = function onOpened () {
17647 var app = panel.app;
17648 app.panel.allowOpen = true;
17650 panel.$el.trigger('panel
:opened
', panel);
17651 panel.emit('local
::opened panelOpened
', panel);
17654 Panel.prototype.onClose = function onClose () {
17656 panel.opened = false;
17657 panel.$el.addClass('panel
-closing
');
17658 panel.$el.trigger('panel
:close
', panel);
17659 panel.emit('local
::close panelClose
', panel);
17662 Panel.prototype.onClosed = function onClosed () {
17664 var app = panel.app;
17665 app.panel.allowOpen = true;
17666 panel.$el.removeClass('panel
-closing
');
17667 panel.$el.trigger('panel
:closed
', panel);
17668 panel.emit('local
::closed panelClosed
', panel);
17672 }(Framework7Class));
17679 rightBreakpoint: 0,
17680 swipe: undefined, // or 'left
' or 'right
' or 'both
'
17681 swipeActiveArea: 0,
17682 swipeCloseActiveAreaSide: 0,
17683 swipeCloseOpposite: true,
17684 swipeOnlyClose: false,
17685 swipeNoFollow: false,
17687 closeByBackdropClick: true,
17698 create: function create() {
17700 Utils.extend(app.panel, {
17701 disableSwipe: function disableSwipe(panel) {
17702 if ( panel === void 0 ) panel = 'both
';
17706 if (typeof panel === 'string
') {
17707 if (panel === 'both
') {
17709 panels = [app.panel.left, app.panel.right];
17712 panels.push(app.panel[side]);
17717 panels.forEach(function (panelInstance) {
17718 if (panelInstance) { Utils.extend(panelInstance, { swipeable: false }); }
17721 enableSwipe: function enableSwipe(panel) {
17722 if ( panel === void 0 ) panel = 'both
';
17726 if (typeof panel === 'string
') {
17729 (app.params.panel.swipe === 'left
' && side === 'right
')
17730 || (app.params.panel.swipe === 'right
' && side === 'left
')
17734 app.params.panel.swipe = side;
17735 panels = [app.panel.left, app.panel.right];
17737 app.params.panel.swipe = side;
17738 panels.push(app.panel[side]);
17740 } else if (panel) {
17741 panels.push(panel);
17743 if (panels.length) {
17744 panels.forEach(function (panelInstance) {
17745 if (!panelInstance) { return; }
17746 if (!panelInstance.swipeInitialized) {
17747 panelInstance.initSwipePanel();
17749 Utils.extend(panelInstance, { swipeable: true });
17754 create: function create(params) {
17755 return new Panel(app, params);
17757 open: function open(side, animate) {
17758 var panelSide = side;
17760 if ($('.panel
').length > 1) {
17763 panelSide = $('.panel
').hasClass('panel
-left
') ? 'left
' : 'right
';
17765 if (!panelSide) { return false; }
17766 if (app.panel[panelSide]) {
17767 return app.panel[panelSide].open(animate);
17769 var $panelEl = $((".panel-" + panelSide));
17770 if ($panelEl.length > 0) {
17771 return app.panel.create({ el: $panelEl }).open(animate);
17775 close: function close(side, animate) {
17780 $panelEl = $((".panel-" + panelSide));
17782 $panelEl = $('.panel
.panel
-active
');
17783 panelSide = $panelEl.hasClass('panel
-left
') ? 'left
' : 'right
';
17785 if (!panelSide) { return false; }
17786 if (app.panel[panelSide]) {
17787 return app.panel[panelSide].close(animate);
17789 if ($panelEl.length > 0) {
17790 return app.panel.create({ el: $panelEl }).close(animate);
17794 get: function get(side) {
17795 var panelSide = side;
17797 if ($('.panel
').length > 1) {
17800 panelSide = $('.panel
').hasClass('panel
-left
') ? 'left
' : 'right
';
17802 if (!panelSide) { return undefined; }
17803 if (app.panel[panelSide]) {
17804 return app.panel[panelSide];
17806 var $panelEl = $((".panel-" + panelSide));
17807 if ($panelEl.length > 0) {
17808 return app.panel.create({ el: $panelEl });
17815 init: function init() {
17819 $('.panel
').each(function (index, panelEl) {
17820 var side = $(panelEl).hasClass('panel
-left
') ? 'left
' : 'right
';
17821 app.panel[side] = app.panel.create({ el: panelEl, side: side });
17826 '.panel
-open
': function open(clickedEl, data) {
17827 if ( data === void 0 ) data = {};
17831 if (data.panel === 'right
' || ($('.panel
').length === 1 && $('.panel
').hasClass('panel
-right
'))) {
17834 app.panel.open(side, data.animate);
17836 '.panel
-close
': function close(clickedEl, data) {
17837 if ( data === void 0 ) data = {};
17840 var side = data.panel;
17841 app.panel.close(side, data.animate);
17843 '.panel
-backdrop
': function close() {
17845 var $panelEl = $('.panel
-active
');
17846 var instance = $panelEl[0] && $panelEl[0].f7Panel;
17847 $panelEl.trigger('panel
:backdrop
-click
');
17849 instance.emit('backdropClick
', instance);
17851 app.emit('panelBackdropClick
', instance || $panelEl[0]);
17852 if (app.params.panel.closeByBackdropClick) { app.panel.close(); }
17857 var CardExpandable = {
17858 open: function open(cardEl, animate) {
17861 if ( cardEl === void 0 ) cardEl = '.card
-expandable
';
17862 if ( animate === void 0 ) animate = true;
17864 if ($('.card
-opened
').length) { return; }
17865 var $cardEl = $(cardEl).eq(0);
17867 if (!$cardEl || !$cardEl.length) { return; }
17868 if ($cardEl.hasClass('card
-opened
') || $cardEl.hasClass('card
-opening
') || $cardEl.hasClass('card
-closing
')) { return; }
17870 var $pageEl = $cardEl.parents('.page
').eq(0);
17871 if (!$pageEl.length) { return; }
17875 function prevent() {
17879 $cardEl.trigger('card
:beforeopen
', { prevent: prevent });
17880 app.emit('cardBeforeOpen
', $cardEl[0], prevent);
17882 if (prevented) { return; }
17885 if (app.params.card.backrop) {
17886 $backropEl = $cardEl.parents('.page
-content
').find('.card
-backdrop
');
17887 if (!$backropEl.length) {
17888 $backropEl = $('<div
class="card-backdrop"></div
>');
17889 $cardEl.parents('.page
-content
').append($backropEl);
17895 if (app.params.card.hideNavbarOnOpen) {
17896 $navbarEl = $pageEl.children('.navbar
');
17897 if (!$navbarEl.length) {
17898 if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
17901 if (app.params.card.hideToolbarOnOpen) {
17902 $toolbarEl = $pageEl.children('.toolbar
');
17903 if (!$toolbarEl.length) {
17904 $toolbarEl = $pageEl.parents('.view
').children('.toolbar
');
17906 if (!$toolbarEl.length) {
17907 $toolbarEl = $pageEl.parents('.views
').children('.toolbar
');
17911 var currTransform = $cardEl.css('transform
');
17913 if (currTransform && currTransform.match(/[2-9]/)) {
17914 hasTransform = true;
17916 var $cardContentEl = $cardEl.children('.card
-content
');
17918 var $cardSizeEl = $(document.createElement('div
')).addClass('card
-expandable
-size
');
17919 $cardEl.append($cardSizeEl);
17921 var cardWidth = $cardEl[0].offsetWidth;
17922 var cardHeight = $cardEl[0].offsetHeight;
17923 var pageWidth = $pageEl[0].offsetWidth;
17924 var pageHeight = $pageEl[0].offsetHeight;
17926 var maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
17927 var maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
17929 var scaleX = maxWidth / cardWidth;
17930 var scaleY = maxHeight / cardHeight;
17932 var offset = $cardEl.offset();
17934 var cardLeftOffset;
17937 if (hasTransform) {
17938 cardLeftOffset = $cardEl[0].offsetLeft;
17939 cardTopOffset = $cardEl[0].offsetTop - $cardEl.parents('.page
-content
')[0].scrollTop;
17941 cardLeftOffset = offset.left;
17942 cardTopOffset = offset.top - $pageEl.offset().top;
17943 if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
17946 cardLeftOffset -= (pageWidth - maxWidth) / 2;
17947 cardTopOffset -= (pageHeight - maxHeight) / 2;
17949 var cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
17951 (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
17953 var cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
17954 var translateX = (cardRightOffset - cardLeftOffset) / 2;
17955 var translateY = (cardBottomOffset - cardTopOffset) / 2;
17956 if (app.params.card.hideNavbarOnOpen && $navbarEl && $navbarEl.length) {
17957 app.navbar.hide($navbarEl, animate);
17959 if (app.params.card.hideToolbarOnOpen && $toolbarEl && $toolbarEl.length) {
17960 app.toolbar.hide($toolbarEl, animate);
17963 $backropEl.removeClass('card
-backdrop
-out
').addClass('card
-backdrop
-in');
17965 $cardEl.removeClass('card
-transitioning
');
17967 $cardEl.addClass('card
-opening
');
17969 $cardEl.trigger('card
:open
');
17970 app.emit('cardOpen
', $cardEl[0]);
17971 function transitionEnd() {
17972 $cardEl.addClass('card
-opened
');
17973 $cardEl.removeClass('card
-opening
');
17974 $cardEl.trigger('card
:opened
');
17975 app.emit('cardOpened
', $cardEl[0]);
17979 width: (maxWidth + "px"),
17980 height: (maxHeight + "px"),
17982 .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
17985 .transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
17987 $cardEl.transitionEnd(function () {
17994 $pageEl.addClass('page
-with-card
-opened
');
17996 function onResize() {
17999 $cardEl.removeClass('card
-transitioning
');
18000 cardWidth = $cardEl[0].offsetWidth;
18001 cardHeight = $cardEl[0].offsetHeight;
18002 pageWidth = $pageEl[0].offsetWidth;
18003 pageHeight = $pageEl[0].offsetHeight;
18004 maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
18005 maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
18007 scaleX = maxWidth / cardWidth;
18008 scaleY = maxHeight / cardHeight;
18010 $cardEl.transform('translate3d(0px
, 0px
, 0) scale(1)');
18011 offset = $cardEl.offset();
18013 cardLeftOffset = offset.left - (pageWidth - maxWidth) / 2;
18014 if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
18015 cardTopOffset = offset.top - (pageHeight - maxHeight) / 2;
18017 cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
18018 cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
18020 (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
18022 translateX = (cardRightOffset - cardLeftOffset) / 2;
18023 translateY = (cardBottomOffset - cardTopOffset) / 2;
18025 $cardEl.transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
18028 width: (maxWidth + "px"),
18029 height: (maxHeight + "px"),
18031 .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
18045 function onTouchStart(e) {
18046 if (!$(e.target).closest($cardEl).length) { return; }
18047 if (!$cardEl.hasClass('card
-opened
')) { return; }
18048 cardScrollTop = $cardContentEl.scrollTop();
18050 touchStartX = e.targetTouches[0].pageX;
18051 touchStartY = e.targetTouches[0].pageY;
18052 isScrolling = undefined;
18056 function onTouchMove(e) {
18057 if (!isTouched) { return; }
18058 touchEndX = e.targetTouches[0].pageX;
18059 touchEndY = e.targetTouches[0].pageY;
18060 if (typeof isScrolling === 'undefined') {
18061 isScrolling = !!(isScrolling || Math.abs(touchEndY - touchStartY) > Math.abs(touchEndX - touchStartX));
18063 if (!isH && !isV) {
18064 if (!isScrolling && e.targetTouches[0].clientX <= 50) {
18071 if (!(isH || isV) || (isV && cardScrollTop !== 0)) {
18077 $cardEl.removeClass('card
-transitioning
');
18081 progress = isV ? Math.max((touchEndY - touchStartY) / 150, 0) : Math.max((touchEndX - touchStartX) / (cardWidth / 2), 0);
18082 if ((progress > 0 && isV) || isH) {
18083 if (isV && app.device.ios) {
18084 $cardContentEl.css('-webkit
-overflow
-scrolling
', 'auto
');
18085 $cardContentEl.scrollTop(0);
18087 e.preventDefault();
18090 if (progress > 1) { progress = Math.pow( progress, 0.3 ); }
18091 if (progress > (isV ? 1.3 : 1.1)) {
18094 app.card.close($cardEl);
18096 $cardEl.transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + (scaleX * (1 - progress * 0.2)) + ", " + (scaleY * (1 - progress * 0.2)) + ")"));
18099 function onTouchEnd() {
18100 if (!isTouched || !isMoved) { return; }
18103 if (app.device.ios) {
18104 $cardContentEl.css('-webkit
-overflow
-scrolling
', '');
18106 if (progress >= 0.8) {
18107 app.card.close($cardEl);
18110 .addClass('card
-transitioning
')
18111 .transform(("translate3d(" + translateX + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
18115 $cardEl[0].detachEventHandlers = function detachEventHandlers() {
18116 app.off('resize
', onResize);
18117 if (Support.touch && app.params.card.swipeToClose) {
18118 app.off('touchstart
:passive
', onTouchStart);
18119 app.off('touchmove
:active
', onTouchMove);
18120 app.off('touchend
:passive
', onTouchEnd);
18124 app.on('resize
', onResize);
18125 if (Support.touch && app.params.card.swipeToClose) {
18126 app.on('touchstart
:passive
', onTouchStart);
18127 app.on('touchmove
:active
', onTouchMove);
18128 app.on('touchend
:passive
', onTouchEnd);
18131 close: function close(cardEl, animate) {
18132 if ( cardEl === void 0 ) cardEl = '.card
-expandable
.card
-opened
';
18133 if ( animate === void 0 ) animate = true;
18136 var $cardEl = $(cardEl).eq(0);
18137 if (!$cardEl || !$cardEl.length) { return; }
18138 if (!$cardEl.hasClass('card
-opened
') || $cardEl.hasClass('card
-opening
') || $cardEl.hasClass('card
-closing
')) { return; }
18140 var $cardContentEl = $cardEl.children('.card
-content
');
18142 var $pageEl = $cardEl.parents('.page
').eq(0);
18143 if (!$pageEl.length) { return; }
18148 if (app.params.card.backrop) {
18149 $backropEl = $cardEl.parents('.page
-content
').find('.card
-backdrop
');
18152 if (app.params.card.hideNavbarOnOpen) {
18153 $navbarEl = $pageEl.children('.navbar
');
18154 if (!$navbarEl.length) {
18155 if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
18157 if ($navbarEl && $navbarEl.length) {
18158 app.navbar.show($navbarEl, animate);
18161 if (app.params.card.hideToolbarOnOpen) {
18162 $toolbarEl = $pageEl.children('.toolbar
');
18163 if (!$toolbarEl.length) {
18164 $toolbarEl = $pageEl.parents('.view
').children('.toolbar
');
18166 if (!$toolbarEl.length) {
18167 $toolbarEl = $pageEl.parents('.views
').children('.toolbar
');
18169 if ($toolbarEl && $toolbarEl.length) {
18170 app.toolbar.show($toolbarEl, animate);
18173 $pageEl.removeClass('page
-with-card
-opened
');
18176 if ($backropEl && $backropEl.length) {
18177 $backropEl.removeClass('card
-backdrop
-in').addClass('card
-backdrop
-out
');
18180 $cardEl.removeClass('card
-opened card
-transitioning
');
18182 $cardEl.addClass('card
-closing
');
18184 $cardEl.addClass('card
-no
-transition
');
18186 $cardEl.transform('');
18187 $cardEl.trigger('card
:close
');
18188 app.emit('cardClose
', $cardEl[0]);
18190 function transitionEnd() {
18191 $cardEl.removeClass('card
-closing card
-no
-transition
');
18192 $cardEl.trigger('card
:closed
');
18193 $cardEl.find('.card
-expandable
-size
').remove();
18194 app.emit('cardClosed
', $cardEl[0]);
18202 .scrollTop(0, animate ? 300 : 0);
18204 $cardContentEl.transitionEnd(function () {
18211 if ($cardEl[0].detachEventHandlers) {
18212 $cardEl[0].detachEventHandlers();
18213 delete $cardEl[0].detachEventHandlers;
18216 toggle: function toggle(cardEl, animate) {
18217 if ( cardEl === void 0 ) cardEl = '.card
-expandable
';
18220 var $cardEl = $(cardEl).eq(0);
18221 if (!$cardEl.length) { return; }
18222 if ($cardEl.hasClass('card
-opened
')) {
18223 app.card.close($cardEl, animate);
18225 app.card.open($cardEl, animate);
18234 hideNavbarOnOpen: true,
18235 hideToolbarOnOpen: true,
18236 swipeToClose: true,
18237 closeByBackdropClick: true,
18241 create: function create() {
18243 Utils.extend(app, {
18245 open: CardExpandable.open.bind(app),
18246 close: CardExpandable.close.bind(app),
18247 toggle: CardExpandable.toggle.bind(app),
18252 '.card
-close
': function closeCard($clickedEl, data) {
18254 app.card.close(data.card);
18256 '.card
-open
': function closeCard($clickedEl, data) {
18258 app.card.open(data.card);
18260 '.card
-expandable
': function toggleExpandableCard($clickedEl, data, e) {
18262 if ($clickedEl.hasClass('card
-opened
') || $clickedEl.hasClass('card
-opening
') || $clickedEl.hasClass('card
-closing
')) { return; }
18263 if ($(e.target).closest('.card
-prevent
-open
').length) { return; }
18264 app.card.open($clickedEl);
18266 '.card
-backdrop
-in': function onBackdropClick() {
18268 var needToClose = false;
18269 if (app.params.card.closeByBackdropClick) { needToClose = true; }
18270 var $openedCardEl = $('.card
-opened
');
18271 if (!$openedCardEl.length) { return; }
18272 if ($openedCardEl.attr('data
-close
-on
-backdrop
-click
') === 'true') {
18273 needToClose = true;
18274 } else if ($openedCardEl.attr('data
-close
-on
-backdrop
-click
') === 'false') {
18275 needToClose = false;
18277 if (needToClose) { app.card.close($openedCardEl); }
18288 store: function store(form, data) {
18292 var $formEl = $(form);
18293 if ($formEl.length && $formEl.is('form
') && $formEl.attr('id
')) {
18294 formId = $formEl.attr('id
');
18296 // Store form data in app.formsData
18297 app.form.data[("form-" + formId)] = data;
18299 // Store form data in local storage also
18301 win.localStorage[("f7form-" + formId)] = JSON.stringify(data);
18306 get: function get(form) {
18310 var $formEl = $(form);
18311 if ($formEl.length && $formEl.is('form
') && $formEl.attr('id
')) {
18312 formId = $formEl.attr('id
');
18316 if (win.localStorage[("f7form-" + formId)]) {
18317 return JSON.parse(win.localStorage[("f7form-" + formId)]);
18322 if (app.form.data[("form-" + formId)]) {
18323 return app.form.data[("form-" + formId)];
18327 remove: function remove(form) {
18331 var $formEl = $(form);
18332 if ($formEl.length && $formEl.is('form
') && $formEl.attr('id
')) {
18333 formId = $formEl.attr('id
');
18336 // Delete form data from app.formsData
18337 if (app.form.data[("form-" + formId)]) {
18338 app.form.data[("form-" + formId)] = '';
18339 delete app.form.data[("form-" + formId)];
18342 // Delete form data from local storage also
18344 if (win.localStorage[("f7form-" + formId)]) {
18345 win.localStorage[("f7form-" + formId)] = '';
18346 win.localStorage.removeItem(("f7form-" + formId));
18355 var FormStorage = {
18356 init: function init(formEl) {
18358 var $formEl = $(formEl);
18359 var formId = $formEl.attr('id
');
18360 if (!formId) { return; }
18361 var initialData = app.form.getFormData(formId);
18363 app.form.fillFromData($formEl, initialData);
18366 var data = app.form.convertToData($formEl);
18367 if (!data) { return; }
18368 app.form.storeFormData(formId, data);
18369 $formEl.trigger('form
:storedata
', data);
18370 app.emit('formStoreData
', $formEl[0], data);
18372 $formEl.on('change submit
', store);
18374 destroy: function destroy(formEl) {
18375 var $formEl = $(formEl);
18376 $formEl.off('change submit
');
18380 // Form To/From Data
18381 function formToData(formEl) {
18383 var $formEl = $(formEl).eq(0);
18384 if ($formEl.length === 0) { return undefined; }
18389 // Skip input types
18390 var skipTypes = ['submit
', 'image
', 'button
', 'file
'];
18391 var skipNames = [];
18392 $formEl.find('input
, select
, textarea
').each(function (inputIndex, inputEl) {
18393 var $inputEl = $(inputEl);
18394 if ($inputEl.hasClass('ignore
-store
-data
') || $inputEl.hasClass('no
-store
-data
')) {
18397 var name = $inputEl.attr('name
');
18398 var type = $inputEl.attr('type
');
18399 var tag = inputEl.nodeName.toLowerCase();
18400 if (skipTypes.indexOf(type) >= 0) { return; }
18401 if (skipNames.indexOf(name) >= 0 || !name) { return; }
18402 if (tag === 'select
' && $inputEl.prop('multiple
')) {
18403 skipNames.push(name);
18405 $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
18406 if (el.selected) { data[name].push(el.value); }
18411 skipNames.push(name);
18413 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18414 if (el.checked) { data[name].push(el.value); }
18418 skipNames.push(name);
18419 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18420 if (el.checked) { data[name] = el.value; }
18424 data[name] = $inputEl.val();
18429 $formEl.trigger('form
:todata
', data);
18430 app.emit('formToData
', $formEl[0], data);
18434 function formFromData(formEl, formData) {
18436 var $formEl = $(formEl).eq(0);
18437 if (!$formEl.length) { return; }
18439 var data = formData;
18440 var formId = $formEl.attr('id
');
18442 if (!data && formId) {
18443 data = app.form.getFormData(formId);
18446 if (!data) { return; }
18448 // Skip input types
18449 var skipTypes = ['submit
', 'image
', 'button
', 'file
'];
18450 var skipNames = [];
18452 $formEl.find('input
, select
, textarea
').each(function (inputIndex, inputEl) {
18453 var $inputEl = $(inputEl);
18454 if ($inputEl.hasClass('ignore
-store
-data
') || $inputEl.hasClass('no
-store
-data
')) {
18457 var name = $inputEl.attr('name
');
18458 var type = $inputEl.attr('type
');
18459 var tag = inputEl.nodeName.toLowerCase();
18460 if (typeof data[name] === 'undefined' || data[name] === null) { return; }
18461 if (skipTypes.indexOf(type) >= 0) { return; }
18462 if (skipNames.indexOf(name) >= 0 || !name) { return; }
18463 if (tag === 'select
' && $inputEl.prop('multiple
')) {
18464 skipNames.push(name);
18465 $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
18467 if (data[name].indexOf(el.value) >= 0) { selectEl.selected = true; }
18468 else { selectEl.selected = false; }
18473 skipNames.push(name);
18474 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18475 var checkboxEl = el;
18476 if (data[name].indexOf(el.value) >= 0) { checkboxEl.checked = true; }
18477 else { checkboxEl.checked = false; }
18481 skipNames.push(name);
18482 $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
18484 if (data[name] === el.value) { radioEl.checked = true; }
18485 else { radioEl.checked = false; }
18489 $inputEl.val(data[name]);
18493 if (tag === 'select
' || tag === 'input
' || tag === 'textarea
') {
18494 $inputEl.trigger('change
', 'fromdata
');
18497 $formEl.trigger('form
:fromdata
', data);
18498 app.emit('formFromData
', $formEl[0], data);
18501 function initAjaxForm() {
18504 function onSubmitChange(e, fromData) {
18505 var $formEl = $(this);
18506 if (e.type === 'change
' && !$formEl.hasClass('form
-ajax
-submit
-onchange
')) { return; }
18507 if (e.type === 'submit
') { e.preventDefault(); }
18509 if (e.type === 'change
' && fromData === 'fromdata
') { return; }
18511 var method = ($formEl.attr('method
') || 'GET
').toUpperCase();
18512 var contentType = $formEl.prop('enctype
') || $formEl.attr('enctype
');
18514 var url = $formEl.attr('action
');
18515 if (!url) { return; }
18518 if (method === 'POST
') {
18519 if (contentType === 'application
/x
-www
-form
-urlencoded
') {
18520 data = app.form.convertToData($formEl[0]);
18522 data = new win.FormData($formEl[0]);
18525 data = Utils.serializeObject(app.form.convertToData($formEl[0]));
18531 contentType: contentType,
18533 beforeSend: function beforeSend(xhr) {
18534 $formEl.trigger('formajax
:beforesend
', data, xhr);
18535 app.emit('formAjaxBeforeSend
', $formEl[0], data, xhr);
18537 error: function error(xhr) {
18538 $formEl.trigger('formajax
:error
', data, xhr);
18539 app.emit('formAjaxError
', $formEl[0], data, xhr);
18541 complete: function complete(xhr) {
18542 $formEl.trigger('formajax
:complete
', data, xhr);
18543 app.emit('formAjaxComplete
', $formEl[0], data, xhr);
18545 success: function success(response, status, xhr) {
18546 $formEl.trigger('formajax
:success
', data, xhr);
18547 app.emit('formAjaxSuccess
', $formEl[0], data, xhr);
18551 $(doc).on('submit change
', 'form
.form
-ajax
-submit
, form
.form
-ajax
-submit
-onchange
', onSubmitChange);
18556 create: function create() {
18558 Utils.extend(app, {
18561 storeFormData: FormData$1.store.bind(app),
18562 getFormData: FormData$1.get.bind(app),
18563 removeFormData: FormData$1.remove.bind(app),
18564 convertToData: formToData.bind(app),
18565 fillFromData: formFromData.bind(app),
18567 init: FormStorage.init.bind(app),
18568 destroy: FormStorage.destroy.bind(app),
18574 init: function init() {
18576 initAjaxForm.call(app);
18578 tabBeforeRemove: function tabBeforeRemove(tabEl) {
18580 $(tabEl).find('.form
-store
-data
').each(function (index, formEl) {
18581 app.form.storage.destroy(formEl);
18584 tabMounted: function tabMounted(tabEl) {
18586 $(tabEl).find('.form
-store
-data
').each(function (index, formEl) {
18587 app.form.storage.init(formEl);
18590 pageBeforeRemove: function pageBeforeRemove(page) {
18592 page.$el.find('.form
-store
-data
').each(function (index, formEl) {
18593 app.form.storage.destroy(formEl);
18596 pageInit: function pageInit(page) {
18598 page.$el.find('.form
-store
-data
').each(function (index, formEl) {
18599 app.form.storage.init(formEl);
18606 ignoreTypes: ['checkbox
', 'button
', 'submit
', 'range
', 'radio
', 'image
'],
18607 createTextareaResizableShadow: function createTextareaResizableShadow() {
18608 var $shadowEl = $(doc.createElement('textarea
'));
18609 $shadowEl.addClass('textarea
-resizable
-shadow
');
18614 Input.textareaResizableShadow = $shadowEl;
18616 textareaResizableShadow: undefined,
18617 resizeTextarea: function resizeTextarea(textareaEl) {
18619 var $textareaEl = $(textareaEl);
18620 if (!Input.textareaResizableShadow) {
18621 Input.createTextareaResizableShadow();
18623 var $shadowEl = Input.textareaResizableShadow;
18624 if (!$textareaEl.length) { return; }
18625 if (!$textareaEl.hasClass('resizable
')) { return; }
18626 if (Input.textareaResizableShadow.parents().length === 0) {
18627 app.root.append($shadowEl);
18630 var styles = win.getComputedStyle($textareaEl[0]);
18631 ('padding
-top padding
-bottom padding
-left padding
-right margin
-left margin
-right margin
-top margin
-bottom width font
-size font
-family font
-style font
-weight line
-height font
-variant text
-transform letter
-spacing border box
-sizing display
').split(' ').forEach(function (style) {
18632 var styleValue = styles[style];
18633 if (('font
-size line
-height letter
-spacing width
').split(' ').indexOf(style) >= 0) {
18634 styleValue = styleValue.replace(',', '.');
18636 $shadowEl.css(style, styleValue);
18638 var currentHeight = $textareaEl[0].clientHeight;
18641 var initialHeight = $shadowEl[0].scrollHeight;
18643 $shadowEl.val($textareaEl.val());
18644 $shadowEl.css('height
', 0);
18645 var scrollHeight = $shadowEl[0].scrollHeight;
18647 if (currentHeight !== scrollHeight) {
18648 if (scrollHeight > initialHeight) {
18649 $textareaEl.css('height
', (scrollHeight + "px"));
18650 $textareaEl.trigger('textarea
:resize
', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
18651 } else if (scrollHeight < currentHeight) {
18652 $textareaEl.css('height
', '');
18653 $textareaEl.trigger('textarea
:resize
', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
18657 validate: function validate(inputEl) {
18658 var $inputEl = $(inputEl);
18659 if (!$inputEl.length) { return; }
18660 var $itemInputEl = $inputEl.parents('.item
-input
');
18661 var $inputWrapEl = $inputEl.parents('.input
');
18662 var validity = $inputEl[0].validity;
18663 var validationMessage = $inputEl.dataset().errorMessage || $inputEl[0].validationMessage || '';
18664 if (!validity) { return; }
18665 if (!validity.valid) {
18666 var $errorEl = $inputEl.nextAll('.item
-input
-error
-message
, .input
-error
-message
');
18667 if (validationMessage) {
18668 if ($errorEl.length === 0) {
18669 $errorEl = $(("<div class=\"" + ($inputWrapEl.length ? 'input
-error
-message
' : 'item
-input
-error
-message
') + "\"></div>"));
18670 $errorEl.insertAfter($inputEl);
18672 $errorEl.text(validationMessage);
18674 if ($errorEl.length > 0) {
18675 $itemInputEl.addClass('item
-input
-with-error
-message
');
18676 $inputWrapEl.addClass('input
-with-eror
-message
');
18678 $itemInputEl.addClass('item
-input
-invalid
');
18679 $inputWrapEl.addClass('input
-invalid
');
18680 $inputEl.addClass('input
-invalid
');
18682 $itemInputEl.removeClass('item
-input
-invalid item
-input
-with-error
-message
');
18683 $inputWrapEl.removeClass('input
-invalid input
-with-error
-message
');
18684 $inputEl.removeClass('input
-invalid
');
18687 validateInputs: function validateInputs(el) {
18689 $(el).find('input
, textarea
, select
').each(function (index, inputEl) {
18690 app.input.validate(inputEl);
18693 focus: function focus(inputEl) {
18694 var $inputEl = $(inputEl);
18695 var type = $inputEl.attr('type
');
18696 if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
18697 $inputEl.parents('.item
-input
').addClass('item
-input
-focused
');
18698 $inputEl.parents('.input
').addClass('input
-focused
');
18699 $inputEl.addClass('input
-focused
');
18701 blur: function blur(inputEl) {
18702 var $inputEl = $(inputEl);
18703 $inputEl.parents('.item
-input
').removeClass('item
-input
-focused
');
18704 $inputEl.parents('.input
').removeClass('input
-focused
');
18705 $inputEl.removeClass('input
-focused
');
18707 checkEmptyState: function checkEmptyState(inputEl) {
18708 var $inputEl = $(inputEl);
18709 if (!$inputEl.is('input
, select
, textarea
')) {
18710 $inputEl = $inputEl.find('input
, select
, textarea
').eq(0);
18712 if (!$inputEl.length) { return; }
18714 var value = $inputEl.val();
18715 var $itemInputEl = $inputEl.parents('.item
-input
');
18716 var $inputWrapEl = $inputEl.parents('.input
');
18717 if ((value && (typeof value === 'string
' && value.trim() !== '')) || (Array.isArray(value) && value.length > 0)) {
18718 $itemInputEl.addClass('item
-input
-with-value
');
18719 $inputWrapEl.addClass('input
-with-value
');
18720 $inputEl.addClass('input
-with-value
');
18721 $inputEl.trigger('input
:notempty
');
18723 $itemInputEl.removeClass('item
-input
-with-value
');
18724 $inputWrapEl.removeClass('input
-with-value
');
18725 $inputEl.removeClass('input
-with-value
');
18726 $inputEl.trigger('input
:empty
');
18729 scrollIntoView: function scrollIntoView(inputEl, duration, centered, force) {
18730 if ( duration === void 0 ) duration = 0;
18732 var $inputEl = $(inputEl);
18733 var $scrollableEl = $inputEl.parents('.page
-content
, .panel
').eq(0);
18734 if (!$scrollableEl.length) {
18737 var contentHeight = $scrollableEl[0].offsetHeight;
18738 var contentScrollTop = $scrollableEl[0].scrollTop;
18739 var contentPaddingTop = parseInt($scrollableEl.css('padding
-top
'), 10);
18740 var contentPaddingBottom = parseInt($scrollableEl.css('padding
-bottom
'), 10);
18741 var contentOffsetTop = $scrollableEl.offset().top - contentScrollTop;
18743 var inputOffsetTop = $inputEl.offset().top - contentOffsetTop;
18744 var inputHeight = $inputEl[0].offsetHeight;
18746 var min = (inputOffsetTop + contentScrollTop) - contentPaddingTop;
18747 var max = ((inputOffsetTop + contentScrollTop) - contentHeight) + contentPaddingBottom + inputHeight;
18748 var centeredPosition = min + ((max - min) / 2);
18750 if (contentScrollTop > min) {
18751 $scrollableEl.scrollTop(centered ? centeredPosition : min, duration);
18754 if (contentScrollTop < max) {
18755 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
18759 $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
18763 init: function init() {
18765 Input.createTextareaResizableShadow();
18766 function onFocus() {
18767 var inputEl = this;
18768 if (app.params.input.scrollIntoViewOnFocus) {
18769 if (Device.android) {
18770 $(win).once('resize
', function () {
18771 if (doc && doc.activeElement === inputEl) {
18772 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
18776 app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
18779 app.input.focus(inputEl);
18781 function onBlur() {
18782 var $inputEl = $(this);
18783 var tag = $inputEl[0].nodeName.toLowerCase();
18784 app.input.blur($inputEl);
18785 if ($inputEl.dataset().validate || $inputEl.attr('validate
') !== null || $inputEl.attr('data
-validate
-on
-blur
') !== null) {
18786 app.input.validate($inputEl);
18789 if (tag === 'textarea
' && $inputEl.hasClass('resizable
')) {
18790 if (Input.textareaResizableShadow) { Input.textareaResizableShadow.remove(); }
18793 function onChange() {
18794 var $inputEl = $(this);
18795 var type = $inputEl.attr('type
');
18796 var tag = $inputEl[0].nodeName.toLowerCase();
18797 if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
18799 // Check Empty State
18800 app.input.checkEmptyState($inputEl);
18802 // Check validation
18803 if ($inputEl.attr('data
-validate
-on
-blur
') === null && ($inputEl.dataset().validate || $inputEl.attr('validate
') !== null)) {
18804 app.input.validate($inputEl);
18808 if (tag === 'textarea
' && $inputEl.hasClass('resizable
')) {
18809 app.input.resizeTextarea($inputEl);
18812 function onInvalid(e) {
18813 var $inputEl = $(this);
18814 if ($inputEl.attr('data
-validate
-on
-blur
') === null && ($inputEl.dataset().validate || $inputEl.attr('validate
') !== null)) {
18815 e.preventDefault();
18816 app.input.validate($inputEl);
18819 function clearInput() {
18820 var $clicked = $(this);
18821 var $inputEl = $clicked.siblings('input
, textarea
').eq(0);
18822 var previousValue = $inputEl.val();
18825 .trigger('input change
')
18827 .trigger('input
:clear
', previousValue);
18829 $(doc).on('click
', '.input
-clear
-button
', clearInput);
18830 $(doc).on('change input
', 'input
, textarea
, select
', onChange, true);
18831 $(doc).on('focus
', 'input
, textarea
, select
', onFocus, true);
18832 $(doc).on('blur
', 'input
, textarea
, select
', onBlur, true);
18833 $(doc).on('invalid
', 'input
, textarea
, select
', onInvalid, true);
18841 scrollIntoViewOnFocus: Device.android,
18842 scrollIntoViewCentered: false,
18843 scrollIntoViewDuration: 0,
18844 scrollIntoViewAlways: false,
18847 create: function create() {
18849 Utils.extend(app, {
18851 scrollIntoView: Input.scrollIntoView.bind(app),
18852 focus: Input.focus.bind(app),
18853 blur: Input.blur.bind(app),
18854 validate: Input.validate.bind(app),
18855 validateInputs: Input.validateInputs.bind(app),
18856 checkEmptyState: Input.checkEmptyState.bind(app),
18857 resizeTextarea: Input.resizeTextarea.bind(app),
18858 init: Input.init.bind(app),
18863 init: function init() {
18867 tabMounted: function tabMounted(tabEl) {
18869 var $tabEl = $(tabEl);
18870 $tabEl.find('.item
-input
, .input
').each(function (itemInputIndex, itemInputEl) {
18871 var $itemInputEl = $(itemInputEl);
18872 $itemInputEl.find('input
, select
, textarea
').each(function (inputIndex, inputEl) {
18873 var $inputEl = $(inputEl);
18874 if (Input.ignoreTypes.indexOf($inputEl.attr('type
')) >= 0) { return; }
18875 app.input.checkEmptyState($inputEl);
18878 $tabEl.find('textarea
.resizable
').each(function (textareaIndex, textareaEl) {
18879 app.input.resizeTextarea(textareaEl);
18882 pageInit: function pageInit(page) {
18884 var $pageEl = page.$el;
18885 $pageEl.find('.item
-input
, .input
').each(function (itemInputIndex, itemInputEl) {
18886 var $itemInputEl = $(itemInputEl);
18887 $itemInputEl.find('input
, select
, textarea
').each(function (inputIndex, inputEl) {
18888 var $inputEl = $(inputEl);
18889 if (Input.ignoreTypes.indexOf($inputEl.attr('type
')) >= 0) { return; }
18890 app.input.checkEmptyState($inputEl);
18893 $pageEl.find('textarea
.resizable
').each(function (textareaIndex, textareaEl) {
18894 app.input.resizeTextarea(textareaEl);
18908 var Toggle = /*@__PURE__*/(function (Framework7Class$$1) {
18909 function Toggle(app, params) {
18910 if ( params === void 0 ) params = {};
18912 Framework7Class$$1.call(this, params, [app]);
18917 // Extend defaults with modules params
18918 toggle.useModulesParams(defaults);
18920 toggle.params = Utils.extend(defaults, params);
18922 var el = toggle.params.el;
18923 if (!el) { return toggle; }
18926 if ($el.length === 0) { return toggle; }
18928 if ($el[0].f7Toggle) { return $el[0].f7Toggle; }
18930 var $inputEl = $el.children('input
[type
="checkbox"]');
18932 Utils.extend(toggle, {
18936 $inputEl: $inputEl,
18937 inputEl: $inputEl[0],
18938 disabled: $el.hasClass('disabled
') || $inputEl.hasClass('disabled
') || $inputEl.attr('disabled
') || $inputEl[0].disabled,
18941 Object.defineProperty(toggle, 'checked
', {
18943 configurable: true,
18944 set: function set(checked) {
18945 if (!toggle || typeof toggle.$inputEl === 'undefined') { return; }
18946 if (toggle.checked === checked) { return; }
18947 $inputEl[0].checked = checked;
18948 toggle.$inputEl.trigger('change
');
18950 get: function get() {
18951 return $inputEl[0].checked;
18955 $el[0].f7Toggle = toggle;
18958 var touchesStart = {};
18962 var touchStartTime;
18963 var touchStartChecked;
18964 function handleTouchStart(e) {
18965 if (isTouched || toggle.disabled) { return; }
18966 touchesStart.x = e.type === 'touchstart
' ? e.targetTouches[0].pageX : e.pageX;
18967 touchesStart.y = e.type === 'touchstart
' ? e.targetTouches[0].pageY : e.pageY;
18971 isScrolling = undefined;
18972 touchStartTime = Utils.now();
18973 touchStartChecked = toggle.checked;
18975 toggleWidth = $el[0].offsetWidth;
18976 Utils.nextTick(function () {
18978 $el.addClass('toggle
-active
-state
');
18982 function handleTouchMove(e) {
18983 if (!isTouched || toggle.disabled) { return; }
18984 var pageX = e.type === 'touchmove
' ? e.targetTouches[0].pageX : e.pageX;
18985 var pageY = e.type === 'touchmove
' ? e.targetTouches[0].pageY : e.pageY;
18986 var inverter = app.rtl ? -1 : 1;
18988 if (typeof isScrolling === 'undefined') {
18989 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
18995 e.preventDefault();
18997 touchesDiff = pageX - touchesStart.x;
19001 if (touchesDiff * inverter < 0 && Math.abs(touchesDiff) > toggleWidth / 3 && touchStartChecked) {
19004 if (touchesDiff * inverter > 0 && Math.abs(touchesDiff) > toggleWidth / 3 && !touchStartChecked) {
19008 touchesStart.x = pageX;
19009 toggle.checked = !touchStartChecked;
19010 touchStartChecked = !touchStartChecked;
19013 function handleTouchEnd() {
19014 if (!isTouched || toggle.disabled) {
19015 if (isScrolling) { $el.removeClass('toggle
-active
-state
'); }
19019 var inverter = app.rtl ? -1 : 1;
19022 $el.removeClass('toggle
-active
-state
');
19025 if ((Utils.now() - touchStartTime) < 300) {
19026 if (touchesDiff * inverter < 0 && touchStartChecked) {
19029 if (touchesDiff * inverter > 0 && !touchStartChecked) {
19033 toggle.checked = !touchStartChecked;
19037 function handleInputChange() {
19038 toggle.$el.trigger('toggle
:change
', toggle);
19039 toggle.emit('local
::change toggleChange
', toggle);
19041 toggle.attachEvents = function attachEvents() {
19042 if (Support.touch) {
19043 var passive = Support.passiveListener ? { passive: true } : false;
19044 $el.on(app.touchEvents.start, handleTouchStart, passive);
19045 app.on('touchmove
', handleTouchMove);
19046 app.on('touchend
:passive
', handleTouchEnd);
19048 toggle.$inputEl.on('change
', handleInputChange);
19050 toggle.detachEvents = function detachEvents() {
19051 if (Support.touch) {
19052 var passive = Support.passiveListener ? { passive: true } : false;
19053 $el.off(app.touchEvents.start, handleTouchStart, passive);
19054 app.off('touchmove
', handleTouchMove);
19055 app.off('touchend
:passive
', handleTouchEnd);
19057 toggle.$inputEl.off('change
', handleInputChange);
19061 toggle.useModules();
19067 if ( Framework7Class$$1 ) Toggle.__proto__ = Framework7Class$$1;
19068 Toggle.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
19069 Toggle.prototype.constructor = Toggle;
19071 Toggle.prototype.toggle = function toggle () {
19073 toggle.checked = !toggle.checked;
19076 Toggle.prototype.init = function init () {
19078 toggle.attachEvents();
19081 Toggle.prototype.destroy = function destroy () {
19083 toggle.$el.trigger('toggle
:beforedestroy
', toggle);
19084 toggle.emit('local
::beforeDestroy toggleBeforeDestroy
', toggle);
19085 delete toggle.$el[0].f7Toggle;
19086 toggle.detachEvents();
19087 Utils.deleteProps(toggle);
19092 }(Framework7Class));
19096 create: function create() {
19098 app.toggle = ConstructorMethods({
19099 defaultSelector: '.toggle
',
19100 constructor: Toggle,
19102 domProp: 'f7Toggle
',
19109 tabMounted: function tabMounted(tabEl) {
19111 $(tabEl).find('.toggle
-init
').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
19113 tabBeforeRemove: function tabBeforeRemove(tabEl) {
19114 $(tabEl).find('.toggle
-init
').each(function (index, toggleEl) {
19115 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
19118 pageInit: function pageInit(page) {
19120 page.$el.find('.toggle
-init
').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
19122 pageBeforeRemove: function pageBeforeRemove(page) {
19123 page.$el.find('.toggle
-init
').each(function (index, toggleEl) {
19124 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
19130 insert: function insert(vnode) {
19132 var toggleEl = vnode.elm;
19133 app.toggle.create({ el: toggleEl });
19135 destroy: function destroy(vnode) {
19136 var toggleEl = vnode.elm;
19137 if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
19143 var Range = /*@__PURE__*/(function (Framework7Class$$1) {
19144 function Range(app, params) {
19145 Framework7Class$$1.call(this, params, [app]);
19158 draggableBar: true,
19160 verticalReversed: false,
19165 formatScaleLabel: null,
19168 // Extend defaults with modules params
19169 range.useModulesParams(defaults);
19171 range.params = Utils.extend(defaults, params);
19173 var el = range.params.el;
19174 if (!el) { return range; }
19177 if ($el.length === 0) { return range; }
19179 if ($el[0].f7Range) { return $el[0].f7Range; }
19181 var dataset = $el.dataset();
19183 ('step min max value scaleSteps scaleSubSteps
').split(' ').forEach(function (paramName) {
19184 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
19185 range.params[paramName] = parseFloat(dataset[paramName]);
19188 ('dual label vertical verticalReversed scale
').split(' ').forEach(function (paramName) {
19189 if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
19190 range.params[paramName] = dataset[paramName];
19194 if (!range.params.value) {
19195 if (typeof dataset.value !== 'undefined') { range.params.value = dataset.value; }
19196 if (typeof dataset.valueLeft !== 'undefined' && typeof dataset.valueRight !== 'undefined') {
19197 range.params.value = [parseFloat(dataset.valueLeft), parseFloat(dataset.valueRight)];
19202 if (!range.params.dual) {
19203 if (range.params.inputEl) {
19204 $inputEl = $(range.params.inputEl);
19205 } else if ($el.find('input
[type
="range"]').length) {
19206 $inputEl = $el.find('input
[type
="range"]').eq(0);
19210 var ref = range.params;
19211 var dual = ref.dual;
19212 var step = ref.step;
19213 var label = ref.label;
19216 var value = ref.value;
19217 var vertical = ref.vertical;
19218 var verticalReversed = ref.verticalReversed;
19219 var scale = ref.scale;
19220 var scaleSteps = ref.scaleSteps;
19221 var scaleSubSteps = ref.scaleSubSteps;
19223 Utils.extend(range, {
19227 $inputEl: $inputEl,
19228 inputEl: $inputEl ? $inputEl[0] : undefined,
19235 previousValue: value,
19236 vertical: vertical,
19237 verticalReversed: verticalReversed,
19239 scaleSteps: scaleSteps,
19240 scaleSubSteps: scaleSubSteps,
19244 ('step min max
').split(' ').forEach(function (paramName) {
19245 if (!params[paramName] && $inputEl.attr(paramName)) {
19246 range.params[paramName] = parseFloat($inputEl.attr(paramName));
19247 range[paramName] = parseFloat($inputEl.attr(paramName));
19250 if (typeof $inputEl.val() !== 'undefined') {
19251 range.params.value = parseFloat($inputEl.val());
19252 range.value = parseFloat($inputEl.val());
19258 $el.addClass('range
-slider
-dual
');
19261 $el.addClass('range
-slider
-label
');
19265 if (range.vertical) {
19266 $el.addClass('range
-slider
-vertical
');
19267 if (range.verticalReversed) {
19268 $el.addClass('range
-slider
-vertical
-reversed
');
19271 $el.addClass('range
-slider
-horizontal
');
19274 // Check for layout
19275 var $barEl = $('<div
class="range-bar"></div
>');
19276 var $barActiveEl = $('<div
class="range-bar-active"></div
>');
19277 $barEl.append($barActiveEl);
19280 var knobHTML = "\n <div class=\"range-knob-wrap\">\n <div class=\"range-knob\"></div>\n " + (range.label ? '<div
class="range-knob-label"></div
>' : '') + "\n </div>\n ";
19281 var knobs = [$(knobHTML)];
19284 knobs.push($(knobHTML));
19287 $el.append($barEl);
19288 knobs.forEach(function ($knobEl) {
19289 $el.append($knobEl);
19295 labels.push(knobs[0].find('.range
-knob
-label
'));
19297 labels.push(knobs[1].find('.range
-knob
-label
'));
19303 if (range.scale && range.scaleSteps > 1) {
19304 $scaleEl = $(("\n <div class=\"range-scale\">\n " + (range.renderScale()) + "\n </div>\n "));
19305 $el.append($scaleEl);
19308 Utils.extend(range, {
19312 $barActiveEl: $barActiveEl,
19313 $scaleEl: $scaleEl,
19316 $el[0].f7Range = range;
19320 var touchesStart = {};
19323 var rangeOffsetLeft;
19324 var rangeOffsetTop;
19325 var $touchedKnobEl;
19326 var dualValueIndex;
19327 var valueChangedByTouch;
19328 function onTouchChange() {
19329 valueChangedByTouch = true;
19331 function handleTouchStart(e) {
19332 if (isTouched) { return; }
19333 if (!range.params.draggableBar) {
19334 if ($(e.target).closest('.range
-knob
').length === 0) {
19338 valueChangedByTouch = false;
19339 touchesStart.x = e.type === 'touchstart
' ? e.targetTouches[0].pageX : e.pageX;
19340 touchesStart.y = e.type === 'touchstart
' ? e.targetTouches[0].pageY : e.pageY;
19343 isScrolling = undefined;
19344 rangeOffset = $el.offset();
19345 rangeOffsetLeft = rangeOffset.left;
19346 rangeOffsetTop = rangeOffset.top;
19349 if (range.vertical) {
19350 progress = (touchesStart.y - rangeOffsetTop) / range.rangeHeight;
19351 if (!range.verticalReversed) { progress = 1 - progress; }
19352 } else if (range.app.rtl) {
19353 progress = ((rangeOffsetLeft + range.rangeWidth) - touchesStart.x) / range.rangeWidth;
19355 progress = (touchesStart.x - rangeOffsetLeft) / range.rangeWidth;
19358 var newValue = (progress * (range.max - range.min)) + range.min;
19360 if (Math.abs(range.value[0] - newValue) < Math.abs(range.value[1] - newValue)) {
19361 dualValueIndex = 0;
19362 $touchedKnobEl = range.knobs[0];
19363 newValue = [newValue, range.value[1]];
19365 dualValueIndex = 1;
19366 $touchedKnobEl = range.knobs[1];
19367 newValue = [range.value[0], newValue];
19370 $touchedKnobEl = range.knobs[0];
19371 newValue = (progress * (range.max - range.min)) + range.min;
19373 Utils.nextTick(function () {
19374 if (isTouched) { $touchedKnobEl.addClass('range
-knob
-active
-state
'); }
19376 range.on('change
', onTouchChange);
19377 range.setValue(newValue, true);
19379 function handleTouchMove(e) {
19380 if (!isTouched) { return; }
19381 var pageX = e.type === 'touchmove
' ? e.targetTouches[0].pageX : e.pageX;
19382 var pageY = e.type === 'touchmove
' ? e.targetTouches[0].pageY : e.pageY;
19384 if (typeof isScrolling === 'undefined') {
19385 if (range.vertical) {
19386 isScrolling = !(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
19388 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
19395 e.preventDefault();
19398 if (range.vertical) {
19399 progress = (pageY - rangeOffsetTop) / range.rangeHeight;
19400 if (!range.verticalReversed) { progress = 1 - progress; }
19401 } else if (range.app.rtl) {
19402 progress = ((rangeOffsetLeft + range.rangeWidth) - pageX) / range.rangeWidth;
19404 progress = (pageX - rangeOffsetLeft) / range.rangeWidth;
19407 var newValue = (progress * (range.max - range.min)) + range.min;
19411 if (dualValueIndex === 0) {
19412 leftValue = newValue;
19413 rightValue = range.value[1];
19414 if (leftValue > rightValue) {
19415 rightValue = leftValue;
19418 leftValue = range.value[0];
19419 rightValue = newValue;
19420 if (rightValue < leftValue) {
19421 leftValue = rightValue;
19424 newValue = [leftValue, rightValue];
19426 range.setValue(newValue, true);
19428 function handleTouchEnd() {
19430 if (isScrolling) { $touchedKnobEl.removeClass('range
-knob
-active
-state
'); }
19434 range.off('change
', onTouchChange);
19436 $touchedKnobEl.removeClass('range
-knob
-active
-state
');
19437 if (valueChangedByTouch && range.$inputEl && !range.dual) {
19438 range.$inputEl.trigger('change
');
19440 valueChangedByTouch = false;
19441 if (typeof range.previousValue !== 'undefined') {
19446 range.previousValue[0] !== range.value[0]
19447 || range.previousValue[1] !== range.value[1]
19452 && range.previousValue !== range.value
19455 range.$el.trigger('range
:changed
', range, range.value);
19456 range.emit('local
::changed rangeChanged
', range, range.value);
19461 function handleResize() {
19468 range.attachEvents = function attachEvents() {
19469 var passive = Support.passiveListener ? { passive: true } : false;
19470 range.$el.on(app.touchEvents.start, handleTouchStart, passive);
19471 app.on('touchmove
', handleTouchMove);
19472 app.on('touchend
:passive
', handleTouchEnd);
19473 app.on('tabShow
', handleResize);
19474 app.on('resize
', handleResize);
19475 parentModals = range.$el.parents('.sheet
-modal
, .actions
-modal
, .popup
, .popover
, .login
-screen
, .dialog
, .toast
');
19476 parentModals.on('modal
:open
', handleResize);
19477 parentPanel = range.$el.parents('.panel
');
19478 parentPanel.on('panel
:open
', handleResize);
19479 parentPage = range.$el.parents('.page
').eq(0);
19480 parentPage.on('page
:reinit
', handleResize);
19482 range.detachEvents = function detachEvents() {
19483 var passive = Support.passiveListener ? { passive: true } : false;
19484 range.$el.off(app.touchEvents.start, handleTouchStart, passive);
19485 app.off('touchmove
', handleTouchMove);
19486 app.off('touchend
:passive
', handleTouchEnd);
19487 app.off('tabShow
', handleResize);
19488 app.off('resize
', handleResize);
19489 if (parentModals) {
19490 parentModals.off('modal
:open
', handleResize);
19493 parentPanel.off('panel
:open
', handleResize);
19496 parentPage.off('page
:reinit
', handleResize);
19498 parentModals = null;
19499 parentPanel = null;
19504 range.useModules();
19512 if ( Framework7Class$$1 ) Range.__proto__ = Framework7Class$$1;
19513 Range.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
19514 Range.prototype.constructor = Range;
19516 Range.prototype.calcSize = function calcSize () {
19518 if (range.vertical) {
19519 var height = range.$el.outerHeight();
19520 if (height === 0) { return; }
19521 range.rangeHeight = height;
19522 range.knobHeight = range.knobs[0].outerHeight();
19524 var width = range.$el.outerWidth();
19525 if (width === 0) { return; }
19526 range.rangeWidth = width;
19527 range.knobWidth = range.knobs[0].outerWidth();
19531 Range.prototype.layout = function layout () {
19535 var app = range.app;
19536 var knobWidth = range.knobWidth;
19537 var knobHeight = range.knobHeight;
19538 var rangeWidth = range.rangeWidth;
19539 var rangeHeight = range.rangeHeight;
19540 var min = range.min;
19541 var max = range.max;
19542 var knobs = range.knobs;
19543 var $barActiveEl = range.$barActiveEl;
19544 var value = range.value;
19545 var label = range.label;
19546 var labels = range.labels;
19547 var vertical = range.vertical;
19548 var verticalReversed = range.verticalReversed;
19549 var knobSize = vertical ? knobHeight : knobWidth;
19550 var rangeSize = vertical ? rangeHeight : rangeWidth;
19551 // eslint-disable-next-line
19552 var positionProperty = vertical
19553 ? (verticalReversed ? 'top
' : 'bottom
')
19554 : (app.rtl ? 'right
' : 'left
');
19556 var progress = [((value[0] - min) / (max - min)), ((value[1] - min) / (max - min))];
19557 $barActiveEl.css(( obj = {}, obj[positionProperty] = ((progress[0] * 100) + "%"), obj[vertical ? 'height
' : 'width
'] = (((progress[1] - progress[0]) * 100) + "%"), obj ));
19558 knobs.forEach(function ($knobEl, knobIndex) {
19559 var startPos = rangeSize * progress[knobIndex];
19560 if (app.theme === 'ios
') {
19561 var realStartPos = (rangeSize * progress[knobIndex]) - (knobSize / 2);
19562 if (realStartPos < 0) { startPos = knobSize / 2; }
19563 if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
19565 $knobEl.css(positionProperty, (startPos + "px"));
19566 if (label) { labels[knobIndex].text(range.formatLabel(value[knobIndex], labels[knobIndex][0])); }
19569 var progress$1 = ((value - min) / (max - min));
19570 $barActiveEl.css(vertical ? 'height
' : 'width
', ((progress$1 * 100) + "%"));
19572 var startPos = rangeSize * progress$1;
19573 if (app.theme === 'ios
') {
19574 var realStartPos = (rangeSize * progress$1) - (knobSize / 2);
19575 if (realStartPos < 0) { startPos = knobSize / 2; }
19576 if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
19578 knobs[0].css(positionProperty, (startPos + "px"));
19579 if (label) { labels[0].text(range.formatLabel(value, labels[0][0])); }
19581 if ((range.dual && value.indexOf(min) >= 0) || (!range.dual && value === min)) {
19582 range.$el.addClass('range
-slider
-min
');
19584 range.$el.removeClass('range
-slider
-min
');
19586 if ((range.dual && value.indexOf(max) >= 0) || (!range.dual && value === max)) {
19587 range.$el.addClass('range
-slider
-max
');
19589 range.$el.removeClass('range
-slider
-max
');
19593 Range.prototype.setValue = function setValue (newValue, byTouchMove) {
19595 var step = range.step;
19596 var min = range.min;
19597 var max = range.max;
19601 oldValue = [range.value[0], range.value[1]];
19602 var newValues = newValue;
19603 if (!Array.isArray(newValues)) { newValues = [newValue, newValue]; }
19604 if (newValue[0] > newValue[1]) {
19605 newValues = [newValues[0], newValues[0]];
19607 newValues = newValues.map(function (value) { return Math.max(Math.min(Math.round(value / step) * step, max), min); });
19608 if (newValues[0] === range.value[0] && newValues[1] === range.value[1]) {
19611 newValues.forEach(function (value, valueIndex) {
19612 range.value[valueIndex] = value;
19614 valueChanged = oldValue[0] !== newValues[0] || oldValue[1] !== newValues[1];
19617 oldValue = range.value;
19618 var value = Math.max(Math.min(Math.round(newValue / step) * step, max), min);
19619 range.value = value;
19621 valueChanged = oldValue !== value;
19624 if (valueChanged) {
19625 range.previousValue = oldValue;
19628 if (!valueChanged) { return range; }
19629 range.$el.trigger('range
:change
', range, range.value);
19630 if (range.$inputEl && !range.dual) {
19631 range.$inputEl.val(range.value);
19632 if (!byTouchMove) {
19633 range.$inputEl.trigger('input change
');
19635 range.$inputEl.trigger('input
');
19638 if (!byTouchMove) {
19639 range.$el.trigger('range
:changed
', range, range.value);
19640 range.emit('local
::changed rangeChanged
', range, range.value);
19642 range.emit('local
::change rangeChange
', range, range.value);
19646 Range.prototype.getValue = function getValue () {
19650 Range.prototype.formatLabel = function formatLabel (value, labelEl) {
19652 if (range.params.formatLabel) { return range.params.formatLabel.call(range, value, labelEl); }
19656 Range.prototype.formatScaleLabel = function formatScaleLabel (value) {
19658 if (range.params.formatScaleLabel) { return range.params.formatScaleLabel.call(range, value); }
19662 Range.prototype.renderScale = function renderScale () {
19664 var app = range.app;
19665 var verticalReversed = range.verticalReversed;
19666 var vertical = range.vertical;
19668 // eslint-disable-next-line
19669 var positionProperty = vertical
19670 ? (verticalReversed ? 'top
' : 'bottom
')
19671 : (app.rtl ? 'right
' : 'left
');
19676 .from({ length: range.scaleSteps + 1 })
19677 .forEach(function (scaleEl, index) {
19678 var scaleStepValue = (range.max - range.min) / range.scaleSteps;
19679 var scaleValue = range.min + scaleStepValue * index;
19680 var progress = ((scaleValue - range.min) / (range.max - range.min));
19681 html += "<div class=\"range-scale-step\" style=\"" + positionProperty + ": " + (progress * 100) + "%\">" + (range.formatScaleLabel(scaleValue)) + "</div>";
19683 if (range.scaleSubSteps && range.scaleSubSteps > 1 && index < range.scaleSteps) {
19685 .from({ length: range.scaleSubSteps - 1 })
19686 .forEach(function (subStepEl, subIndex) {
19687 var subStep = scaleStepValue / range.scaleSubSteps;
19688 var scaleSubValue = scaleValue + subStep * (subIndex + 1);
19689 var subProgress = ((scaleSubValue - range.min) / (range.max - range.min));
19690 html += "<div class=\"range-scale-step range-scale-substep\" style=\"" + positionProperty + ": " + (subProgress * 100) + "%\"></div>";
19698 Range.prototype.updateScale = function updateScale () {
19700 if (!range.scale || range.scaleSteps < 2) {
19701 if (range.$scaleEl) { range.$scaleEl.remove(); }
19702 delete range.$scaleEl;
19705 if (!range.$scaleEl) {
19706 range.$scaleEl = $('<div
class="range-scale"></div
>');
19707 range.$el.append(range.$scaleEl);
19710 range.$scaleEl.html(range.renderScale());
19713 Range.prototype.init = function init () {
19717 range.attachEvents();
19721 Range.prototype.destroy = function destroy () {
19723 range.$el.trigger('range
:beforedestroy
', range);
19724 range.emit('local
::beforeDestroy rangeBeforeDestroy
', range);
19725 delete range.$el[0].f7Range;
19726 range.detachEvents();
19727 Utils.deleteProps(range);
19732 }(Framework7Class));
19736 create: function create() {
19738 app.range = Utils.extend(
19739 ConstructorMethods({
19740 defaultSelector: '.range
-slider
',
19741 constructor: Range,
19743 domProp: 'f7Range
',
19746 getValue: function getValue(el) {
19747 if ( el === void 0 ) el = '.range
-slider
';
19749 var range = app.range.get(el);
19750 if (range) { return range.getValue(); }
19753 setValue: function setValue(el, value) {
19754 if ( el === void 0 ) el = '.range
-slider
';
19756 var range = app.range.get(el);
19757 if (range) { return range.setValue(value); }
19767 tabMounted: function tabMounted(tabEl) {
19769 $(tabEl).find('.range
-slider
-init
').each(function (index, rangeEl) { return new Range(app, {
19773 tabBeforeRemove: function tabBeforeRemove(tabEl) {
19774 $(tabEl).find('.range
-slider
-init
').each(function (index, rangeEl) {
19775 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
19778 pageInit: function pageInit(page) {
19780 page.$el.find('.range
-slider
-init
').each(function (index, rangeEl) { return new Range(app, {
19784 pageBeforeRemove: function pageBeforeRemove(page) {
19785 page.$el.find('.range
-slider
-init
').each(function (index, rangeEl) {
19786 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
19791 'range
-slider
-init
': {
19792 insert: function insert(vnode) {
19793 var rangeEl = vnode.elm;
19795 app.range.create({ el: rangeEl });
19797 destroy: function destroy(vnode) {
19798 var rangeEl = vnode.elm;
19799 if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
19805 var Stepper = /*@__PURE__*/(function (Framework7Class$$1) {
19806 function Stepper(app, params) {
19807 Framework7Class$$1.call(this, params, [app]);
19808 var stepper = this;
19821 autorepeatDynamic: false,
19823 manualInputMode: false,
19825 buttonsEndInputMode: true,
19828 // Extend defaults with modules params
19829 stepper.useModulesParams(defaults);
19831 stepper.params = Utils.extend(defaults, params);
19832 if (stepper.params.value < stepper.params.min) {
19833 stepper.params.value = stepper.params.min;
19835 if (stepper.params.value > stepper.params.max) {
19836 stepper.params.value = stepper.params.max;
19839 var el = stepper.params.el;
19840 if (!el) { return stepper; }
19843 if ($el.length === 0) { return stepper; }
19845 if ($el[0].f7Stepper) { return $el[0].f7Stepper; }
19848 if (stepper.params.inputEl) {
19849 $inputEl = $(stepper.params.inputEl);
19850 } else if ($el.find('.stepper
-input
-wrap
').find('input
, textarea
').length) {
19851 $inputEl = $el.find('.stepper
-input
-wrap
').find('input
, textarea
').eq(0);
19854 if ($inputEl && $inputEl.length) {
19855 ('step min max
').split(' ').forEach(function (paramName) {
19856 if (!params[paramName] && $inputEl.attr(paramName)) {
19857 stepper.params[paramName] = parseFloat($inputEl.attr(paramName));
19861 var decimalPoint$1 = parseInt(stepper.params.decimalPoint, 10);
19862 if (Number.isNaN(decimalPoint$1)) {
19863 stepper.params.decimalPoint = 0;
19865 stepper.params.decimalPoint = decimalPoint$1;
19868 var inputValue = parseFloat($inputEl.val());
19869 if (typeof params.value === 'undefined' && !Number.isNaN(inputValue) && (inputValue || inputValue === 0)) {
19870 stepper.params.value = inputValue;
19875 if (stepper.params.valueEl) {
19876 $valueEl = $(stepper.params.valueEl);
19877 } else if ($el.find('.stepper
-value
').length) {
19878 $valueEl = $el.find('.stepper
-value
').eq(0);
19881 var $buttonPlusEl = $el.find('.stepper
-button
-plus
');
19882 var $buttonMinusEl = $el.find('.stepper
-button
-minus
');
19884 var ref = stepper.params;
19885 var step = ref.step;
19888 var value = ref.value;
19889 var decimalPoint = ref.decimalPoint;
19891 Utils.extend(stepper, {
19895 $buttonPlusEl: $buttonPlusEl,
19896 buttonPlusEl: $buttonPlusEl[0],
19897 $buttonMinusEl: $buttonMinusEl,
19898 buttonMinusEl: $buttonMinusEl[0],
19899 $inputEl: $inputEl,
19900 inputEl: $inputEl ? $inputEl[0] : undefined,
19901 $valueEl: $valueEl,
19902 valueEl: $valueEl ? $valueEl[0] : undefined,
19907 decimalPoint: decimalPoint,
19908 typeModeChanged: false,
19911 $el[0].f7Stepper = stepper;
19914 var touchesStart = {};
19917 var preventButtonClick;
19920 var autorepeatAction = null;
19921 var autorepeatInAction = false;
19922 var manualInput = false;
19924 function dynamicRepeat(current, progressions, startsIn, progressionStep, repeatEvery, action) {
19925 clearTimeout(timeoutId);
19926 timeoutId = setTimeout(function () {
19927 if (current === 1) {
19928 preventButtonClick = true;
19929 autorepeatInAction = true;
19931 clearInterval(intervalId);
19933 intervalId = setInterval(function () {
19936 if (current < progressions) {
19937 dynamicRepeat(current + 1, progressions, startsIn, progressionStep, repeatEvery / 2, action);
19939 }, current === 1 ? startsIn : progressionStep);
19942 function onTouchStart(e) {
19943 if (isTouched) { return; }
19944 if (manualInput) { return; }
19945 if ($(e.target).closest($buttonPlusEl).length) {
19946 autorepeatAction = 'increment
';
19947 } else if ($(e.target).closest($buttonMinusEl).length) {
19948 autorepeatAction = 'decrement
';
19950 if (!autorepeatAction) { return; }
19952 touchesStart.x = e.type === 'touchstart
' ? e.targetTouches[0].pageX : e.pageX;
19953 touchesStart.y = e.type === 'touchstart
' ? e.targetTouches[0].pageY : e.pageY;
19955 isScrolling = undefined;
19957 var progressions = stepper.params.autorepeatDynamic ? 4 : 1;
19958 dynamicRepeat(1, progressions, 500, 1000, 300, function () {
19959 stepper[autorepeatAction]();
19962 function onTouchMove(e) {
19963 if (!isTouched) { return; }
19964 if (manualInput) { return; }
19965 var pageX = e.type === 'touchmove
' ? e.targetTouches[0].pageX : e.pageX;
19966 var pageY = e.type === 'touchmove
' ? e.targetTouches[0].pageY : e.pageY;
19968 if (typeof isScrolling === 'undefined' && !autorepeatInAction) {
19969 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
19971 var distance = Math.pow( ((Math.pow( (pageX - touchesStart.x), 2 )) + (Math.pow( (pageY - touchesStart.y), 2 ))), 0.5 );
19973 if (isScrolling || distance > 20) {
19975 clearTimeout(timeoutId);
19976 clearInterval(intervalId);
19979 function onTouchEnd() {
19980 clearTimeout(timeoutId);
19981 clearInterval(intervalId);
19982 autorepeatAction = null;
19983 autorepeatInAction = false;
19987 function onMinusClick() {
19989 if (stepper.params.buttonsEndInputMode) {
19990 manualInput = false;
19991 stepper.endTypeMode(true);
19995 if (preventButtonClick) {
19996 preventButtonClick = false;
19999 stepper.decrement(true);
20001 function onPlusClick() {
20003 if (stepper.params.buttonsEndInputMode) {
20004 manualInput = false;
20005 stepper.endTypeMode(true);
20009 if (preventButtonClick) {
20010 preventButtonClick = false;
20013 stepper.increment(true);
20015 function onInputClick(e) {
20016 if (!e.target.readOnly && stepper.params.manualInputMode) {
20017 manualInput = true;
20018 if (typeof e.target.selectionStart === 'number
') {
20019 e.target.selectionStart = e.target.value.length;
20020 e.target.selectionEnd = e.target.value.length;
20024 function onInputKey(e) {
20025 if (e.keyCode === 13 || e.which === 13) {
20026 e.preventDefault();
20027 manualInput = false;
20028 stepper.endTypeMode();
20031 function onInputBlur() {
20032 manualInput = false;
20033 stepper.endTypeMode(true);
20035 function onInput(e) {
20037 stepper.typeValue(e.target.value);
20040 if (e.detail && e.detail.sentByF7Stepper) { return; }
20041 stepper.setValue(e.target.value, true);
20043 stepper.attachEvents = function attachEvents() {
20044 $buttonMinusEl.on('click
', onMinusClick);
20045 $buttonPlusEl.on('click
', onPlusClick);
20046 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
20047 $inputEl.on('input
', onInput);
20048 $inputEl.on('click
', onInputClick);
20049 $inputEl.on('blur
', onInputBlur);
20050 $inputEl.on('keyup
', onInputKey);
20052 if (stepper.params.autorepeat) {
20053 app.on('touchstart
:passive
', onTouchStart);
20054 app.on('touchmove
:active
', onTouchMove);
20055 app.on('touchend
:passive
', onTouchEnd);
20058 stepper.detachEvents = function detachEvents() {
20059 $buttonMinusEl.off('click
', onMinusClick);
20060 $buttonPlusEl.off('click
', onPlusClick);
20061 if (stepper.params.watchInput && $inputEl && $inputEl.length) {
20062 $inputEl.off('input
', onInput);
20063 $inputEl.off('click
', onInputClick);
20064 $inputEl.off('blur
', onInputBlur);
20065 $inputEl.off('keyup
', onInputKey);
20070 stepper.useModules();
20078 if ( Framework7Class$$1 ) Stepper.__proto__ = Framework7Class$$1;
20079 Stepper.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
20080 Stepper.prototype.constructor = Stepper;
20082 Stepper.prototype.minus = function minus () {
20083 return this.decrement();
20086 Stepper.prototype.plus = function plus () {
20087 return this.increment();
20090 Stepper.prototype.decrement = function decrement () {
20091 var stepper = this;
20092 return stepper.setValue(stepper.value - stepper.step, false, true);
20095 Stepper.prototype.increment = function increment () {
20096 var stepper = this;
20097 return stepper.setValue(stepper.value + stepper.step, false, true);
20100 Stepper.prototype.setValue = function setValue (newValue, forceUpdate, withWraps) {
20101 var stepper = this;
20102 var step = stepper.step;
20103 var min = stepper.min;
20104 var max = stepper.max;
20106 var oldValue = stepper.value;
20108 var value = Math.round(newValue / step) * step;
20109 if (stepper.params.wraps && withWraps) {
20110 if (value > max) { value = min; }
20111 if (value < min) { value = max; }
20113 value = Math.max(Math.min(value, max), min);
20116 if (Number.isNaN(value)) {
20119 stepper.value = value;
20121 var valueChanged = oldValue !== value;
20124 if (!valueChanged && !forceUpdate) { return stepper; }
20126 stepper.$el.trigger('stepper
:change
', stepper, stepper.value);
20127 var formattedValue = stepper.formatValue(stepper.value);
20128 if (stepper.$inputEl && stepper.$inputEl.length) {
20129 stepper.$inputEl.val(formattedValue);
20130 stepper.$inputEl.trigger('input change
', { sentByF7Stepper: true });
20132 if (stepper.$valueEl && stepper.$valueEl.length) {
20133 stepper.$valueEl.html(formattedValue);
20135 stepper.emit('local
::change stepperChange
', stepper, stepper.value);
20139 Stepper.prototype.endTypeMode = function endTypeMode (noBlur) {
20140 var stepper = this;
20141 var min = stepper.min;
20142 var max = stepper.max;
20143 var value = parseFloat(stepper.value);
20145 if (Number.isNaN(value)) { value = 0; }
20147 value = Math.max(Math.min(value, max), min);
20149 stepper.value = value;
20150 if (!stepper.typeModeChanged) {
20151 if (stepper.$inputEl && stepper.$inputEl.length && !noBlur) {
20152 stepper.$inputEl.blur();
20156 stepper.typeModeChanged = false;
20158 stepper.$el.trigger('stepper
:change
', stepper, stepper.value);
20159 var formattedValue = stepper.formatValue(stepper.value);
20160 if (stepper.$inputEl && stepper.$inputEl.length) {
20161 stepper.$inputEl.val(formattedValue);
20162 stepper.$inputEl.trigger('input change
', { sentByF7Stepper: true });
20163 if (!noBlur) { stepper.$inputEl.blur(); }
20165 if (stepper.$valueEl && stepper.$valueEl.length) {
20166 stepper.$valueEl.html(formattedValue);
20168 stepper.emit('local
::change stepperChange
', stepper, stepper.value);
20172 Stepper.prototype.typeValue = function typeValue (value) {
20173 var stepper = this;
20174 stepper.typeModeChanged = true;
20175 var inputTxt = String(value);
20176 if (inputTxt.lastIndexOf('.') + 1 === inputTxt.length || inputTxt.lastIndexOf(',') + 1 === inputTxt.length) {
20177 if (inputTxt.lastIndexOf('.') !== inputTxt.indexOf('.') || inputTxt.lastIndexOf(',') !== inputTxt.indexOf(',')) {
20178 inputTxt = inputTxt.slice(0, -1);
20179 stepper.value = inputTxt;
20180 stepper.$inputEl.val(stepper.value);
20184 var newValue = parseFloat(inputTxt.replace(',', '.'));
20185 if (newValue === 0) {
20186 stepper.value = inputTxt.replace(',', '.');
20187 stepper.$inputEl.val(stepper.value);
20190 if (Number.isNaN(newValue)) {
20192 stepper.$inputEl.val(stepper.value);
20195 var powVal = Math.pow( 10, stepper.params.decimalPoint );
20196 newValue = (Math.round((newValue) * powVal)).toFixed(stepper.params.decimalPoint + 1) / powVal;
20197 stepper.value = parseFloat(String(newValue).replace(',', '.'));
20198 stepper.$inputEl.val(stepper.value);
20201 stepper.value = inputTxt;
20202 stepper.$inputEl.val(inputTxt);
20206 Stepper.prototype.getValue = function getValue () {
20210 Stepper.prototype.formatValue = function formatValue (value) {
20211 var stepper = this;
20212 if (!stepper.params.formatValue) { return value; }
20213 return stepper.params.formatValue.call(stepper, value);
20216 Stepper.prototype.init = function init () {
20217 var stepper = this;
20218 stepper.attachEvents();
20219 if (stepper.$valueEl && stepper.$valueEl.length) {
20220 var formattedValue = stepper.formatValue(stepper.value);
20221 stepper.$valueEl.html(formattedValue);
20226 Stepper.prototype.destroy = function destroy () {
20227 var stepper = this;
20228 stepper.$el.trigger('stepper
:beforedestroy
', stepper);
20229 stepper.emit('local
::beforeDestroy stepperBeforeDestroy
', stepper);
20230 delete stepper.$el[0].f7Stepper;
20231 stepper.detachEvents();
20232 Utils.deleteProps(stepper);
20237 }(Framework7Class));
20241 create: function create() {
20243 app.stepper = Utils.extend(
20244 ConstructorMethods({
20245 defaultSelector: '.stepper
',
20246 constructor: Stepper,
20248 domProp: 'f7Stepper
',
20251 getValue: function getValue(el) {
20252 if ( el === void 0 ) el = '.stepper
';
20254 var stepper = app.stepper.get(el);
20255 if (stepper) { return stepper.getValue(); }
20258 setValue: function setValue(el, value) {
20259 if ( el === void 0 ) el = '.stepper
';
20261 var stepper = app.stepper.get(el);
20262 if (stepper) { return stepper.setValue(value); }
20272 tabMounted: function tabMounted(tabEl) {
20274 $(tabEl).find('.stepper
-init
').each(function (index, stepperEl) {
20275 var dataset = $(stepperEl).dataset();
20276 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
20279 tabBeforeRemove: function tabBeforeRemove(tabEl) {
20280 $(tabEl).find('.stepper
-init
').each(function (index, stepperEl) {
20281 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
20284 pageInit: function pageInit(page) {
20286 page.$el.find('.stepper
-init
').each(function (index, stepperEl) {
20287 var dataset = $(stepperEl).dataset();
20288 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
20291 pageBeforeRemove: function pageBeforeRemove(page) {
20292 page.$el.find('.stepper
-init
').each(function (index, stepperEl) {
20293 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
20299 insert: function insert(vnode) {
20301 var stepperEl = vnode.elm;
20302 var dataset = $(stepperEl).dataset();
20303 app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
20305 destroy: function destroy(vnode) {
20306 var stepperEl = vnode.elm;
20307 if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
20313 var SmartSelect = /*@__PURE__*/(function (Framework7Class$$1) {
20314 function SmartSelect(app, params) {
20315 if ( params === void 0 ) params = {};
20317 Framework7Class$$1.call(this, params, [app]);
20320 var defaults = Utils.extend({
20322 }, app.params.smartSelect);
20324 // Extend defaults with modules params
20325 ss.useModulesParams(defaults);
20327 ss.params = Utils.extend({}, defaults, params);
20331 var $el = $(ss.params.el).eq(0);
20332 if ($el.length === 0) { return ss; }
20334 if ($el[0].f7SmartSelect) { return $el[0].f7SmartSelect; }
20336 var $selectEl = $el.find('select
').eq(0);
20337 if ($selectEl.length === 0) { return ss; }
20339 var $valueEl = $(ss.params.valueEl);
20340 if ($valueEl.length === 0) {
20341 $valueEl = $el.find('.item
-after
');
20343 if ($valueEl.length === 0) {
20344 $valueEl = $('<div
class="item-after"></div
>');
20345 $valueEl.insertAfter($el.find('.item
-title
'));
20352 var url = params.url;
20354 if ($el.attr('href
') && $el.attr('href
') !== '#') { url = $el.attr('href
'); }
20355 else if ($selectEl.attr('name
')) { url = ($selectEl.attr('name
').toLowerCase()) + "-select/"; }
20357 if (!url) { url = ss.params.url; }
20359 var multiple = $selectEl[0].multiple;
20360 var inputType = multiple ? 'checkbox
' : 'radio
';
20361 var id = Utils.id();
20366 $selectEl: $selectEl,
20367 selectEl: $selectEl[0],
20368 $valueEl: $valueEl,
20369 valueEl: $valueEl[0],
20371 multiple: multiple,
20372 inputType: inputType,
20375 inputName: (inputType + "-" + id),
20376 selectName: $selectEl.attr('name
'),
20377 maxLength: $selectEl.attr('maxlength
') || params.maxLength,
20380 $el[0].f7SmartSelect = ss;
20383 function onClick() {
20386 function onChange() {
20387 var value = ss.$selectEl.val();
20388 ss.$el.trigger('smartselect
:change
', ss, value);
20389 ss.emit('local
::change smartSelectChange
', ss, value);
20392 ss.attachEvents = function attachEvents() {
20393 $el.on('click
', onClick);
20394 $el.on('change
', 'select
', onChange);
20396 ss.detachEvents = function detachEvents() {
20397 $el.off('click
', onClick);
20398 $el.off('change
', 'select
', onChange);
20401 function handleInputChange() {
20404 var inputEl = this;
20405 var value = inputEl.value;
20406 var optionText = [];
20408 if (inputEl.type === 'checkbox
') {
20409 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
20410 optionEl = ss.selectEl.options[i];
20411 if (optionEl.value === value) {
20412 optionEl.selected = inputEl.checked;
20414 if (optionEl.selected) {
20415 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display
-value
-as
');
20416 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20417 optionText.push(text.trim());
20420 if (ss.maxLength) {
20421 ss.checkMaxLength();
20424 optionEl = ss.$selectEl.find(("option[value=\"" + value + "\"]"))[0];
20425 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display
-as
');
20426 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20427 optionText = [text];
20428 ss.selectEl.value = value;
20431 ss.$selectEl.trigger('change
');
20432 ss.$valueEl.text(optionText.join(', '));
20433 if (ss.params.closeOnSelect && ss.inputType === 'radio
') {
20438 ss.attachInputsEvents = function attachInputsEvents() {
20439 ss.$containerEl.on('change
', 'input
[type
="checkbox"], input
[type
="radio"]', handleInputChange);
20441 ss.detachInputsEvents = function detachInputsEvents() {
20442 ss.$containerEl.off('change
', 'input
[type
="checkbox"], input
[type
="radio"]', handleInputChange);
20454 if ( Framework7Class$$1 ) SmartSelect.__proto__ = Framework7Class$$1;
20455 SmartSelect.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
20456 SmartSelect.prototype.constructor = SmartSelect;
20458 SmartSelect.prototype.setValue = function setValue (value) {
20460 var newValue = value;
20461 var optionText = [];
20466 if (!Array.isArray(newValue)) { newValue = [newValue]; }
20467 for (var i = 0; i < ss.selectEl.options.length; i += 1) {
20468 optionEl = ss.selectEl.options[i];
20469 if (newValue.indexOf(optionEl.value) >= 0) {
20470 optionEl.selected = true;
20472 optionEl.selected = false;
20474 if (optionEl.selected) {
20475 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display
-value
-as
');
20476 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20477 optionText.push(text.trim());
20481 optionEl = ss.$selectEl.find(("option[value=\"" + newValue + "\"]"))[0];
20482 displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display
-as
');
20483 text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
20484 optionText = [text];
20485 ss.selectEl.value = newValue;
20487 ss.$valueEl.text(optionText.join(', '));
20490 SmartSelect.prototype.getValue = function getValue () {
20492 return ss.$selectEl.val();
20495 SmartSelect.prototype.getView = function getView () {
20497 var view = ss.view || ss.params.view;
20499 view = ss.$el.parents('.view
').length && ss.$el.parents('.view
')[0].f7View;
20502 throw Error('Smart Select requires initialized View
');
20508 SmartSelect.prototype.checkMaxLength = function checkMaxLength () {
20510 var $containerEl = ss.$containerEl;
20511 if (ss.selectEl.selectedOptions.length >= ss.maxLength) {
20512 $containerEl.find('input
[type
="checkbox"]').each(function (index, inputEl) {
20513 if (!inputEl.checked) {
20514 $(inputEl).parents('li
').addClass('disabled
');
20516 $(inputEl).parents('li
').removeClass('disabled
');
20520 $containerEl.find('.disabled
').removeClass('disabled
');
20524 SmartSelect.prototype.setTextValue = function setTextValue (value) {
20526 var valueArray = [];
20527 if (typeof value !== 'undefined') {
20528 if (Array.isArray(value)) {
20529 valueArray = value;
20531 valueArray = [value];
20534 ss.$selectEl.find('option
').each(function (optionIndex, optionEl) {
20535 var $optionEl = $(optionEl);
20536 if (optionEl.selected) {
20537 var displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $optionEl.data('display
-value
-as
');
20538 if (displayAs && typeof displayAs !== 'undefined') {
20539 valueArray.push(displayAs);
20541 valueArray.push(optionEl.textContent.trim());
20546 ss.$valueEl.text(valueArray.join(', '));
20549 SmartSelect.prototype.getItemsData = function getItemsData () {
20552 var previousGroupEl;
20553 ss.$selectEl.find('option
').each(function (index, optionEl) {
20554 var $optionEl = $(optionEl);
20555 var optionData = $optionEl.dataset();
20556 var optionImage = optionData.optionImage || ss.params.optionImage;
20557 var optionIcon = optionData.optionIcon || ss.params.optionIcon;
20558 var optionHasMedia = optionImage || optionIcon;
20559 // if (material) optionHasMedia = optionImage || optionIcon;
20560 var optionColor = optionData.optionColor;
20562 var optionClassName = optionData.optionClass || '';
20563 if ($optionEl[0].disabled) { optionClassName += ' disabled
'; }
20565 var optionGroupEl = $optionEl.parent('optgroup
')[0];
20566 var optionGroupLabel = optionGroupEl && optionGroupEl.label;
20567 var optionIsLabel = false;
20568 if (optionGroupEl && optionGroupEl !== previousGroupEl) {
20569 optionIsLabel = true;
20570 previousGroupEl = optionGroupEl;
20572 groupLabel: optionGroupLabel,
20573 isLabel: optionIsLabel,
20577 value: $optionEl[0].value,
20578 text: $optionEl[0].textContent.trim(),
20579 selected: $optionEl[0].selected,
20580 groupEl: optionGroupEl,
20581 groupLabel: optionGroupLabel,
20582 image: optionImage,
20584 color: optionColor,
20585 className: optionClassName,
20586 disabled: $optionEl[0].disabled,
20588 hasMedia: optionHasMedia,
20589 checkbox: ss.inputType === 'checkbox
',
20590 radio: ss.inputType === 'radio
',
20591 inputName: ss.inputName,
20592 inputType: ss.inputType,
20599 SmartSelect.prototype.renderSearchbar = function renderSearchbar () {
20601 if (ss.params.renderSearchbar) { return ss.params.renderSearchbar.call(ss); }
20602 var searchbarHTML = "\n <form class=\"searchbar\">\n <div class=\"searchbar-inner\">\n <div class=\"searchbar-input-wrap\">\n <input type=\"search\" placeholder=\"" + (ss.params.searchbarPlaceholder) + "\"/>\n <i class=\"searchbar-icon\"></i>\n <span class=\"input-clear-button\"></span>\n </div>\n <span class=\"searchbar-disable-button\">" + (ss.params.searchbarDisableText) + "</span>\n </div>\n </form>\n ";
20603 return searchbarHTML;
20606 SmartSelect.prototype.renderItem = function renderItem (item, index) {
20608 if (ss.params.renderItem) { return ss.params.renderItem.call(ss, item, index); }
20610 if (item.isLabel) {
20611 itemHtml = "<li class=\"item-divider\">" + (item.groupLabel) + "</li>";
20613 itemHtml = "\n <li class=\"" + (item.className || '') + "\">\n <label class=\"item-" + (item.inputType) + " item-content\">\n <input type=\"" + (item.inputType) + "\" name=\"" + (item.inputName) + "\" value=\"" + (item.value) + "\" " + (item.selected ? 'checked
' : '') + "/>\n <i class=\"icon icon-" + (item.inputType) + "\"></i>\n " + (item.hasMedia ? ("\n <div class=\"item-media\">\n " + (item.icon ? ("<i class=\"icon " + (item.icon) + "\"></i>") : '') + "\n " + (item.image ? ("<img src=\"" + (item.image) + "\">") : '') + "\n </div>\n ") : '') + "\n <div class=\"item-inner\">\n <div class=\"item-title" + (item.color ? (" color-" + (item.color)) : '') + "\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
20618 SmartSelect.prototype.renderItems = function renderItems () {
20620 if (ss.params.renderItems) { return ss.params.renderItems.call(ss, ss.items); }
20621 var itemsHtml = "\n " + (ss.items.map(function (item, index) { return ("" + (ss.renderItem(item, index))); }).join('')) + "\n ";
20625 SmartSelect.prototype.renderPage = function renderPage () {
20627 if (ss.params.renderPage) { return ss.params.renderPage.call(ss, ss.items); }
20628 var pageTitle = ss.params.pageTitle;
20629 if (typeof pageTitle === 'undefined') {
20630 var $itemTitleEl = ss.$el.find('.item
-title
');
20631 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
20633 var cssClass = ss.params.cssClass;
20634 var pageHtml = "\n <div class=\"page smart-select-page " + cssClass + "\" data-name=\"smart-select-page\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"navbar " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"navbar-inner sliding " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"left\">\n <a href=\"#\" class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"ios-only\">" + (ss.params.pageBackLinkText) + "</span>\n </a>\n </div>\n " + (pageTitle ? ("<div class=\"title\">" + pageTitle + "</div>") : '') + "\n " + (ss.params.searchbar ? ("<div class=\"subnavbar\">" + (ss.renderSearchbar()) + "</div>") : '') + "\n </div>\n </div>\n " + (ss.params.searchbar ? '<div
class="searchbar-backdrop"></div>' : '') + "\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div
>\n ";
20638 SmartSelect.prototype.renderPopup = function renderPopup () {
20640 if (ss.params.renderPopup) { return ss.params.renderPopup.call(ss, ss.items); }
20641 var pageTitle = ss.params.pageTitle;
20642 if (typeof pageTitle === 'undefined') {
20643 var $itemTitleEl = ss.$el.find('.item-title');
20644 pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
20646 var cssClass = ss.params.cssClass || '';
20647 var popupHtml = "\n <div
class=\"popup smart
-select
-popup
" + cssClass + " " + (ss.params.popupTabletFullscreen ? 'popup-tablet-fullscreen' : '') + "\" data
-select
-name
=\"" + (ss.selectName) + "\">\n <div
class=\"view
\">\n <div
class=\"page smart
-select
-page
" + (ss.params.searchbar ? 'page-with-subnavbar' : '') + "\" data
-name
=\"smart
-select
-page
\">\n <div
class=\"navbar
" + (ss.params.navbarColorTheme ? ("color
-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div
class=\"navbar
-inner sliding
\">\n <div
class=\"left
\">\n <a href
=\"#\" class=\"link popup
-close
\" data
-popup
=\".smart
-select
-popup
[data
-select
-name
='" + (ss.selectName) + "']\">\n <i
class=\"icon icon
-back
\"></i>\n <span class=\"ios-only\">" + (ss.params.popupCloseLinkText) + "</span>\n </a>\n </div>\n " + (pageTitle ? ("<div
class=\"title
\">" + pageTitle + "</div>") : '') + "\n " + (ss.params.searchbar ? ("<div class=\"subnavbar\">" + (ss.renderSearchbar()) + "</div>") : '') + "\n </div>\n </div>\n " + (ss.params.searchbar ? '<div class="searchbar
-backdrop
"></div>' : '') + "\n <div
class=\"page
-content
\">\n <div
class=\"list smart
-select
-list
-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color
-" + (ss.params.formColorTheme)) : '') + "\">\n <ul
>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul
>\n </div>\n </div>\n </div>\n </div>\n </div
>\n ";
20651 SmartSelect.prototype.renderSheet = function renderSheet () {
20653 if (ss.params.renderSheet) { return ss.params.renderSheet.call(ss, ss.items); }
20654 var cssClass = ss.params.cssClass;
20655 var sheetHtml = "\n <div
class=\"sheet
-modal smart
-select
-sheet
" + cssClass + "\" data
-select
-name
=\"" + (ss.selectName) + "\">\n <div
class=\"toolbar toolbar
-top
" + (ss.params.toolbarColorTheme ? ("color
-" + (ss.params.toolbarColorTheme)) : '') + "\">\n <div
class=\"toolbar
-inner
\">\n <div
class=\"left
\"></div>\n <div class=\"right\">\n <a class=\"link sheet-close\">" + (ss.params.sheetCloseLinkText) + "</a>\n </div>\n </div>\n </div>\n <div class=\"sheet-modal-inner\">\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n </div>\n ";
20659 SmartSelect.prototype.renderPopover = function renderPopover () {
20661 if (ss.params.renderPopover) { return ss.params.renderPopover.call(ss, ss.items); }
20662 var cssClass = ss.params.cssClass;
20663 var popoverHtml = "\n <div
class=\"popover smart
-select
-popover
" + cssClass + "\" data
-select
-name
=\"" + (ss.selectName) + "\">\n <div
class=\"popover
-inner
\">\n <div
class=\"list smart
-select
-list
-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color
-" + (ss.params.formColorTheme)) : '') + "\">\n <ul
>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n ";
20664 return popoverHtml;
20667 SmartSelect.prototype.onOpen = function onOpen (type, containerEl) {
20670 var $containerEl = $(containerEl);
20671 ss.$containerEl = $containerEl;
20672 ss.openedIn = type;
20676 if (ss.params.virtualList) {
20677 ss.vl = app.virtualList.create({
20678 el: $containerEl.find('.virtual-list'),
20680 renderItem: ss.renderItem.bind(ss),
20681 height: ss.params.virtualListHeight,
20682 searchByItem: function searchByItem(query, item) {
20683 if (item.text && item.text.toLowerCase().indexOf(query.trim().toLowerCase()) >= 0) { return true; }
20690 if (ss.params.searchbar) {
20691 var $searchbarEl = $containerEl.find('.searchbar');
20692 if (type === 'page' && app.theme === 'ios') {
20693 $searchbarEl = $(app.navbar.getElByPage($containerEl)).find('.searchbar');
20696 if (ss.params.appendSearchbarNotFound && (type === 'page' || type === 'popup')) {
20697 var $notFoundEl = null;
20699 if (typeof ss.params.appendSearchbarNotFound === 'string') {
20700 $notFoundEl = $(("<div
class=\"block searchbar
-not
-found
\">" + (ss.params.appendSearchbarNotFound) + "</div
>"));
20701 } else if (typeof ss.params.appendSearchbarNotFound === 'boolean') {
20702 $notFoundEl = $('<div class="block searchbar
-not
-found
">Nothing found</div>');
20704 $notFoundEl = ss.params.appendSearchbarNotFound;
20708 $containerEl.find('.page-content').append($notFoundEl[0]);
20712 var searchbarParams = Utils.extend({
20714 backdropEl: $containerEl.find('.searchbar-backdrop'),
20715 searchContainer: (".smart
-select
-list
-" + (ss.id)),
20716 searchIn: '.item-title',
20717 }, typeof ss.params.searchbar === 'object' ? ss.params.searchbar : {});
20719 ss.searchbar = app.searchbar.create(searchbarParams);
20722 // Check for max length
20723 if (ss.maxLength) {
20724 ss.checkMaxLength();
20728 if (ss.params.closeOnSelect) {
20729 ss.$containerEl.find(("input
[type
=\"radio
\"][name
=\"" + (ss.inputName) + "\"]:checked
")).parents('label').once('click', function () {
20734 // Attach input events
20735 ss.attachInputsEvents();
20737 ss.$el.trigger('smartselect:open', ss);
20738 ss.emit('local::open smartSelectOpen', ss);
20741 SmartSelect.prototype.onOpened = function onOpened () {
20744 ss.$el.trigger('smartselect:opened', ss);
20745 ss.emit('local::opened smartSelectOpened', ss);
20748 SmartSelect.prototype.onClose = function onClose () {
20750 if (ss.destroyed) { return; }
20753 if (ss.vl && ss.vl.destroy) {
20760 if (ss.searchbar && ss.searchbar.destroy) {
20761 ss.searchbar.destroy();
20762 ss.searchbar = null;
20763 delete ss.searchbar;
20766 ss.detachInputsEvents();
20768 ss.$el.trigger('smartselect:close', ss);
20769 ss.emit('local::close smartSelectClose', ss);
20772 SmartSelect.prototype.onClosed = function onClosed () {
20774 if (ss.destroyed) { return; }
20776 ss.$containerEl = null;
20777 delete ss.$containerEl;
20779 ss.$el.trigger('smartselect:closed', ss);
20780 ss.emit('local::closed smartSelectClosed', ss);
20783 SmartSelect.prototype.openPage = function openPage () {
20785 if (ss.opened) { return ss; }
20787 var pageHtml = ss.renderPage(ss.items);
20788 var view = ss.getView();
20790 view.router.navigate({
20796 pageBeforeIn: function pageBeforeIn(e, page) {
20797 ss.onOpen('page', page.el);
20799 pageAfterIn: function pageAfterIn(e, page) {
20800 ss.onOpened('page', page.el);
20802 pageBeforeOut: function pageBeforeOut(e, page) {
20803 ss.onClose('page', page.el);
20805 pageAfterOut: function pageAfterOut(e, page) {
20806 ss.onClosed('page', page.el);
20814 SmartSelect.prototype.openPopup = function openPopup () {
20816 if (ss.opened) { return ss; }
20818 var popupHtml = ss.renderPopup(ss.items);
20820 var popupParams = {
20821 content: popupHtml,
20823 popupOpen: function popupOpen(popup) {
20824 ss.onOpen('popup', popup.el);
20826 popupOpened: function popupOpened(popup) {
20827 ss.onOpened('popup', popup.el);
20829 popupClose: function popupClose(popup) {
20830 ss.onClose('popup', popup.el);
20832 popupClosed: function popupClosed(popup) {
20833 ss.onClosed('popup', popup.el);
20838 if (ss.params.routableModals) {
20839 var view = ss.getView();
20840 view.router.navigate({
20844 popup: popupParams,
20848 ss.modal = ss.app.popup.create(popupParams).open();
20853 SmartSelect.prototype.openSheet = function openSheet () {
20855 if (ss.opened) { return ss; }
20857 var sheetHtml = ss.renderSheet(ss.items);
20859 var sheetParams = {
20860 content: sheetHtml,
20862 scrollToEl: ss.$el,
20863 closeByOutsideClick: true,
20865 sheetOpen: function sheetOpen(sheet) {
20866 ss.onOpen('sheet', sheet.el);
20868 sheetOpened: function sheetOpened(sheet) {
20869 ss.onOpened('sheet', sheet.el);
20871 sheetClose: function sheetClose(sheet) {
20872 ss.onClose('sheet', sheet.el);
20874 sheetClosed: function sheetClosed(sheet) {
20875 ss.onClosed('sheet', sheet.el);
20880 if (ss.params.routableModals) {
20881 var view = ss.getView();
20882 view.router.navigate({
20886 sheet: sheetParams,
20890 ss.modal = ss.app.sheet.create(sheetParams).open();
20895 SmartSelect.prototype.openPopover = function openPopover () {
20897 if (ss.opened) { return ss; }
20899 var popoverHtml = ss.renderPopover(ss.items);
20900 var popoverParams = {
20901 content: popoverHtml,
20904 popoverOpen: function popoverOpen(popover) {
20905 ss.onOpen('popover', popover.el);
20907 popoverOpened: function popoverOpened(popover) {
20908 ss.onOpened('popover', popover.el);
20910 popoverClose: function popoverClose(popover) {
20911 ss.onClose('popover', popover.el);
20913 popoverClosed: function popoverClosed(popover) {
20914 ss.onClosed('popover', popover.el);
20918 if (ss.params.routableModals) {
20919 var view = ss.getView();
20920 view.router.navigate({
20924 popover: popoverParams,
20928 ss.modal = ss.app.popover.create(popoverParams).open();
20933 SmartSelect.prototype.open = function open (type) {
20935 if (ss.opened) { return ss; }
20936 var openIn = type || ss.params.openIn;
20937 ss[("open
" + (openIn.split('').map(function (el, index) {
20938 if (index === 0) { return el.toUpperCase(); }
20944 SmartSelect.prototype.close = function close () {
20946 if (!ss.opened) { return ss; }
20947 if (ss.params.routableModals || ss.openedIn === 'page') {
20948 var view = ss.getView();
20949 view.router.back();
20951 ss.modal.once('modalClosed', function () {
20952 Utils.nextTick(function () {
20953 ss.modal.destroy();
20962 SmartSelect.prototype.init = function init () {
20968 SmartSelect.prototype.destroy = function destroy () {
20970 ss.emit('local::beforeDestroy smartSelectBeforeDestroy', ss);
20971 ss.$el.trigger('smartselect:beforedestroy', ss);
20973 delete ss.$el[0].f7SmartSelect;
20974 Utils.deleteProps(ss);
20975 ss.destroyed = true;
20978 return SmartSelect;
20979 }(Framework7Class));
20981 var SmartSelect$1 = {
20982 name: 'smartSelect',
20986 valueEl: undefined,
20987 openIn: 'page', // or 'popup' or 'sheet' or 'popover'
20988 pageTitle: undefined,
20989 pageBackLinkText: 'Back',
20990 popupCloseLinkText: 'Close',
20991 popupTabletFullscreen: false,
20992 sheetCloseLinkText: 'Done',
20994 searchbarPlaceholder: 'Search',
20995 searchbarDisableText: 'Cancel',
20996 closeOnSelect: false,
20997 virtualList: false,
20998 virtualListHeight: undefined,
20999 formColorTheme: undefined,
21000 navbarColorTheme: undefined,
21001 routableModals: true,
21005 Custom render functions
21007 renderPage: undefined,
21008 renderPopup: undefined,
21009 renderSheet: undefined,
21010 renderPopover: undefined,
21011 renderItems: undefined,
21012 renderItem: undefined,
21013 renderSearchbar: undefined,
21017 SmartSelect: SmartSelect,
21019 create: function create() {
21021 app.smartSelect = Utils.extend(
21022 ConstructorMethods({
21023 defaultSelector: '.smart-select',
21024 constructor: SmartSelect,
21026 domProp: 'f7SmartSelect',
21029 open: function open(smartSelectEl) {
21030 var ss = app.smartSelect.get(smartSelectEl);
21031 if (ss && ss.open) { return ss.open(); }
21034 close: function close(smartSelectEl) {
21035 var ss = app.smartSelect.get(smartSelectEl);
21036 if (ss && ss.close) { return ss.close(); }
21044 tabMounted: function tabMounted(tabEl) {
21046 $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
21047 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
21050 tabBeforeRemove: function tabBeforeRemove(tabEl) {
21051 $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
21052 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
21053 smartSelectEl.f7SmartSelect.destroy();
21057 pageInit: function pageInit(page) {
21059 page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
21060 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
21063 pageBeforeRemove: function pageBeforeRemove(page) {
21064 page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
21065 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
21066 smartSelectEl.f7SmartSelect.destroy();
21072 '.smart-select': function open($clickedEl, data) {
21074 if (!$clickedEl[0].f7SmartSelect) {
21075 var ss = app.smartSelect.create(Utils.extend({ el: $clickedEl }, data));
21081 'smart-select-init': {
21082 insert: function insert(vnode) {
21084 var smartSelectEl = vnode.elm;
21085 app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
21087 destroy: function destroy(vnode) {
21088 var smartSelectEl = vnode.elm;
21089 if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
21090 smartSelectEl.f7SmartSelect.destroy();
21102 Converts a Gregorian date to Jalaali.
21104 function toJalaali (gy, gm, gd) {
21105 if (Object.prototype.toString.call(gy) === '[object Date]') {
21107 gm = gy.getMonth() + 1;
21108 gy = gy.getFullYear();
21110 return d2j(g2d(gy, gm, gd))
21114 Converts a Jalaali date to Gregorian.
21116 function toGregorian (jy, jm, jd) {
21117 return d2g(j2d(jy, jm, jd))
21121 // Checks whether a Jalaali date is valid or not.
21123 // function isValidJalaaliDate (jy, jm, jd) {
21124 // return jy >= -61 && jy <= 3177 &&
21125 // jm >= 1 && jm <= 12 &&
21126 // jd >= 1 && jd <= monthLength(jy, jm)
21130 Is this a leap year or not?
21132 function isLeapJalaaliYear (jy) {
21133 return jalCal(jy).leap === 0
21137 Number of days in a given month in a Jalaali year.
21139 function monthLength (jy, jm) {
21140 if (jm <= 6) { return 31 }
21141 if (jm <= 11) { return 30 }
21142 if (isLeapJalaaliYear(jy)) { return 30 }
21147 This function determines if the Jalaali (Persian) year is
21148 leap (366-day long) or is the common year (365 days), and
21149 finds the day in March (Gregorian calendar) of the first
21150 day of the Jalaali year (jy).
21151 @param jy Jalaali calendar year (-61 to 3177)
21153 leap: number of years since the last leap year (0 to 4)
21154 gy: Gregorian year of the beginning of Jalaali year
21155 march: the March day of Farvardin the 1st (1st day of jy)
21156 @see: http://www.astro.uni.torun.pl/~kb/Papers/EMP/PersianC-EMP.htm
21157 @see: http://www.fourmilab.ch/documents/calendar/
21159 function jalCal (jy) {
21160 // Jalaali years starting the 33-year rule.
21161 var breaks = [-61, 9, 38, 199, 426, 686, 756, 818, 1111, 1181, 1210, 1635, 2060, 2097, 2192, 2262, 2324, 2394, 2456, 3178];
21162 var bl = breaks.length;
21165 var jp = breaks[0];
21174 if (jy < jp || jy >= breaks[bl - 1]) { throw new Error('Invalid Jalaali year ' + jy) }
21176 // Find the limiting years for the Jalaali year jy.
21177 for (i = 1; i < bl; i += 1) {
21180 if (jy < jm) { break }
21181 leapJ = leapJ + div(jump, 33) * 8 + div(mod(jump, 33), 4);
21186 // Find the number of leap years from AD 621 to the beginning
21187 // of the current Jalaali year in the Persian calendar.
21188 leapJ = leapJ + div(n, 33) * 8 + div(mod(n, 33) + 3, 4);
21189 if (mod(jump, 33) === 4 && jump - n === 4) { leapJ += 1; }
21191 // And the same in the Gregorian calendar (until the year gy).
21192 leapG = div(gy, 4) - div((div(gy, 100) + 1) * 3, 4) - 150;
21194 // Determine the Gregorian date of Farvardin the 1st.
21195 march = 20 + leapJ - leapG;
21197 // Find how many years have passed since the last leap year.
21198 if (jump - n < 6) { n = n - jump + div(jump + 4, 33) * 33; }
21199 leap = mod(mod(n + 1, 33) - 1, 4);
21204 return { leap: leap,
21211 Converts a date of the Jalaali calendar to the Julian Day number.
21212 @param jy Jalaali year (1 to 3100)
21213 @param jm Jalaali month (1 to 12)
21214 @param jd Jalaali day (1 to 29/31)
21215 @return Julian Day number
21217 function j2d (jy, jm, jd) {
21218 var r = jalCal(jy);
21219 return g2d(r.gy, 3, r.march) + (jm - 1) * 31 - div(jm, 7) * (jm - 7) + jd - 1
21223 Converts the Julian Day number to a date in the Jalaali calendar.
21224 @param jdn Julian Day number
21226 jy: Jalaali year (1 to 3100)
21227 jm: Jalaali month (1 to 12)
21228 jd: Jalaali day (1 to 29/31)
21230 function d2j (jdn) {
21231 var gy = d2g(jdn).gy; // Calculate Gregorian year (gy).
21233 var r = jalCal(jy);
21234 var jdn1f = g2d(gy, 3, r.march);
21239 // Find number of days that passed since 1 Farvardin.
21243 // The first 6 months.
21244 jm = 1 + div(k, 31);
21245 jd = mod(k, 31) + 1;
21251 // The remaining months.
21255 // Previous Jalaali year.
21258 if (r.leap === 1) { k += 1; }
21260 jm = 7 + div(k, 30);
21261 jd = mod(k, 30) + 1;
21269 Calculates the Julian Day number from Gregorian or Julian
21270 calendar dates. This integer number corresponds to the noon of
21271 the date (i.e. 12 hours of Universal Time).
21272 The procedure was tested to be good since 1 March, -100100 (of both
21273 calendars) up to a few million years into the future.
21274 @param gy Calendar year (years BC numbered 0, -1, -2, ...)
21275 @param gm Calendar month (1 to 12)
21276 @param gd Calendar day of the month (1 to 28/29/30/31)
21277 @return Julian Day number
21279 function g2d (gy, gm, gd) {
21280 var d = div((gy + div(gm - 8, 6) + 100100) * 1461, 4) +
21281 div(153 * mod(gm + 9, 12) + 2, 5) +
21283 d = d - div(div(gy + 100100 + div(gm - 8, 6), 100) * 3, 4) + 752;
21288 Calculates Gregorian and Julian calendar dates from the Julian Day number
21289 (jdn) for the period since jdn=-34839655 (i.e. the year -100100 of both
21290 calendars) to some millions years ahead of the present.
21291 @param jdn Julian Day number
21293 gy: Calendar year (years BC numbered 0, -1, -2, ...)
21294 gm: Calendar month (1 to 12)
21295 gd: Calendar day of the month M (1 to 28/29/30/31)
21297 function d2g (jdn) {
21303 j = 4 * jdn + 139361631;
21304 j = j + div(div(4 * jdn + 183187720, 146097) * 3, 4) * 4 - 3908;
21305 i = div(mod(j, 1461), 4) * 5 + 308;
21306 gd = div(mod(i, 153), 5) + 1;
21307 gm = mod(div(i, 153), 12) + 1;
21308 gy = div(j, 1461) - 100100 + div(8 - gm, 6);
21316 Utility helper functions.
21319 function div (a, b) {
21323 function mod (a, b) {
21324 return a - ~~(a / b) * b
21327 function fixDate (y, m, d) {
21329 y += Math.floor(m / 12);
21336 while (d > monthLength(y, m + 1)) {
21337 m = m !== 11 ? m + 1 : 0;
21338 y = m === 0 ? y + 1 : y;
21339 d -= monthLength(y, m + 1);
21342 m = m !== 0 ? m - 1 : 11;
21343 y = m === 11 ? y - 1 : y;
21344 d += monthLength(y, m + 1);
21346 return [y, m || 0, d || 1]
21350 Copyright nainemom <nainemom@gmail.com>
21351 https://github.com/nainemom/idate/blob/dev/package.json
21360 'getTimezoneOffset',
21365 'getUTCMilliseconds',
21379 'setUTCMilliseconds',
21386 'toLocaleDateString',
21387 'toLocaleTimeString',
21395 var DAY_NAMES = ['Shanbe', 'Yekshanbe', 'Doshanbe', 'Seshanbe', 'Chaharshanbe', 'Panjshanbe', 'Jom\'e'];
21396 var PERSIAN_DAY_NAMES = ['شنبه', 'یکشنبه', 'دوشنبه', 'سهشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه'];
21397 var MONTH_NAMES = ['Farvardin', 'Ordibehesht', 'Khordad', 'Tir', 'Mordad', 'Shahrivar', 'Mehr', 'Aban', 'Azar', 'Dey', 'Bahman', 'Esfand'];
21398 var PERSIAN_MONTH_NAMES = ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
21399 var PERSIAN_NUMBERS = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
21401 var IDate = /*@__PURE__*/(function (Date) {
21402 function IDate () {
21406 var args = Array.from(arguments);
21407 if (args.length === 0) {
21409 } else if (args.length === 1) {
21410 date = args[0] instanceof Date ? args[0].getTime() : args[0];
21412 var fixed = fixDate(
21415 typeof args[2] === 'undefined' ? 1 : args[2]);
21416 var converted$1 = toGregorian(fixed[0], fixed[1] + 1, fixed[2]);
21417 date = [converted$1.gy, converted$1.gm - 1, converted$1.gd].concat([args[3] || 0, args[4] || 0, args[5] || 0, args[6] || 0]);
21420 if (Array.isArray(date)) {
21421 this.gdate = new (Function.prototype.bind.apply( Date, [ null ].concat( date) ));
21423 this.gdate = new Date(date);
21426 var converted = toJalaali(this.gdate.getFullYear(), this.gdate.getMonth() + 1, this.gdate.getDate());
21427 this.jdate = [converted.jy, converted.jm - 1, converted.jd];
21429 methods.forEach(function (method) {
21430 IDate.prototype[method] = function () {
21433 return (ref = this.gdate)[method].apply(ref, arguments)
21438 if ( Date ) IDate.__proto__ = Date;
21439 IDate.prototype = Object.create( Date && Date.prototype );
21440 IDate.prototype.constructor = IDate;
21442 IDate.prototype.getFullYear = function getFullYear () {
21443 return this.jdate[0]
21446 IDate.prototype.setFullYear = function setFullYear (value) {
21447 this.jdate = fixDate(value, this.jdate[1], this.jdate[2]);
21449 return this.gdate.getTime()
21452 IDate.prototype.getMonth = function getMonth () {
21453 return this.jdate[1]
21456 IDate.prototype.setMonth = function setMonth (value) {
21457 this.jdate = fixDate(this.jdate[0], value, this.jdate[2]);
21459 return this.gdate.getTime()
21462 IDate.prototype.getDate = function getDate () {
21463 return this.jdate[2]
21466 IDate.prototype.setDate = function setDate (value) {
21467 this.jdate = fixDate(this.jdate[0], this.jdate[1], value);
21469 return this.gdate.getTime()
21472 IDate.prototype.getDay = function getDay () {
21473 return (this.gdate.getDay() + 1) % 7
21476 IDate.prototype.syncDate = function syncDate () {
21477 var converted = toGregorian(this.jdate[0], this.jdate[1] + 1, this.jdate[2]);
21478 this.gdate.setFullYear(converted.gy);
21479 this.gdate.setMonth(converted.gm - 1);
21480 this.gdate.setDate(converted.gd);
21482 IDate.prototype.toString = function toString (persianString) {
21483 if ( persianString === void 0 ) persianString = true;
21485 var replaceNums = function (str) {
21486 return str.replace(/./g, function (c) { return PERSIAN_NUMBERS[c] || c; })
21488 var padNumber = function (num) { return num.toString().length === 1 ? ("0" + num) : num.toString(); };
21489 var time = (padNumber(this.getHours())) + ":" + (padNumber(this.getMinutes())) + ":" + (padNumber(this.getSeconds()));
21490 if (persianString) {
21491 return replaceNums(((PERSIAN_DAY_NAMES[this.getDay()]) + " " + (this.getDate()) + " " + (PERSIAN_MONTH_NAMES[this.getMonth()]) + " " + (this.getFullYear()) + " ساعت " + time))
21493 return ((DAY_NAMES[this.getDay()]) + " " + (this.getDate()) + " " + (MONTH_NAMES[this.getMonth()]) + " " + (this.getFullYear()) + " " + time)
21499 var Calendar = /*@__PURE__*/(function (Framework7Class$$1) {
21500 function Calendar(app, params) {
21501 if ( params === void 0 ) params = {};
21503 Framework7Class$$1.call(this, params, [app]);
21504 var calendar = this;
21506 calendar.params = Utils.extend({}, app.params.calendar, params);
21508 if (calendar.params.calendarType === 'jalali') {
21509 Object.keys(calendar.params.jalali).forEach(function (param) {
21510 if (!params[param]) {
21511 calendar.params[param] = calendar.params.jalali[param];
21516 if (calendar.params.calendarType === 'jalali') {
21517 calendar.DateHandleClass = IDate;
21519 calendar.DateHandleClass = Date;
21523 if (calendar.params.containerEl) {
21524 $containerEl = $(calendar.params.containerEl);
21525 if ($containerEl.length === 0) { return calendar; }
21529 if (calendar.params.inputEl) {
21530 $inputEl = $(calendar.params.inputEl);
21535 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
21537 if (!view) { view = app.views.main; }
21539 var isHorizontal = calendar.params.direction === 'horizontal';
21542 if (isHorizontal) {
21543 inverter = app.rtl ? -1 : 1;
21546 Utils.extend(calendar, {
21548 $containerEl: $containerEl,
21549 containerEl: $containerEl && $containerEl[0],
21550 inline: $containerEl && $containerEl.length > 0,
21551 $inputEl: $inputEl,
21552 inputEl: $inputEl && $inputEl[0],
21553 initialized: false,
21555 url: calendar.params.url,
21556 isHorizontal: isHorizontal,
21557 inverter: inverter,
21562 function onInputClick() {
21565 function onInputFocus(e) {
21566 e.preventDefault();
21568 function onHtmlClick(e) {
21569 var $targetEl = $(e.target);
21570 if (calendar.isPopover()) { return; }
21571 if (!calendar.opened || calendar.closing) { return; }
21572 if ($targetEl.closest('[class*="backdrop
"]').length) { return; }
21573 if ($inputEl && $inputEl.length > 0) {
21574 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal, .calendar-modal').length === 0) {
21577 } else if ($(e.target).closest('.sheet-modal, .calendar-modal').length === 0) {
21583 Utils.extend(calendar, {
21584 attachInputEvents: function attachInputEvents() {
21585 calendar.$inputEl.on('click', onInputClick);
21586 if (calendar.params.inputReadOnly) {
21587 calendar.$inputEl.on('focus mousedown', onInputFocus);
21590 detachInputEvents: function detachInputEvents() {
21591 calendar.$inputEl.off('click', onInputClick);
21592 if (calendar.params.inputReadOnly) {
21593 calendar.$inputEl.off('focus mousedown', onInputFocus);
21596 attachHtmlEvents: function attachHtmlEvents() {
21597 app.on('click', onHtmlClick);
21599 detachHtmlEvents: function detachHtmlEvents() {
21600 app.off('click', onHtmlClick);
21603 calendar.attachCalendarEvents = function attachCalendarEvents() {
21604 var allowItemClick = true;
21611 var touchStartTime;
21613 var currentTranslate;
21620 var $el = calendar.$el;
21621 var $wrapperEl = calendar.$wrapperEl;
21623 function handleTouchStart(e) {
21624 if (isMoved || isTouched) { return; }
21626 touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
21627 touchCurrentX = touchStartX;
21628 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
21629 touchCurrentY = touchStartY;
21630 touchStartTime = (new calendar.DateHandleClass()).getTime();
21632 allowItemClick = true;
21633 isScrolling = undefined;
21634 currentTranslate = calendar.monthsTranslate;
21636 function handleTouchMove(e) {
21637 if (!isTouched) { return; }
21638 var isH = calendar.isHorizontal;
21640 touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
21641 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
21642 if (typeof isScrolling === 'undefined') {
21643 isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
21645 if (isH && isScrolling) {
21649 e.preventDefault();
21650 if (calendar.animating) {
21654 allowItemClick = false;
21658 wrapperWidth = $wrapperEl[0].offsetWidth;
21659 wrapperHeight = $wrapperEl[0].offsetHeight;
21660 $wrapperEl.transition(0);
21663 touchesDiff = isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;
21664 percentage = touchesDiff / (isH ? wrapperWidth : wrapperHeight);
21665 currentTranslate = ((calendar.monthsTranslate * calendar.inverter) + percentage) * 100;
21667 // Transform wrapper
21668 $wrapperEl.transform(("translate3d(" + (isH ? currentTranslate : 0) + "%, " + (isH ? 0 : currentTranslate) + "%, 0)"));
21670 function handleTouchEnd() {
21671 if (!isTouched || !isMoved) {
21679 touchEndTime = new calendar.DateHandleClass().getTime();
21680 if (touchEndTime - touchStartTime < 300) {
21681 if (Math.abs(touchesDiff) < 10) {
21682 calendar.resetMonth();
21683 } else if (touchesDiff >= 10) {
21684 if (app.rtl) { calendar.nextMonth(); }
21685 else { calendar.prevMonth(); }
21686 } else if (app.rtl) { calendar.prevMonth(); }
21687 else { calendar.nextMonth(); }
21688 } else if (percentage <= -0.5) {
21689 if (app.rtl) { calendar.prevMonth(); }
21690 else { calendar.nextMonth(); }
21691 } else if (percentage >= 0.5) {
21692 if (app.rtl) { calendar.nextMonth(); }
21693 else { calendar.prevMonth(); }
21695 calendar.resetMonth();
21699 setTimeout(function () {
21700 allowItemClick = true;
21704 function handleDayClick(e) {
21705 if (!allowItemClick) { return; }
21706 var $dayEl = $(e.target).parents('.calendar-day');
21707 if ($dayEl.length === 0 && $(e.target).hasClass('calendar-day')) {
21708 $dayEl = $(e.target);
21710 if ($dayEl.length === 0) { return; }
21711 if ($dayEl.hasClass('calendar-day-disabled')) { return; }
21712 if (!calendar.params.rangePicker) {
21713 if ($dayEl.hasClass('calendar-day-next')) { calendar.nextMonth(); }
21714 if ($dayEl.hasClass('calendar-day-prev')) { calendar.prevMonth(); }
21716 var dateYear = parseInt($dayEl.attr('data-year'), 10);
21717 var dateMonth = parseInt($dayEl.attr('data-month'), 10);
21718 var dateDay = parseInt($dayEl.attr('data-day'), 10);
21720 'local::dayClick calendarDayClick',
21727 if (!$dayEl.hasClass('calendar-day-selected') || calendar.params.multiple || calendar.params.rangePicker) {
21728 calendar.addValue(new calendar.DateHandleClass(dateYear, dateMonth, dateDay, 0, 0, 0));
21730 if (calendar.params.closeOnSelect) {
21732 (calendar.params.rangePicker && calendar.value.length === 2)
21733 || !calendar.params.rangePicker
21740 function onNextMonthClick() {
21741 calendar.nextMonth();
21744 function onPrevMonthClick() {
21745 calendar.prevMonth();
21748 function onNextYearClick() {
21749 calendar.nextYear();
21752 function onPrevYearClick() {
21753 calendar.prevYear();
21756 var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
21757 // Selectors clicks
21758 $el.find('.calendar-prev-month-button').on('click', onPrevMonthClick);
21759 $el.find('.calendar-next-month-button').on('click', onNextMonthClick);
21760 $el.find('.calendar-prev-year-button').on('click', onPrevYearClick);
21761 $el.find('.calendar-next-year-button').on('click', onNextYearClick);
21763 $wrapperEl.on('click', handleDayClick);
21766 if (calendar.params.touchMove) {
21767 $wrapperEl.on(app.touchEvents.start, handleTouchStart, passiveListener);
21768 app.on('touchmove:active', handleTouchMove);
21769 app.on('touchend:passive', handleTouchEnd);
21773 calendar.detachCalendarEvents = function detachCalendarEvents() {
21774 $el.find('.calendar-prev-month-button').off('click', onPrevMonthClick);
21775 $el.find('.calendar-next-month-button').off('click', onNextMonthClick);
21776 $el.find('.calendar-prev-year-button').off('click', onPrevYearClick);
21777 $el.find('.calendar-next-year-button').off('click', onNextYearClick);
21778 $wrapperEl.off('click', handleDayClick);
21780 if (calendar.params.touchMove) {
21781 $wrapperEl.off(app.touchEvents.start, handleTouchStart, passiveListener);
21782 app.off('touchmove:active', handleTouchMove);
21783 app.off('touchend:passive', handleTouchEnd);
21794 if ( Framework7Class$$1 ) Calendar.__proto__ = Framework7Class$$1;
21795 Calendar.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
21796 Calendar.prototype.constructor = Calendar;
21797 // eslint-disable-next-line
21798 Calendar.prototype.normalizeDate = function normalizeDate (date) {
21799 var calendar = this;
21800 var d = new calendar.DateHandleClass(date);
21801 return new calendar.DateHandleClass(d.getFullYear(), d.getMonth(), d.getDate());
21804 Calendar.prototype.normalizeValues = function normalizeValues (values) {
21805 var calendar = this;
21806 var newValues = [];
21807 if (values && Array.isArray(values)) {
21808 newValues = values.map(function (val) { return calendar.normalizeDate(val); });
21813 Calendar.prototype.initInput = function initInput () {
21814 var calendar = this;
21815 if (!calendar.$inputEl) { return; }
21816 if (calendar.params.inputReadOnly) { calendar.$inputEl.prop('readOnly', true); }
21819 Calendar.prototype.isPopover = function isPopover () {
21820 var calendar = this;
21821 var app = calendar.app;
21822 var modal = calendar.modal;
21823 var params = calendar.params;
21824 if (params.openIn === 'sheet') { return false; }
21825 if (modal && modal.type !== 'popover') { return false; }
21827 if (!calendar.inline && calendar.inputEl) {
21828 if (params.openIn === 'popover') { return true; }
21829 if (app.device.ios) {
21830 return !!app.device.ipad;
21832 if (app.width >= 768) {
21839 Calendar.prototype.formatDate = function formatDate (d) {
21840 var calendar = this;
21841 var date = new calendar.DateHandleClass(d);
21842 var year = date.getFullYear();
21843 var month = date.getMonth();
21844 var month1 = month + 1;
21845 var day = date.getDate();
21846 var weekDay = date.getDay();
21847 var ref = calendar.params;
21848 var dateFormat = ref.dateFormat;
21849 var monthNames = ref.monthNames;
21850 var monthNamesShort = ref.monthNamesShort;
21851 var dayNames = ref.dayNames;
21852 var dayNamesShort = ref.dayNamesShort;
21855 .replace(/yyyy/g, year)
21856 .replace(/yy/g, String(year).substring(2))
21857 .replace(/mm/g, month1 < 10 ? ("0" + month1) : month1)
21858 .replace(/m(\W+)/g, (month1 + "$1"))
21859 .replace(/MM/g, monthNames[month])
21860 .replace(/M(\W+)/g, ((monthNamesShort[month]) + "$1"))
21861 .replace(/dd/g, day < 10 ? ("0" + day) : day)
21862 .replace(/d(\W+)/g, (day + "$1"))
21863 .replace(/DD/g, dayNames[weekDay])
21864 .replace(/D(\W+)/g, ((dayNamesShort[weekDay]) + "$1"));
21867 Calendar.prototype.formatValue = function formatValue () {
21868 var calendar = this;
21869 var value = calendar.value;
21870 if (calendar.params.formatValue) {
21871 return calendar.params.formatValue.call(calendar, value);
21874 .map(function (v) { return calendar.formatDate(v); })
21875 .join(calendar.params.rangePicker ? ' - ' : ', ');
21878 Calendar.prototype.addValue = function addValue (newValue) {
21879 var calendar = this;
21880 var ref = calendar.params;
21881 var multiple = ref.multiple;
21882 var rangePicker = ref.rangePicker;
21883 var rangePickerMinDays = ref.rangePickerMinDays;
21884 var rangePickerMaxDays = ref.rangePickerMaxDays;
21886 if (!calendar.value) { calendar.value = []; }
21888 for (var i = 0; i < calendar.value.length; i += 1) {
21889 if (new calendar.DateHandleClass(newValue).getTime() === new calendar.DateHandleClass(calendar.value[i]).getTime()) {
21893 if (typeof inValuesIndex === 'undefined') {
21894 calendar.value.push(newValue);
21896 calendar.value.splice(inValuesIndex, 1);
21898 calendar.updateValue();
21899 } else if (rangePicker) {
21900 if (!calendar.value) { calendar.value = []; }
21901 if (calendar.value.length === 2 || calendar.value.length === 0) {
21902 calendar.value = [];
21905 if ((calendar.value.length === 0
21906 || ((Math.abs(calendar.value[0].getTime() - newValue.getTime()) >= (rangePickerMinDays - 1) * 60 * 60 * 24 * 1000) && (rangePickerMaxDays === 0 || Math.abs(calendar.value[0].getTime() - newValue.getTime()) <= (rangePickerMaxDays - 1) * 60 * 60 * 24 * 1000)))) { calendar.value.push(newValue); }
21907 else { calendar.value = []; }
21909 calendar.value.sort(function (a, b) { return a - b; });
21910 calendar.updateValue();
21912 calendar.value = [newValue];
21913 calendar.updateValue();
21917 Calendar.prototype.setValue = function setValue (values) {
21918 var calendar = this;
21919 calendar.value = values;
21920 calendar.updateValue();
21923 Calendar.prototype.getValue = function getValue () {
21924 var calendar = this;
21925 return calendar.value;
21928 Calendar.prototype.updateValue = function updateValue (onlyHeader) {
21929 var calendar = this;
21930 var $el = calendar.$el;
21931 var $wrapperEl = calendar.$wrapperEl;
21932 var $inputEl = calendar.$inputEl;
21933 var value = calendar.value;
21934 var params = calendar.params;
21936 if ($el && $el.length > 0) {
21937 $wrapperEl.find('.calendar-day-selected').removeClass('calendar-day-selected');
21939 if (params.rangePicker && value.length === 2) {
21940 for (i = new calendar.DateHandleClass(value[0]).getTime(); i <= new calendar.DateHandleClass(value[1]).getTime(); i += 24 * 60 * 60 * 1000) {
21941 valueDate = new calendar.DateHandleClass(i);
21942 $wrapperEl.find((".calendar
-day
[data
-date
=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
21945 for (i = 0; i < calendar.value.length; i += 1) {
21946 valueDate = new calendar.DateHandleClass(value[i]);
21947 $wrapperEl.find((".calendar
-day
[data
-date
=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
21952 calendar.emit('local::change calendarChange', calendar, value);
21956 if (($inputEl && $inputEl.length) || params.header) {
21957 var inputValue = calendar.formatValue(value);
21958 if (params.header && $el && $el.length) {
21959 $el.find('.calendar-selected-date').text(inputValue);
21961 if ($inputEl && $inputEl.length && !onlyHeader) {
21962 $inputEl.val(inputValue);
21963 $inputEl.trigger('change');
21968 Calendar.prototype.updateCurrentMonthYear = function updateCurrentMonthYear (dir) {
21969 var calendar = this;
21970 var $months = calendar.$months;
21971 var $el = calendar.$el;
21972 var params = calendar.params;
21973 if (typeof dir === 'undefined') {
21974 calendar.currentMonth = parseInt($months.eq(1).attr('data-month'), 10);
21975 calendar.currentYear = parseInt($months.eq(1).attr('data-year'), 10);
21977 calendar.currentMonth = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-month'), 10);
21978 calendar.currentYear = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-year'), 10);
21980 $el.find('.current-month-value').text(params.monthNames[calendar.currentMonth]);
21981 $el.find('.current-year-value').text(calendar.currentYear);
21984 Calendar.prototype.update = function update () {
21985 var calendar = this;
21986 var currentYear = calendar.currentYear;
21987 var currentMonth = calendar.currentMonth;
21988 var $wrapperEl = calendar.$wrapperEl;
21989 var currentDate = new calendar.DateHandleClass(currentYear, currentMonth);
21990 var prevMonthHtml = calendar.renderMonth(currentDate, 'prev');
21991 var currentMonthHtml = calendar.renderMonth(currentDate);
21992 var nextMonthHtml = calendar.renderMonth(currentDate, 'next');
21996 .html(("" + prevMonthHtml + currentMonthHtml + nextMonthHtml))
21997 .transform('translate3d(0,0,0)');
21998 calendar.$months = $wrapperEl.find('.calendar-month');
21999 calendar.monthsTranslate = 0;
22000 calendar.setMonthsTranslate();
22001 calendar.$months.each(function (index, monthEl) {
22003 'local::monthAdd calendarMonthAdd',
22009 Calendar.prototype.onMonthChangeStart = function onMonthChangeStart (dir) {
22010 var calendar = this;
22011 var $months = calendar.$months;
22012 var currentYear = calendar.currentYear;
22013 var currentMonth = calendar.currentMonth;
22014 calendar.updateCurrentMonthYear(dir);
22015 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
22016 var currentIndex = dir === 'next' ? $months.length - 1 : 0;
22018 $months.eq(currentIndex).addClass('calendar-month-current');
22019 $months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'calendar-month-prev' : 'calendar-month-next');
22022 'local::monthYearChangeStart calendarMonthYearChangeStart',
22029 Calendar.prototype.onMonthChangeEnd = function onMonthChangeEnd (dir, rebuildBoth) {
22030 var calendar = this;
22031 var currentYear = calendar.currentYear;
22032 var currentMonth = calendar.currentMonth;
22033 var $wrapperEl = calendar.$wrapperEl;
22034 var monthsTranslate = calendar.monthsTranslate;
22035 calendar.animating = false;
22038 var currentMonthHtml;
22040 .find('.calendar-month:not(.calendar-month-prev):not(.calendar-month-current):not(.calendar-month-next)')
22043 if (typeof dir === 'undefined') {
22044 dir = 'next'; // eslint-disable-line
22045 rebuildBoth = true; // eslint-disable-line
22047 if (!rebuildBoth) {
22048 currentMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), dir);
22050 $wrapperEl.find('.calendar-month-next, .calendar-month-prev').remove();
22051 prevMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), 'prev');
22052 nextMonthHtml = calendar.renderMonth(new calendar.DateHandleClass(currentYear, currentMonth), 'next');
22054 if (dir === 'next' || rebuildBoth) {
22055 $wrapperEl.append(currentMonthHtml || nextMonthHtml);
22057 if (dir === 'prev' || rebuildBoth) {
22058 $wrapperEl.prepend(currentMonthHtml || prevMonthHtml);
22060 var $months = $wrapperEl.find('.calendar-month');
22061 calendar.$months = $months;
22062 calendar.setMonthsTranslate(monthsTranslate);
22064 'local::monthAdd calendarMonthAdd',
22066 dir === 'next' ? $months.eq($months.length - 1)[0] : $months.eq(0)[0]
22069 'local::monthYearChangeEnd calendarMonthYearChangeEnd',
22076 Calendar.prototype.setMonthsTranslate = function setMonthsTranslate (translate) {
22077 var calendar = this;
22078 var $months = calendar.$months;
22079 var isH = calendar.isHorizontal;
22080 var inverter = calendar.inverter;
22081 // eslint-disable-next-line
22082 translate = translate || calendar.monthsTranslate || 0;
22083 if (typeof calendar.monthsTranslate === 'undefined') {
22084 calendar.monthsTranslate = translate;
22086 $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
22087 var prevMonthTranslate = -(translate + 1) * 100 * inverter;
22088 var currentMonthTranslate = -translate * 100 * inverter;
22089 var nextMonthTranslate = -(translate - 1) * 100 * inverter;
22091 .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
22092 .addClass('calendar-month-prev');
22094 .transform(("translate3d(" + (isH ? currentMonthTranslate : 0) + "%, " + (isH ? 0 : currentMonthTranslate) + "%, 0)"))
22095 .addClass('calendar-month-current');
22097 .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
22098 .addClass('calendar-month-next');
22101 Calendar.prototype.nextMonth = function nextMonth (transition) {
22102 var calendar = this;
22103 var params = calendar.params;
22104 var $wrapperEl = calendar.$wrapperEl;
22105 var inverter = calendar.inverter;
22106 var isH = calendar.isHorizontal;
22107 if (typeof transition === 'undefined' || typeof transition === 'object') {
22108 transition = ''; // eslint-disable-line
22109 if (!params.animate) { transition = 0; } // eslint-disable-line
22111 var nextMonth = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-month'), 10);
22112 var nextYear = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-year'), 10);
22113 var nextDate = new calendar.DateHandleClass(nextYear, nextMonth);
22114 var nextDateTime = nextDate.getTime();
22115 var transitionEndCallback = !calendar.animating;
22116 if (params.maxDate) {
22117 if (nextDateTime > new calendar.DateHandleClass(params.maxDate).getTime()) {
22118 calendar.resetMonth();
22122 calendar.monthsTranslate -= 1;
22123 if (nextMonth === calendar.currentMonth) {
22124 var nextMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
22125 var nextMonthHtml = $(calendar.renderMonth(nextDateTime, 'next'))
22126 .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
22127 .addClass('calendar-month-next');
22128 $wrapperEl.append(nextMonthHtml[0]);
22129 calendar.$months = $wrapperEl.find('.calendar-month');
22131 'local::monthAdd calendarMonthAdd',
22132 calendar.$months.eq(calendar.$months.length - 1)[0]
22135 calendar.animating = true;
22136 calendar.onMonthChangeStart('next');
22137 var translate = (calendar.monthsTranslate * 100) * inverter;
22139 $wrapperEl.transition(transition).transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
22140 if (transitionEndCallback) {
22141 $wrapperEl.transitionEnd(function () {
22142 calendar.onMonthChangeEnd('next');
22145 if (!params.animate) {
22146 calendar.onMonthChangeEnd('next');
22150 Calendar.prototype.prevMonth = function prevMonth (transition) {
22151 var calendar = this;
22152 var params = calendar.params;
22153 var $wrapperEl = calendar.$wrapperEl;
22154 var inverter = calendar.inverter;
22155 var isH = calendar.isHorizontal;
22156 if (typeof transition === 'undefined' || typeof transition === 'object') {
22157 transition = ''; // eslint-disable-line
22158 if (!params.animate) { transition = 0; } // eslint-disable-line
22160 var prevMonth = parseInt(calendar.$months.eq(0).attr('data-month'), 10);
22161 var prevYear = parseInt(calendar.$months.eq(0).attr('data-year'), 10);
22162 var prevDate = new calendar.DateHandleClass(prevYear, prevMonth + 1, -1);
22163 var prevDateTime = prevDate.getTime();
22164 var transitionEndCallback = !calendar.animating;
22165 if (params.minDate) {
22166 var minDate = new calendar.DateHandleClass(params.minDate);
22167 minDate = new calendar.DateHandleClass(minDate.getFullYear(), minDate.getMonth(), 1);
22168 if (prevDateTime < minDate.getTime()) {
22169 calendar.resetMonth();
22173 calendar.monthsTranslate += 1;
22174 if (prevMonth === calendar.currentMonth) {
22175 var prevMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
22176 var prevMonthHtml = $(calendar.renderMonth(prevDateTime, 'prev'))
22177 .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
22178 .addClass('calendar-month-prev');
22179 $wrapperEl.prepend(prevMonthHtml[0]);
22180 calendar.$months = $wrapperEl.find('.calendar-month');
22182 'local::monthAdd calendarMonthAdd',
22183 calendar.$months.eq(0)[0]
22186 calendar.animating = true;
22187 calendar.onMonthChangeStart('prev');
22188 var translate = (calendar.monthsTranslate * 100) * inverter;
22190 .transition(transition)
22191 .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
22192 if (transitionEndCallback) {
22193 $wrapperEl.transitionEnd(function () {
22194 calendar.onMonthChangeEnd('prev');
22197 if (!params.animate) {
22198 calendar.onMonthChangeEnd('prev');
22202 Calendar.prototype.resetMonth = function resetMonth (transition) {
22203 if ( transition === void 0 ) transition = '';
22205 var calendar = this;
22206 var $wrapperEl = calendar.$wrapperEl;
22207 var inverter = calendar.inverter;
22208 var isH = calendar.isHorizontal;
22209 var monthsTranslate = calendar.monthsTranslate;
22210 var translate = (monthsTranslate * 100) * inverter;
22212 .transition(transition)
22213 .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
22215 // eslint-disable-next-line
22216 Calendar.prototype.setYearMonth = function setYearMonth (year, month, transition) {
22217 var calendar = this;
22218 var params = calendar.params;
22219 var isH = calendar.isHorizontal;
22220 var $wrapperEl = calendar.$wrapperEl;
22221 var inverter = calendar.inverter;
22222 // eslint-disable-next-line
22223 if (typeof year === 'undefined') { year = calendar.currentYear; }
22224 // eslint-disable-next-line
22225 if (typeof month === 'undefined') { month = calendar.currentMonth; }
22226 if (typeof transition === 'undefined' || typeof transition === 'object') {
22227 // eslint-disable-next-line
22229 // eslint-disable-next-line
22230 if (!params.animate) { transition = 0; }
22233 if (year < calendar.currentYear) {
22234 targetDate = new calendar.DateHandleClass(year, month + 1, -1).getTime();
22236 targetDate = new calendar.DateHandleClass(year, month).getTime();
22238 if (params.maxDate && targetDate > new calendar.DateHandleClass(params.maxDate).getTime()) {
22241 if (params.minDate) {
22242 var minDate = new calendar.DateHandleClass(params.minDate);
22243 minDate = new calendar.DateHandleClass(minDate.getFullYear(), minDate.getMonth(), 1);
22244 if (targetDate < minDate.getTime()) {
22248 var currentDate = new calendar.DateHandleClass(calendar.currentYear, calendar.currentMonth).getTime();
22249 var dir = targetDate > currentDate ? 'next' : 'prev';
22250 var newMonthHTML = calendar.renderMonth(new calendar.DateHandleClass(year, month));
22251 calendar.monthsTranslate = calendar.monthsTranslate || 0;
22252 var prevTranslate = calendar.monthsTranslate;
22253 var monthTranslate;
22254 var transitionEndCallback = !calendar.animating;
22255 if (targetDate > currentDate) {
22257 calendar.monthsTranslate -= 1;
22258 if (!calendar.animating) { calendar.$months.eq(calendar.$months.length - 1).remove(); }
22259 $wrapperEl.append(newMonthHTML);
22260 calendar.$months = $wrapperEl.find('.calendar-month');
22261 monthTranslate = -(prevTranslate - 1) * 100 * inverter;
22263 .eq(calendar.$months.length - 1)
22264 .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
22265 .addClass('calendar-month-next');
22268 calendar.monthsTranslate += 1;
22269 if (!calendar.animating) { calendar.$months.eq(0).remove(); }
22270 $wrapperEl.prepend(newMonthHTML);
22271 calendar.$months = $wrapperEl.find('.calendar-month');
22272 monthTranslate = -(prevTranslate + 1) * 100 * inverter;
22275 .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
22276 .addClass('calendar-month-prev');
22279 'local::monthAdd calendarMonthAdd',
22281 ? calendar.$months.eq(calendar.$months.length - 1)[0]
22282 : calendar.$months.eq(0)[0]
22285 calendar.animating = true;
22286 calendar.onMonthChangeStart(dir);
22287 var wrapperTranslate = (calendar.monthsTranslate * 100) * inverter;
22289 .transition(transition)
22290 .transform(("translate3d(" + (isH ? wrapperTranslate : 0) + "%, " + (isH ? 0 : wrapperTranslate) + "%, 0)"));
22291 if (transitionEndCallback) {
22292 $wrapperEl.transitionEnd(function () {
22293 calendar.onMonthChangeEnd(dir, true);
22296 if (!params.animate) {
22297 calendar.onMonthChangeEnd(dir);
22301 Calendar.prototype.nextYear = function nextYear () {
22302 var calendar = this;
22303 calendar.setYearMonth(calendar.currentYear + 1);
22306 Calendar.prototype.prevYear = function prevYear () {
22307 var calendar = this;
22308 calendar.setYearMonth(calendar.currentYear - 1);
22310 // eslint-disable-next-line
22311 Calendar.prototype.dateInRange = function dateInRange (dayDate, range) {
22312 var calendar = this;
22315 if (!range) { return false; }
22316 if (Array.isArray(range)) {
22317 for (i = 0; i < range.length; i += 1) {
22318 if (range[i].from || range[i].to) {
22319 if (range[i].from && range[i].to) {
22320 if ((dayDate <= new calendar.DateHandleClass(range[i].to).getTime()) && (dayDate >= new calendar.DateHandleClass(range[i].from).getTime())) {
22323 } else if (range[i].from) {
22324 if (dayDate >= new calendar.DateHandleClass(range[i].from).getTime()) {
22327 } else if (range[i].to) {
22328 if (dayDate <= new calendar.DateHandleClass(range[i].to).getTime()) {
22332 } else if (range[i].date) {
22333 if (dayDate === new calendar.DateHandleClass(range[i].date).getTime()) {
22336 } else if (dayDate === new calendar.DateHandleClass(range[i]).getTime()) {
22340 } else if (range.from || range.to) {
22341 if (range.from && range.to) {
22342 if ((dayDate <= new calendar.DateHandleClass(range.to).getTime()) && (dayDate >= new calendar.DateHandleClass(range.from).getTime())) {
22345 } else if (range.from) {
22346 if (dayDate >= new calendar.DateHandleClass(range.from).getTime()) {
22349 } else if (range.to) {
22350 if (dayDate <= new calendar.DateHandleClass(range.to).getTime()) {
22354 } else if (range.date) {
22355 match = dayDate === new calendar.DateHandleClass(range.date).getTime();
22356 } else if (typeof range === 'function') {
22357 match = range(new calendar.DateHandleClass(dayDate));
22361 // eslint-disable-next-line
22362 Calendar.prototype.daysInMonth = function daysInMonth (date) {
22363 var calendar = this;
22364 var d = new calendar.DateHandleClass(date);
22365 return new calendar.DateHandleClass(d.getFullYear(), d.getMonth() + 1, 0).getDate();
22368 Calendar.prototype.renderMonths = function renderMonths (date) {
22369 var calendar = this;
22370 if (calendar.params.renderMonths) {
22371 return calendar.params.renderMonths.call(calendar, date);
22373 return ("\n <div
class=\"calendar
-months
-wrapper
\">\n " + (calendar.renderMonth(date, 'prev')) + "\n " + (calendar.renderMonth(date)) + "\n " + (calendar.renderMonth(date, 'next')) + "\n </div
>\n ").trim();
22376 Calendar.prototype.renderMonth = function renderMonth (d, offset) {
22377 var calendar = this;
22378 var params = calendar.params;
22379 var value = calendar.value;
22380 if (params.renderMonth) {
22381 return params.renderMonth.call(calendar, d, offset);
22383 var date = new calendar.DateHandleClass(d);
22384 var year = date.getFullYear();
22385 var month = date.getMonth();
22387 if (offset === 'next') {
22388 if (month === 11) { date = new calendar.DateHandleClass(year + 1, 0); }
22389 else { date = new calendar.DateHandleClass(year, month + 1, 1); }
22391 if (offset === 'prev') {
22392 if (month === 0) { date = new calendar.DateHandleClass(year - 1, 11); }
22393 else { date = new calendar.DateHandleClass(year, month - 1, 1); }
22395 if (offset === 'next' || offset === 'prev') {
22396 month = date.getMonth();
22397 year = date.getFullYear();
22400 var currentValues = [];
22401 var today = new calendar.DateHandleClass().setHours(0, 0, 0, 0);
22402 var minDate = params.minDate ? new calendar.DateHandleClass(params.minDate).getTime() : null;
22403 var maxDate = params.maxDate ? new calendar.DateHandleClass(params.maxDate).getTime() : null;
22406 var daysInPrevMonth = calendar.daysInMonth(new calendar.DateHandleClass(date.getFullYear(), date.getMonth()).getTime() - (10 * 24 * 60 * 60 * 1000));
22407 var daysInMonth = calendar.daysInMonth(date);
22408 var minDayNumber = params.firstDay === 6 ? 0 : 1;
22410 var monthHtml = '';
22411 var dayIndex = 0 + (params.firstDay - 1);
22414 var firstDayOfMonthIndex = new calendar.DateHandleClass(date.getFullYear(), date.getMonth()).getDay();
22415 if (firstDayOfMonthIndex === 0) { firstDayOfMonthIndex = 7; }
22417 if (value && value.length) {
22418 for (var i = 0; i < value.length; i += 1) {
22419 currentValues.push(new calendar.DateHandleClass(value[i]).setHours(0, 0, 0, 0));
22423 for (var row = 1; row <= rows; row += 1) {
22425 var loop = function ( col ) {
22427 var dayDate = (void 0);
22428 var dayNumber = dayIndex - firstDayOfMonthIndex;
22430 if (row === 1 && col === 1 && dayNumber > minDayNumber && params.firstDay !== 1) {
22432 dayNumber = dayIndex - firstDayOfMonthIndex;
22435 var weekDayIndex = ((col - 1) + params.firstDay > 6)
22436 ? ((col - 1 - 7) + params.firstDay)
22437 : ((col - 1) + params.firstDay);
22439 if (dayNumber < 0) {
22440 dayNumber = daysInPrevMonth + dayNumber + 1;
22441 addClass += ' calendar-day-prev';
22442 dayDate = new calendar.DateHandleClass(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();
22445 if (dayNumber > daysInMonth) {
22446 dayNumber -= daysInMonth;
22447 addClass += ' calendar-day-next';
22448 dayDate = new calendar.DateHandleClass(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();
22450 dayDate = new calendar.DateHandleClass(year, month, dayNumber).getTime();
22454 if (dayDate === today) { addClass += ' calendar-day-today'; }
22457 if (params.rangePicker && currentValues.length === 2) {
22458 if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) { addClass += ' calendar-day-selected'; }
22459 } else if (currentValues.indexOf(dayDate) >= 0) { addClass += ' calendar-day-selected'; }
22461 if (params.weekendDays.indexOf(weekDayIndex) >= 0) {
22462 addClass += ' calendar-day-weekend';
22465 var eventsHtml = '';
22467 if (params.events) {
22468 if (calendar.dateInRange(dayDate, params.events)) {
22473 addClass += ' calendar-day-has-events';
22474 eventsHtml = "\n <span
class=\"calendar
-day
-events
\">\n <span
class=\"calendar
-day
-event
\"></span>\n </span>\n ";
22475 if (Array.isArray(params.events)) {
22476 var eventDots = [];
22477 params.events.forEach(function (ev) {
22478 var color = ev.color || '';
22479 if (eventDots.indexOf(color) < 0 && calendar.dateInRange(dayDate, ev)) {
22480 eventDots.push(color);
22483 eventsHtml = "\n <span
class=\"calendar
-day
-events
\">\n " + (eventDots.map(function (color) { return ("\n <span
class=\"calendar
-day
-event
\" style
=\"" + (color ? ("background
-color
: " + color) : '') + "\"></span>\n ").trim(); }).join('')) + "\n </span>\n ";
22487 if (params.rangesClasses) {
22488 for (var k = 0; k < params.rangesClasses.length; k += 1) {
22489 if (calendar.dateInRange(dayDate, params.rangesClasses[k].range)) {
22490 addClass += " " + (params.rangesClasses[k].cssClass);
22496 if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) {
22499 if (params.disabled) {
22500 if (calendar.dateInRange(dayDate, params.disabled)) {
22505 addClass += ' calendar-day-disabled';
22508 dayDate = new calendar.DateHandleClass(dayDate);
22509 var dayYear = dayDate.getFullYear();
22510 var dayMonth = dayDate.getMonth();
22511 rowHtml += ("\n <div data
-year
=\"" + dayYear + "\" data
-month
=\"" + dayMonth + "\" data
-day
=\"" + dayNumber + "\" class=\"calendar
-day
" + addClass + "\" data
-date
=\"" + dayYear + "-" + dayMonth + "-" + dayNumber + "\">\n <span
class=\"calendar
-day
-number
\">" + dayNumber + eventsHtml + "</span>\n </div>").trim();
22514 for (var col = 1; col <= cols; col += 1) loop( col );
22515 monthHtml += "<div
class=\"calendar
-row
\">" + rowHtml + "</div
>";
22517 monthHtml = "<div
class=\"calendar
-month
\" data
-year
=\"" + year + "\" data
-month
=\"" + month + "\">" + monthHtml + "</div
>";
22521 Calendar.prototype.renderWeekHeader = function renderWeekHeader () {
22522 var calendar = this;
22523 if (calendar.params.renderWeekHeader) {
22524 return calendar.params.renderWeekHeader.call(calendar);
22526 var params = calendar.params;
22527 var weekDaysHtml = '';
22528 for (var i = 0; i < 7; i += 1) {
22529 var dayIndex = (i + params.firstDay > 6)
22530 ? ((i - 7) + params.firstDay)
22531 : (i + params.firstDay);
22532 var dayName = params.dayNamesShort[dayIndex];
22533 weekDaysHtml += "<div
class=\"calendar
-week
-day
\">" + dayName + "</div
>";
22535 return ("\n <div
class=\"calendar
-week
-header
\">\n " + weekDaysHtml + "\n </div
>\n ").trim();
22538 Calendar.prototype.renderMonthSelector = function renderMonthSelector () {
22539 var calendar = this;
22540 if (calendar.params.renderMonthSelector) {
22541 return calendar.params.renderMonthSelector.call(calendar);
22544 return "\n <div
class=\"calendar
-month
-selector
\">\n <a href
=\"#\" class=\"link icon
-only calendar
-prev
-month
-button
\">\n <i
class=\"icon icon
-prev
\"></i>\n </a>\n <span
class=\"current
-month
-value
\"></span>\n <a href=\"#\" class=\"link icon-only calendar-next-month-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ".trim();
22547 Calendar.prototype.renderYearSelector = function renderYearSelector () {
22548 var calendar = this;
22549 if (calendar.params.renderYearSelector) {
22550 return calendar.params.renderYearSelector.call(calendar);
22552 return "\n <div
class=\"calendar
-year
-selector
\">\n <a href
=\"#\" class=\"link icon
-only calendar
-prev
-year
-button
\">\n <i
class=\"icon icon
-prev
\"></i>\n </a>\n <span
class=\"current
-year
-value
\"></span>\n <a href=\"#\" class=\"link icon-only calendar-next-year-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ".trim();
22555 Calendar.prototype.renderHeader = function renderHeader () {
22556 var calendar = this;
22557 if (calendar.params.renderHeader) {
22558 return calendar.params.renderHeader.call(calendar);
22560 return ("\n <div
class=\"calendar
-header
\">\n <div
class=\"calendar
-selected
-date
\">" + (calendar.params.headerPlaceholder) + "</div>\n </div>\n ").trim();
22563 Calendar.prototype.renderFooter = function renderFooter () {
22564 var calendar = this;
22565 var app = calendar.app;
22566 if (calendar.params.renderFooter) {
22567 return calendar.params.renderFooter.call(calendar);
22569 return ("\n <div
class=\"calendar
-footer
\">\n <a href
=\"#\" class=\"" + (app.theme === 'md' ? 'button' : 'link') + " calendar
-close sheet
-close popover
-close
\">" + (calendar.params.toolbarCloseText) + "</a>\n </div>\n ").trim();
22572 Calendar.prototype.renderToolbar = function renderToolbar () {
22573 var calendar = this;
22574 if (calendar.params.renderToolbar) {
22575 return calendar.params.renderToolbar.call(calendar, calendar);
22577 return ("\n <div
class=\"toolbar toolbar
-top no
-shadow
\">\n <div
class=\"toolbar
-inner
\">\n " + (calendar.renderMonthSelector()) + "\n " + (calendar.renderYearSelector()) + "\n </div>\n </div>\n ").trim();
22579 // eslint-disable-next-line
22580 Calendar.prototype.renderInline = function renderInline () {
22581 var calendar = this;
22582 var ref = calendar.params;
22583 var cssClass = ref.cssClass;
22584 var toolbar = ref.toolbar;
22585 var header = ref.header;
22586 var footer = ref.footer;
22587 var rangePicker = ref.rangePicker;
22588 var weekHeader = ref.weekHeader;
22589 var value = calendar.value;
22590 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22591 var inlineHtml = ("\n <div
class=\"calendar calendar
-inline
" + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div
class=\"calendar
-months
\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
22596 Calendar.prototype.renderCustomModal = function renderCustomModal () {
22597 var calendar = this;
22598 var ref = calendar.params;
22599 var cssClass = ref.cssClass;
22600 var toolbar = ref.toolbar;
22601 var header = ref.header;
22602 var footer = ref.footer;
22603 var rangePicker = ref.rangePicker;
22604 var weekHeader = ref.weekHeader;
22605 var value = calendar.value;
22606 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22607 var sheetHtml = ("\n <div
class=\"calendar calendar
-modal
" + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div
class=\"calendar
-months
\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
22612 Calendar.prototype.renderSheet = function renderSheet () {
22613 var calendar = this;
22614 var ref = calendar.params;
22615 var cssClass = ref.cssClass;
22616 var toolbar = ref.toolbar;
22617 var header = ref.header;
22618 var footer = ref.footer;
22619 var rangePicker = ref.rangePicker;
22620 var weekHeader = ref.weekHeader;
22621 var value = calendar.value;
22622 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22623 var sheetHtml = ("\n <div
class=\"sheet
-modal calendar calendar
-sheet
" + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div
class=\"sheet
-modal
-inner calendar
-months
\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
22628 Calendar.prototype.renderPopover = function renderPopover () {
22629 var calendar = this;
22630 var ref = calendar.params;
22631 var cssClass = ref.cssClass;
22632 var toolbar = ref.toolbar;
22633 var header = ref.header;
22634 var footer = ref.footer;
22635 var rangePicker = ref.rangePicker;
22636 var weekHeader = ref.weekHeader;
22637 var value = calendar.value;
22638 var date = value && value.length ? value[0] : new calendar.DateHandleClass().setHours(0, 0, 0);
22639 var popoverHtml = ("\n <div
class=\"popover calendar
-popover
\">\n <div
class=\"popover
-inner
\">\n <div
class=\"calendar
" + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div
class=\"calendar
-months
\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n </div>\n </div>\n ").trim();
22641 return popoverHtml;
22644 Calendar.prototype.render = function render () {
22645 var calendar = this;
22646 var params = calendar.params;
22647 if (params.render) { return params.render.call(calendar); }
22648 if (!calendar.inline) {
22649 var modalType = params.openIn;
22650 if (modalType === 'auto') { modalType = calendar.isPopover() ? 'popover' : 'sheet'; }
22652 if (modalType === 'popover') { return calendar.renderPopover(); }
22653 if (modalType === 'sheet') { return calendar.renderSheet(); }
22654 return calendar.renderCustomModal();
22656 return calendar.renderInline();
22659 Calendar.prototype.onOpen = function onOpen () {
22660 var calendar = this;
22661 var initialized = calendar.initialized;
22662 var $el = calendar.$el;
22663 var app = calendar.app;
22664 var $inputEl = calendar.$inputEl;
22665 var inline = calendar.inline;
22666 var value = calendar.value;
22667 var params = calendar.params;
22668 calendar.closing = false;
22669 calendar.opened = true;
22670 calendar.opening = true;
22672 // Init main events
22673 calendar.attachCalendarEvents();
22675 var updateValue = !value && params.value;
22678 if (!initialized) {
22679 if (value) { calendar.setValue(value, 0); }
22680 else if (params.value) {
22681 calendar.setValue(calendar.normalizeValues(params.value), 0);
22683 } else if (value) {
22684 calendar.setValue(value, 0);
22687 // Update current month and year
22688 calendar.updateCurrentMonthYear();
22690 // Set initial translate
22691 calendar.monthsTranslate = 0;
22692 calendar.setMonthsTranslate();
22694 // Update input value
22695 if (updateValue) { calendar.updateValue(); }
22696 else if (params.header && value) {
22697 calendar.updateValue(true);
22701 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
22702 $inputEl.trigger('focus');
22705 calendar.initialized = true;
22707 calendar.$months.each(function (index, monthEl) {
22708 calendar.emit('local::monthAdd calendarMonthAdd', monthEl);
22713 $el.trigger('calendar:open', calendar);
22716 $inputEl.trigger('calendar:open', calendar);
22718 calendar.emit('local::open calendarOpen', calendar);
22721 Calendar.prototype.onOpened = function onOpened () {
22722 var calendar = this;
22723 calendar.opening = false;
22724 if (calendar.$el) {
22725 calendar.$el.trigger('calendar:opened', calendar);
22727 if (calendar.$inputEl) {
22728 calendar.$inputEl.trigger('calendar:opened', calendar);
22730 calendar.emit('local::opened calendarOpened', calendar);
22733 Calendar.prototype.onClose = function onClose () {
22734 var calendar = this;
22735 var app = calendar.app;
22736 calendar.opening = false;
22737 calendar.closing = true;
22739 if (calendar.$inputEl && app.theme === 'md') {
22740 calendar.$inputEl.trigger('blur');
22742 if (calendar.detachCalendarEvents) {
22743 calendar.detachCalendarEvents();
22746 if (calendar.$el) {
22747 calendar.$el.trigger('calendar:close', calendar);
22749 if (calendar.$inputEl) {
22750 calendar.$inputEl.trigger('calendar:close', calendar);
22752 calendar.emit('local::close calendarClose', calendar);
22755 Calendar.prototype.onClosed = function onClosed () {
22756 var calendar = this;
22757 calendar.opened = false;
22758 calendar.closing = false;
22760 if (!calendar.inline) {
22761 Utils.nextTick(function () {
22762 if (calendar.modal && calendar.modal.el && calendar.modal.destroy) {
22763 if (!calendar.params.routableModals) {
22764 calendar.modal.destroy();
22767 delete calendar.modal;
22770 if (calendar.$el) {
22771 calendar.$el.trigger('calendar:closed', calendar);
22773 if (calendar.$inputEl) {
22774 calendar.$inputEl.trigger('calendar:closed', calendar);
22776 calendar.emit('local::closed calendarClosed', calendar);
22779 Calendar.prototype.open = function open () {
22782 var calendar = this;
22783 var app = calendar.app;
22784 var opened = calendar.opened;
22785 var inline = calendar.inline;
22786 var $inputEl = calendar.$inputEl;
22787 var params = calendar.params;
22788 if (opened) { return; }
22791 calendar.$el = $(calendar.render());
22792 calendar.$el[0].f7Calendar = calendar;
22793 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
22794 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
22795 calendar.$containerEl.append(calendar.$el);
22797 calendar.onOpened();
22800 var modalType = params.openIn;
22801 if (modalType === 'auto') {
22802 modalType = calendar.isPopover() ? 'popover' : 'sheet';
22804 var modalContent = calendar.render();
22806 var modalParams = {
22807 targetEl: $inputEl,
22808 scrollToEl: calendar.params.scrollToInput ? $inputEl : undefined,
22809 content: modalContent,
22810 backdrop: calendar.params.backdrop === true || (modalType === 'popover' && app.params.popover.backdrop !== false && calendar.params.backdrop !== false),
22811 closeByBackdropClick: calendar.params.closeByBackdropClick,
22813 open: function open() {
22815 calendar.modal = modal;
22816 calendar.$el = modalType === 'popover' ? modal.$el.find('.calendar') : modal.$el;
22817 calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
22818 calendar.$months = calendar.$wrapperEl.find('.calendar-month');
22819 calendar.$el[0].f7Calendar = calendar;
22820 if (modalType === 'customModal') {
22821 $(calendar.$el).find('.calendar-close').once('click', function () {
22827 opened: function opened() { calendar.onOpened(); },
22828 close: function close() { calendar.onClose(); },
22829 closed: function closed() { calendar.onClosed(); },
22832 if (calendar.params.routableModals) {
22833 calendar.view.router.navigate({
22837 }, obj[modalType] = modalParams, obj ),
22840 calendar.modal = app[modalType].create(modalParams);
22841 calendar.modal.open();
22845 Calendar.prototype.close = function close () {
22846 var calendar = this;
22847 var opened = calendar.opened;
22848 var inline = calendar.inline;
22849 if (!opened) { return; }
22851 calendar.onClose();
22852 calendar.onClosed();
22855 if (calendar.params.routableModals) {
22856 calendar.view.router.back();
22858 calendar.modal.close();
22862 Calendar.prototype.init = function init () {
22863 var calendar = this;
22865 calendar.initInput();
22867 if (calendar.inline) {
22869 calendar.emit('local::init calendarInit', calendar);
22873 if (!calendar.initialized && calendar.params.value) {
22874 calendar.setValue(calendar.normalizeValues(calendar.params.value));
22877 // Attach input Events
22878 if (calendar.$inputEl) {
22879 calendar.attachInputEvents();
22881 if (calendar.params.closeByOutsideClick) {
22882 calendar.attachHtmlEvents();
22884 calendar.emit('local::init calendarInit', calendar);
22887 Calendar.prototype.destroy = function destroy () {
22888 var calendar = this;
22889 if (calendar.destroyed) { return; }
22890 var $el = calendar.$el;
22891 calendar.emit('local::beforeDestroy calendarBeforeDestroy', calendar);
22892 if ($el) { $el.trigger('calendar:beforedestroy', calendar); }
22897 if (calendar.$inputEl) {
22898 calendar.detachInputEvents();
22900 if (calendar.params.closeByOutsideClick) {
22901 calendar.detachHtmlEvents();
22904 if ($el && $el.length) { delete calendar.$el[0].f7Calendar; }
22905 Utils.deleteProps(calendar);
22906 calendar.destroyed = true;
22910 }(Framework7Class));
22915 Calendar: Calendar,
22917 create: function create() {
22919 app.calendar = ConstructorMethods({
22920 defaultSelector: '.calendar',
22921 constructor: Calendar,
22923 domProp: 'f7Calendar',
22925 app.calendar.close = function close(el) {
22926 if ( el === void 0 ) el = '.calendar';
22929 if ($el.length === 0) { return; }
22930 var calendar = $el[0].f7Calendar;
22931 if (!calendar || (calendar && !calendar.opened)) { return; }
22937 // Calendar settings
22938 calendarType: 'gregorian', // or 'jalali'
22939 monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
22940 monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
22941 dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
22942 dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
22943 firstDay: 1, // First day of the week, Monday
22944 weekendDays: [0, 6], // Sunday and Saturday
22946 monthNames: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'],
22947 monthNamesShort: ['فَر', 'اُر', 'خُر', 'تیر', 'مُر', 'شَه', 'مهر', 'آب', 'آذر', 'دی', 'بَه', 'اِس'],
22948 dayNames: ['یکشنبه', 'دوشنبه', 'سهشنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],
22949 dayNamesShort: ['1ش', '۲ش', '۳ش', '۴ش', '۵ش', 'ج', 'ش'],
22950 firstDay: 6, // Saturday
22951 weekendDays: [5], // Friday
22954 rangePicker: false,
22955 rangePickerMinDays: 1, // when calendar is used as rangePicker
22956 rangePickerMaxDays: 0, // when calendar is used as rangePicker, 0 means unlimited
22957 dateFormat: 'yyyy-mm-dd',
22958 direction: 'horizontal', // or 'vertical'
22961 disabled: null, // dates range of disabled days
22962 events: null, // dates range of days with events
22963 rangesClasses: null, // array with custom classes date ranges
22966 closeOnSelect: false,
22967 monthSelector: true,
22968 yearSelector: true,
22971 // Common opener settings
22973 openIn: 'auto', // or 'popover' or 'sheet' or 'customModal'
22976 inputReadOnly: true,
22977 closeByOutsideClick: true,
22978 scrollToInput: true,
22980 headerPlaceholder: 'Select date',
22983 toolbarCloseText: 'Done',
22985 routableModals: true,
22989 closeByBackdropClick: true,
22990 // Render functions
22991 renderWeekHeader: null,
22992 renderMonths: null,
22994 renderMonthSelector: null,
22995 renderYearSelector: null,
22996 renderHeader: null,
22997 renderFooter: null,
22998 renderToolbar: null,
22999 renderInline: null,
23000 renderPopover: null,
23007 function pickerColumn (colEl, updateItems) {
23009 var app = picker.app;
23010 var $colEl = $(colEl);
23011 var colIndex = $colEl.index();
23012 var col = picker.cols[colIndex];
23013 if (col.divider) { return; }
23016 col.el = $colEl[0];
23017 col.$itemsEl = col.$el.find('.picker-items');
23018 col.items = col.$itemsEl.find('.picker-item');
23024 var animationFrameId;
23026 function updateDuringScroll() {
23027 animationFrameId = Utils.requestAnimationFrame(function () {
23028 col.updateItems(undefined, undefined, 0);
23029 updateDuringScroll();
23033 col.replaceValues = function replaceColValues(values, displayValues) {
23034 col.detachEvents();
23035 col.values = values;
23036 col.displayValues = displayValues;
23037 col.$itemsEl.html(picker.renderColumn(col, true));
23038 col.items = col.$itemsEl.find('.picker-item');
23040 col.setValue(col.values[0], 0, true);
23041 col.attachEvents();
23043 col.calcSize = function calcColSize() {
23044 if (picker.params.rotateEffect) {
23045 col.$el.removeClass('picker-column-absolute');
23046 if (!col.width) { col.$el.css({ width: '' }); }
23049 var colHeight = col.$el[0].offsetHeight;
23050 itemHeight = col.items[0].offsetHeight;
23051 itemsHeight = itemHeight * col.items.length;
23052 minTranslate = ((colHeight / 2) - itemsHeight) + (itemHeight / 2);
23053 maxTranslate = (colHeight / 2) - (itemHeight / 2);
23055 colWidth = col.width;
23056 if (parseInt(colWidth, 10) === colWidth) { colWidth += 'px'; }
23057 col.$el.css({ width: colWidth });
23059 if (picker.params.rotateEffect) {
23061 col.items.each(function (index, itemEl) {
23062 var item = $(itemEl).children('span');
23063 colWidth = Math.max(colWidth, item[0].offsetWidth);
23065 col.$el.css({ width: ((colWidth + 2) + "px
") });
23067 col.$el.addClass('picker-column-absolute');
23071 col.setValue = function setColValue(newValue, transition, valueCallbacks) {
23072 if ( transition === void 0 ) transition = '';
23074 var newActiveIndex = col.$itemsEl.find((".picker
-item
[data
-picker
-value
=\"" + newValue + "\"]")).index();
23075 if (typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {
23078 var newTranslate = (-newActiveIndex * itemHeight) + maxTranslate;
23080 col.$itemsEl.transition(transition);
23081 col.$itemsEl.transform(("translate3d(0," + newTranslate + "px
,0)"));
23084 if (picker.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex) {
23085 Utils.cancelAnimationFrame(animationFrameId);
23086 col.$itemsEl.transitionEnd(function () {
23087 Utils.cancelAnimationFrame(animationFrameId);
23089 updateDuringScroll();
23093 col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);
23096 col.updateItems = function updateColItems(activeIndex, translate, transition, valueCallbacks) {
23097 if (typeof translate === 'undefined') {
23098 // eslint-disable-next-line
23099 translate = Utils.getTranslate(col.$itemsEl[0], 'y');
23101 // eslint-disable-next-line
23102 if (typeof activeIndex === 'undefined') { activeIndex = -Math.round((translate - maxTranslate) / itemHeight); }
23103 // eslint-disable-next-line
23104 if (activeIndex < 0) { activeIndex = 0; }
23105 // eslint-disable-next-line
23106 if (activeIndex >= col.items.length) { activeIndex = col.items.length - 1; }
23107 var previousActiveIndex = col.activeIndex;
23108 col.activeIndex = activeIndex;
23109 col.$itemsEl.find('.picker-item-selected').removeClass('picker-item-selected');
23111 col.items.transition(transition);
23113 var selectedItem = col.items.eq(activeIndex).addClass('picker-item-selected').transform('');
23115 // Set 3D rotate effect
23116 if (picker.params.rotateEffect) {
23117 col.items.each(function (index, itemEl) {
23118 var $itemEl = $(itemEl);
23119 var itemOffsetTop = $itemEl.index() * itemHeight;
23120 var translateOffset = maxTranslate - translate;
23121 var itemOffset = itemOffsetTop - translateOffset;
23122 var percentage = itemOffset / itemHeight;
23123 var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;
23125 var angle = (-18 * percentage);
23126 if (angle > 180) { angle = 180; }
23127 if (angle < -180) { angle = -180; }
23128 if (Math.abs(percentage) > itemsFit) {
23129 $itemEl.addClass('picker-item-far');
23131 $itemEl.removeClass('picker-item-far');
23133 $itemEl.transform(("translate3d(0, " + (-translate + maxTranslate) + "px
, " + (picker.needsOriginFix ? -110 : 0) + "px
) rotateX(" + angle + "deg
)"));
23137 if (valueCallbacks || typeof valueCallbacks === 'undefined') {
23139 col.value = selectedItem.attr('data-picker-value');
23140 col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;
23141 // On change callback
23142 if (previousActiveIndex !== activeIndex) {
23143 if (col.onChange) {
23144 col.onChange(picker, col.value, col.displayValue);
23146 picker.updateValue();
23151 var allowItemClick = true;
23156 var touchStartTime;
23158 var startTranslate;
23160 var currentTranslate;
23162 var velocityTranslate;
23163 function handleTouchStart(e) {
23164 if (isMoved || isTouched) { return; }
23165 e.preventDefault();
23167 touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
23168 touchCurrentY = touchStartY;
23169 touchStartTime = (new Date()).getTime();
23171 allowItemClick = true;
23172 startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
23173 currentTranslate = startTranslate;
23175 function handleTouchMove(e) {
23176 if (!isTouched) { return; }
23177 e.preventDefault();
23178 allowItemClick = false;
23179 touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
23182 Utils.cancelAnimationFrame(animationFrameId);
23184 startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
23185 currentTranslate = startTranslate;
23186 col.$itemsEl.transition(0);
23189 var diff = touchCurrentY - touchStartY;
23190 currentTranslate = startTranslate + diff;
23191 returnTo = undefined;
23193 // Normalize translate
23194 if (currentTranslate < minTranslate) {
23195 currentTranslate = minTranslate - (Math.pow( (minTranslate - currentTranslate), 0.8 ));
23198 if (currentTranslate > maxTranslate) {
23199 currentTranslate = maxTranslate + (Math.pow( (currentTranslate - maxTranslate), 0.8 ));
23202 // Transform wrapper
23203 col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px
,0)"));
23206 col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnTouchmove);
23209 velocityTranslate = currentTranslate - prevTranslate || currentTranslate;
23210 prevTranslate = currentTranslate;
23212 function handleTouchEnd() {
23213 if (!isTouched || !isMoved) {
23220 col.$itemsEl.transition('');
23222 if (returnTo === 'min') {
23223 col.$itemsEl.transform(("translate3d(0," + minTranslate + "px
,0)"));
23224 } else { col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px
,0)")); }
23226 touchEndTime = new Date().getTime();
23228 if (touchEndTime - touchStartTime > 300) {
23229 newTranslate = currentTranslate;
23231 newTranslate = currentTranslate + (velocityTranslate * picker.params.momentumRatio);
23234 newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
23237 var activeIndex = -Math.floor((newTranslate - maxTranslate) / itemHeight);
23239 // Normalize translate
23240 if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
23242 // Transform wrapper
23243 col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px
,0)"));
23246 col.updateItems(activeIndex, newTranslate, '', true);
23249 if (picker.params.updateValuesOnMomentum) {
23250 updateDuringScroll();
23251 col.$itemsEl.transitionEnd(function () {
23252 Utils.cancelAnimationFrame(animationFrameId);
23257 setTimeout(function () {
23258 allowItemClick = true;
23262 function handleClick() {
23263 if (!allowItemClick) { return; }
23264 Utils.cancelAnimationFrame(animationFrameId);
23265 var value = $(this).attr('data-picker-value');
23266 col.setValue(value);
23269 var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
23270 col.attachEvents = function attachColEvents() {
23271 col.$el.on(app.touchEvents.start, handleTouchStart, activeListener);
23272 app.on('touchmove:active', handleTouchMove);
23273 app.on('touchend:passive', handleTouchEnd);
23274 col.items.on('click', handleClick);
23276 col.detachEvents = function detachColEvents() {
23277 col.$el.off(app.touchEvents.start, handleTouchStart, activeListener);
23278 app.off('touchmove:active', handleTouchMove);
23279 app.off('touchend:passive', handleTouchEnd);
23280 col.items.off('click', handleClick);
23283 col.init = function initCol() {
23285 col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px
,0)")).transition(0);
23286 if (colIndex === 0) { col.$el.addClass('picker-column-first'); }
23287 if (colIndex === picker.cols.length - 1) { col.$el.addClass('picker-column-last'); }
23288 // Update items on init
23289 if (updateItems) { col.updateItems(0, maxTranslate, 0); }
23291 col.attachEvents();
23294 col.destroy = function destroyCol() {
23295 col.detachEvents();
23301 var Picker = /*@__PURE__*/(function (Framework7Class$$1) {
23302 function Picker(app, params) {
23303 if ( params === void 0 ) params = {};
23305 Framework7Class$$1.call(this, params, [app]);
23307 picker.params = Utils.extend({}, app.params.picker, params);
23310 if (picker.params.containerEl) {
23311 $containerEl = $(picker.params.containerEl);
23312 if ($containerEl.length === 0) { return picker; }
23316 if (picker.params.inputEl) {
23317 $inputEl = $(picker.params.inputEl);
23322 view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
23324 if (!view) { view = app.views.main; }
23326 Utils.extend(picker, {
23328 $containerEl: $containerEl,
23329 containerEl: $containerEl && $containerEl[0],
23330 inline: $containerEl && $containerEl.length > 0,
23331 needsOriginFix: app.device.ios || ((win.navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && win.navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !app.device.android),
23333 $inputEl: $inputEl,
23334 inputEl: $inputEl && $inputEl[0],
23335 initialized: false,
23337 url: picker.params.url,
23341 function onResize() {
23342 picker.resizeCols();
23344 function onInputClick() {
23347 function onInputFocus(e) {
23348 e.preventDefault();
23350 function onHtmlClick(e) {
23351 var $targetEl = $(e.target);
23352 if (picker.isPopover()) { return; }
23353 if (!picker.opened || picker.closing) { return; }
23354 if ($targetEl.closest('[class*="backdrop
"]').length) { return; }
23355 if ($inputEl && $inputEl.length > 0) {
23356 if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal').length === 0) {
23359 } else if ($(e.target).closest('.sheet-modal').length === 0) {
23365 Utils.extend(picker, {
23366 attachResizeEvent: function attachResizeEvent() {
23367 app.on('resize', onResize);
23369 detachResizeEvent: function detachResizeEvent() {
23370 app.off('resize', onResize);
23372 attachInputEvents: function attachInputEvents() {
23373 picker.$inputEl.on('click', onInputClick);
23374 if (picker.params.inputReadOnly) {
23375 picker.$inputEl.on('focus mousedown', onInputFocus);
23378 detachInputEvents: function detachInputEvents() {
23379 picker.$inputEl.off('click', onInputClick);
23380 if (picker.params.inputReadOnly) {
23381 picker.$inputEl.off('focus mousedown', onInputFocus);
23384 attachHtmlEvents: function attachHtmlEvents() {
23385 app.on('click', onHtmlClick);
23387 detachHtmlEvents: function detachHtmlEvents() {
23388 app.off('click', onHtmlClick);
23397 if ( Framework7Class$$1 ) Picker.__proto__ = Framework7Class$$1;
23398 Picker.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
23399 Picker.prototype.constructor = Picker;
23401 Picker.prototype.initInput = function initInput () {
23403 if (!picker.$inputEl) { return; }
23404 if (picker.params.inputReadOnly) { picker.$inputEl.prop('readOnly', true); }
23407 Picker.prototype.resizeCols = function resizeCols () {
23409 if (!picker.opened) { return; }
23410 for (var i = 0; i < picker.cols.length; i += 1) {
23411 if (!picker.cols[i].divider) {
23412 picker.cols[i].calcSize();
23413 picker.cols[i].setValue(picker.cols[i].value, 0, false);
23418 Picker.prototype.isPopover = function isPopover () {
23420 var app = picker.app;
23421 var modal = picker.modal;
23422 var params = picker.params;
23423 if (params.openIn === 'sheet') { return false; }
23424 if (modal && modal.type !== 'popover') { return false; }
23426 if (!picker.inline && picker.inputEl) {
23427 if (params.openIn === 'popover') { return true; }
23428 if (app.device.ios) {
23429 return !!app.device.ipad;
23430 } if (app.width >= 768) {
23437 Picker.prototype.formatValue = function formatValue () {
23439 var value = picker.value;
23440 var displayValue = picker.displayValue;
23441 if (picker.params.formatValue) {
23442 return picker.params.formatValue.call(picker, value, displayValue);
23444 return value.join(' ');
23447 Picker.prototype.setValue = function setValue (values, transition) {
23449 var valueIndex = 0;
23450 if (picker.cols.length === 0) {
23451 picker.value = values;
23452 picker.updateValue(values);
23455 for (var i = 0; i < picker.cols.length; i += 1) {
23456 if (picker.cols[i] && !picker.cols[i].divider) {
23457 picker.cols[i].setValue(values[valueIndex], transition);
23463 Picker.prototype.getValue = function getValue () {
23465 return picker.value;
23468 Picker.prototype.updateValue = function updateValue (forceValues) {
23470 var newValue = forceValues || [];
23471 var newDisplayValue = [];
23473 if (picker.cols.length === 0) {
23474 var noDividerColumns = picker.params.cols.filter(function (c) { return !c.divider; });
23475 for (var i = 0; i < noDividerColumns.length; i += 1) {
23476 column = noDividerColumns[i];
23477 if (column.displayValues !== undefined && column.values !== undefined && column.values.indexOf(newValue[i]) !== -1) {
23478 newDisplayValue.push(column.displayValues[column.values.indexOf(newValue[i])]);
23480 newDisplayValue.push(newValue[i]);
23484 for (var i$1 = 0; i$1 < picker.cols.length; i$1 += 1) {
23485 if (!picker.cols[i$1].divider) {
23486 newValue.push(picker.cols[i$1].value);
23487 newDisplayValue.push(picker.cols[i$1].displayValue);
23492 if (newValue.indexOf(undefined) >= 0) {
23495 picker.value = newValue;
23496 picker.displayValue = newDisplayValue;
23497 picker.emit('local::change pickerChange', picker, picker.value, picker.displayValue);
23498 if (picker.inputEl) {
23499 picker.$inputEl.val(picker.formatValue());
23500 picker.$inputEl.trigger('change');
23504 Picker.prototype.initColumn = function initColumn (colEl, updateItems) {
23506 pickerColumn.call(picker, colEl, updateItems);
23508 // eslint-disable-next-line
23509 Picker.prototype.destroyColumn = function destroyColumn (colEl) {
23511 var $colEl = $(colEl);
23512 var index = $colEl.index();
23513 if (picker.cols[index] && picker.cols[index].destroy) {
23514 picker.cols[index].destroy();
23518 Picker.prototype.renderToolbar = function renderToolbar () {
23520 if (picker.params.renderToolbar) { return picker.params.renderToolbar.call(picker, picker); }
23521 return ("\n <div
class=\"toolbar toolbar
-top no
-shadow
\">\n <div
class=\"toolbar
-inner
\">\n <div
class=\"left
\"></div>\n <div class=\"right\">\n <a href=\"#\" class=\"link sheet-close popover-close\">" + (picker.params.toolbarCloseText) + "</a>\n </div>\n </div>\n </div
>\n ").trim();
23523 // eslint-disable-next-line
23524 Picker.prototype.renderColumn = function renderColumn (col, onlyItems) {
23525 var colClasses = "picker
-column
" + (col.textAlign ? ("picker
-column
-" + (col.textAlign)) : '') + " " + (col.cssClass || '');
23527 var columnItemsHtml;
23530 columnHtml = "\n <div
class=\"" + colClasses + " picker
-column
-divider
\">" + (col.content) + "</div
>\n ";
23532 columnItemsHtml = col.values.map(function (value, index) { return ("\n <div
class=\"picker
-item
\" data
-picker
-value
=\"" + value + "\">\n <span
>" + (col.displayValues ? col.displayValues[index] : value) + "</span>\n </div>\n "); }).join('');
23533 columnHtml = "\n <div
class=\"" + colClasses + "\">\n <div
class=\"picker
-items
\">" + columnItemsHtml + "</div>\n </div>\n ";
23536 return onlyItems ? columnItemsHtml.trim() : columnHtml.trim();
23539 Picker.prototype.renderInline = function renderInline () {
23541 var ref = picker.params;
23542 var rotateEffect = ref.rotateEffect;
23543 var cssClass = ref.cssClass;
23544 var toolbar = ref.toolbar;
23545 var inlineHtml = ("\n <div
class=\"picker picker
-inline
" + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div
class=\"picker
-columns
\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div
class=\"picker
-center
-highlight
\"></div>\n </div>\n </div
>\n ").trim();
23550 Picker.prototype.renderSheet = function renderSheet () {
23552 var ref = picker.params;
23553 var rotateEffect = ref.rotateEffect;
23554 var cssClass = ref.cssClass;
23555 var toolbar = ref.toolbar;
23556 var sheetHtml = ("\n <div
class=\"sheet
-modal picker picker
-sheet
" + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div
class=\"sheet
-modal
-inner picker
-columns
\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div
class=\"picker
-center
-highlight
\"></div>\n </div>\n </div
>\n ").trim();
23561 Picker.prototype.renderPopover = function renderPopover () {
23563 var ref = picker.params;
23564 var rotateEffect = ref.rotateEffect;
23565 var cssClass = ref.cssClass;
23566 var toolbar = ref.toolbar;
23567 var popoverHtml = ("\n <div
class=\"popover picker
-popover
\">\n <div
class=\"popover
-inner
\">\n <div
class=\"picker
" + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div
class=\"picker
-columns
\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div
class=\"picker
-center
-highlight
\"></div>\n </div>\n </div>\n </div>\n </div
>\n ").trim();
23569 return popoverHtml;
23572 Picker.prototype.render = function render () {
23574 if (picker.params.render) { return picker.params.render.call(picker); }
23575 if (!picker.inline) {
23576 if (picker.isPopover()) { return picker.renderPopover(); }
23577 return picker.renderSheet();
23579 return picker.renderInline();
23582 Picker.prototype.onOpen = function onOpen () {
23584 var initialized = picker.initialized;
23585 var $el = picker.$el;
23586 var app = picker.app;
23587 var $inputEl = picker.$inputEl;
23588 var inline = picker.inline;
23589 var value = picker.value;
23590 var params = picker.params;
23591 picker.opened = true;
23592 picker.closing = false;
23593 picker.opening = true;
23595 // Init main events
23596 picker.attachResizeEvent();
23599 $el.find('.picker-column').each(function (index, colEl) {
23600 var updateItems = true;
23602 (!initialized && params.value)
23603 || (initialized && value)
23605 updateItems = false;
23607 picker.initColumn(colEl, updateItems);
23611 if (!initialized) {
23612 if (value) { picker.setValue(value, 0); }
23613 else if (params.value) {
23614 picker.setValue(params.value, 0);
23616 } else if (value) {
23617 picker.setValue(value, 0);
23621 if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
23622 $inputEl.trigger('focus');
23625 picker.initialized = true;
23629 $el.trigger('picker:open', picker);
23632 $inputEl.trigger('picker:open', picker);
23634 picker.emit('local::open pickerOpen', picker);
23637 Picker.prototype.onOpened = function onOpened () {
23639 picker.opening = false;
23642 picker.$el.trigger('picker:opened', picker);
23644 if (picker.$inputEl) {
23645 picker.$inputEl.trigger('picker:opened', picker);
23647 picker.emit('local::opened pickerOpened', picker);
23650 Picker.prototype.onClose = function onClose () {
23652 var app = picker.app;
23653 picker.opening = false;
23654 picker.closing = true;
23657 picker.detachResizeEvent();
23659 picker.cols.forEach(function (col) {
23660 if (col.destroy) { col.destroy(); }
23662 if (picker.$inputEl && app.theme === 'md') {
23663 picker.$inputEl.trigger('blur');
23667 picker.$el.trigger('picker:close', picker);
23669 if (picker.$inputEl) {
23670 picker.$inputEl.trigger('picker:close', picker);
23672 picker.emit('local::close pickerClose', picker);
23675 Picker.prototype.onClosed = function onClosed () {
23677 picker.opened = false;
23678 picker.closing = false;
23680 if (!picker.inline) {
23681 Utils.nextTick(function () {
23682 if (picker.modal && picker.modal.el && picker.modal.destroy) {
23683 if (!picker.params.routableModals) {
23684 picker.modal.destroy();
23687 delete picker.modal;
23692 picker.$el.trigger('picker:closed', picker);
23694 if (picker.$inputEl) {
23695 picker.$inputEl.trigger('picker:closed', picker);
23697 picker.emit('local::closed pickerClosed', picker);
23700 Picker.prototype.open = function open () {
23704 var app = picker.app;
23705 var opened = picker.opened;
23706 var inline = picker.inline;
23707 var $inputEl = picker.$inputEl;
23708 if (opened) { return; }
23709 if (picker.cols.length === 0 && picker.params.cols.length) {
23710 picker.params.cols.forEach(function (col) {
23711 picker.cols.push(col);
23715 picker.$el = $(picker.render());
23716 picker.$el[0].f7Picker = picker;
23717 picker.$containerEl.append(picker.$el);
23722 var isPopover = picker.isPopover();
23723 var modalType = isPopover ? 'popover' : 'sheet';
23724 var modalParams = {
23725 targetEl: $inputEl,
23726 scrollToEl: picker.params.scrollToInput ? $inputEl : undefined,
23727 content: picker.render(),
23728 backdrop: isPopover,
23730 open: function open() {
23732 picker.modal = modal;
23733 picker.$el = isPopover ? modal.$el.find('.picker') : modal.$el;
23734 picker.$el[0].f7Picker = picker;
23737 opened: function opened() { picker.onOpened(); },
23738 close: function close() { picker.onClose(); },
23739 closed: function closed() { picker.onClosed(); },
23742 if (picker.params.routableModals) {
23743 picker.view.router.navigate({
23747 }, obj[modalType] = modalParams, obj ),
23750 picker.modal = app[modalType].create(modalParams);
23751 picker.modal.open();
23755 Picker.prototype.close = function close () {
23757 var opened = picker.opened;
23758 var inline = picker.inline;
23759 if (!opened) { return; }
23765 if (picker.params.routableModals) {
23766 picker.view.router.back();
23768 picker.modal.close();
23772 Picker.prototype.init = function init () {
23775 picker.initInput();
23777 if (picker.inline) {
23779 picker.emit('local::init pickerInit', picker);
23783 if (!picker.initialized && picker.params.value) {
23784 picker.setValue(picker.params.value);
23787 // Attach input Events
23788 if (picker.$inputEl) {
23789 picker.attachInputEvents();
23791 if (picker.params.closeByOutsideClick) {
23792 picker.attachHtmlEvents();
23794 picker.emit('local::init pickerInit', picker);
23797 Picker.prototype.destroy = function destroy () {
23799 if (picker.destroyed) { return; }
23800 var $el = picker.$el;
23801 picker.emit('local::beforeDestroy pickerBeforeDestroy', picker);
23802 if ($el) { $el.trigger('picker:beforedestroy', picker); }
23807 if (picker.$inputEl) {
23808 picker.detachInputEvents();
23810 if (picker.params.closeByOutsideClick) {
23811 picker.detachHtmlEvents();
23814 if ($el && $el.length) { delete picker.$el[0].f7Picker; }
23815 Utils.deleteProps(picker);
23816 picker.destroyed = true;
23820 }(Framework7Class));
23827 create: function create() {
23829 app.picker = ConstructorMethods({
23830 defaultSelector: '.picker',
23831 constructor: Picker,
23833 domProp: 'f7Picker',
23835 app.picker.close = function close(el) {
23836 if ( el === void 0 ) el = '.picker';
23839 if ($el.length === 0) { return; }
23840 var picker = $el[0].f7Picker;
23841 if (!picker || (picker && !picker.opened)) { return; }
23848 updateValuesOnMomentum: false,
23849 updateValuesOnTouchmove: true,
23850 rotateEffect: false,
23854 // Common opener settings
23856 openIn: 'auto', // or 'popover' or 'sheet'
23859 inputReadOnly: true,
23860 closeByOutsideClick: true,
23861 scrollToInput: true,
23863 toolbarCloseText: 'Done',
23865 routableModals: true,
23868 // Render functions
23869 renderToolbar: null,
23875 var InfiniteScroll = {
23876 handleScroll: function handleScroll(el, e) {
23879 var scrollTop = $el[0].scrollTop;
23880 var scrollHeight = $el[0].scrollHeight;
23881 var height = $el[0].offsetHeight;
23882 var distance = $el[0].getAttribute('data-infinite-distance');
23884 var virtualListContainer = $el.find('.virtual-list');
23887 var onTop = $el.hasClass('infinite-scroll-top');
23888 if (!distance) { distance = 50; }
23889 if (typeof distance === 'string' && distance.indexOf('%') >= 0) {
23890 distance = (parseInt(distance, 10) / 100) * height;
23892 if (distance > height) { distance = height; }
23894 if (scrollTop < distance) {
23895 $el.trigger('infinite', e);
23896 app.emit('infinite', $el[0], e);
23898 } else if (scrollTop + height >= scrollHeight - distance) {
23899 if (virtualListContainer.length > 0) {
23900 virtualList = virtualListContainer.eq(-1)[0].f7VirtualList;
23901 if (virtualList && !virtualList.reachEnd && !virtualList.params.updatableScroll) {
23905 $el.trigger('infinite', e);
23906 app.emit('infinite', $el[0], e);
23909 create: function create(el) {
23912 $el.on('scroll', function handle(e) {
23913 app.infiniteScroll.handle(this, e);
23916 destroy: function destroy(el) {
23921 var InfiniteScroll$1 = {
23922 name: 'infiniteScroll',
23923 create: function create() {
23925 Utils.extend(app, {
23927 handle: InfiniteScroll.handleScroll.bind(app),
23928 create: InfiniteScroll.create.bind(app),
23929 destroy: InfiniteScroll.destroy.bind(app),
23934 tabMounted: function tabMounted(tabEl) {
23936 var $tabEl = $(tabEl);
23937 $tabEl.find('.infinite-scroll-content').each(function (index, el) {
23938 app.infiniteScroll.create(el);
23941 tabBeforeRemove: function tabBeforeRemove(tabEl) {
23942 var $tabEl = $(tabEl);
23944 $tabEl.find('.infinite-scroll-content').each(function (index, el) {
23945 app.infiniteScroll.destroy(el);
23948 pageInit: function pageInit(page) {
23950 page.$el.find('.infinite-scroll-content').each(function (index, el) {
23951 app.infiniteScroll.create(el);
23954 pageBeforeRemove: function pageBeforeRemove(page) {
23956 page.$el.find('.infinite-scroll-content').each(function (index, el) {
23957 app.infiniteScroll.destroy(el);
23963 var PullToRefresh = /*@__PURE__*/(function (Framework7Class$$1) {
23964 function PullToRefresh(app, el) {
23965 Framework7Class$$1.call(this, {}, [app]);
23968 var $preloaderEl = $el.find('.ptr-preloader');
23974 ptr.bottom = ptr.$el.hasClass('ptr-bottom');
23976 // Extend defaults with modules params
23977 ptr.useModulesParams({});
23979 var isMaterial = app.theme === 'md';
23982 ptr.done = function done() {
23983 var $transitionTarget = isMaterial ? $preloaderEl : $el;
23984 $transitionTarget.transitionEnd(function () {
23985 $el.removeClass('ptr-transitioning ptr-pull-up ptr-pull-down');
23986 $el.trigger('ptr:done');
23987 ptr.emit('local::done ptrDone', $el[0]);
23989 $el.removeClass('ptr-refreshing').addClass('ptr-transitioning');
23993 ptr.refresh = function refresh() {
23994 if ($el.hasClass('ptr-refreshing')) { return ptr; }
23995 $el.addClass('ptr-transitioning ptr-refreshing');
23996 $el.trigger('ptr:refresh', ptr.done);
23997 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
24005 var touchesStart = {};
24008 var refresh = false;
24009 var useTranslate = false;
24010 var forceUseTranslate = false;
24011 var startTranslate = 0;
24015 var triggerDistance;
24016 var dynamicTriggerDistance;
24018 var hasNavbar = false;
24022 var $pageEl = $el.parents('.page');
24024 if ($pageEl.find('.navbar').length > 0 || $pageEl.parents('.view').children('.navbar').length > 0) { hasNavbar = true; }
24025 if ($pageEl.hasClass('no-navbar')) { hasNavbar = false; }
24026 if (!hasNavbar && !ptr.bottom) { $el.addClass('ptr-no-navbar'); }
24028 // Define trigger distance
24029 if ($el.attr('data-ptr-distance')) {
24030 dynamicTriggerDistance = true;
24032 triggerDistance = isMaterial ? 66 : 44;
24035 function handleTouchStart(e) {
24037 if (Device.os === 'android') {
24038 if ('targetTouches' in e && e.targetTouches.length > 1) { return; }
24042 if ($el.hasClass('ptr-refreshing')) {
24045 if ($(e.target).closest('.sortable-handler').length) { return; }
24048 pullStarted = false;
24050 isScrolling = undefined;
24051 wasScrolled = undefined;
24052 if (e.type === 'touchstart') { touchId = e.targetTouches[0].identifier; }
24053 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
24054 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
24057 function handleTouchMove(e) {
24058 if (!isTouched) { return; }
24062 if (e.type === 'touchmove') {
24063 if (touchId && e.touches) {
24064 for (var i = 0; i < e.touches.length; i += 1) {
24065 if (e.touches[i].identifier === touchId) {
24066 touch = e.touches[i];
24070 if (!touch) { touch = e.targetTouches[0]; }
24071 pageX = touch.pageX;
24072 pageY = touch.pageY;
24077 if (!pageX || !pageY) { return; }
24080 if (typeof isScrolling === 'undefined') {
24081 isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
24083 if (!isScrolling) {
24088 scrollTop = $el[0].scrollTop;
24091 $el.removeClass('ptr-transitioning');
24092 var targetIsScrollable;
24093 scrollHeight = $el[0].scrollHeight;
24094 offsetHeight = $el[0].offsetHeight;
24096 maxScrollTop = scrollHeight - offsetHeight;
24098 if (scrollTop > scrollHeight) {
24102 var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
24103 if ($ptrWatchScrollable.length) {
24104 $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
24105 if (ptrScrollableEl === el) { return; }
24107 (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
24108 && $(ptrScrollableEl).css('overflow') === 'auto'
24110 (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
24111 || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
24114 targetIsScrollable = true;
24118 if (targetIsScrollable) {
24122 if (dynamicTriggerDistance) {
24123 triggerDistance = $el.attr('data-ptr-distance');
24124 if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
24126 startTranslate = $el.hasClass('ptr-refreshing') ? triggerDistance : 0;
24127 if (scrollHeight === offsetHeight || Device.os !== 'ios' || isMaterial) {
24128 useTranslate = true;
24130 useTranslate = false;
24132 forceUseTranslate = false;
24135 touchesDiff = pageY - touchesStart.y;
24137 if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
24139 var ptrStarted = ptr.bottom
24140 ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
24141 : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
24145 if (Device.os === 'ios' && parseInt(Device.osVersion.split('.')[0], 10) > 7) {
24146 if (!ptr.bottom && scrollTop === 0 && !wasScrolled) { useTranslate = true; }
24147 if (ptr.bottom && scrollTop === maxScrollTop && !wasScrolled) { useTranslate = true; }
24150 if (!useTranslate && ptr.bottom && !isMaterial) {
24151 $el.css('-webkit-overflow-scrolling', 'auto');
24152 $el.scrollTop(maxScrollTop);
24153 forceUseTranslate = true;
24156 if (useTranslate || forceUseTranslate) {
24157 if (e.cancelable) {
24158 e.preventDefault();
24160 translate = (ptr.bottom ? -1 * (Math.pow( Math.abs(touchesDiff), 0.85 )) : Math.pow( touchesDiff, 0.85 )) + startTranslate;
24162 $preloaderEl.transform(("translate3d(0," + translate + "px
,0)"))
24163 .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg
)"));
24165 // eslint-disable-next-line
24167 $el.children().transform(("translate3d(0," + translate + "px
,0)"));
24169 $el.transform(("translate3d(0," + translate + "px
,0)"));
24174 if (((useTranslate || forceUseTranslate) && (Math.pow( Math.abs(touchesDiff), 0.85 )) > triggerDistance) || (!useTranslate && Math.abs(touchesDiff) >= triggerDistance * 2)) {
24176 $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
24179 $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
24181 if (!pullStarted) {
24182 $el.trigger('ptr:pullstart');
24183 ptr.emit('local::pullStart ptrPullStart', $el[0]);
24184 pullStarted = true;
24186 $el.trigger('ptr:pullmove', {
24188 scrollTop: scrollTop,
24189 translate: translate,
24190 touchesDiff: touchesDiff,
24192 ptr.emit('local::pullMove ptrPullMove', $el[0], {
24194 scrollTop: scrollTop,
24195 translate: translate,
24196 touchesDiff: touchesDiff,
24199 pullStarted = false;
24200 $el.removeClass('ptr-pull-up ptr-pull-down');
24204 function handleTouchEnd(e) {
24205 if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {
24206 if (e.changedTouches[0].identifier !== touchId) {
24208 isScrolling = false;
24214 if (!isTouched || !isMoved) {
24220 $el.addClass('ptr-transitioning');
24224 $preloaderEl.transform('')
24225 .find('.ptr-arrow').transform('');
24227 // eslint-disable-next-line
24229 $el.children().transform('');
24235 if (!useTranslate && ptr.bottom && !isMaterial) {
24236 $el.css('-webkit-overflow-scrolling', '');
24240 $el.addClass('ptr-refreshing');
24241 $el.trigger('ptr:refresh', ptr.done);
24242 ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
24244 $el.removeClass('ptr-pull-down');
24249 $el.trigger('ptr:pullend');
24250 ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
24254 if (!$pageEl.length || !$el.length) { return ptr; }
24256 $el[0].f7PullToRefresh = ptr;
24259 ptr.attachEvents = function attachEvents() {
24260 var passive = Support.passiveListener ? { passive: true } : false;
24261 $el.on(app.touchEvents.start, handleTouchStart, passive);
24262 app.on('touchmove:active', handleTouchMove);
24263 app.on('touchend:passive', handleTouchEnd);
24265 ptr.detachEvents = function detachEvents() {
24266 var passive = Support.passiveListener ? { passive: true } : false;
24267 $el.off(app.touchEvents.start, handleTouchStart, passive);
24268 app.off('touchmove:active', handleTouchMove);
24269 app.off('touchend:passive', handleTouchEnd);
24281 if ( Framework7Class$$1 ) PullToRefresh.__proto__ = Framework7Class$$1;
24282 PullToRefresh.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
24283 PullToRefresh.prototype.constructor = PullToRefresh;
24285 PullToRefresh.prototype.init = function init () {
24287 ptr.attachEvents();
24290 PullToRefresh.prototype.destroy = function destroy () {
24292 ptr.emit('local::beforeDestroy ptrBeforeDestroy', ptr);
24293 ptr.$el.trigger('ptr:beforedestroy', ptr);
24294 delete ptr.el.f7PullToRefresh;
24295 ptr.detachEvents();
24296 Utils.deleteProps(ptr);
24300 return PullToRefresh;
24301 }(Framework7Class));
24303 var PullToRefresh$1 = {
24304 name: 'pullToRefresh',
24305 create: function create() {
24307 app.ptr = Utils.extend(
24308 ConstructorMethods({
24309 defaultSelector: '.ptr-content',
24310 constructor: PullToRefresh,
24312 domProp: 'f7PullToRefresh',
24315 done: function done(el) {
24316 var ptr = app.ptr.get(el);
24317 if (ptr) { return ptr.done(); }
24320 refresh: function refresh(el) {
24321 var ptr = app.ptr.get(el);
24322 if (ptr) { return ptr.refresh(); }
24329 PullToRefresh: PullToRefresh,
24332 tabMounted: function tabMounted(tabEl) {
24334 var $tabEl = $(tabEl);
24335 $tabEl.find('.ptr-content').each(function (index, el) {
24336 app.ptr.create(el);
24339 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24340 var $tabEl = $(tabEl);
24342 $tabEl.find('.ptr-content').each(function (index, el) {
24343 app.ptr.destroy(el);
24346 pageInit: function pageInit(page) {
24348 page.$el.find('.ptr-content').each(function (index, el) {
24349 app.ptr.create(el);
24352 pageBeforeRemove: function pageBeforeRemove(page) {
24354 page.$el.find('.ptr-content').each(function (index, el) {
24355 app.ptr.destroy(el);
24362 destroy: function destroy(pageEl) {
24363 var $pageEl = $(pageEl).closest('.page');
24364 if (!$pageEl.length) { return; }
24365 if ($pageEl[0].f7LazyDestroy) {
24366 $pageEl[0].f7LazyDestroy();
24369 create: function create(pageEl) {
24371 var $pageEl = $(pageEl).closest('.page').eq(0);
24374 var $lazyLoadImages = $pageEl.find('.lazy');
24375 if ($lazyLoadImages.length === 0 && !$pageEl.hasClass('lazy')) { return; }
24378 var placeholderSrc = app.params.lazy.placeholder;
24380 if (placeholderSrc !== false) {
24381 $lazyLoadImages.each(function (index, lazyEl) {
24382 if ($(lazyEl).attr('data-src') && !$(lazyEl).attr('src')) { $(lazyEl).attr('src', placeholderSrc); }
24387 var imagesSequence = [];
24388 var imageIsLoading = false;
24390 function onImageComplete(lazyEl) {
24391 if (imagesSequence.indexOf(lazyEl) >= 0) {
24392 imagesSequence.splice(imagesSequence.indexOf(lazyEl), 1);
24394 imageIsLoading = false;
24395 if (app.params.lazy.sequential && imagesSequence.length > 0) {
24396 imageIsLoading = true;
24397 app.lazy.loadImage(imagesSequence[0], onImageComplete);
24401 function observerCallback(entries, observer) {
24402 entries.forEach(function (entry) {
24403 if (entry.isIntersecting) {
24404 if (app.params.lazy.sequential && imageIsLoading) {
24405 if (imagesSequence.indexOf(entry.target) < 0) { imagesSequence.push(entry.target); }
24409 imageIsLoading = true;
24410 app.lazy.loadImage(entry.target, onImageComplete);
24412 observer.unobserve(entry.target);
24416 if (app.params.lazy.observer && Support.intersectionObserver) {
24417 var observer = $pageEl[0].f7LazyObserver;
24419 observer = new win.IntersectionObserver(observerCallback, {
24423 $lazyLoadImages.each(function (index, el) {
24424 if (el.f7LazyObserverAdded) { return; }
24425 el.f7LazyObserverAdded = true;
24426 observer.observe(el);
24428 if (!$pageEl[0].f7LazyDestroy) {
24429 $pageEl[0].f7LazyDestroy = function () {
24430 observer.disconnect();
24431 delete $pageEl[0].f7LazyDestroy;
24432 delete $pageEl[0].f7LazyObserver;
24438 function lazyHandler() {
24439 app.lazy.load($pageEl, function (lazyEl) {
24440 if (app.params.lazy.sequential && imageIsLoading) {
24441 if (imagesSequence.indexOf(lazyEl) < 0) { imagesSequence.push(lazyEl); }
24444 imageIsLoading = true;
24445 app.lazy.loadImage(lazyEl, onImageComplete);
24449 function attachEvents() {
24450 $pageEl[0].f7LazyAttached = true;
24451 $pageEl.on('lazy', lazyHandler);
24452 $pageEl.on('scroll', lazyHandler, true);
24453 $pageEl.find('.tab').on('tab:mounted tab:show', lazyHandler);
24454 app.on('resize', lazyHandler);
24456 function detachEvents() {
24457 $pageEl[0].f7LazyAttached = false;
24458 delete $pageEl[0].f7LazyAttached;
24459 $pageEl.off('lazy', lazyHandler);
24460 $pageEl.off('scroll', lazyHandler, true);
24461 $pageEl.find('.tab').off('tab:mounted tab:show', lazyHandler);
24462 app.off('resize', lazyHandler);
24465 // Store detach function
24466 if (!$pageEl[0].f7LazyDestroy) {
24467 $pageEl[0].f7LazyDestroy = detachEvents;
24471 if (!$pageEl[0].f7LazyAttached) {
24475 // Run loader on page load/init
24478 isInViewport: function isInViewport(lazyEl) {
24480 var rect = lazyEl.getBoundingClientRect();
24481 var threshold = app.params.lazy.threshold || 0;
24484 rect.top >= (0 - threshold)
24485 && rect.left >= (0 - threshold)
24486 && rect.top <= (app.height + threshold)
24487 && rect.left <= (app.width + threshold)
24490 loadImage: function loadImage(imageEl, callback) {
24492 var $imageEl = $(imageEl);
24494 var bg = $imageEl.attr('data-background');
24495 var src = bg || $imageEl.attr('data-src');
24496 if (!src) { return; }
24497 function onLoad() {
24498 $imageEl.removeClass('lazy').addClass('lazy-loaded');
24500 $imageEl.css('background-image', ("url(" + src + ")"));
24502 $imageEl.attr('src', src);
24504 if (callback) { callback(imageEl); }
24505 $imageEl.trigger('lazy:loaded');
24506 app.emit('lazyLoaded', $imageEl[0]);
24509 function onError() {
24510 $imageEl.removeClass('lazy').addClass('lazy-loaded');
24512 $imageEl.css('background-image', ("url(" + (app.params.lazy.placeholder || '') + ")"));
24514 $imageEl.attr('src', app.params.lazy.placeholder || '');
24516 if (callback) { callback(imageEl); }
24517 $imageEl.trigger('lazy:error');
24518 app.emit('lazyError', $imageEl[0]);
24520 var image = new win.Image();
24521 image.onload = onLoad;
24522 image.onerror = onError;
24525 $imageEl.removeAttr('data-src').removeAttr('data-background');
24527 // Add loaded callback and events
24528 $imageEl.trigger('lazy:load');
24529 app.emit('lazyLoad', $imageEl[0]);
24531 load: function load(pageEl, callback) {
24533 var $pageEl = $(pageEl);
24534 if (!$pageEl.hasClass('page')) { $pageEl = $pageEl.parents('.page').eq(0); }
24535 if ($pageEl.length === 0) {
24538 $pageEl.find('.lazy').each(function (index, lazyEl) {
24539 var $lazyEl = $(lazyEl);
24540 if ($lazyEl.parents('.tab:not(.tab-active)').length > 0) {
24543 if (app.lazy.isInViewport(lazyEl)) {
24544 if (callback) { callback(lazyEl); }
24545 else { app.lazy.loadImage(lazyEl); }
24555 placeholder: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEXCwsK592mkAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==',
24561 create: function create() {
24563 Utils.extend(app, {
24565 create: Lazy.create.bind(app),
24566 destroy: Lazy.destroy.bind(app),
24567 loadImage: Lazy.loadImage.bind(app),
24568 load: Lazy.load.bind(app),
24569 isInViewport: Lazy.isInViewport.bind(app),
24574 pageInit: function pageInit(page) {
24576 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
24577 app.lazy.create(page.$el);
24580 pageAfterIn: function pageAfterIn(page) {
24582 if (app.params.lazy.observer && Support.intersectionObserver) { return; }
24583 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
24584 app.lazy.create(page.$el);
24587 pageBeforeRemove: function pageBeforeRemove(page) {
24589 if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
24590 app.lazy.destroy(page.$el);
24593 tabMounted: function tabMounted(tabEl) {
24595 var $tabEl = $(tabEl);
24596 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
24597 app.lazy.create($tabEl);
24600 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24602 if (app.params.lazy.observer && Support.intersectionObserver) { return; }
24603 var $tabEl = $(tabEl);
24604 if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
24605 app.lazy.destroy($tabEl);
24611 var DataTable = /*@__PURE__*/(function (Framework7Class$$1) {
24612 function DataTable(app, params) {
24613 if ( params === void 0 ) params = {};
24615 Framework7Class$$1.call(this, params, [app]);
24623 // Extend defaults with modules params
24624 table.useModulesParams(defaults);
24626 table.params = Utils.extend(defaults, params);
24629 var $el = $(table.params.el);
24630 if ($el.length === 0) { return undefined; }
24635 if (table.$el[0].f7DataTable) {
24636 var instance = table.$el[0].f7DataTable;
24641 table.$el[0].f7DataTable = table;
24643 Utils.extend(table, {
24644 collapsible: $el.hasClass('data-table-collapsible'),
24646 $headerEl: $el.find('.data-table-header'),
24647 $headerSelectedEl: $el.find('.data-table-header-selected'),
24651 function handleChange(e) {
24652 if (e.detail && e.detail.sentByF7DataTable) {
24653 // Scripted event, don't do anything
24656 var $inputEl = $(this);
24657 var checked = $inputEl[0].checked;
24658 var columnIndex = $inputEl.parents('td,th').index();
24660 if ($inputEl.parents('thead').length > 0) {
24661 if (columnIndex === 0) {
24663 .find('tbody tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
24666 .find(("tbody tr td
:nth
-child(" + (columnIndex + 1) + ") input
"))
24667 .prop('checked', checked)
24668 .trigger('change', { sentByF7DataTable: true });
24670 if (columnIndex === 0) {
24671 $inputEl.parents('tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
24675 $el.find(("thead
.checkbox
-cell
:nth
-child(" + (columnIndex + 1) + ") input
[type
=\"checkbox
\"]")).prop('checked', false);
24676 } else if ($el.find(("tbody
.checkbox
-cell
:nth
-child(" + (columnIndex + 1) + ") input
[type
=\"checkbox
\"]:checked
")).length === $el.find('tbody tr').length) {
24677 $el.find(("thead
.checkbox
-cell
:nth
-child(" + (columnIndex + 1) + ") input
[type
=\"checkbox
\"]")).prop('checked', true).trigger('change', { sentByF7DataTable: true });
24680 table.checkSelectedHeader();
24682 function handleSortableClick() {
24683 var $cellEl = $(this);
24684 var isActive = $cellEl.hasClass('sortable-cell-active');
24685 var currentSort = $cellEl.hasClass('sortable-desc') ? 'desc' : 'asc';
24688 newSort = currentSort === 'desc' ? 'asc' : 'desc';
24689 $cellEl.removeClass('sortable-desc sortable-asc').addClass(("sortable
-" + newSort));
24691 $el.find('thead .sortable-cell-active').removeClass('sortable-cell-active');
24692 $cellEl.addClass('sortable-cell-active');
24693 newSort = currentSort;
24695 $cellEl.trigger('datatable:sort', newSort);
24696 table.emit('local::sort dataTableSort', table, newSort);
24698 table.attachEvents = function attachEvents() {
24699 table.$el.on('change', '.checkbox-cell input[type="checkbox
"]', handleChange);
24700 table.$el.find('thead .sortable-cell').on('click', handleSortableClick);
24702 table.detachEvents = function detachEvents() {
24703 table.$el.off('change', '.checkbox-cell input[type="checkbox
"]', handleChange);
24704 table.$el.find('thead .sortable-cell').off('click', handleSortableClick);
24708 table.useModules();
24716 if ( Framework7Class$$1 ) DataTable.__proto__ = Framework7Class$$1;
24717 DataTable.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
24718 DataTable.prototype.constructor = DataTable;
24720 DataTable.prototype.setCollapsibleLabels = function setCollapsibleLabels () {
24722 if (!table.collapsible) { return; }
24723 table.$el.find('tbody td:not(.checkbox-cell)').each(function (index, el) {
24725 var elIndex = $el.index();
24726 var collpsibleTitle = $el.attr('data-collapsible-title');
24727 if (!collpsibleTitle && collpsibleTitle !== '') {
24728 $el.attr('data-collapsible-title', table.$el.find('thead th').eq(elIndex).text());
24733 DataTable.prototype.checkSelectedHeader = function checkSelectedHeader () {
24735 if (table.$headerEl.length > 0 && table.$headerSelectedEl.length > 0) {
24736 var checkedItems = table.$el.find('tbody .checkbox-cell input:checked').length;
24737 table.$el[checkedItems > 0 ? 'addClass' : 'removeClass']('data-table-has-checked');
24738 table.$headerSelectedEl.find('.data-table-selected-count').text(checkedItems);
24742 DataTable.prototype.init = function init () {
24744 table.attachEvents();
24745 table.setCollapsibleLabels();
24746 table.checkSelectedHeader();
24749 DataTable.prototype.destroy = function destroy () {
24752 table.$el.trigger('datatable:beforedestroy', table);
24753 table.emit('local::beforeDestroy dataTableBeforeDestroy', table);
24755 table.attachEvents();
24757 if (table.$el[0]) {
24758 table.$el[0].f7DataTable = null;
24759 delete table.$el[0].f7DataTable;
24761 Utils.deleteProps(table);
24766 }(Framework7Class));
24768 var DataTable$1 = {
24771 DataTable: DataTable,
24773 create: function create() {
24775 app.dataTable = ConstructorMethods({
24776 defaultSelector: '.data-table',
24777 constructor: DataTable,
24779 domProp: 'f7DataTable',
24783 tabBeforeRemove: function tabBeforeRemove(tabEl) {
24785 $(tabEl).find('.data-table-init').each(function (index, tableEl) {
24786 app.dataTable.destroy(tableEl);
24789 tabMounted: function tabMounted(tabEl) {
24791 $(tabEl).find('.data-table-init').each(function (index, tableEl) {
24792 app.dataTable.create({ el: tableEl });
24795 pageBeforeRemove: function pageBeforeRemove(page) {
24797 page.$el.find('.data-table-init').each(function (index, tableEl) {
24798 app.dataTable.destroy(tableEl);
24801 pageInit: function pageInit(page) {
24803 page.$el.find('.data-table-init').each(function (index, tableEl) {
24804 app.dataTable.create({ el: tableEl });
24809 'data-table-init': {
24810 insert: function insert(vnode) {
24812 var tableEl = vnode.elm;
24813 app.dataTable.create({ el: tableEl });
24815 destroy: function destroy(vnode) {
24817 var tableEl = vnode.elm;
24818 app.dataTable.destroy(tableEl);
24825 morphOpen: function morphOpen(fabEl, targetEl) {
24827 var $fabEl = $(fabEl);
24828 var $targetEl = $(targetEl);
24829 if ($targetEl.length === 0) { return; }
24831 $targetEl.transition(0).addClass('fab-morph-target-visible');
24833 width: $targetEl[0].offsetWidth,
24834 height: $targetEl[0].offsetHeight,
24835 offset: $targetEl.offset(),
24836 borderRadius: $targetEl.css('border-radius'),
24837 zIndex: $targetEl.css('z-index'),
24840 width: $fabEl[0].offsetWidth,
24841 height: $fabEl[0].offsetHeight,
24842 offset: $fabEl.offset(),
24843 translateX: Utils.getTranslate($fabEl[0], 'x'),
24844 translateY: Utils.getTranslate($fabEl[0], 'y'),
24847 $fabEl[0].f7FabMorphData = {
24848 $targetEl: $targetEl,
24853 var diffX = (fab.offset.left + (fab.width / 2))
24854 - (target.offset.left + (target.width / 2))
24856 var diffY = (fab.offset.top + (fab.height / 2))
24857 - (target.offset.top + (target.height / 2))
24859 var scaleX = target.width / fab.width;
24860 var scaleY = target.height / fab.height;
24862 var borderRadius = Math.ceil(parseInt(target.borderRadius, 10) / Math.max(scaleX, scaleY));
24863 if (borderRadius > 0) { borderRadius += 2; }
24865 $fabEl[0].f7FabMorphResizeHandler = function resizeHandler() {
24866 $fabEl.transition(0).transform('');
24867 $targetEl.transition(0);
24868 target.width = $targetEl[0].offsetWidth;
24869 target.height = $targetEl[0].offsetHeight;
24870 target.offset = $targetEl.offset();
24871 fab.offset = $fabEl.offset();
24873 var diffXNew = (fab.offset.left + (fab.width / 2))
24874 - (target.offset.left + (target.width / 2))
24876 var diffYNew = (fab.offset.top + (fab.height / 2))
24877 - (target.offset.top + (target.height / 2))
24879 var scaleXNew = target.width / fab.width;
24880 var scaleYNew = target.height / fab.height;
24882 $fabEl.transform(("translate3d(" + (-diffXNew) + "px
, " + (-diffYNew) + "px
, 0) scale(" + scaleXNew + ", " + scaleYNew + ")"));
24887 .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
24889 .addClass('fab-opened')
24890 .css('z-index', target.zIndex - 1)
24891 .transform(("translate3d(" + (-diffX) + "px
, " + (-diffY) + "px
, 0)"));
24892 $fabEl.transitionEnd(function () {
24893 $targetEl.transition('');
24894 Utils.nextFrame(function () {
24895 $targetEl.css('opacity', 1).transform('scale(1,1)');
24897 .transform(("translate3d(" + (-diffX) + "px
, " + (-diffY) + "px
, 0) scale(" + scaleX + ", " + scaleY + ")"))
24898 .css('border-radius', (borderRadius + "px
"))
24899 .css('box-shadow', 'none');
24901 app.on('resize', $fabEl[0].f7FabMorphResizeHandler);
24902 if ($targetEl.parents('.page-content').length > 0) {
24903 $targetEl.parents('.page-content').on('scroll', $fabEl[0].f7FabMorphResizeHandler);
24907 morphClose: function morphClose(fabEl) {
24909 var $fabEl = $(fabEl);
24910 var morphData = $fabEl[0].f7FabMorphData;
24911 if (!morphData) { return; }
24912 var $targetEl = morphData.$targetEl;
24913 var target = morphData.target;
24914 var fab = morphData.fab;
24915 if ($targetEl.length === 0) { return; }
24917 var diffX = (fab.offset.left + (fab.width / 2))
24918 - (target.offset.left + (target.width / 2))
24920 var diffY = (fab.offset.top + (fab.height / 2))
24921 - (target.offset.top + (target.height / 2))
24923 var scaleX = target.width / fab.width;
24924 var scaleY = target.height / fab.height;
24926 app.off('resize', $fabEl[0].f7FabMorphResizeHandler);
24927 if ($targetEl.parents('.page-content').length > 0) {
24928 $targetEl.parents('.page-content').off('scroll', $fabEl[0].f7FabMorphResizeHandler);
24933 .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
24936 .css('box-shadow', '')
24937 .css('border-radius', '')
24938 .transform(("translate3d(" + (-diffX) + "px
, " + (-diffY) + "px
, 0)"));
24939 $fabEl.transitionEnd(function () {
24941 .css('z-index', '')
24942 .removeClass('fab-opened')
24944 Utils.nextFrame(function () {
24945 $fabEl.transitionEnd(function () {
24947 .removeClass('fab-morph-target-visible')
24948 .css('opacity', '')
24955 open: function open(fabEl, targetEl) {
24957 var $fabEl = $(fabEl).eq(0);
24958 var $buttonsEl = $fabEl.find('.fab-buttons');
24959 if (!$fabEl.length) { return; }
24960 if ($fabEl.hasClass('fab-opened')) { return; }
24961 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
24963 if (app.fab.openedEl) {
24964 if (app.fab.openedEl === $fabEl[0]) { return; }
24965 app.fab.close(app.fab.openedEl);
24967 app.fab.openedEl = $fabEl[0];
24968 if ($fabEl.hasClass('fab-morph')) {
24969 app.fab.morphOpen($fabEl, targetEl || $fabEl.attr('data-morph-to'));
24971 $fabEl.addClass('fab-opened');
24973 $fabEl.trigger('fab:open');
24975 close: function close(fabEl) {
24976 if ( fabEl === void 0 ) fabEl = '.fab-opened';
24979 var $fabEl = $(fabEl).eq(0);
24980 var $buttonsEl = $fabEl.find('.fab-buttons');
24981 if (!$fabEl.length) { return; }
24982 if (!$fabEl.hasClass('fab-opened')) { return; }
24983 if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
24984 app.fab.openedEl = null;
24985 if ($fabEl.hasClass('fab-morph')) {
24986 app.fab.morphClose($fabEl);
24988 $fabEl.removeClass('fab-opened');
24990 $fabEl.trigger('fab:close');
24992 toggle: function toggle(fabEl) {
24994 var $fabEl = $(fabEl);
24995 if (!$fabEl.hasClass('fab-opened')) { app.fab.open(fabEl); }
24996 else { app.fab.close(fabEl); }
25002 create: function create() {
25004 Utils.extend(app, {
25007 morphOpen: Fab.morphOpen.bind(app),
25008 morphClose: Fab.morphClose.bind(app),
25009 open: Fab.open.bind(app),
25010 close: Fab.close.bind(app),
25011 toggle: Fab.toggle.bind(app),
25016 '.fab > a': function open($clickedEl) {
25018 app.fab.toggle($clickedEl.parents('.fab'));
25020 '.fab-open': function open($clickedEl, data) {
25021 if ( data === void 0 ) data = {};
25024 app.fab.open(data.fab);
25026 '.fab-close': function close($clickedEl, data) {
25027 if ( data === void 0 ) data = {};
25030 app.fab.close(data.fab);
25035 var Searchbar = /*@__PURE__*/(function (FrameworkClass) {
25036 function Searchbar(app, params) {
25037 if ( params === void 0 ) params = {};
25039 FrameworkClass.call(this, params, [app]);
25045 inputEl: undefined,
25046 inputEvents: 'change input compositionend',
25047 disableButton: true,
25048 disableButtonEl: undefined,
25049 backdropEl: undefined,
25050 searchContainer: undefined, // container to search, HTMLElement or CSS selector
25051 searchItem: 'li', // single item selector, CSS selector
25052 searchIn: undefined, // where to search in item, CSS selector
25053 searchGroup: '.list-group',
25054 searchGroupTitle: '.item-divider, .list-group-title',
25055 ignore: '.searchbar-ignore',
25056 foundEl: '.searchbar-found',
25057 notFoundEl: '.searchbar-not-found',
25058 hideOnEnableEl: '.searchbar-hide-on-enable',
25059 hideOnSearchEl: '.searchbar-hide-on-search',
25061 removeDiacritics: true,
25062 customSearch: false,
25063 hideDividers: true,
25065 disableOnBackdropClick: true,
25069 // Extend defaults with modules params
25070 sb.useModulesParams(defaults);
25072 sb.params = Utils.extend(defaults, params);
25074 var $el = $(sb.params.el);
25075 if ($el.length === 0) { return sb; }
25077 if ($el[0].f7Searchbar) { return $el[0].f7Searchbar; }
25079 $el[0].f7Searchbar = sb;
25082 var $navbarEl = $el.parents('.navbar-inner');
25083 if ($el.parents('.page').length > 0) {
25084 $pageEl = $el.parents('.page');
25085 } else if ($navbarEl.length > 0) {
25086 $pageEl = $(app.navbar.getPageByEl($navbarEl[0]));
25087 if (!$pageEl.length) {
25088 var $currentPageEl = $el.parents('.view').find('.page-current');
25089 if ($currentPageEl[0] && $currentPageEl[0].f7Page && $currentPageEl[0].f7Page.navbarEl === $navbarEl[0]) {
25090 $pageEl = $currentPageEl;
25096 if (params.foundEl) {
25097 $foundEl = $(params.foundEl);
25098 } else if (typeof sb.params.foundEl === 'string' && $pageEl) {
25099 $foundEl = $pageEl.find(sb.params.foundEl);
25103 if (params.notFoundEl) {
25104 $notFoundEl = $(params.notFoundEl);
25105 } else if (typeof sb.params.notFoundEl === 'string' && $pageEl) {
25106 $notFoundEl = $pageEl.find(sb.params.notFoundEl);
25109 var $hideOnEnableEl;
25110 if (params.hideOnEnableEl) {
25111 $hideOnEnableEl = $(params.hideOnEnableEl);
25112 } else if (typeof sb.params.hideOnEnableEl === 'string' && $pageEl) {
25113 $hideOnEnableEl = $pageEl.find(sb.params.hideOnEnableEl);
25116 var $hideOnSearchEl;
25117 if (params.hideOnSearchEl) {
25118 $hideOnSearchEl = $(params.hideOnSearchEl);
25119 } else if (typeof sb.params.hideOnSearchEl === 'string' && $pageEl) {
25120 $hideOnSearchEl = $pageEl.find(sb.params.hideOnSearchEl);
25124 if (sb.params.backdrop) {
25125 if (sb.params.backdropEl) {
25126 $backdropEl = $(sb.params.backdropEl);
25127 } else if ($pageEl && $pageEl.length > 0) {
25128 $backdropEl = $pageEl.find('.searchbar-backdrop');
25130 $backdropEl = $el.siblings('.searchbar-backdrop');
25132 if ($backdropEl.length === 0) {
25133 $backdropEl = $('<div class="searchbar
-backdrop
"></div>');
25134 if ($pageEl && $pageEl.length) {
25135 if ($el.parents($pageEl).length > 0 && $navbarEl && $el.parents($navbarEl).length === 0) {
25136 $backdropEl.insertBefore($el);
25138 $backdropEl.insertBefore($pageEl.find('.page-content').eq(0));
25141 $backdropEl.insertBefore($el);
25146 var $searchContainer;
25147 if (sb.params.searchContainer) {
25148 $searchContainer = $(sb.params.searchContainer);
25152 if (sb.params.inputEl) {
25153 $inputEl = $(sb.params.inputEl);
25155 $inputEl = $el.find('input[type="search
"]').eq(0);
25158 var $disableButtonEl;
25159 if (sb.params.disableButton) {
25160 if (sb.params.disableButtonEl) {
25161 $disableButtonEl = $(sb.params.disableButtonEl);
25163 $disableButtonEl = $el.find('.searchbar-disable-button');
25169 view: app.views.get($el.parents('.view')),
25172 $backdropEl: $backdropEl,
25173 backdropEl: $backdropEl && $backdropEl[0],
25174 $searchContainer: $searchContainer,
25175 searchContainer: $searchContainer && $searchContainer[0],
25176 $inputEl: $inputEl,
25177 inputEl: $inputEl[0],
25178 $disableButtonEl: $disableButtonEl,
25179 disableButtonEl: $disableButtonEl && $disableButtonEl[0],
25180 disableButtonHasMargin: false,
25182 pageEl: $pageEl && $pageEl[0],
25183 $navbarEl: $navbarEl,
25184 navbarEl: $navbarEl && $navbarEl[0],
25185 $foundEl: $foundEl,
25186 foundEl: $foundEl && $foundEl[0],
25187 $notFoundEl: $notFoundEl,
25188 notFoundEl: $notFoundEl && $notFoundEl[0],
25189 $hideOnEnableEl: $hideOnEnableEl,
25190 hideOnEnableEl: $hideOnEnableEl && $hideOnEnableEl[0],
25191 $hideOnSearchEl: $hideOnSearchEl,
25192 hideOnSearchEl: $hideOnSearchEl && $hideOnSearchEl[0],
25195 isVirtualList: $searchContainer && $searchContainer.hasClass('virtual-list'),
25196 virtualList: undefined,
25198 expandable: sb.params.expandable || $el.hasClass('searchbar-expandable'),
25202 function preventSubmit(e) {
25203 e.preventDefault();
25205 function onInputFocus(e) {
25207 sb.$el.addClass('searchbar-focused');
25209 function onInputBlur() {
25210 sb.$el.removeClass('searchbar-focused');
25212 function onInputChange() {
25213 var value = sb.$inputEl.val().trim();
25216 (sb.$searchContainer && sb.$searchContainer.length > 0)
25217 && (sb.params.searchIn || sb.isVirtualList || sb.params.searchIn === sb.params.searchItem)
25219 || sb.params.customSearch
25221 sb.search(value, true);
25224 function onInputClear(e, previousValue) {
25225 sb.$el.trigger('searchbar:clear', previousValue);
25226 sb.emit('local::clear searchbarClear', sb, previousValue);
25228 function disableOnClick(e) {
25231 function onPageBeforeOut() {
25232 if (!sb || (sb && !sb.$el)) { return; }
25234 sb.$el.removeClass('searchbar-enabled');
25235 if (sb.expandable) {
25236 sb.$el.parents('.navbar-inner').removeClass('with-searchbar-expandable-enabled');
25240 function onPageBeforeIn() {
25241 if (!sb || (sb && !sb.$el)) { return; }
25243 sb.$el.addClass('searchbar-enabled');
25244 if (sb.expandable) {
25245 sb.$el.parents('.navbar-inner').addClass('with-searchbar-expandable-enabled');
25249 sb.attachEvents = function attachEvents() {
25250 $el.on('submit', preventSubmit);
25251 if (sb.params.disableButton) {
25252 sb.$disableButtonEl.on('click', disableOnClick);
25254 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
25255 sb.$backdropEl.on('click', disableOnClick);
25257 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
25258 sb.$pageEl.on('page:beforeout', onPageBeforeOut);
25259 sb.$pageEl.on('page:beforein', onPageBeforeIn);
25261 sb.$inputEl.on('focus', onInputFocus);
25262 sb.$inputEl.on('blur', onInputBlur);
25263 sb.$inputEl.on(sb.params.inputEvents, onInputChange);
25264 sb.$inputEl.on('input:clear', onInputClear);
25266 sb.detachEvents = function detachEvents() {
25267 $el.off('submit', preventSubmit);
25268 if (sb.params.disableButton) {
25269 sb.$disableButtonEl.off('click', disableOnClick);
25271 if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
25272 sb.$backdropEl.off('click', disableOnClick);
25274 if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
25275 sb.$pageEl.off('page:beforeout', onPageBeforeOut);
25276 sb.$pageEl.off('page:beforein', onPageBeforeIn);
25278 sb.$inputEl.off('focus', onInputFocus);
25279 sb.$inputEl.off('blur', onInputBlur);
25280 sb.$inputEl.off(sb.params.inputEvents, onInputChange);
25281 sb.$inputEl.off('input:clear', onInputClear);
25293 if ( FrameworkClass ) Searchbar.__proto__ = FrameworkClass;
25294 Searchbar.prototype = Object.create( FrameworkClass && FrameworkClass.prototype );
25295 Searchbar.prototype.constructor = Searchbar;
25297 Searchbar.prototype.clear = function clear (e) {
25299 if (!sb.query && e && $(e.target).hasClass('searchbar-clear')) {
25303 var previousQuery = sb.value;
25304 sb.$inputEl.val('').trigger('change').focus();
25305 sb.$el.trigger('searchbar:clear', previousQuery);
25306 sb.emit('local::clear searchbarClear', sb, previousQuery);
25310 Searchbar.prototype.setDisableButtonMargin = function setDisableButtonMargin () {
25312 if (sb.expandable) { return; }
25314 sb.$disableButtonEl.transition(0).show();
25315 sb.$disableButtonEl.css(("margin
-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px
"));
25316 /* eslint no-underscore-dangle: ["error
", { "allow
": ["_clientLeft
"] }] */
25317 sb._clientLeft = sb.$disableButtonEl[0].clientLeft;
25318 sb.$disableButtonEl.transition('');
25319 sb.disableButtonHasMargin = true;
25322 Searchbar.prototype.enable = function enable (setFocus) {
25324 if (sb.enabled) { return sb; }
25327 function enable() {
25328 if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch) && !sb.$el.hasClass('searchbar-enabled') && !sb.query) {
25331 sb.$el.addClass('searchbar-enabled');
25332 if (!sb.$disableButtonEl || (sb.$disableButtonEl && sb.$disableButtonEl.length === 0)) {
25333 sb.$el.addClass('searchbar-enabled-no-disable-button');
25335 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme === 'ios') {
25336 if (!sb.disableButtonHasMargin) {
25337 sb.setDisableButtonMargin();
25339 sb.$disableButtonEl.css(("margin
-" + (app.rtl ? 'left' : 'right')), '0px');
25341 if (sb.expandable) {
25342 if (sb.$el.parents('.navbar-inner').hasClass('navbar-inner-large') && sb.$pageEl) {
25343 sb.$pageEl.find('.page-content').addClass('with-searchbar-expandable-enabled');
25345 if (app.theme === 'md' && sb.$el.parent('.navbar-inner').parent('.navbar').length) {
25346 sb.$el.parent('.navbar-inner').parent('.navbar').addClass('with-searchbar-expandable-enabled');
25348 sb.$el.parent('.navbar-inner').addClass('with-searchbar-expandable-enabled');
25349 sb.$el.parent('.navbar-inner-large').addClass('navbar-inner-large-collapsed');
25352 if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.addClass('hidden-by-searchbar'); }
25353 sb.$el.trigger('searchbar:enable');
25354 sb.emit('local::enable searchbarEnable', sb);
25356 var needsFocus = false;
25357 if (setFocus === true) {
25358 if (doc.activeElement !== sb.inputEl) {
25362 var isIos = app.device.ios && app.theme === 'ios';
25364 if (sb.expandable) {
25365 if (needsFocus) { sb.$inputEl.focus(); }
25368 if (needsFocus) { sb.$inputEl.focus(); }
25369 if (setFocus && (setFocus.type === 'focus' || setFocus === true)) {
25370 Utils.nextTick(function () {
25378 if (needsFocus) { sb.$inputEl.focus(); }
25379 if (app.theme === 'md' && sb.expandable) {
25380 sb.$el.parents('.page, .view, .navbar-inner').scrollLeft(0);
25387 Searchbar.prototype.disable = function disable () {
25389 if (!sb.enabled) { return sb; }
25391 sb.$inputEl.val('').trigger('change');
25392 sb.$el.removeClass('searchbar-enabled searchbar-focused searchbar-enabled-no-disable-button');
25393 if (sb.expandable) {
25394 if (sb.$el.parents('.navbar-inner').hasClass('navbar-inner-large') && sb.$pageEl) {
25395 sb.$pageEl.find('.page-content').removeClass('with-searchbar-expandable-enabled');
25397 if (app.theme === 'md' && sb.$el.parent('.navbar-inner').parent('.navbar').length) {
25398 sb.$el.parent('.navbar-inner').parent('.navbar').removeClass('with-searchbar-expandable-enabled');
25400 sb.$el.parent('.navbar-inner').removeClass('with-searchbar-expandable-enabled');
25402 sb.$pageEl.find('.page-content').trigger('scroll');
25406 if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme === 'ios') {
25407 sb.$disableButtonEl.css(("margin
-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px
"));
25409 if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch)) {
25413 sb.enabled = false;
25415 sb.$inputEl.blur();
25417 if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.removeClass('hidden-by-searchbar'); }
25419 sb.$el.trigger('searchbar:disable');
25420 sb.emit('local::disable searchbarDisable', sb);
25424 Searchbar.prototype.toggle = function toggle () {
25426 if (sb.enabled) { sb.disable(); }
25427 else { sb.enable(true); }
25431 Searchbar.prototype.backdropShow = function backdropShow () {
25433 if (sb.$backdropEl) {
25434 sb.$backdropEl.addClass('searchbar-backdrop-in');
25439 Searchbar.prototype.backdropHide = function backdropHide () {
25441 if (sb.$backdropEl) {
25442 sb.$backdropEl.removeClass('searchbar-backdrop-in');
25447 Searchbar.prototype.search = function search (query, internal) {
25449 sb.previousQuery = sb.query || '';
25450 if (query === sb.previousQuery) { return sb; }
25456 sb.$inputEl.val(query);
25457 sb.$inputEl.trigger('input');
25462 var $searchContainer = sb.$searchContainer;
25464 var $foundEl = sb.$foundEl;
25465 var $notFoundEl = sb.$notFoundEl;
25466 var $hideOnSearchEl = sb.$hideOnSearchEl;
25467 var isVirtualList = sb.isVirtualList;
25469 // Hide on search element
25470 if (query.length > 0 && $hideOnSearchEl) {
25471 $hideOnSearchEl.addClass('hidden-by-searchbar');
25472 } else if ($hideOnSearchEl) {
25473 $hideOnSearchEl.removeClass('hidden-by-searchbar');
25475 // Add active/inactive classes on overlay
25477 ($searchContainer && $searchContainer.length && $el.hasClass('searchbar-enabled'))
25478 || (sb.params.customSearch && $el.hasClass('searchbar-enabled'))
25480 if (query.length === 0) {
25487 if (sb.params.customSearch) {
25488 $el.trigger('searchbar:search', query, sb.previousQuery);
25489 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
25493 var foundItems = [];
25495 if (isVirtualList) {
25496 sb.virtualList = $searchContainer[0].f7VirtualList;
25497 if (query.trim() === '') {
25498 sb.virtualList.resetFilter();
25499 if ($notFoundEl) { $notFoundEl.hide(); }
25500 if ($foundEl) { $foundEl.show(); }
25501 $el.trigger('searchbar:search', query, sb.previousQuery);
25502 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
25505 vlQuery = sb.params.removeDiacritics ? Utils.removeDiacritics(query) : query;
25506 if (sb.virtualList.params.searchAll) {
25507 foundItems = sb.virtualList.params.searchAll(vlQuery, sb.virtualList.items) || [];
25508 } else if (sb.virtualList.params.searchByItem) {
25509 for (var i = 0; i < sb.virtualList.items.length; i += 1) {
25510 if (sb.virtualList.params.searchByItem(vlQuery, sb.virtualList.params.items[i], i)) {
25511 foundItems.push(i);
25517 if (sb.params.removeDiacritics) { values = Utils.removeDiacritics(query.trim().toLowerCase()).split(' '); }
25519 values = query.trim().toLowerCase().split(' ');
25521 $searchContainer.find(sb.params.searchItem).removeClass('hidden-by-searchbar').each(function (itemIndex, itemEl) {
25522 var $itemEl = $(itemEl);
25523 var compareWithText = [];
25524 var $searchIn = sb.params.searchIn ? $itemEl.find(sb.params.searchIn) : $itemEl;
25525 if (sb.params.searchIn === sb.params.searchItem) {
25526 $searchIn = $itemEl;
25528 $searchIn.each(function (searchInIndex, searchInEl) {
25529 var itemText = $(searchInEl).text().trim().toLowerCase();
25530 if (sb.params.removeDiacritics) { itemText = Utils.removeDiacritics(itemText); }
25531 compareWithText.push(itemText);
25533 compareWithText = compareWithText.join(' ');
25534 var wordsMatch = 0;
25535 for (var i = 0; i < values.length; i += 1) {
25536 if (compareWithText.indexOf(values[i]) >= 0) { wordsMatch += 1; }
25538 if (wordsMatch !== values.length && !(sb.params.ignore && $itemEl.is(sb.params.ignore))) {
25539 $itemEl.addClass('hidden-by-searchbar');
25541 foundItems.push($itemEl[0]);
25545 if (sb.params.hideDividers) {
25546 $searchContainer.find(sb.params.searchGroupTitle).each(function (titleIndex, titleEl) {
25547 var $titleEl = $(titleEl);
25548 var $nextElements = $titleEl.nextAll(sb.params.searchItem);
25550 for (var i = 0; i < $nextElements.length; i += 1) {
25551 var $nextEl = $nextElements.eq(i);
25552 if ($nextEl.is(sb.params.searchGroupTitle)) { break; }
25553 if (!$nextEl.hasClass('hidden-by-searchbar')) {
25557 var ignore = sb.params.ignore && $titleEl.is(sb.params.ignore);
25558 if (hide && !ignore) { $titleEl.addClass('hidden-by-searchbar'); }
25559 else { $titleEl.removeClass('hidden-by-searchbar'); }
25562 if (sb.params.hideGroups) {
25563 $searchContainer.find(sb.params.searchGroup).each(function (groupIndex, groupEl) {
25564 var $groupEl = $(groupEl);
25565 var ignore = sb.params.ignore && $groupEl.is(sb.params.ignore);
25566 // eslint-disable-next-line
25567 var notHidden = $groupEl.find(sb.params.searchItem).filter(function (index, el) {
25568 return !$(el).hasClass('hidden-by-searchbar');
25570 if (notHidden.length === 0 && !ignore) {
25571 $groupEl.addClass('hidden-by-searchbar');
25573 $groupEl.removeClass('hidden-by-searchbar');
25579 if (foundItems.length === 0) {
25580 if ($notFoundEl) { $notFoundEl.show(); }
25581 if ($foundEl) { $foundEl.hide(); }
25583 if ($notFoundEl) { $notFoundEl.hide(); }
25584 if ($foundEl) { $foundEl.show(); }
25586 if (isVirtualList && sb.virtualList) {
25587 sb.virtualList.filterItems(foundItems);
25590 $el.trigger('searchbar:search', query, sb.previousQuery, foundItems);
25591 sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery, foundItems);
25596 Searchbar.prototype.init = function init () {
25601 Searchbar.prototype.destroy = function destroy () {
25603 sb.emit('local::beforeDestroy searchbarBeforeDestroy', sb);
25604 sb.$el.trigger('searchbar:beforedestroy', sb);
25607 sb.$el[0].f7Searchbar = null;
25608 delete sb.$el[0].f7Searchbar;
25610 Utils.deleteProps(sb);
25614 }(Framework7Class));
25616 var Searchbar$1 = {
25619 Searchbar: Searchbar,
25621 create: function create() {
25623 app.searchbar = ConstructorMethods({
25624 defaultSelector: '.searchbar',
25625 constructor: Searchbar,
25627 domProp: 'f7Searchbar',
25628 addMethods: 'clear enable disable toggle search'.split(' '),
25632 tabMounted: function tabMounted(tabEl) {
25634 $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
25635 var $searchbarEl = $(searchbarEl);
25636 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25639 tabBeforeRemove: function tabBeforeRemove(tabEl) {
25640 $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
25641 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25642 searchbarEl.f7Searchbar.destroy();
25646 pageInit: function pageInit(page) {
25648 page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
25649 var $searchbarEl = $(searchbarEl);
25650 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25652 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
25653 page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
25654 var $searchbarEl = $(searchbarEl);
25655 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25659 pageBeforeRemove: function pageBeforeRemove(page) {
25661 page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
25662 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25663 searchbarEl.f7Searchbar.destroy();
25666 if (app.theme === 'ios' && page.view && page.view.router.separateNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
25667 page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
25668 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25669 searchbarEl.f7Searchbar.destroy();
25676 '.searchbar-clear': function clear($clickedEl, data) {
25677 if ( data === void 0 ) data = {};
25680 var sb = app.searchbar.get(data.searchbar);
25681 if (sb) { sb.clear(); }
25683 '.searchbar-enable': function enable($clickedEl, data) {
25684 if ( data === void 0 ) data = {};
25687 var sb = app.searchbar.get(data.searchbar);
25688 if (sb) { sb.enable(true); }
25690 '.searchbar-disable': function disable($clickedEl, data) {
25691 if ( data === void 0 ) data = {};
25694 var sb = app.searchbar.get(data.searchbar);
25695 if (sb) { sb.disable(); }
25697 '.searchbar-toggle': function toggle($clickedEl, data) {
25698 if ( data === void 0 ) data = {};
25701 var sb = app.searchbar.get(data.searchbar);
25702 if (sb) { sb.toggle(); }
25706 'searchbar-init': {
25707 insert: function insert(vnode) {
25709 var searchbarEl = vnode.elm;
25710 var $searchbarEl = $(searchbarEl);
25711 app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
25713 destroy: function destroy(vnode) {
25714 var searchbarEl = vnode.elm;
25715 if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
25716 searchbarEl.f7Searchbar.destroy();
25723 var Messages = /*@__PURE__*/(function (Framework7Class$$1) {
25724 function Messages(app, params) {
25725 if ( params === void 0 ) params = {};
25727 Framework7Class$$1.call(this, params, [app]);
25734 newMessagesFirst: false,
25735 scrollMessages: true,
25736 scrollMessagesOnEdge: true,
25737 firstMessageRule: undefined,
25738 lastMessageRule: undefined,
25739 tailMessageRule: undefined,
25740 sameNameMessageRule: undefined,
25741 sameHeaderMessageRule: undefined,
25742 sameFooterMessageRule: undefined,
25743 sameAvatarMessageRule: undefined,
25744 customClassMessageRule: undefined,
25745 renderMessage: undefined,
25748 // Extend defaults with modules params
25749 m.useModulesParams(defaults);
25751 m.params = Utils.extend(defaults, params);
25753 var $el = $(params.el).eq(0);
25754 if ($el.length === 0) { return m; }
25756 if ($el[0].f7Messages) { return $el[0].f7Messages; }
25758 $el[0].f7Messages = m;
25760 var $pageContentEl = $el.closest('.page-content').eq(0);
25763 messages: m.params.messages,
25766 $pageContentEl: $pageContentEl,
25767 pageContentEl: $pageContentEl[0],
25779 if ( Framework7Class$$1 ) Messages.__proto__ = Framework7Class$$1;
25780 Messages.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
25781 Messages.prototype.constructor = Messages;
25782 // eslint-disable-next-line
25783 Messages.prototype.getMessageData = function getMessageData (messageEl) {
25784 var $messageEl = $(messageEl);
25786 name: $messageEl.find('.message-name').html(),
25787 header: $messageEl.find('.message-header').html(),
25788 textHeader: $messageEl.find('.message-text-header').html(),
25789 textFooter: $messageEl.find('.message-text-footer').html(),
25790 footer: $messageEl.find('.message-footer').html(),
25791 isTitle: $messageEl.hasClass('messages-title'),
25792 type: $messageEl.hasClass('message-sent') ? 'sent' : 'received',
25793 text: $messageEl.find('.message-text').html(),
25794 image: $messageEl.find('.message-image').html(),
25795 imageSrc: $messageEl.find('.message-image img').attr('src'),
25796 typing: $messageEl.hasClass('message-typing'),
25798 if (data.isTitle) {
25799 data.text = $messageEl.html();
25801 if (data.text && data.textHeader) {
25802 data.text = data.text.replace(("<div
class=\"message
-text
-header
\">" + (data.textHeader) + "</div
>"), '');
25804 if (data.text && data.textFooter) {
25805 data.text = data.text.replace(("<div
class=\"message
-text
-footer
\">" + (data.textFooter) + "</div
>"), '');
25807 var avatar = $messageEl.find('.message-avatar').css('background-image');
25808 if (avatar === 'none' || avatar === '') { avatar = undefined; }
25809 if (avatar && typeof avatar === 'string') {
25810 avatar = avatar.replace('url(', '').replace(')', '').replace(/"/g
, '').replace(/'/g, '');
25812 avatar = undefined;
25814 data.avatar = avatar;
25819 Messages.prototype.getMessagesData = function getMessagesData () {
25822 m.$el.find('.message
, .messages
-title
').each(function (index, messageEl) {
25823 data.push(m.getMessageData(messageEl));
25828 Messages.prototype.renderMessage = function renderMessage (messageToRender) {
25830 var message = Utils.extend({
25833 }, messageToRender);
25834 if (m.params.renderMessage) {
25835 return m.params.renderMessage.call(m, message);
25837 if (message.isTitle) {
25838 return ("<div class=\"messages-title\">" + (message.text) + "</div>");
25840 var attrs = Object.keys(message.attrs).map(function (attr) { return (attr + "=\"" + (message.attrs[attr]) + "\""); }).join(' ');
25841 return ("\n <div class=\"message message-" + (message.type) + " " + (message.isTyping ? 'message
-typing
' : '') + " " + (message.cssClass || '') + "\" " + attrs + ">\n " + (message.avatar ? ("\n <div class=\"message-avatar\" style=\"background-image:url(" + (message.avatar) + ")\"></div>\n ") : '') + "\n <div class=\"message-content\">\n " + (message.name ? ("<div class=\"message-name\">" + (message.name) + "</div>") : '') + "\n " + (message.header ? ("<div class=\"message-header\">" + (message.header) + "</div>") : '') + "\n <div class=\"message-bubble\">\n " + (message.textHeader ? ("<div class=\"message-text-header\">" + (message.textHeader) + "</div>") : '') + "\n " + (message.image ? ("<div class=\"message-image\">" + (message.image) + "</div>") : '') + "\n " + (message.imageSrc && !message.image ? ("<div class=\"message-image\"><img src=\"" + (message.imageSrc) + "\"></div>") : '') + "\n " + (message.text || message.isTyping ? ("<div class=\"message-text\">" + (message.text || '') + (message.isTyping ? '<div
class="message-typing-indicator"><div
></div><div></div><div
></div></div>' : '') + "</div>") : '') + "\n " + (message.textFooter ? ("<div class=\"message-text-footer\">" + (message.textFooter) + "</div>") : '') + "\n </div>\n " + (message.footer ? ("<div class=\"message-footer\">" + (message.footer) + "</div>") : '') + "\n </div>\n </div>\n ");
25844 Messages.prototype.renderMessages = function renderMessages (messagesToRender, method) {
25845 if ( messagesToRender === void 0 ) messagesToRender = this.messages;
25846 if ( method === void 0 ) method = this.params.newMessagesFirst ? 'prepend
' : 'append
';
25849 var html = messagesToRender.map(function (message) { return m.renderMessage(message); }).join('');
25850 m.$el[method](html);
25853 Messages.prototype.isFirstMessage = function isFirstMessage () {
25856 var args = [], len = arguments.length;
25857 while ( len-- ) args[ len ] = arguments[ len ];
25859 if (m.params.firstMessageRule) { return (ref = m.params).firstMessageRule.apply(ref, args); }
25863 Messages.prototype.isLastMessage = function isLastMessage () {
25866 var args = [], len = arguments.length;
25867 while ( len-- ) args[ len ] = arguments[ len ];
25869 if (m.params.lastMessageRule) { return (ref = m.params).lastMessageRule.apply(ref, args); }
25873 Messages.prototype.isTailMessage = function isTailMessage () {
25876 var args = [], len = arguments.length;
25877 while ( len-- ) args[ len ] = arguments[ len ];
25879 if (m.params.tailMessageRule) { return (ref = m.params).tailMessageRule.apply(ref, args); }
25883 Messages.prototype.isSameNameMessage = function isSameNameMessage () {
25886 var args = [], len = arguments.length;
25887 while ( len-- ) args[ len ] = arguments[ len ];
25889 if (m.params.sameNameMessageRule) { return (ref = m.params).sameNameMessageRule.apply(ref, args); }
25893 Messages.prototype.isSameHeaderMessage = function isSameHeaderMessage () {
25896 var args = [], len = arguments.length;
25897 while ( len-- ) args[ len ] = arguments[ len ];
25899 if (m.params.sameHeaderMessageRule) { return (ref = m.params).sameHeaderMessageRule.apply(ref, args); }
25903 Messages.prototype.isSameFooterMessage = function isSameFooterMessage () {
25906 var args = [], len = arguments.length;
25907 while ( len-- ) args[ len ] = arguments[ len ];
25909 if (m.params.sameFooterMessageRule) { return (ref = m.params).sameFooterMessageRule.apply(ref, args); }
25913 Messages.prototype.isSameAvatarMessage = function isSameAvatarMessage () {
25916 var args = [], len = arguments.length;
25917 while ( len-- ) args[ len ] = arguments[ len ];
25919 if (m.params.sameAvatarMessageRule) { return (ref = m.params).sameAvatarMessageRule.apply(ref, args); }
25923 Messages.prototype.isCustomClassMessage = function isCustomClassMessage () {
25926 var args = [], len = arguments.length;
25927 while ( len-- ) args[ len ] = arguments[ len ];
25929 if (m.params.customClassMessageRule) { return (ref = m.params).customClassMessageRule.apply(ref, args); }
25933 Messages.prototype.layout = function layout () {
25935 m.$el.find('.message
, .messages
-title
').each(function (index, messageEl) {
25936 var $messageEl = $(messageEl);
25938 m.messages = m.getMessagesData();
25941 var message = m.messages[index];
25942 var previousMessage = m.messages[index - 1];
25943 var nextMessage = m.messages[index + 1];
25944 if (m.isFirstMessage(message, previousMessage, nextMessage)) {
25945 classes.push('message
-first
');
25947 if (m.isLastMessage(message, previousMessage, nextMessage)) {
25948 classes.push('message
-last
');
25950 if (m.isTailMessage(message, previousMessage, nextMessage)) {
25951 classes.push('message
-tail
');
25953 if (m.isSameNameMessage(message, previousMessage, nextMessage)) {
25954 classes.push('message
-same
-name
');
25956 if (m.isSameHeaderMessage(message, previousMessage, nextMessage)) {
25957 classes.push('message
-same
-header
');
25959 if (m.isSameFooterMessage(message, previousMessage, nextMessage)) {
25960 classes.push('message
-same
-footer
');
25962 if (m.isSameAvatarMessage(message, previousMessage, nextMessage)) {
25963 classes.push('message
-same
-avatar
');
25965 var customMessageClasses = m.isCustomClassMessage(message, previousMessage, nextMessage);
25966 if (customMessageClasses && customMessageClasses.length) {
25967 if (typeof customMessageClasses === 'string
') {
25968 customMessageClasses = customMessageClasses.split(' ');
25970 customMessageClasses.forEach(function (customClass) {
25971 classes.push(customClass);
25974 $messageEl.removeClass('message
-first message
-last message
-tail message
-same
-name message
-same
-header message
-same
-footer message
-same
-avatar
');
25975 classes.forEach(function (className) {
25976 $messageEl.addClass(className);
25981 Messages.prototype.clear = function clear () {
25987 Messages.prototype.removeMessage = function removeMessage (messageToRemove, layout) {
25988 if ( layout === void 0 ) layout = true;
25994 if (typeof messageToRemove === 'number
') {
25995 index = messageToRemove;
25996 $el = m.$el.find('.message
, .messages
-title
').eq(index);
25997 } else if (m.messages && m.messages.indexOf(messageToRemove) >= 0) {
25998 index = m.messages.indexOf(messageToRemove);
25999 $el = m.$el.children().eq(index);
26001 $el = $(messageToRemove);
26002 index = $el.index();
26004 if ($el.length === 0) {
26008 m.messages.splice(index, 1);
26009 if (m.params.autoLayout && layout) { m.layout(); }
26013 Messages.prototype.removeMessages = function removeMessages (messagesToRemove, layout) {
26014 if ( layout === void 0 ) layout = true;
26017 if (Array.isArray(messagesToRemove)) {
26018 var messagesToRemoveEls = [];
26019 messagesToRemove.forEach(function (messageToRemoveIndex) {
26020 messagesToRemoveEls.push(m.$el.find('.message
, .messages
-title
').eq(messageToRemoveIndex));
26022 messagesToRemoveEls.forEach(function (messageToRemove) {
26023 m.removeMessage(messageToRemove, false);
26026 $(messagesToRemove).each(function (index, messageToRemove) {
26027 m.removeMessage(messageToRemove, false);
26030 if (m.params.autoLayout && layout) { m.layout(); }
26034 Messages.prototype.addMessage = function addMessage () {
26035 var assign, assign$1;
26037 var args = [], len = arguments.length;
26038 while ( len-- ) args[ len ] = arguments[ len ];
26043 if (typeof args[1] === 'boolean') {
26044 (assign = args, messageToAdd = assign[0], animate = assign[1], method = assign[2]);
26046 (assign$1 = args, messageToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
26048 if (typeof animate === 'undefined') {
26051 if (typeof method === 'undefined') {
26052 method = m.params.newMessagesFirst ? 'prepend
' : 'append
';
26055 return m.addMessages([messageToAdd], animate, method);
26058 Messages.prototype.addMessages = function addMessages () {
26059 var assign, assign$1;
26061 var args = [], len = arguments.length;
26062 while ( len-- ) args[ len ] = arguments[ len ];
26067 if (typeof args[1] === 'boolean') {
26068 (assign = args, messagesToAdd = assign[0], animate = assign[1], method = assign[2]);
26070 (assign$1 = args, messagesToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
26072 if (typeof animate === 'undefined') {
26075 if (typeof method === 'undefined') {
26076 method = m.params.newMessagesFirst ? 'prepend
' : 'append
';
26079 // Define scroll positions before new messages added
26080 var scrollHeightBefore = m.pageContentEl.scrollHeight;
26081 var heightBefore = m.pageContentEl.offsetHeight;
26082 var scrollBefore = m.pageContentEl.scrollTop;
26084 // Add message to DOM and data
26085 var messagesHTML = '';
26086 var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
26087 messagesToAdd.forEach(function (messageToAdd) {
26088 if (typingMessage) {
26089 if (method === 'append
') {
26090 m.messages.splice(m.messages.indexOf(typingMessage), 0, messageToAdd);
26092 m.messages.splice(m.messages.indexOf(typingMessage) + 1, 0, messageToAdd);
26095 m.messages[method === 'append
' ? 'push
' : 'unshift
'](messageToAdd);
26097 messagesHTML += m.renderMessage(messageToAdd);
26099 var $messagesEls = $(messagesHTML);
26101 if (method === 'append
' && !m.params.newMessagesFirst) {
26102 $messagesEls.addClass('message
-appear
-from-bottom
');
26104 if (method === 'prepend
' && m.params.newMessagesFirst) {
26105 $messagesEls.addClass('message
-appear
-from-top
');
26108 if (typingMessage) {
26109 if (method === 'append
') {
26110 $messagesEls.insertBefore(m.$el.find('.message
-typing
'));
26112 $messagesEls.insertAfter(m.$el.find('.message
-typing
'));
26115 m.$el[method]($messagesEls);
26119 if (m.params.autoLayout) { m.layout(); }
26121 if (method === 'prepend
' && !typingMessage) {
26122 m.pageContentEl.scrollTop = scrollBefore + (m.pageContentEl.scrollHeight - scrollHeightBefore);
26125 if (m.params.scrollMessages && ((method === 'append
' && !m.params.newMessagesFirst) || (method === 'prepend
' && m.params.newMessagesFirst && !typingMessage))) {
26126 if (m.params.scrollMessagesOnEdge) {
26127 var onEdge = false;
26128 if (m.params.newMessagesFirst && scrollBefore === 0) {
26131 if (!m.params.newMessagesFirst && (scrollBefore - (scrollHeightBefore - heightBefore) >= -10)) {
26134 if (onEdge) { m.scroll(animate ? undefined : 0); }
26136 m.scroll(animate ? undefined : 0);
26143 Messages.prototype.showTyping = function showTyping (message) {
26144 if ( message === void 0 ) message = {};
26147 var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
26148 if (typingMessage) {
26149 m.removeMessage(m.messages.indexOf(typingMessage));
26151 m.addMessage(Utils.extend({
26158 Messages.prototype.hideTyping = function hideTyping () {
26160 var typingMessageIndex;
26162 m.messages.forEach(function (message, index) {
26163 if (message.isTyping) { typingMessageIndex = index; }
26165 if (typeof typingMessageIndex !== 'undefined') {
26166 if (m.$el.find('.message
').eq(typingMessageIndex).hasClass('message
-typing
')) {
26167 typingFound = true;
26168 m.removeMessage(typingMessageIndex);
26171 if (!typingFound) {
26172 var $typingMessageEl = m.$el.find('.message
-typing
');
26173 if ($typingMessageEl.length) {
26174 m.removeMessage($typingMessageEl);
26180 Messages.prototype.scroll = function scroll (duration, scrollTop) {
26181 if ( duration === void 0 ) duration = 300;
26184 var currentScroll = m.pageContentEl.scrollTop;
26186 if (typeof scrollTop !== 'undefined') { newScrollTop = scrollTop; }
26188 newScrollTop = m.params.newMessagesFirst ? 0 : m.pageContentEl.scrollHeight - m.pageContentEl.offsetHeight;
26189 if (newScrollTop === currentScroll) { return m; }
26191 m.$pageContentEl.scrollTop(newScrollTop, duration);
26195 Messages.prototype.init = function init () {
26197 if (!m.messages || m.messages.length === 0) {
26198 m.messages = m.getMessagesData();
26200 if (m.params.messages && m.params.messages.length) {
26201 m.renderMessages();
26203 if (m.params.autoLayout) { m.layout(); }
26204 if (m.params.scrollMessages) { m.scroll(0); }
26207 Messages.prototype.destroy = function destroy () {
26209 m.emit('local
::beforeDestroy messagesBeforeDestroy
', m);
26210 m.$el.trigger('messages
:beforedestroy
', m);
26212 m.$el[0].f7Messages = null;
26213 delete m.$el[0].f7Messages;
26215 Utils.deleteProps(m);
26219 }(Framework7Class));
26224 Messages: Messages,
26226 create: function create() {
26228 app.messages = ConstructorMethods({
26229 defaultSelector: '.messages
',
26230 constructor: Messages,
26232 domProp: 'f7Messages
',
26233 addMethods: 'renderMessages layout scroll clear removeMessage removeMessages addMessage addMessages
'.split(' '),
26237 tabBeforeRemove: function tabBeforeRemove(tabEl) {
26239 $(tabEl).find('.messages
-init
').each(function (index, messagesEl) {
26240 app.messages.destroy(messagesEl);
26243 tabMounted: function tabMounted(tabEl) {
26245 $(tabEl).find('.messages
-init
').each(function (index, messagesEl) {
26246 app.messages.create({ el: messagesEl });
26249 pageBeforeRemove: function pageBeforeRemove(page) {
26251 page.$el.find('.messages
-init
').each(function (index, messagesEl) {
26252 app.messages.destroy(messagesEl);
26255 pageInit: function pageInit(page) {
26257 page.$el.find('.messages
-init
').each(function (index, messagesEl) {
26258 app.messages.create({ el: messagesEl });
26264 insert: function insert(vnode) {
26266 var messagesEl = vnode.elm;
26267 app.messages.create({ el: messagesEl });
26269 destroy: function destroy(vnode) {
26271 var messagesEl = vnode.elm;
26272 app.messages.destroy(messagesEl);
26278 var Messagebar = /*@__PURE__*/(function (Framework7Class$$1) {
26279 function Messagebar(app, params) {
26280 if ( params === void 0 ) params = {};
26282 Framework7Class$$1.call(this, params, [app]);
26284 var messagebar = this;
26291 renderAttachments: undefined,
26292 renderAttachment: undefined,
26297 // Extend defaults with modules params
26298 messagebar.useModulesParams(defaults);
26300 messagebar.params = Utils.extend(defaults, params);
26303 var $el = $(messagebar.params.el);
26304 if ($el.length === 0) { return messagebar; }
26306 if ($el[0].f7Messagebar) { return $el[0].f7Messagebar; }
26308 $el[0].f7Messagebar = messagebar;
26310 // Page and PageContent
26311 var $pageEl = $el.parents('.page
').eq(0);
26312 var $pageContentEl = $pageEl.find('.page
-content
').eq(0);
26315 var $areaEl = $el.find('.messagebar
-area
');
26319 if (messagebar.params.textareaEl) {
26320 $textareaEl = $(messagebar.params.textareaEl);
26322 $textareaEl = $el.find('textarea
');
26325 // Attachments & Library
26326 var $attachmentsEl = $el.find('.messagebar
-attachments
');
26327 var $sheetEl = $el.find('.messagebar
-sheet
');
26329 if (messagebar.params.top) {
26330 $el.addClass('messagebar
-top
');
26333 Utils.extend(messagebar, {
26337 areaEl: $areaEl[0],
26338 $textareaEl: $textareaEl,
26339 textareaEl: $textareaEl[0],
26340 $attachmentsEl: $attachmentsEl,
26341 attachmentsEl: $attachmentsEl[0],
26342 attachmentsVisible: $attachmentsEl.hasClass('messagebar
-attachments
-visible
'),
26343 $sheetEl: $sheetEl,
26344 sheetEl: $sheetEl[0],
26345 sheetVisible: $sheetEl.hasClass('messagebar
-sheet
-visible
'),
26347 pageEl: $pageEl[0],
26348 $pageContentEl: $pageContentEl,
26349 pageContentEl: $pageContentEl,
26350 top: $el.hasClass('messagebar
-top
') || messagebar.params.top,
26355 function onAppResize() {
26356 if (messagebar.params.resizePage) {
26357 messagebar.resizePage();
26360 function onSubmit(e) {
26361 e.preventDefault();
26363 function onAttachmentClick(e) {
26364 var index = $(this).index();
26365 if ($(e.target).closest('.messagebar
-attachment
-delete').length) {
26366 $(this).trigger('messagebar
:attachmentdelete
', index);
26367 messagebar.emit('local
::attachmentDelete messagebarAttachmentDelete
', messagebar, this, index);
26369 $(this).trigger('messagebar
:attachmentclick
', index);
26370 messagebar.emit('local
::attachmentClick messagebarAttachmentClick
', messagebar, this, index);
26373 function onTextareaChange() {
26374 messagebar.checkEmptyState();
26375 messagebar.$el.trigger('messagebar
:change
');
26376 messagebar.emit('local
::change messagebarChange
', messagebar);
26378 function onTextareaFocus() {
26379 messagebar.sheetHide();
26380 messagebar.$el.addClass('messagebar
-focused
');
26381 messagebar.$el.trigger('messagebar
:focus
');
26382 messagebar.emit('local
::focus messagebarFocus
', messagebar);
26384 function onTextareaBlur() {
26385 messagebar.$el.removeClass('messagebar
-focused
');
26386 messagebar.$el.trigger('messagebar
:blur
');
26387 messagebar.emit('local
::blur messagebarBlur
', messagebar);
26390 messagebar.attachEvents = function attachEvents() {
26391 $el.on('textarea
:resize
', onAppResize);
26392 $el.on('submit
', onSubmit);
26393 $el.on('click
', '.messagebar
-attachment
', onAttachmentClick);
26394 $textareaEl.on('change input
', onTextareaChange);
26395 $textareaEl.on('focus
', onTextareaFocus);
26396 $textareaEl.on('blur
', onTextareaBlur);
26397 app.on('resize
', onAppResize);
26399 messagebar.detachEvents = function detachEvents() {
26400 $el.off('textarea
:resize
', onAppResize);
26401 $el.off('submit
', onSubmit);
26402 $el.off('click
', '.messagebar
-attachment
', onAttachmentClick);
26403 $textareaEl.off('change input
', onTextareaChange);
26404 $textareaEl.off('focus
', onTextareaFocus);
26405 $textareaEl.off('blur
', onTextareaBlur);
26406 app.off('resize
', onAppResize);
26411 messagebar.useModules();
26419 if ( Framework7Class$$1 ) Messagebar.__proto__ = Framework7Class$$1;
26420 Messagebar.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
26421 Messagebar.prototype.constructor = Messagebar;
26423 Messagebar.prototype.focus = function focus () {
26424 var messagebar = this;
26425 messagebar.$textareaEl.focus();
26429 Messagebar.prototype.blur = function blur () {
26430 var messagebar = this;
26431 messagebar.$textareaEl.blur();
26435 Messagebar.prototype.clear = function clear () {
26436 var messagebar = this;
26437 messagebar.$textareaEl.val('').trigger('change
');
26441 Messagebar.prototype.getValue = function getValue () {
26442 var messagebar = this;
26443 return messagebar.$textareaEl.val().trim();
26446 Messagebar.prototype.setValue = function setValue (value) {
26447 var messagebar = this;
26448 messagebar.$textareaEl.val(value).trigger('change
');
26452 Messagebar.prototype.setPlaceholder = function setPlaceholder (placeholder) {
26453 var messagebar = this;
26454 messagebar.$textareaEl.attr('placeholder
', placeholder);
26458 Messagebar.prototype.resizePage = function resizePage () {
26459 var messagebar = this;
26460 var params = messagebar.params;
26461 var $el = messagebar.$el;
26462 var top = messagebar.top;
26463 var $pageEl = messagebar.$pageEl;
26464 var $pageContentEl = messagebar.$pageContentEl;
26465 var $areaEl = messagebar.$areaEl;
26466 var $textareaEl = messagebar.$textareaEl;
26467 var $sheetEl = messagebar.$sheetEl;
26468 var $attachmentsEl = messagebar.$attachmentsEl;
26469 var elHeight = $el[0].offsetHeight;
26470 var maxHeight = params.maxHeight;
26472 var currentPaddingBottom = parseInt($pageContentEl.css('padding
-bottom
'), 10);
26473 var requiredPaddingBottom = elHeight + params.bottomOffset;
26474 if (requiredPaddingBottom !== currentPaddingBottom && $pageContentEl.length) {
26475 var currentPaddingTop = parseInt($pageContentEl.css('padding
-top
'), 10);
26476 var pageScrollHeight = $pageContentEl[0].scrollHeight;
26477 var pageOffsetHeight = $pageContentEl[0].offsetHeight;
26478 var pageScrollTop = $pageContentEl[0].scrollTop;
26479 var scrollOnBottom = (pageScrollTop === pageScrollHeight - pageOffsetHeight);
26481 maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin
-top
'), 10) - parseInt($areaEl.css('margin
-bottom
'), 10);
26483 $textareaEl.css('max
-height
', (maxHeight + "px"));
26484 $pageContentEl.css('padding
-bottom
', (requiredPaddingBottom + "px"));
26485 if (scrollOnBottom) {
26486 $pageContentEl.scrollTop($pageContentEl[0].scrollHeight - pageOffsetHeight);
26488 $el.trigger('messagebar
:resizepage
');
26489 messagebar.emit('local
::resizePage messagebarResizePage
', messagebar);
26494 Messagebar.prototype.checkEmptyState = function checkEmptyState () {
26495 var messagebar = this;
26496 var $el = messagebar.$el;
26497 var $textareaEl = messagebar.$textareaEl;
26498 var value = $textareaEl.val().trim();
26499 if (value && value.length) {
26500 $el.addClass('messagebar
-with-value
');
26502 $el.removeClass('messagebar
-with-value
');
26506 Messagebar.prototype.attachmentsCreate = function attachmentsCreate (innerHTML) {
26507 if ( innerHTML === void 0 ) innerHTML = '';
26509 var messagebar = this;
26510 var $attachmentsEl = $(("<div class=\"messagebar-attachments\">" + innerHTML + "</div>"));
26511 $attachmentsEl.insertBefore(messagebar.$textareaEl);
26512 Utils.extend(messagebar, {
26513 $attachmentsEl: $attachmentsEl,
26514 attachmentsEl: $attachmentsEl[0],
26519 Messagebar.prototype.attachmentsShow = function attachmentsShow (innerHTML) {
26520 if ( innerHTML === void 0 ) innerHTML = '';
26522 var messagebar = this;
26523 messagebar.$attachmentsEl = messagebar.$el.find('.messagebar
-attachments
');
26524 if (messagebar.$attachmentsEl.length === 0) {
26525 messagebar.attachmentsCreate(innerHTML);
26527 messagebar.$el.addClass('messagebar
-attachments
-visible
');
26528 messagebar.attachmentsVisible = true;
26529 if (messagebar.params.resizePage) {
26530 messagebar.resizePage();
26535 Messagebar.prototype.attachmentsHide = function attachmentsHide () {
26536 var messagebar = this;
26537 messagebar.$el.removeClass('messagebar
-attachments
-visible
');
26538 messagebar.attachmentsVisible = false;
26539 if (messagebar.params.resizePage) {
26540 messagebar.resizePage();
26545 Messagebar.prototype.attachmentsToggle = function attachmentsToggle () {
26546 var messagebar = this;
26547 if (messagebar.attachmentsVisible) {
26548 messagebar.attachmentsHide();
26550 messagebar.attachmentsShow();
26555 Messagebar.prototype.renderAttachment = function renderAttachment (attachment) {
26556 var messagebar = this;
26557 if (messagebar.params.renderAttachment) {
26558 return messagebar.params.renderAttachment.call(messagebar, attachment);
26560 return ("\n <div class=\"messagebar-attachment\">\n <img src=\"" + attachment + "\">\n <span class=\"messagebar-attachment-delete\"></span>\n </div>\n ");
26563 Messagebar.prototype.renderAttachments = function renderAttachments () {
26564 var messagebar = this;
26566 if (messagebar.params.renderAttachments) {
26567 html = messagebar.params.renderAttachments.call(messagebar, messagebar.attachments);
26569 html = "" + (messagebar.attachments.map(function (attachment) { return messagebar.renderAttachment(attachment); }).join(''));
26571 if (messagebar.$attachmentsEl.length === 0) {
26572 messagebar.attachmentsCreate(html);
26574 messagebar.$attachmentsEl.html(html);
26578 Messagebar.prototype.sheetCreate = function sheetCreate (innerHTML) {
26579 if ( innerHTML === void 0 ) innerHTML = '';
26581 var messagebar = this;
26582 var $sheetEl = $(("<div class=\"messagebar-sheet\">" + innerHTML + "</div>"));
26583 messagebar.$el.append($sheetEl);
26584 Utils.extend(messagebar, {
26585 $sheetEl: $sheetEl,
26586 sheetEl: $sheetEl[0],
26591 Messagebar.prototype.sheetShow = function sheetShow (innerHTML) {
26592 if ( innerHTML === void 0 ) innerHTML = '';
26594 var messagebar = this;
26595 messagebar.$sheetEl = messagebar.$el.find('.messagebar
-sheet
');
26596 if (messagebar.$sheetEl.length === 0) {
26597 messagebar.sheetCreate(innerHTML);
26599 messagebar.$el.addClass('messagebar
-sheet
-visible
');
26600 messagebar.sheetVisible = true;
26601 if (messagebar.params.resizePage) {
26602 messagebar.resizePage();
26607 Messagebar.prototype.sheetHide = function sheetHide () {
26608 var messagebar = this;
26609 messagebar.$el.removeClass('messagebar
-sheet
-visible
');
26610 messagebar.sheetVisible = false;
26611 if (messagebar.params.resizePage) {
26612 messagebar.resizePage();
26617 Messagebar.prototype.sheetToggle = function sheetToggle () {
26618 var messagebar = this;
26619 if (messagebar.sheetVisible) {
26620 messagebar.sheetHide();
26622 messagebar.sheetShow();
26627 Messagebar.prototype.init = function init () {
26628 var messagebar = this;
26629 messagebar.attachEvents();
26630 messagebar.checkEmptyState();
26634 Messagebar.prototype.destroy = function destroy () {
26635 var messagebar = this;
26636 messagebar.emit('local
::beforeDestroy messagebarBeforeDestroy
', messagebar);
26637 messagebar.$el.trigger('messagebar
:beforedestroy
', messagebar);
26638 messagebar.detachEvents();
26639 if (messagebar.$el[0]) {
26640 messagebar.$el[0].f7Messagebar = null;
26641 delete messagebar.$el[0].f7Messagebar;
26643 Utils.deleteProps(messagebar);
26647 }(Framework7Class));
26649 var Messagebar$1 = {
26650 name: 'messagebar
',
26652 Messagebar: Messagebar,
26654 create: function create() {
26656 app.messagebar = ConstructorMethods({
26657 defaultSelector: '.messagebar
',
26658 constructor: Messagebar,
26660 domProp: 'f7Messagebar
',
26661 addMethods: 'clear getValue setValue setPlaceholder resizePage focus blur attachmentsCreate attachmentsShow attachmentsHide attachmentsToggle renderAttachments sheetCreate sheetShow sheetHide sheetToggle
'.split(' '),
26665 tabBeforeRemove: function tabBeforeRemove(tabEl) {
26667 $(tabEl).find('.messagebar
-init
').each(function (index, messagebarEl) {
26668 app.messagebar.destroy(messagebarEl);
26671 tabMounted: function tabMounted(tabEl) {
26673 $(tabEl).find('.messagebar
-init
').each(function (index, messagebarEl) {
26674 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
26677 pageBeforeRemove: function pageBeforeRemove(page) {
26679 page.$el.find('.messagebar
-init
').each(function (index, messagebarEl) {
26680 app.messagebar.destroy(messagebarEl);
26683 pageInit: function pageInit(page) {
26685 page.$el.find('.messagebar
-init
').each(function (index, messagebarEl) {
26686 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
26691 'messagebar
-init
': {
26692 insert: function insert(vnode) {
26694 var messagebarEl = vnode.elm;
26695 app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
26697 destroy: function destroy(vnode) {
26699 var messagebarEl = vnode.elm;
26700 app.messagebar.destroy(messagebarEl);
26706 function updateSize () {
26710 var $el = swiper.$el;
26711 if (typeof swiper.params.width !== 'undefined') {
26712 width = swiper.params.width;
26714 width = $el[0].clientWidth;
26716 if (typeof swiper.params.height !== 'undefined') {
26717 height = swiper.params.height;
26719 height = $el[0].clientHeight;
26721 if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
26725 // Subtract paddings
26726 width = width - parseInt($el.css('padding
-left
'), 10) - parseInt($el.css('padding
-right
'), 10);
26727 height = height - parseInt($el.css('padding
-top
'), 10) - parseInt($el.css('padding
-bottom
'), 10);
26729 Utils.extend(swiper, {
26732 size: swiper.isHorizontal() ? width : height,
26736 function updateSlides () {
26738 var params = swiper.params;
26740 var $wrapperEl = swiper.$wrapperEl;
26741 var swiperSize = swiper.size;
26742 var rtl = swiper.rtlTranslate;
26743 var wrongRTL = swiper.wrongRTL;
26744 var isVirtual = swiper.virtual && params.virtual.enabled;
26745 var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
26746 var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
26747 var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
26749 var slidesGrid = [];
26750 var slidesSizesGrid = [];
26752 var offsetBefore = params.slidesOffsetBefore;
26753 if (typeof offsetBefore === 'function') {
26754 offsetBefore = params.slidesOffsetBefore.call(swiper);
26757 var offsetAfter = params.slidesOffsetAfter;
26758 if (typeof offsetAfter === 'function') {
26759 offsetAfter = params.slidesOffsetAfter.call(swiper);
26762 var previousSnapGridLength = swiper.snapGrid.length;
26763 var previousSlidesGridLength = swiper.snapGrid.length;
26765 var spaceBetween = params.spaceBetween;
26766 var slidePosition = -offsetBefore;
26767 var prevSlideSize = 0;
26769 if (typeof swiperSize === 'undefined') {
26772 if (typeof spaceBetween === 'string
' && spaceBetween.indexOf('%') >= 0) {
26773 spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
26776 swiper.virtualSize = -spaceBetween;
26779 if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
26780 else { slides.css({ marginRight: '', marginBottom: '' }); }
26782 var slidesNumberEvenToRows;
26783 if (params.slidesPerColumn > 1) {
26784 if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
26785 slidesNumberEvenToRows = slidesLength;
26787 slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
26789 if (params.slidesPerView !== 'auto
' && params.slidesPerColumnFill === 'row
') {
26790 slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
26796 var slidesPerColumn = params.slidesPerColumn;
26797 var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
26798 var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
26799 for (var i = 0; i < slidesLength; i += 1) {
26801 var slide = slides.eq(i);
26802 if (params.slidesPerColumn > 1) {
26803 // Set slides order
26804 var newSlideOrderIndex = (void 0);
26805 var column = (void 0);
26806 var row = (void 0);
26807 if (params.slidesPerColumnFill === 'column
') {
26808 column = Math.floor(i / slidesPerColumn);
26809 row = i - (column * slidesPerColumn);
26810 if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
26812 if (row >= slidesPerColumn) {
26817 newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
26820 '-webkit
-box
-ordinal
-group
': newSlideOrderIndex,
26821 '-moz
-box
-ordinal
-group
': newSlideOrderIndex,
26822 '-ms
-flex
-order
': newSlideOrderIndex,
26823 '-webkit
-order
': newSlideOrderIndex,
26824 order: newSlideOrderIndex,
26827 row = Math.floor(i / slidesPerRow);
26828 column = i - (row * slidesPerRow);
26832 ("margin-" + (swiper.isHorizontal() ? 'top
' : 'left
')),
26833 (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
26835 .attr('data
-swiper
-column
', column)
26836 .attr('data
-swiper
-row
', row);
26838 if (slide.css('display
') === 'none
') { continue; } // eslint-disable-line
26840 if (params.slidesPerView === 'auto
') {
26841 var slideStyles = win.getComputedStyle(slide[0], null);
26842 var currentTransform = slide[0].style.transform;
26843 var currentWebKitTransform = slide[0].style.webkitTransform;
26844 if (currentTransform) {
26845 slide[0].style.transform = 'none
';
26847 if (currentWebKitTransform) {
26848 slide[0].style.webkitTransform = 'none
';
26850 if (params.roundLengths) {
26851 slideSize = swiper.isHorizontal()
26852 ? slide.outerWidth(true)
26853 : slide.outerHeight(true);
26855 // eslint-disable-next-line
26856 if (swiper.isHorizontal()) {
26857 var width = parseFloat(slideStyles.getPropertyValue('width
'));
26858 var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding
-left
'));
26859 var paddingRight = parseFloat(slideStyles.getPropertyValue('padding
-right
'));
26860 var marginLeft = parseFloat(slideStyles.getPropertyValue('margin
-left
'));
26861 var marginRight = parseFloat(slideStyles.getPropertyValue('margin
-right
'));
26862 var boxSizing = slideStyles.getPropertyValue('box
-sizing
');
26863 if (boxSizing && boxSizing === 'border
-box
') {
26864 slideSize = width + marginLeft + marginRight;
26866 slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
26869 var height = parseFloat(slideStyles.getPropertyValue('height
'));
26870 var paddingTop = parseFloat(slideStyles.getPropertyValue('padding
-top
'));
26871 var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding
-bottom
'));
26872 var marginTop = parseFloat(slideStyles.getPropertyValue('margin
-top
'));
26873 var marginBottom = parseFloat(slideStyles.getPropertyValue('margin
-bottom
'));
26874 var boxSizing$1 = slideStyles.getPropertyValue('box
-sizing
');
26875 if (boxSizing$1 && boxSizing$1 === 'border
-box
') {
26876 slideSize = height + marginTop + marginBottom;
26878 slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
26882 if (currentTransform) {
26883 slide[0].style.transform = currentTransform;
26885 if (currentWebKitTransform) {
26886 slide[0].style.webkitTransform = currentWebKitTransform;
26888 if (params.roundLengths) { slideSize = Math.floor(slideSize); }
26890 slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
26891 if (params.roundLengths) { slideSize = Math.floor(slideSize); }
26894 if (swiper.isHorizontal()) {
26895 slides[i].style.width = slideSize + "px";
26897 slides[i].style.height = slideSize + "px";
26902 slides[i].swiperSlideSize = slideSize;
26904 slidesSizesGrid.push(slideSize);
26907 if (params.centeredSlides) {
26908 slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
26909 if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
26910 if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
26911 if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
26912 if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
26913 if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
26914 slidesGrid.push(slidePosition);
26916 if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
26917 if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
26918 slidesGrid.push(slidePosition);
26919 slidePosition = slidePosition + slideSize + spaceBetween;
26922 swiper.virtualSize += slideSize + spaceBetween;
26924 prevSlideSize = slideSize;
26928 swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
26932 rtl && wrongRTL && (params.effect === 'slide
' || params.effect === 'coverflow
')) {
26933 $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
26935 if (!Support.flexbox || params.setWrapperSize) {
26936 if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26937 else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26940 if (params.slidesPerColumn > 1) {
26941 swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
26942 swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
26943 if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26944 else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
26945 if (params.centeredSlides) {
26946 newSlidesGrid = [];
26947 for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
26948 var slidesGridItem = snapGrid[i$1];
26949 if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
26950 if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
26952 snapGrid = newSlidesGrid;
26956 // Remove last grid elements depending on width
26957 if (!params.centeredSlides) {
26958 newSlidesGrid = [];
26959 for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
26960 var slidesGridItem$1 = snapGrid[i$2];
26961 if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
26962 if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
26963 newSlidesGrid.push(slidesGridItem$1);
26966 snapGrid = newSlidesGrid;
26967 if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
26968 snapGrid.push(swiper.virtualSize - swiperSize);
26971 if (snapGrid.length === 0) { snapGrid = [0]; }
26973 if (params.spaceBetween !== 0) {
26974 if (swiper.isHorizontal()) {
26975 if (rtl) { slides.css({ marginLeft: (spaceBetween + "px") }); }
26976 else { slides.css({ marginRight: (spaceBetween + "px") }); }
26977 } else { slides.css({ marginBottom: (spaceBetween + "px") }); }
26980 if (params.centerInsufficientSlides) {
26981 var allSlidesSize = 0;
26982 slidesSizesGrid.forEach(function (slideSizeValue) {
26983 allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
26985 allSlidesSize -= params.spaceBetween;
26986 if (allSlidesSize < swiperSize) {
26987 var allSlidesOffset = (swiperSize - allSlidesSize) / 2;
26988 snapGrid.forEach(function (snap, snapIndex) {
26989 snapGrid[snapIndex] = snap - allSlidesOffset;
26991 slidesGrid.forEach(function (snap, snapIndex) {
26992 slidesGrid[snapIndex] = snap + allSlidesOffset;
26997 Utils.extend(swiper, {
26999 snapGrid: snapGrid,
27000 slidesGrid: slidesGrid,
27001 slidesSizesGrid: slidesSizesGrid,
27004 if (slidesLength !== previousSlidesLength) {
27005 swiper.emit('slidesLengthChange
');
27007 if (snapGrid.length !== previousSnapGridLength) {
27008 if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
27009 swiper.emit('snapGridLengthChange
');
27011 if (slidesGrid.length !== previousSlidesGridLength) {
27012 swiper.emit('slidesGridLengthChange
');
27015 if (params.watchSlidesProgress || params.watchSlidesVisibility) {
27016 swiper.updateSlidesOffset();
27020 function updateAutoHeight (speed) {
27022 var activeSlides = [];
27025 if (typeof speed === 'number
') {
27026 swiper.setTransition(speed);
27027 } else if (speed === true) {
27028 swiper.setTransition(swiper.params.speed);
27030 // Find slides currently in view
27031 if (swiper.params.slidesPerView !== 'auto
' && swiper.params.slidesPerView > 1) {
27032 for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
27033 var index = swiper.activeIndex + i;
27034 if (index > swiper.slides.length) { break; }
27035 activeSlides.push(swiper.slides.eq(index)[0]);
27038 activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
27041 // Find new height from highest slide in view
27042 for (i = 0; i < activeSlides.length; i += 1) {
27043 if (typeof activeSlides[i] !== 'undefined') {
27044 var height = activeSlides[i].offsetHeight;
27045 newHeight = height > newHeight ? height : newHeight;
27050 if (newHeight) { swiper.$wrapperEl.css('height
', (newHeight + "px")); }
27053 function updateSlidesOffset () {
27055 var slides = swiper.slides;
27056 for (var i = 0; i < slides.length; i += 1) {
27057 slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
27061 function updateSlidesProgress (translate) {
27062 if ( translate === void 0 ) translate = (this && this.translate) || 0;
27065 var params = swiper.params;
27067 var slides = swiper.slides;
27068 var rtl = swiper.rtlTranslate;
27070 if (slides.length === 0) { return; }
27071 if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
27073 var offsetCenter = -translate;
27074 if (rtl) { offsetCenter = translate; }
27077 slides.removeClass(params.slideVisibleClass);
27079 swiper.visibleSlidesIndexes = [];
27080 swiper.visibleSlides = [];
27082 for (var i = 0; i < slides.length; i += 1) {
27083 var slide = slides[i];
27084 var slideProgress = (
27085 (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
27086 ) / (slide.swiperSlideSize + params.spaceBetween);
27087 if (params.watchSlidesVisibility) {
27088 var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
27089 var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
27090 var isVisible = (slideBefore >= 0 && slideBefore < swiper.size)
27091 || (slideAfter > 0 && slideAfter <= swiper.size)
27092 || (slideBefore <= 0 && slideAfter >= swiper.size);
27094 swiper.visibleSlides.push(slide);
27095 swiper.visibleSlidesIndexes.push(i);
27096 slides.eq(i).addClass(params.slideVisibleClass);
27099 slide.progress = rtl ? -slideProgress : slideProgress;
27101 swiper.visibleSlides = $(swiper.visibleSlides);
27104 function updateProgress (translate) {
27105 if ( translate === void 0 ) translate = (this && this.translate) || 0;
27108 var params = swiper.params;
27110 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
27111 var progress = swiper.progress;
27112 var isBeginning = swiper.isBeginning;
27113 var isEnd = swiper.isEnd;
27114 var wasBeginning = isBeginning;
27115 var wasEnd = isEnd;
27116 if (translatesDiff === 0) {
27118 isBeginning = true;
27121 progress = (translate - swiper.minTranslate()) / (translatesDiff);
27122 isBeginning = progress <= 0;
27123 isEnd = progress >= 1;
27125 Utils.extend(swiper, {
27126 progress: progress,
27127 isBeginning: isBeginning,
27131 if (params.watchSlidesProgress || params.watchSlidesVisibility) { swiper.updateSlidesProgress(translate); }
27133 if (isBeginning && !wasBeginning) {
27134 swiper.emit('reachBeginning toEdge
');
27136 if (isEnd && !wasEnd) {
27137 swiper.emit('reachEnd toEdge
');
27139 if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
27140 swiper.emit('fromEdge
');
27143 swiper.emit('progress
', progress);
27146 function updateSlidesClasses () {
27149 var slides = swiper.slides;
27150 var params = swiper.params;
27151 var $wrapperEl = swiper.$wrapperEl;
27152 var activeIndex = swiper.activeIndex;
27153 var realIndex = swiper.realIndex;
27154 var isVirtual = swiper.virtual && params.virtual.enabled;
27156 slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
27160 activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
27162 activeSlide = slides.eq(activeIndex);
27166 activeSlide.addClass(params.slideActiveClass);
27169 // Duplicate to all looped slides
27170 if (activeSlide.hasClass(params.slideDuplicateClass)) {
27172 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
27173 .addClass(params.slideDuplicateActiveClass);
27176 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
27177 .addClass(params.slideDuplicateActiveClass);
27181 var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
27182 if (params.loop && nextSlide.length === 0) {
27183 nextSlide = slides.eq(0);
27184 nextSlide.addClass(params.slideNextClass);
27187 var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
27188 if (params.loop && prevSlide.length === 0) {
27189 prevSlide = slides.eq(-1);
27190 prevSlide.addClass(params.slidePrevClass);
27193 // Duplicate to all looped slides
27194 if (nextSlide.hasClass(params.slideDuplicateClass)) {
27196 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data
-swiper
-slide
-index
')) + "\"]"))
27197 .addClass(params.slideDuplicateNextClass);
27200 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data
-swiper
-slide
-index
')) + "\"]"))
27201 .addClass(params.slideDuplicateNextClass);
27203 if (prevSlide.hasClass(params.slideDuplicateClass)) {
27205 .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data
-swiper
-slide
-index
')) + "\"]"))
27206 .addClass(params.slideDuplicatePrevClass);
27209 .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data
-swiper
-slide
-index
')) + "\"]"))
27210 .addClass(params.slideDuplicatePrevClass);
27215 function updateActiveIndex (newActiveIndex) {
27217 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
27218 var slidesGrid = swiper.slidesGrid;
27219 var snapGrid = swiper.snapGrid;
27220 var params = swiper.params;
27221 var previousIndex = swiper.activeIndex;
27222 var previousRealIndex = swiper.realIndex;
27223 var previousSnapIndex = swiper.snapIndex;
27224 var activeIndex = newActiveIndex;
27226 if (typeof activeIndex === 'undefined') {
27227 for (var i = 0; i < slidesGrid.length; i += 1) {
27228 if (typeof slidesGrid[i + 1] !== 'undefined') {
27229 if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
27231 } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
27232 activeIndex = i + 1;
27234 } else if (translate >= slidesGrid[i]) {
27238 // Normalize slideIndex
27239 if (params.normalizeSlideIndex) {
27240 if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
27243 if (snapGrid.indexOf(translate) >= 0) {
27244 snapIndex = snapGrid.indexOf(translate);
27246 snapIndex = Math.floor(activeIndex / params.slidesPerGroup);
27248 if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
27249 if (activeIndex === previousIndex) {
27250 if (snapIndex !== previousSnapIndex) {
27251 swiper.snapIndex = snapIndex;
27252 swiper.emit('snapIndexChange
');
27258 var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data
-swiper
-slide
-index
') || activeIndex, 10);
27260 Utils.extend(swiper, {
27261 snapIndex: snapIndex,
27262 realIndex: realIndex,
27263 previousIndex: previousIndex,
27264 activeIndex: activeIndex,
27266 swiper.emit('activeIndexChange
');
27267 swiper.emit('snapIndexChange
');
27268 if (previousRealIndex !== realIndex) {
27269 swiper.emit('realIndexChange
');
27271 swiper.emit('slideChange
');
27274 function updateClickedSlide (e) {
27276 var params = swiper.params;
27277 var slide = $(e.target).closest(("." + (params.slideClass)))[0];
27278 var slideFound = false;
27280 for (var i = 0; i < swiper.slides.length; i += 1) {
27281 if (swiper.slides[i] === slide) { slideFound = true; }
27285 if (slide && slideFound) {
27286 swiper.clickedSlide = slide;
27287 if (swiper.virtual && swiper.params.virtual.enabled) {
27288 swiper.clickedIndex = parseInt($(slide).attr('data
-swiper
-slide
-index
'), 10);
27290 swiper.clickedIndex = $(slide).index();
27293 swiper.clickedSlide = undefined;
27294 swiper.clickedIndex = undefined;
27297 if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
27298 swiper.slideToClickedSlide();
27303 updateSize: updateSize,
27304 updateSlides: updateSlides,
27305 updateAutoHeight: updateAutoHeight,
27306 updateSlidesOffset: updateSlidesOffset,
27307 updateSlidesProgress: updateSlidesProgress,
27308 updateProgress: updateProgress,
27309 updateSlidesClasses: updateSlidesClasses,
27310 updateActiveIndex: updateActiveIndex,
27311 updateClickedSlide: updateClickedSlide,
27314 function getTranslate (axis) {
27315 if ( axis === void 0 ) axis = this.isHorizontal() ? 'x
' : 'y
';
27319 var params = swiper.params;
27320 var rtl = swiper.rtlTranslate;
27321 var translate = swiper.translate;
27322 var $wrapperEl = swiper.$wrapperEl;
27324 if (params.virtualTranslate) {
27325 return rtl ? -translate : translate;
27328 var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
27329 if (rtl) { currentTranslate = -currentTranslate; }
27331 return currentTranslate || 0;
27334 function setTranslate (translate, byController) {
27336 var rtl = swiper.rtlTranslate;
27337 var params = swiper.params;
27338 var $wrapperEl = swiper.$wrapperEl;
27339 var progress = swiper.progress;
27344 if (swiper.isHorizontal()) {
27345 x = rtl ? -translate : translate;
27350 if (params.roundLengths) {
27355 if (!params.virtualTranslate) {
27356 if (Support.transforms3d) { $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)")); }
27357 else { $wrapperEl.transform(("translate(" + x + "px, " + y + "px)")); }
27359 swiper.previousTranslate = swiper.translate;
27360 swiper.translate = swiper.isHorizontal() ? x : y;
27362 // Check if we need to update progress
27364 var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
27365 if (translatesDiff === 0) {
27368 newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
27370 if (newProgress !== progress) {
27371 swiper.updateProgress(translate);
27374 swiper.emit('setTranslate
', swiper.translate, byController);
27377 function minTranslate () {
27378 return (-this.snapGrid[0]);
27381 function maxTranslate () {
27382 return (-this.snapGrid[this.snapGrid.length - 1]);
27386 getTranslate: getTranslate,
27387 setTranslate: setTranslate,
27388 minTranslate: minTranslate,
27389 maxTranslate: maxTranslate,
27392 function setTransition (duration, byController) {
27395 swiper.$wrapperEl.transition(duration);
27397 swiper.emit('setTransition
', duration, byController);
27400 function transitionStart (runCallbacks, direction) {
27401 if ( runCallbacks === void 0 ) runCallbacks = true;
27404 var activeIndex = swiper.activeIndex;
27405 var params = swiper.params;
27406 var previousIndex = swiper.previousIndex;
27407 if (params.autoHeight) {
27408 swiper.updateAutoHeight();
27411 var dir = direction;
27413 if (activeIndex > previousIndex) { dir = 'next
'; }
27414 else if (activeIndex < previousIndex) { dir = 'prev
'; }
27415 else { dir = 'reset
'; }
27418 swiper.emit('transitionStart
');
27420 if (runCallbacks && activeIndex !== previousIndex) {
27421 if (dir === 'reset
') {
27422 swiper.emit('slideResetTransitionStart
');
27425 swiper.emit('slideChangeTransitionStart
');
27426 if (dir === 'next
') {
27427 swiper.emit('slideNextTransitionStart
');
27429 swiper.emit('slidePrevTransitionStart
');
27434 function transitionEnd$1 (runCallbacks, direction) {
27435 if ( runCallbacks === void 0 ) runCallbacks = true;
27438 var activeIndex = swiper.activeIndex;
27439 var previousIndex = swiper.previousIndex;
27440 swiper.animating = false;
27441 swiper.setTransition(0);
27443 var dir = direction;
27445 if (activeIndex > previousIndex) { dir = 'next
'; }
27446 else if (activeIndex < previousIndex) { dir = 'prev
'; }
27447 else { dir = 'reset
'; }
27450 swiper.emit('transitionEnd
');
27452 if (runCallbacks && activeIndex !== previousIndex) {
27453 if (dir === 'reset
') {
27454 swiper.emit('slideResetTransitionEnd
');
27457 swiper.emit('slideChangeTransitionEnd
');
27458 if (dir === 'next
') {
27459 swiper.emit('slideNextTransitionEnd
');
27461 swiper.emit('slidePrevTransitionEnd
');
27466 var transition$1 = {
27467 setTransition: setTransition,
27468 transitionStart: transitionStart,
27469 transitionEnd: transitionEnd$1,
27472 function slideTo (index, speed, runCallbacks, internal) {
27473 if ( index === void 0 ) index = 0;
27474 if ( speed === void 0 ) speed = this.params.speed;
27475 if ( runCallbacks === void 0 ) runCallbacks = true;
27478 var slideIndex = index;
27479 if (slideIndex < 0) { slideIndex = 0; }
27481 var params = swiper.params;
27482 var snapGrid = swiper.snapGrid;
27483 var slidesGrid = swiper.slidesGrid;
27484 var previousIndex = swiper.previousIndex;
27485 var activeIndex = swiper.activeIndex;
27486 var rtl = swiper.rtlTranslate;
27487 if (swiper.animating && params.preventInteractionOnTransition) {
27491 var snapIndex = Math.floor(slideIndex / params.slidesPerGroup);
27492 if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
27494 if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
27495 swiper.emit('beforeSlideChangeStart
');
27498 var translate = -snapGrid[snapIndex];
27501 swiper.updateProgress(translate);
27503 // Normalize slideIndex
27504 if (params.normalizeSlideIndex) {
27505 for (var i = 0; i < slidesGrid.length; i += 1) {
27506 if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
27511 // Directions locks
27512 if (swiper.initialized && slideIndex !== activeIndex) {
27513 if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
27516 if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
27517 if ((activeIndex || 0) !== slideIndex) { return false; }
27522 if (slideIndex > activeIndex) { direction = 'next
'; }
27523 else if (slideIndex < activeIndex) { direction = 'prev
'; }
27524 else { direction = 'reset
'; }
27528 if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
27529 swiper.updateActiveIndex(slideIndex);
27531 if (params.autoHeight) {
27532 swiper.updateAutoHeight();
27534 swiper.updateSlidesClasses();
27535 if (params.effect !== 'slide
') {
27536 swiper.setTranslate(translate);
27538 if (direction !== 'reset
') {
27539 swiper.transitionStart(runCallbacks, direction);
27540 swiper.transitionEnd(runCallbacks, direction);
27545 if (speed === 0 || !Support.transition) {
27546 swiper.setTransition(0);
27547 swiper.setTranslate(translate);
27548 swiper.updateActiveIndex(slideIndex);
27549 swiper.updateSlidesClasses();
27550 swiper.emit('beforeTransitionStart
', speed, internal);
27551 swiper.transitionStart(runCallbacks, direction);
27552 swiper.transitionEnd(runCallbacks, direction);
27554 swiper.setTransition(speed);
27555 swiper.setTranslate(translate);
27556 swiper.updateActiveIndex(slideIndex);
27557 swiper.updateSlidesClasses();
27558 swiper.emit('beforeTransitionStart
', speed, internal);
27559 swiper.transitionStart(runCallbacks, direction);
27560 if (!swiper.animating) {
27561 swiper.animating = true;
27562 if (!swiper.onSlideToWrapperTransitionEnd) {
27563 swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
27564 if (!swiper || swiper.destroyed) { return; }
27565 if (e.target !== this) { return; }
27566 swiper.$wrapperEl[0].removeEventListener('transitionend
', swiper.onSlideToWrapperTransitionEnd);
27567 swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd
', swiper.onSlideToWrapperTransitionEnd);
27568 swiper.onSlideToWrapperTransitionEnd = null;
27569 delete swiper.onSlideToWrapperTransitionEnd;
27570 swiper.transitionEnd(runCallbacks, direction);
27573 swiper.$wrapperEl[0].addEventListener('transitionend
', swiper.onSlideToWrapperTransitionEnd);
27574 swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd
', swiper.onSlideToWrapperTransitionEnd);
27581 function slideToLoop (index, speed, runCallbacks, internal) {
27582 if ( index === void 0 ) index = 0;
27583 if ( speed === void 0 ) speed = this.params.speed;
27584 if ( runCallbacks === void 0 ) runCallbacks = true;
27587 var newIndex = index;
27588 if (swiper.params.loop) {
27589 newIndex += swiper.loopedSlides;
27592 return swiper.slideTo(newIndex, speed, runCallbacks, internal);
27595 /* eslint no-unused-vars: "off" */
27596 function slideNext (speed, runCallbacks, internal) {
27597 if ( speed === void 0 ) speed = this.params.speed;
27598 if ( runCallbacks === void 0 ) runCallbacks = true;
27601 var params = swiper.params;
27602 var animating = swiper.animating;
27604 if (animating) { return false; }
27606 // eslint-disable-next-line
27607 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
27608 return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
27610 return swiper.slideTo(swiper.activeIndex + params.slidesPerGroup, speed, runCallbacks, internal);
27613 /* eslint no-unused-vars: "off" */
27614 function slidePrev (speed, runCallbacks, internal) {
27615 if ( speed === void 0 ) speed = this.params.speed;
27616 if ( runCallbacks === void 0 ) runCallbacks = true;
27619 var params = swiper.params;
27620 var animating = swiper.animating;
27621 var snapGrid = swiper.snapGrid;
27622 var slidesGrid = swiper.slidesGrid;
27623 var rtlTranslate = swiper.rtlTranslate;
27626 if (animating) { return false; }
27628 // eslint-disable-next-line
27629 swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
27631 var translate = rtlTranslate ? swiper.translate : -swiper.translate;
27632 function normalize(val) {
27633 if (val < 0) { return -Math.floor(Math.abs(val)); }
27634 return Math.floor(val);
27636 var normalizedTranslate = normalize(translate);
27637 var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
27638 var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
27640 var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
27641 var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
27643 if (typeof prevSnap !== 'undefined') {
27644 prevIndex = slidesGrid.indexOf(prevSnap);
27645 if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
27647 return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
27650 /* eslint no-unused-vars: "off" */
27651 function slideReset (speed, runCallbacks, internal) {
27652 if ( speed === void 0 ) speed = this.params.speed;
27653 if ( runCallbacks === void 0 ) runCallbacks = true;
27656 return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
27659 /* eslint no-unused-vars: "off" */
27660 function slideToClosest (speed, runCallbacks, internal) {
27661 if ( speed === void 0 ) speed = this.params.speed;
27662 if ( runCallbacks === void 0 ) runCallbacks = true;
27665 var index = swiper.activeIndex;
27666 var snapIndex = Math.floor(index / swiper.params.slidesPerGroup);
27668 if (snapIndex < swiper.snapGrid.length - 1) {
27669 var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
27671 var currentSnap = swiper.snapGrid[snapIndex];
27672 var nextSnap = swiper.snapGrid[snapIndex + 1];
27674 if ((translate - currentSnap) > (nextSnap - currentSnap) / 2) {
27675 index = swiper.params.slidesPerGroup;
27679 return swiper.slideTo(index, speed, runCallbacks, internal);
27682 function slideToClickedSlide () {
27684 var params = swiper.params;
27685 var $wrapperEl = swiper.$wrapperEl;
27687 var slidesPerView = params.slidesPerView === 'auto
' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
27688 var slideToIndex = swiper.clickedIndex;
27691 if (swiper.animating) { return; }
27692 realIndex = parseInt($(swiper.clickedSlide).attr('data
-swiper
-slide
-index
'), 10);
27693 if (params.centeredSlides) {
27695 (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
27696 || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
27699 slideToIndex = $wrapperEl
27700 .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
27704 Utils.nextTick(function () {
27705 swiper.slideTo(slideToIndex);
27708 swiper.slideTo(slideToIndex);
27710 } else if (slideToIndex > swiper.slides.length - slidesPerView) {
27712 slideToIndex = $wrapperEl
27713 .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
27717 Utils.nextTick(function () {
27718 swiper.slideTo(slideToIndex);
27721 swiper.slideTo(slideToIndex);
27724 swiper.slideTo(slideToIndex);
27730 slideToLoop: slideToLoop,
27731 slideNext: slideNext,
27732 slidePrev: slidePrev,
27733 slideReset: slideReset,
27734 slideToClosest: slideToClosest,
27735 slideToClickedSlide: slideToClickedSlide,
27738 function loopCreate () {
27740 var params = swiper.params;
27741 var $wrapperEl = swiper.$wrapperEl;
27742 // Remove duplicated slides
27743 $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
27745 var slides = $wrapperEl.children(("." + (params.slideClass)));
27747 if (params.loopFillGroupWithBlank) {
27748 var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
27749 if (blankSlidesNum !== params.slidesPerGroup) {
27750 for (var i = 0; i < blankSlidesNum; i += 1) {
27751 var blankNode = $(doc.createElement('div
')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
27752 $wrapperEl.append(blankNode);
27754 slides = $wrapperEl.children(("." + (params.slideClass)));
27758 if (params.slidesPerView === 'auto
' && !params.loopedSlides) { params.loopedSlides = slides.length; }
27760 swiper.loopedSlides = parseInt(params.loopedSlides || params.slidesPerView, 10);
27761 swiper.loopedSlides += params.loopAdditionalSlides;
27762 if (swiper.loopedSlides > slides.length) {
27763 swiper.loopedSlides = slides.length;
27766 var prependSlides = [];
27767 var appendSlides = [];
27768 slides.each(function (index, el) {
27770 if (index < swiper.loopedSlides) { appendSlides.push(el); }
27771 if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
27772 slide.attr('data
-swiper
-slide
-index
', index);
27774 for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
27775 $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
27777 for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
27778 $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
27782 function loopFix () {
27784 var params = swiper.params;
27785 var activeIndex = swiper.activeIndex;
27786 var slides = swiper.slides;
27787 var loopedSlides = swiper.loopedSlides;
27788 var allowSlidePrev = swiper.allowSlidePrev;
27789 var allowSlideNext = swiper.allowSlideNext;
27790 var snapGrid = swiper.snapGrid;
27791 var rtl = swiper.rtlTranslate;
27793 swiper.allowSlidePrev = true;
27794 swiper.allowSlideNext = true;
27796 var snapTranslate = -snapGrid[activeIndex];
27797 var diff = snapTranslate - swiper.getTranslate();
27800 // Fix For Negative Oversliding
27801 if (activeIndex < loopedSlides) {
27802 newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
27803 newIndex += loopedSlides;
27804 var slideChanged = swiper.slideTo(newIndex, 0, false, true);
27805 if (slideChanged && diff !== 0) {
27806 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
27808 } else if ((params.slidesPerView === 'auto
' && activeIndex >= loopedSlides * 2) || (activeIndex >= slides.length - loopedSlides)) {
27809 // Fix For Positive Oversliding
27810 newIndex = -slides.length + activeIndex + loopedSlides;
27811 newIndex += loopedSlides;
27812 var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
27813 if (slideChanged$1 && diff !== 0) {
27814 swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
27817 swiper.allowSlidePrev = allowSlidePrev;
27818 swiper.allowSlideNext = allowSlideNext;
27821 function loopDestroy () {
27823 var $wrapperEl = swiper.$wrapperEl;
27824 var params = swiper.params;
27825 var slides = swiper.slides;
27826 $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
27827 slides.removeAttr('data
-swiper
-slide
-index
');
27831 loopCreate: loopCreate,
27833 loopDestroy: loopDestroy,
27836 function setGrabCursor (moving) {
27838 if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
27839 var el = swiper.el;
27840 el.style.cursor = 'move';
27841 el.style.cursor = moving ? '-webkit
-grabbing
' : '-webkit
-grab
';
27842 el.style.cursor = moving ? '-moz
-grabbin
' : '-moz
-grab
';
27843 el.style.cursor = moving ? 'grabbing
' : 'grab
';
27846 function unsetGrabCursor () {
27848 if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked)) { return; }
27849 swiper.el.style.cursor = '';
27853 setGrabCursor: setGrabCursor,
27854 unsetGrabCursor: unsetGrabCursor,
27857 function appendSlide (slides) {
27859 var $wrapperEl = swiper.$wrapperEl;
27860 var params = swiper.params;
27862 swiper.loopDestroy();
27864 if (typeof slides === 'object
' && 'length
' in slides) {
27865 for (var i = 0; i < slides.length; i += 1) {
27866 if (slides[i]) { $wrapperEl.append(slides[i]); }
27869 $wrapperEl.append(slides);
27872 swiper.loopCreate();
27874 if (!(params.observer && Support.observer)) {
27879 function prependSlide (slides) {
27881 var params = swiper.params;
27882 var $wrapperEl = swiper.$wrapperEl;
27883 var activeIndex = swiper.activeIndex;
27886 swiper.loopDestroy();
27888 var newActiveIndex = activeIndex + 1;
27889 if (typeof slides === 'object
' && 'length
' in slides) {
27890 for (var i = 0; i < slides.length; i += 1) {
27891 if (slides[i]) { $wrapperEl.prepend(slides[i]); }
27893 newActiveIndex = activeIndex + slides.length;
27895 $wrapperEl.prepend(slides);
27898 swiper.loopCreate();
27900 if (!(params.observer && Support.observer)) {
27903 swiper.slideTo(newActiveIndex, 0, false);
27906 function addSlide (index, slides) {
27908 var $wrapperEl = swiper.$wrapperEl;
27909 var params = swiper.params;
27910 var activeIndex = swiper.activeIndex;
27911 var activeIndexBuffer = activeIndex;
27913 activeIndexBuffer -= swiper.loopedSlides;
27914 swiper.loopDestroy();
27915 swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
27917 var baseLength = swiper.slides.length;
27919 swiper.prependSlide(slides);
27922 if (index >= baseLength) {
27923 swiper.appendSlide(slides);
27926 var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
27928 var slidesBuffer = [];
27929 for (var i = baseLength - 1; i >= index; i -= 1) {
27930 var currentSlide = swiper.slides.eq(i);
27931 currentSlide.remove();
27932 slidesBuffer.unshift(currentSlide);
27935 if (typeof slides === 'object
' && 'length
' in slides) {
27936 for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
27937 if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
27939 newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
27941 $wrapperEl.append(slides);
27944 for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
27945 $wrapperEl.append(slidesBuffer[i$2]);
27949 swiper.loopCreate();
27951 if (!(params.observer && Support.observer)) {
27955 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
27957 swiper.slideTo(newActiveIndex, 0, false);
27961 function removeSlide (slidesIndexes) {
27963 var params = swiper.params;
27964 var $wrapperEl = swiper.$wrapperEl;
27965 var activeIndex = swiper.activeIndex;
27967 var activeIndexBuffer = activeIndex;
27969 activeIndexBuffer -= swiper.loopedSlides;
27970 swiper.loopDestroy();
27971 swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
27973 var newActiveIndex = activeIndexBuffer;
27976 if (typeof slidesIndexes === 'object
' && 'length
' in slidesIndexes) {
27977 for (var i = 0; i < slidesIndexes.length; i += 1) {
27978 indexToRemove = slidesIndexes[i];
27979 if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
27980 if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
27982 newActiveIndex = Math.max(newActiveIndex, 0);
27984 indexToRemove = slidesIndexes;
27985 if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
27986 if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
27987 newActiveIndex = Math.max(newActiveIndex, 0);
27991 swiper.loopCreate();
27994 if (!(params.observer && Support.observer)) {
27998 swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
28000 swiper.slideTo(newActiveIndex, 0, false);
28004 function removeAllSlides () {
28007 var slidesIndexes = [];
28008 for (var i = 0; i < swiper.slides.length; i += 1) {
28009 slidesIndexes.push(i);
28011 swiper.removeSlide(slidesIndexes);
28014 var manipulation = {
28015 appendSlide: appendSlide,
28016 prependSlide: prependSlide,
28017 addSlide: addSlide,
28018 removeSlide: removeSlide,
28019 removeAllSlides: removeAllSlides,
28022 function onTouchStart (event) {
28024 var data = swiper.touchEventsData;
28025 var params = swiper.params;
28026 var touches = swiper.touches;
28027 if (swiper.animating && params.preventInteractionOnTransition) {
28031 if (e.originalEvent) { e = e.originalEvent; }
28032 data.isTouchEvent = e.type === 'touchstart
';
28033 if (!data.isTouchEvent && 'which
' in e && e.which === 3) { return; }
28034 if (!data.isTouchEvent && 'button
' in e && e.button > 0) { return; }
28035 if (data.isTouched && data.isMoved) { return; }
28036 if (params.noSwiping && $(e.target).closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
28037 swiper.allowClick = true;
28040 if (params.swipeHandler) {
28041 if (!$(e).closest(params.swipeHandler)[0]) { return; }
28044 touches.currentX = e.type === 'touchstart
' ? e.targetTouches[0].pageX : e.pageX;
28045 touches.currentY = e.type === 'touchstart
' ? e.targetTouches[0].pageY : e.pageY;
28046 var startX = touches.currentX;
28047 var startY = touches.currentY;
28049 // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
28051 var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
28052 var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
28055 && ((startX <= edgeSwipeThreshold)
28056 || (startX >= win.screen.width - edgeSwipeThreshold))
28061 Utils.extend(data, {
28064 allowTouchCallbacks: true,
28065 isScrolling: undefined,
28066 startMoving: undefined,
28069 touches.startX = startX;
28070 touches.startY = startY;
28071 data.touchStartTime = Utils.now();
28072 swiper.allowClick = true;
28073 swiper.updateSize();
28074 swiper.swipeDirection = undefined;
28075 if (params.threshold > 0) { data.allowThresholdMove = false; }
28076 if (e.type !== 'touchstart
') {
28077 var preventDefault = true;
28078 if ($(e.target).is(data.formElements)) { preventDefault = false; }
28081 && $(doc.activeElement).is(data.formElements)
28082 && doc.activeElement !== e.target
28084 doc.activeElement.blur();
28087 var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
28088 if (params.touchStartForcePreventDefault || shouldPreventDefault) {
28089 e.preventDefault();
28092 swiper.emit('touchStart
', e);
28095 function onTouchMove (event) {
28097 var data = swiper.touchEventsData;
28098 var params = swiper.params;
28099 var touches = swiper.touches;
28100 var rtl = swiper.rtlTranslate;
28102 if (e.originalEvent) { e = e.originalEvent; }
28103 if (!data.isTouched) {
28104 if (data.startMoving && data.isScrolling) {
28105 swiper.emit('touchMoveOpposite
', e);
28109 if (data.isTouchEvent && e.type === 'mousemove
') { return; }
28110 var pageX = e.type === 'touchmove
' ? e.targetTouches[0].pageX : e.pageX;
28111 var pageY = e.type === 'touchmove
' ? e.targetTouches[0].pageY : e.pageY;
28112 if (e.preventedByNestedSwiper) {
28113 touches.startX = pageX;
28114 touches.startY = pageY;
28117 if (!swiper.allowTouchMove) {
28119 swiper.allowClick = false;
28120 if (data.isTouched) {
28121 Utils.extend(touches, {
28127 data.touchStartTime = Utils.now();
28131 if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
28132 if (swiper.isVertical()) {
28135 (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
28136 || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
28138 data.isTouched = false;
28139 data.isMoved = false;
28143 (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
28144 || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
28149 if (data.isTouchEvent && doc.activeElement) {
28150 if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
28151 data.isMoved = true;
28152 swiper.allowClick = false;
28156 if (data.allowTouchCallbacks) {
28157 swiper.emit('touchMove
', e);
28159 if (e.targetTouches && e.targetTouches.length > 1) { return; }
28161 touches.currentX = pageX;
28162 touches.currentY = pageY;
28164 var diffX = touches.currentX - touches.startX;
28165 var diffY = touches.currentY - touches.startY;
28166 if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
28168 if (typeof data.isScrolling === 'undefined') {
28170 if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
28171 data.isScrolling = false;
28173 // eslint-disable-next-line
28174 if ((diffX * diffX) + (diffY * diffY) >= 25) {
28175 touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
28176 data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
28180 if (data.isScrolling) {
28181 swiper.emit('touchMoveOpposite
', e);
28183 if (typeof data.startMoving === 'undefined') {
28184 if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
28185 data.startMoving = true;
28188 if (data.isScrolling) {
28189 data.isTouched = false;
28192 if (!data.startMoving) {
28195 swiper.allowClick = false;
28196 e.preventDefault();
28197 if (params.touchMoveStopPropagation && !params.nested) {
28198 e.stopPropagation();
28201 if (!data.isMoved) {
28205 data.startTranslate = swiper.getTranslate();
28206 swiper.setTransition(0);
28207 if (swiper.animating) {
28208 swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend
');
28210 data.allowMomentumBounce = false;
28212 if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
28213 swiper.setGrabCursor(true);
28215 swiper.emit('sliderFirstMove
', e);
28217 swiper.emit('sliderMove
', e);
28218 data.isMoved = true;
28220 var diff = swiper.isHorizontal() ? diffX : diffY;
28221 touches.diff = diff;
28223 diff *= params.touchRatio;
28224 if (rtl) { diff = -diff; }
28226 swiper.swipeDirection = diff > 0 ? 'prev
' : 'next
';
28227 data.currentTranslate = diff + data.startTranslate;
28229 var disableParentSwiper = true;
28230 var resistanceRatio = params.resistanceRatio;
28231 if (params.touchReleaseOnEdges) {
28232 resistanceRatio = 0;
28234 if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
28235 disableParentSwiper = false;
28236 if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
28237 } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
28238 disableParentSwiper = false;
28239 if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
28242 if (disableParentSwiper) {
28243 e.preventedByNestedSwiper = true;
28246 // Directions locks
28247 if (!swiper.allowSlideNext && swiper.swipeDirection === 'next
' && data.currentTranslate < data.startTranslate) {
28248 data.currentTranslate = data.startTranslate;
28250 if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev
' && data.currentTranslate > data.startTranslate) {
28251 data.currentTranslate = data.startTranslate;
28256 if (params.threshold > 0) {
28257 if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
28258 if (!data.allowThresholdMove) {
28259 data.allowThresholdMove = true;
28260 touches.startX = touches.currentX;
28261 touches.startY = touches.currentY;
28262 data.currentTranslate = data.startTranslate;
28263 touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
28267 data.currentTranslate = data.startTranslate;
28272 if (!params.followFinger) { return; }
28274 // Update active index in free mode
28275 if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
28276 swiper.updateActiveIndex();
28277 swiper.updateSlidesClasses();
28279 if (params.freeMode) {
28281 if (data.velocities.length === 0) {
28282 data.velocities.push({
28283 position: touches[swiper.isHorizontal() ? 'startX
' : 'startY
'],
28284 time: data.touchStartTime,
28287 data.velocities.push({
28288 position: touches[swiper.isHorizontal() ? 'currentX
' : 'currentY
'],
28293 swiper.updateProgress(data.currentTranslate);
28294 // Update translate
28295 swiper.setTranslate(data.currentTranslate);
28298 function onTouchEnd (event) {
28300 var data = swiper.touchEventsData;
28302 var params = swiper.params;
28303 var touches = swiper.touches;
28304 var rtl = swiper.rtlTranslate;
28305 var $wrapperEl = swiper.$wrapperEl;
28306 var slidesGrid = swiper.slidesGrid;
28307 var snapGrid = swiper.snapGrid;
28309 if (e.originalEvent) { e = e.originalEvent; }
28310 if (data.allowTouchCallbacks) {
28311 swiper.emit('touchEnd
', e);
28313 data.allowTouchCallbacks = false;
28314 if (!data.isTouched) {
28315 if (data.isMoved && params.grabCursor) {
28316 swiper.setGrabCursor(false);
28318 data.isMoved = false;
28319 data.startMoving = false;
28322 // Return Grab Cursor
28323 if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
28324 swiper.setGrabCursor(false);
28328 var touchEndTime = Utils.now();
28329 var timeDiff = touchEndTime - data.touchStartTime;
28331 // Tap, doubleTap, Click
28332 if (swiper.allowClick) {
28333 swiper.updateClickedSlide(e);
28334 swiper.emit('tap
', e);
28335 if (timeDiff < 300 && (touchEndTime - data.lastClickTime) > 300) {
28336 if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
28337 data.clickTimeout = Utils.nextTick(function () {
28338 if (!swiper || swiper.destroyed) { return; }
28339 swiper.emit('click
', e);
28342 if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
28343 if (data.clickTimeout) { clearTimeout(data.clickTimeout); }
28344 swiper.emit('doubleTap
', e);
28348 data.lastClickTime = Utils.now();
28349 Utils.nextTick(function () {
28350 if (!swiper.destroyed) { swiper.allowClick = true; }
28353 if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
28354 data.isTouched = false;
28355 data.isMoved = false;
28356 data.startMoving = false;
28359 data.isTouched = false;
28360 data.isMoved = false;
28361 data.startMoving = false;
28364 if (params.followFinger) {
28365 currentPos = rtl ? swiper.translate : -swiper.translate;
28367 currentPos = -data.currentTranslate;
28370 if (params.freeMode) {
28371 if (currentPos < -swiper.minTranslate()) {
28372 swiper.slideTo(swiper.activeIndex);
28375 if (currentPos > -swiper.maxTranslate()) {
28376 if (swiper.slides.length < snapGrid.length) {
28377 swiper.slideTo(snapGrid.length - 1);
28379 swiper.slideTo(swiper.slides.length - 1);
28384 if (params.freeModeMomentum) {
28385 if (data.velocities.length > 1) {
28386 var lastMoveEvent = data.velocities.pop();
28387 var velocityEvent = data.velocities.pop();
28389 var distance = lastMoveEvent.position - velocityEvent.position;
28390 var time = lastMoveEvent.time - velocityEvent.time;
28391 swiper.velocity = distance / time;
28392 swiper.velocity /= 2;
28393 if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
28394 swiper.velocity = 0;
28396 // this implies that the user stopped moving a finger then released.
28397 // There would be no events with distance zero, so the last event is stale.
28398 if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
28399 swiper.velocity = 0;
28402 swiper.velocity = 0;
28404 swiper.velocity *= params.freeModeMomentumVelocityRatio;
28406 data.velocities.length = 0;
28407 var momentumDuration = 1000 * params.freeModeMomentumRatio;
28408 var momentumDistance = swiper.velocity * momentumDuration;
28410 var newPosition = swiper.translate + momentumDistance;
28411 if (rtl) { newPosition = -newPosition; }
28413 var doBounce = false;
28414 var afterBouncePosition;
28415 var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
28417 if (newPosition < swiper.maxTranslate()) {
28418 if (params.freeModeMomentumBounce) {
28419 if (newPosition + swiper.maxTranslate() < -bounceAmount) {
28420 newPosition = swiper.maxTranslate() - bounceAmount;
28422 afterBouncePosition = swiper.maxTranslate();
28424 data.allowMomentumBounce = true;
28426 newPosition = swiper.maxTranslate();
28428 if (params.loop && params.centeredSlides) { needsLoopFix = true; }
28429 } else if (newPosition > swiper.minTranslate()) {
28430 if (params.freeModeMomentumBounce) {
28431 if (newPosition - swiper.minTranslate() > bounceAmount) {
28432 newPosition = swiper.minTranslate() + bounceAmount;
28434 afterBouncePosition = swiper.minTranslate();
28436 data.allowMomentumBounce = true;
28438 newPosition = swiper.minTranslate();
28440 if (params.loop && params.centeredSlides) { needsLoopFix = true; }
28441 } else if (params.freeModeSticky) {
28443 for (var j = 0; j < snapGrid.length; j += 1) {
28444 if (snapGrid[j] > -newPosition) {
28450 if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next
') {
28451 newPosition = snapGrid[nextSlide];
28453 newPosition = snapGrid[nextSlide - 1];
28455 newPosition = -newPosition;
28457 if (needsLoopFix) {
28458 swiper.once('transitionEnd
', function () {
28463 if (swiper.velocity !== 0) {
28465 momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
28467 momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
28469 } else if (params.freeModeSticky) {
28470 swiper.slideToClosest();
28474 if (params.freeModeMomentumBounce && doBounce) {
28475 swiper.updateProgress(afterBouncePosition);
28476 swiper.setTransition(momentumDuration);
28477 swiper.setTranslate(newPosition);
28478 swiper.transitionStart(true, swiper.swipeDirection);
28479 swiper.animating = true;
28480 $wrapperEl.transitionEnd(function () {
28481 if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
28482 swiper.emit('momentumBounce
');
28484 swiper.setTransition(params.speed);
28485 swiper.setTranslate(afterBouncePosition);
28486 $wrapperEl.transitionEnd(function () {
28487 if (!swiper || swiper.destroyed) { return; }
28488 swiper.transitionEnd();
28491 } else if (swiper.velocity) {
28492 swiper.updateProgress(newPosition);
28493 swiper.setTransition(momentumDuration);
28494 swiper.setTranslate(newPosition);
28495 swiper.transitionStart(true, swiper.swipeDirection);
28496 if (!swiper.animating) {
28497 swiper.animating = true;
28498 $wrapperEl.transitionEnd(function () {
28499 if (!swiper || swiper.destroyed) { return; }
28500 swiper.transitionEnd();
28504 swiper.updateProgress(newPosition);
28507 swiper.updateActiveIndex();
28508 swiper.updateSlidesClasses();
28509 } else if (params.freeModeSticky) {
28510 swiper.slideToClosest();
28514 if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
28515 swiper.updateProgress();
28516 swiper.updateActiveIndex();
28517 swiper.updateSlidesClasses();
28522 // Find current slide
28524 var groupSize = swiper.slidesSizesGrid[0];
28525 for (var i = 0; i < slidesGrid.length; i += params.slidesPerGroup) {
28526 if (typeof slidesGrid[i + params.slidesPerGroup] !== 'undefined') {
28527 if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + params.slidesPerGroup]) {
28529 groupSize = slidesGrid[i + params.slidesPerGroup] - slidesGrid[i];
28531 } else if (currentPos >= slidesGrid[i]) {
28533 groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
28537 // Find current slide size
28538 var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
28540 if (timeDiff > params.longSwipesMs) {
28542 if (!params.longSwipes) {
28543 swiper.slideTo(swiper.activeIndex);
28546 if (swiper.swipeDirection === 'next
') {
28547 if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
28548 else { swiper.slideTo(stopIndex); }
28550 if (swiper.swipeDirection === 'prev
') {
28551 if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + params.slidesPerGroup); }
28552 else { swiper.slideTo(stopIndex); }
28556 if (!params.shortSwipes) {
28557 swiper.slideTo(swiper.activeIndex);
28560 if (swiper.swipeDirection === 'next
') {
28561 swiper.slideTo(stopIndex + params.slidesPerGroup);
28563 if (swiper.swipeDirection === 'prev
') {
28564 swiper.slideTo(stopIndex);
28569 function onResize () {
28572 var params = swiper.params;
28573 var el = swiper.el;
28575 if (el && el.offsetWidth === 0) { return; }
28578 if (params.breakpoints) {
28579 swiper.setBreakpoint();
28583 var allowSlideNext = swiper.allowSlideNext;
28584 var allowSlidePrev = swiper.allowSlidePrev;
28585 var snapGrid = swiper.snapGrid;
28587 // Disable locks on resize
28588 swiper.allowSlideNext = true;
28589 swiper.allowSlidePrev = true;
28591 swiper.updateSize();
28592 swiper.updateSlides();
28594 if (params.freeMode) {
28595 var newTranslate = Math.min(Math.max(swiper.translate, swiper.maxTranslate()), swiper.minTranslate());
28596 swiper.setTranslate(newTranslate);
28597 swiper.updateActiveIndex();
28598 swiper.updateSlidesClasses();
28600 if (params.autoHeight) {
28601 swiper.updateAutoHeight();
28604 swiper.updateSlidesClasses();
28605 if ((params.slidesPerView === 'auto
' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
28606 swiper.slideTo(swiper.slides.length - 1, 0, false, true);
28608 swiper.slideTo(swiper.activeIndex, 0, false, true);
28611 // Return locks after resize
28612 swiper.allowSlidePrev = allowSlidePrev;
28613 swiper.allowSlideNext = allowSlideNext;
28615 if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
28616 swiper.checkOverflow();
28620 function onClick (e) {
28622 if (!swiper.allowClick) {
28623 if (swiper.params.preventClicks) { e.preventDefault(); }
28624 if (swiper.params.preventClicksPropagation && swiper.animating) {
28625 e.stopPropagation();
28626 e.stopImmediatePropagation();
28631 function attachEvents() {
28633 var params = swiper.params;
28634 var touchEvents = swiper.touchEvents;
28635 var el = swiper.el;
28636 var wrapperEl = swiper.wrapperEl;
28639 swiper.onTouchStart = onTouchStart.bind(swiper);
28640 swiper.onTouchMove = onTouchMove.bind(swiper);
28641 swiper.onTouchEnd = onTouchEnd.bind(swiper);
28644 swiper.onClick = onClick.bind(swiper);
28646 var target = params.touchEventsTarget === 'container
' ? el : wrapperEl;
28647 var capture = !!params.nested;
28651 if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
28652 target.addEventListener(touchEvents.start, swiper.onTouchStart, false);
28653 doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
28654 doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
28656 if (Support.touch) {
28657 var passiveListener = touchEvents.start === 'touchstart
' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
28658 target.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
28659 target.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
28660 target.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
28662 if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
28663 target.addEventListener('mousedown
', swiper.onTouchStart, false);
28664 doc.addEventListener('mousemove
', swiper.onTouchMove, capture);
28665 doc.addEventListener('mouseup
', swiper.onTouchEnd, false);
28668 // Prevent Links Clicks
28669 if (params.preventClicks || params.preventClicksPropagation) {
28670 target.addEventListener('click
', swiper.onClick, true);
28675 swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate
' : 'resize observerUpdate
'), onResize, true);
28678 function detachEvents() {
28681 var params = swiper.params;
28682 var touchEvents = swiper.touchEvents;
28683 var el = swiper.el;
28684 var wrapperEl = swiper.wrapperEl;
28686 var target = params.touchEventsTarget === 'container
' ? el : wrapperEl;
28687 var capture = !!params.nested;
28691 if (!Support.touch && (Support.pointerEvents || Support.prefixedPointerEvents)) {
28692 target.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
28693 doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
28694 doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
28696 if (Support.touch) {
28697 var passiveListener = touchEvents.start === 'onTouchStart
' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
28698 target.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
28699 target.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
28700 target.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
28702 if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
28703 target.removeEventListener('mousedown
', swiper.onTouchStart, false);
28704 doc.removeEventListener('mousemove
', swiper.onTouchMove, capture);
28705 doc.removeEventListener('mouseup
', swiper.onTouchEnd, false);
28708 // Prevent Links Clicks
28709 if (params.preventClicks || params.preventClicksPropagation) {
28710 target.removeEventListener('click
', swiper.onClick, true);
28715 swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate
' : 'resize observerUpdate
'), onResize);
28719 attachEvents: attachEvents,
28720 detachEvents: detachEvents,
28723 function setBreakpoint () {
28725 var activeIndex = swiper.activeIndex;
28726 var initialized = swiper.initialized;
28727 var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
28728 var params = swiper.params;
28729 var breakpoints = params.breakpoints;
28730 if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
28732 // Set breakpoint for window width and update parameters
28733 var breakpoint = swiper.getBreakpoint(breakpoints);
28735 if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
28736 var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
28737 if (breakpointOnlyParams) {
28738 ['slidesPerView
', 'spaceBetween
', 'slidesPerGroup
'].forEach(function (param) {
28739 var paramValue = breakpointOnlyParams[param];
28740 if (typeof paramValue === 'undefined') { return; }
28741 if (param === 'slidesPerView
' && (paramValue === 'AUTO
' || paramValue === 'auto
')) {
28742 breakpointOnlyParams[param] = 'auto
';
28743 } else if (param === 'slidesPerView
') {
28744 breakpointOnlyParams[param] = parseFloat(paramValue);
28746 breakpointOnlyParams[param] = parseInt(paramValue, 10);
28751 var breakpointParams = breakpointOnlyParams || swiper.originalParams;
28752 var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView);
28754 Utils.extend(swiper.params, breakpointParams);
28756 Utils.extend(swiper, {
28757 allowTouchMove: swiper.params.allowTouchMove,
28758 allowSlideNext: swiper.params.allowSlideNext,
28759 allowSlidePrev: swiper.params.allowSlidePrev,
28762 swiper.currentBreakpoint = breakpoint;
28764 if (needsReLoop && initialized) {
28765 swiper.loopDestroy();
28766 swiper.loopCreate();
28767 swiper.updateSlides();
28768 swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
28770 swiper.emit('breakpoint
', breakpointParams);
28774 function getBreakpoint (breakpoints) {
28776 // Get breakpoint for window width
28777 if (!breakpoints) { return undefined; }
28778 var breakpoint = false;
28780 Object.keys(breakpoints).forEach(function (point) {
28781 points.push(point);
28783 points.sort(function (a, b) { return parseInt(a, 10) - parseInt(b, 10); });
28784 for (var i = 0; i < points.length; i += 1) {
28785 var point = points[i];
28786 if (swiper.params.breakpointsInverse) {
28787 if (point <= win.innerWidth) {
28788 breakpoint = point;
28790 } else if (point >= win.innerWidth && !breakpoint) {
28791 breakpoint = point;
28794 return breakpoint || 'max
';
28797 var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
28799 var Browser = (function Browser() {
28800 function isSafari() {
28801 var ua = win.navigator.userAgent.toLowerCase();
28802 return (ua.indexOf('safari
') >= 0 && ua.indexOf('chrome
') < 0 && ua.indexOf('android
') < 0);
28805 isIE: !!win.navigator.userAgent.match(/Trident/g) || !!win.navigator.userAgent.match(/MSIE/g),
28806 isSafari: isSafari(),
28807 isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
28811 function addClasses () {
28813 var classNames = swiper.classNames;
28814 var params = swiper.params;
28815 var rtl = swiper.rtl;
28816 var $el = swiper.$el;
28819 suffixes.push(params.direction);
28821 if (params.freeMode) {
28822 suffixes.push('free
-mode
');
28824 if (!Support.flexbox) {
28825 suffixes.push('no
-flexbox
');
28827 if (params.autoHeight) {
28828 suffixes.push('autoheight
');
28831 suffixes.push('rtl
');
28833 if (params.slidesPerColumn > 1) {
28834 suffixes.push('multirow
');
28836 if (Device.android) {
28837 suffixes.push('android
');
28840 suffixes.push('ios
');
28842 // WP8 Touch Events Fix
28843 if ((Browser.isIE || Browser.isEdge) && (Support.pointerEvents || Support.prefixedPointerEvents)) {
28844 suffixes.push(("wp8-" + (params.direction)));
28847 suffixes.forEach(function (suffix) {
28848 classNames.push(params.containerModifierClass + suffix);
28851 $el.addClass(classNames.join(' '));
28854 function removeClasses () {
28856 var $el = swiper.$el;
28857 var classNames = swiper.classNames;
28859 $el.removeClass(classNames.join(' '));
28862 var classes = { addClasses: addClasses, removeClasses: removeClasses };
28864 function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
28866 function onReady() {
28867 if (callback) { callback(); }
28869 if (!imageEl.complete || !checkForComplete) {
28871 image = new win.Image();
28872 image.onload = onReady;
28873 image.onerror = onReady;
28875 image.sizes = sizes;
28878 image.srcset = srcset;
28887 // image already loaded...
28892 function preloadImages () {
28894 swiper.imagesToLoad = swiper.$el.find('img
');
28895 function onReady() {
28896 if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
28897 if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
28898 if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
28899 if (swiper.params.updateOnImagesReady) { swiper.update(); }
28900 swiper.emit('imagesReady
');
28903 for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
28904 var imageEl = swiper.imagesToLoad[i];
28907 imageEl.currentSrc || imageEl.getAttribute('src
'),
28908 imageEl.srcset || imageEl.getAttribute('srcset
'),
28909 imageEl.sizes || imageEl.getAttribute('sizes
'),
28917 loadImage: loadImage,
28918 preloadImages: preloadImages,
28921 function checkOverflow() {
28923 var wasLocked = swiper.isLocked;
28925 swiper.isLocked = swiper.snapGrid.length === 1;
28926 swiper.allowSlideNext = !swiper.isLocked;
28927 swiper.allowSlidePrev = !swiper.isLocked;
28930 if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock
' : 'unlock
'); }
28932 if (wasLocked && wasLocked !== swiper.isLocked) {
28933 swiper.isEnd = false;
28934 swiper.navigation.update();
28938 var checkOverflow$1 = { checkOverflow: checkOverflow };
28942 direction: 'horizontal
',
28943 touchEventsTarget: 'container
',
28947 preventInteractionOnTransition: false,
28949 // To support iOS's swipe
-to
-go
-back
gesture (when being used
in-app
, with UIWebView
).
28950 edgeSwipeDetection
: false,
28951 edgeSwipeThreshold
: 20,
28955 freeModeMomentum
: true,
28956 freeModeMomentumRatio
: 1,
28957 freeModeMomentumBounce
: true,
28958 freeModeMomentumBounceRatio
: 1,
28959 freeModeMomentumVelocityRatio
: 1,
28960 freeModeSticky
: false,
28961 freeModeMinimumVelocity
: 0.02,
28966 // Set wrapper width
28967 setWrapperSize
: false,
28969 // Virtual Translate
28970 virtualTranslate
: false,
28973 effect
: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
28976 breakpoints
: undefined,
28977 breakpointsInverse
: false,
28982 slidesPerColumn
: 1,
28983 slidesPerColumnFill
: 'column',
28985 centeredSlides
: false,
28986 slidesOffsetBefore
: 0, // in px
28987 slidesOffsetAfter
: 0, // in px
28988 normalizeSlideIndex
: true,
28989 centerInsufficientSlides
: false,
28991 // Disable swiper and hide navigation when container not overflow
28992 watchOverflow
: false,
28995 roundLengths
: false,
29000 simulateTouch
: true,
29003 longSwipesRatio
: 0.5,
29005 followFinger
: true,
29006 allowTouchMove
: true,
29008 touchMoveStopPropagation
: true,
29009 touchStartPreventDefault
: true,
29010 touchStartForcePreventDefault
: false,
29011 touchReleaseOnEdges
: false,
29013 // Unique Navigation Elements
29014 uniqueNavElements
: true,
29018 resistanceRatio
: 0.85,
29021 watchSlidesProgress
: false,
29022 watchSlidesVisibility
: false,
29028 preventClicks
: true,
29029 preventClicksPropagation
: true,
29030 slideToClickedSlide
: false,
29033 preloadImages
: true,
29034 updateOnImagesReady
: true,
29038 loopAdditionalSlides
: 0,
29039 loopedSlides
: null,
29040 loopFillGroupWithBlank
: false,
29042 // Swiping/no swiping
29043 allowSlidePrev
: true,
29044 allowSlideNext
: true,
29045 swipeHandler
: null, // '.swipe-handler',
29047 noSwipingClass
: 'swiper-no-swiping',
29048 noSwipingSelector
: null,
29050 // Passive Listeners
29051 passiveListeners
: true,
29054 containerModifierClass
: 'swiper-container-', // NEW
29055 slideClass
: 'swiper-slide',
29056 slideBlankClass
: 'swiper-slide-invisible-blank',
29057 slideActiveClass
: 'swiper-slide-active',
29058 slideDuplicateActiveClass
: 'swiper-slide-duplicate-active',
29059 slideVisibleClass
: 'swiper-slide-visible',
29060 slideDuplicateClass
: 'swiper-slide-duplicate',
29061 slideNextClass
: 'swiper-slide-next',
29062 slideDuplicateNextClass
: 'swiper-slide-duplicate-next',
29063 slidePrevClass
: 'swiper-slide-prev',
29064 slideDuplicatePrevClass
: 'swiper-slide-duplicate-prev',
29065 wrapperClass
: 'swiper-wrapper',
29068 runCallbacksOnInit
: true,
29073 translate
: translate
,
29074 transition
: transition
$1,
29077 grabCursor
: grabCursor
,
29078 manipulation
: manipulation
,
29080 breakpoints
: breakpoints
,
29081 checkOverflow
: checkOverflow
$1,
29086 var extendedDefaults
= {};
29088 var Swiper
= /*@__PURE__*/(function (SwiperClass
) {
29089 function Swiper() {
29092 var args
= [], len
= arguments
.length
;
29093 while ( len
-- ) args
[ len
] = arguments
[ len
];
29096 if (args
.length
=== 1 && args
[0].constructor && args
[0].constructor === Object
) {
29099 (assign
= args
, el
= assign
[0], params
= assign
[1]);
29101 if (!params
) { params
= {}; }
29103 params
= Utils
.extend({}, params
);
29104 if (el
&& !params
.el
) { params
.el
= el
; }
29106 SwiperClass
.call(this, params
);
29108 Object
.keys(prototypes
).forEach(function (prototypeGroup
) {
29109 Object
.keys(prototypes
[prototypeGroup
]).forEach(function (protoMethod
) {
29110 if (!Swiper
.prototype[protoMethod
]) {
29111 Swiper
.prototype[protoMethod
] = prototypes
[prototypeGroup
][protoMethod
];
29118 if (typeof swiper
.modules
=== 'undefined') {
29119 swiper
.modules
= {};
29121 Object
.keys(swiper
.modules
).forEach(function (moduleName
) {
29122 var module
= swiper
.modules
[moduleName
];
29123 if (module
.params
) {
29124 var moduleParamName
= Object
.keys(module
.params
)[0];
29125 var moduleParams
= module
.params
[moduleParamName
];
29126 if (typeof moduleParams
!== 'object' || moduleParams
=== null) { return; }
29127 if (!(moduleParamName
in params
&& 'enabled' in moduleParams
)) { return; }
29128 if (params
[moduleParamName
] === true) {
29129 params
[moduleParamName
] = { enabled
: true };
29132 typeof params
[moduleParamName
] === 'object'
29133 && !('enabled' in params
[moduleParamName
])
29135 params
[moduleParamName
].enabled
= true;
29137 if (!params
[moduleParamName
]) { params
[moduleParamName
] = { enabled
: false }; }
29141 // Extend defaults with modules params
29142 var swiperParams
= Utils
.extend({}, defaults
);
29143 swiper
.useModulesParams(swiperParams
);
29145 // Extend defaults with passed params
29146 swiper
.params
= Utils
.extend({}, swiperParams
, extendedDefaults
, params
);
29147 swiper
.originalParams
= Utils
.extend({}, swiper
.params
);
29148 swiper
.passedParams
= Utils
.extend({}, params
);
29154 var $el
= $(swiper
.params
.el
);
29161 if ($el
.length
> 1) {
29163 $el
.each(function (index
, containerEl
) {
29164 var newParams
= Utils
.extend({}, params
, { el
: containerEl
});
29165 swipers
.push(new Swiper(newParams
));
29170 el
.swiper
= swiper
;
29171 $el
.data('swiper', swiper
);
29174 var $wrapperEl
= $el
.children(("." + (swiper
.params
.wrapperClass
)));
29177 Utils
.extend(swiper
, {
29180 $wrapperEl
: $wrapperEl
,
29181 wrapperEl
: $wrapperEl
[0],
29190 slidesSizesGrid
: [],
29193 isHorizontal
: function isHorizontal() {
29194 return swiper
.params
.direction
=== 'horizontal';
29196 isVertical
: function isVertical() {
29197 return swiper
.params
.direction
=== 'vertical';
29200 rtl
: (el
.dir
.toLowerCase() === 'rtl' || $el
.css('direction') === 'rtl'),
29201 rtlTranslate
: swiper
.params
.direction
=== 'horizontal' && (el
.dir
.toLowerCase() === 'rtl' || $el
.css('direction') === 'rtl'),
29202 wrongRTL
: $wrapperEl
.css('display') === '-webkit-box',
29214 previousTranslate
: 0,
29220 allowSlideNext
: swiper
.params
.allowSlideNext
,
29221 allowSlidePrev
: swiper
.params
.allowSlidePrev
,
29224 touchEvents
: (function touchEvents() {
29225 var touch
= ['touchstart', 'touchmove', 'touchend'];
29226 var desktop
= ['mousedown', 'mousemove', 'mouseup'];
29227 if (Support
.pointerEvents
) {
29228 desktop
= ['pointerdown', 'pointermove', 'pointerup'];
29229 } else if (Support
.prefixedPointerEvents
) {
29230 desktop
= ['MSPointerDown', 'MSPointerMove', 'MSPointerUp'];
29232 swiper
.touchEventsTouch
= {
29237 swiper
.touchEventsDesktop
= {
29242 return Support
.touch
|| !swiper
.params
.simulateTouch
? swiper
.touchEventsTouch
: swiper
.touchEventsDesktop
;
29245 isTouched
: undefined,
29246 isMoved
: undefined,
29247 allowTouchCallbacks
: undefined,
29248 touchStartTime
: undefined,
29249 isScrolling
: undefined,
29250 currentTranslate
: undefined,
29251 startTranslate
: undefined,
29252 allowThresholdMove
: undefined,
29253 // Form elements to match
29254 formElements
: 'input, select, option, textarea, button, video',
29256 lastClickTime
: Utils
.now(),
29257 clickTimeout
: undefined,
29260 allowMomentumBounce
: undefined,
29261 isTouchEvent
: undefined,
29262 startMoving
: undefined,
29269 allowTouchMove
: swiper
.params
.allowTouchMove
,
29286 swiper
.useModules();
29289 if (swiper
.params
.init
) {
29293 // Return app instance
29297 if ( SwiperClass
) Swiper
.__proto__
= SwiperClass
;
29298 Swiper
.prototype = Object
.create( SwiperClass
&& SwiperClass
.prototype );
29299 Swiper
.prototype.constructor = Swiper
;
29301 var staticAccessors
= { extendedDefaults
: { configurable
: true },defaults
: { configurable
: true },Class
: { configurable
: true },$: { configurable
: true } };
29303 Swiper
.prototype.slidesPerViewDynamic
= function slidesPerViewDynamic () {
29305 var params
= swiper
.params
;
29306 var slides
= swiper
.slides
;
29307 var slidesGrid
= swiper
.slidesGrid
;
29308 var swiperSize
= swiper
.size
;
29309 var activeIndex
= swiper
.activeIndex
;
29311 if (params
.centeredSlides
) {
29312 var slideSize
= slides
[activeIndex
].swiperSlideSize
;
29314 for (var i
= activeIndex
+ 1; i
< slides
.length
; i
+= 1) {
29315 if (slides
[i
] && !breakLoop
) {
29316 slideSize
+= slides
[i
].swiperSlideSize
;
29318 if (slideSize
> swiperSize
) { breakLoop
= true; }
29321 for (var i
$1 = activeIndex
- 1; i
$1 >= 0; i
$1 -= 1) {
29322 if (slides
[i
$1] && !breakLoop
) {
29323 slideSize
+= slides
[i
$1].swiperSlideSize
;
29325 if (slideSize
> swiperSize
) { breakLoop
= true; }
29329 for (var i
$2 = activeIndex
+ 1; i
$2 < slides
.length
; i
$2 += 1) {
29330 if (slidesGrid
[i
$2] - slidesGrid
[activeIndex
] < swiperSize
) {
29338 Swiper
.prototype.update
= function update
$$1 () {
29340 if (!swiper
|| swiper
.destroyed
) { return; }
29341 var snapGrid
= swiper
.snapGrid
;
29342 var params
= swiper
.params
;
29344 if (params
.breakpoints
) {
29345 swiper
.setBreakpoint();
29347 swiper
.updateSize();
29348 swiper
.updateSlides();
29349 swiper
.updateProgress();
29350 swiper
.updateSlidesClasses();
29352 function setTranslate() {
29353 var translateValue
= swiper
.rtlTranslate
? swiper
.translate
* -1 : swiper
.translate
;
29354 var newTranslate
= Math
.min(Math
.max(translateValue
, swiper
.maxTranslate()), swiper
.minTranslate());
29355 swiper
.setTranslate(newTranslate
);
29356 swiper
.updateActiveIndex();
29357 swiper
.updateSlidesClasses();
29360 if (swiper
.params
.freeMode
) {
29362 if (swiper
.params
.autoHeight
) {
29363 swiper
.updateAutoHeight();
29366 if ((swiper
.params
.slidesPerView
=== 'auto' || swiper
.params
.slidesPerView
> 1) && swiper
.isEnd
&& !swiper
.params
.centeredSlides
) {
29367 translated
= swiper
.slideTo(swiper
.slides
.length
- 1, 0, false, true);
29369 translated
= swiper
.slideTo(swiper
.activeIndex
, 0, false, true);
29375 if (params
.watchOverflow
&& snapGrid
!== swiper
.snapGrid
) {
29376 swiper
.checkOverflow();
29378 swiper
.emit('update');
29381 Swiper
.prototype.init
= function init () {
29383 if (swiper
.initialized
) { return; }
29385 swiper
.emit('beforeInit');
29388 if (swiper
.params
.breakpoints
) {
29389 swiper
.setBreakpoint();
29393 swiper
.addClasses();
29396 if (swiper
.params
.loop
) {
29397 swiper
.loopCreate();
29401 swiper
.updateSize();
29404 swiper
.updateSlides();
29406 if (swiper
.params
.watchOverflow
) {
29407 swiper
.checkOverflow();
29411 if (swiper
.params
.grabCursor
) {
29412 swiper
.setGrabCursor();
29415 if (swiper
.params
.preloadImages
) {
29416 swiper
.preloadImages();
29419 // Slide To Initial Slide
29420 if (swiper
.params
.loop
) {
29421 swiper
.slideTo(swiper
.params
.initialSlide
+ swiper
.loopedSlides
, 0, swiper
.params
.runCallbacksOnInit
);
29423 swiper
.slideTo(swiper
.params
.initialSlide
, 0, swiper
.params
.runCallbacksOnInit
);
29427 swiper
.attachEvents();
29430 swiper
.initialized
= true;
29433 swiper
.emit('init');
29436 Swiper
.prototype.destroy
= function destroy (deleteInstance
, cleanStyles
) {
29437 if ( deleteInstance
=== void 0 ) deleteInstance
= true;
29438 if ( cleanStyles
=== void 0 ) cleanStyles
= true;
29441 var params
= swiper
.params
;
29442 var $el
= swiper
.$el
;
29443 var $wrapperEl
= swiper
.$wrapperEl
;
29444 var slides
= swiper
.slides
;
29446 if (typeof swiper
.params
=== 'undefined' || swiper
.destroyed
) {
29450 swiper
.emit('beforeDestroy');
29453 swiper
.initialized
= false;
29456 swiper
.detachEvents();
29460 swiper
.loopDestroy();
29465 swiper
.removeClasses();
29466 $el
.removeAttr('style');
29467 $wrapperEl
.removeAttr('style');
29468 if (slides
&& slides
.length
) {
29471 params
.slideVisibleClass
,
29472 params
.slideActiveClass
,
29473 params
.slideNextClass
,
29474 params
.slidePrevClass
].join(' '))
29475 .removeAttr('style')
29476 .removeAttr('data-swiper-slide-index')
29477 .removeAttr('data-swiper-column')
29478 .removeAttr('data-swiper-row');
29482 swiper
.emit('destroy');
29484 // Detach emitter events
29485 Object
.keys(swiper
.eventsListeners
).forEach(function (eventName
) {
29486 swiper
.off(eventName
);
29489 if (deleteInstance
!== false) {
29490 swiper
.$el
[0].swiper
= null;
29491 swiper
.$el
.data('swiper', null);
29492 Utils
.deleteProps(swiper
);
29494 swiper
.destroyed
= true;
29499 Swiper
.extendDefaults
= function extendDefaults (newDefaults
) {
29500 Utils
.extend(extendedDefaults
, newDefaults
);
29503 staticAccessors
.extendedDefaults
.get = function () {
29504 return extendedDefaults
;
29507 staticAccessors
.defaults
.get = function () {
29511 staticAccessors
.Class
.get = function () {
29512 return SwiperClass
;
29515 staticAccessors
.$.get = function () {
29519 Object
.defineProperties( Swiper
, staticAccessors
);
29522 }(Framework7Class
));
29556 create
: function create() {
29558 Utils
.extend(swiper
, {
29560 resizeHandler
: function resizeHandler() {
29561 if (!swiper
|| swiper
.destroyed
|| !swiper
.initialized
) { return; }
29562 swiper
.emit('beforeResize');
29563 swiper
.emit('resize');
29565 orientationChangeHandler
: function orientationChangeHandler() {
29566 if (!swiper
|| swiper
.destroyed
|| !swiper
.initialized
) { return; }
29567 swiper
.emit('orientationchange');
29573 init
: function init() {
29576 win
.addEventListener('resize', swiper
.resize
.resizeHandler
);
29578 // Emit orientationchange
29579 win
.addEventListener('orientationchange', swiper
.resize
.orientationChangeHandler
);
29581 destroy
: function destroy() {
29583 win
.removeEventListener('resize', swiper
.resize
.resizeHandler
);
29584 win
.removeEventListener('orientationchange', swiper
.resize
.orientationChangeHandler
);
29590 func
: win
.MutationObserver
|| win
.WebkitMutationObserver
,
29591 attach
: function attach(target
, options
) {
29592 if ( options
=== void 0 ) options
= {};
29596 var ObserverFunc
= Observer
.func
;
29597 var observer
= new ObserverFunc(function (mutations
) {
29598 // The observerUpdate event should only be triggered
29599 // once despite the number of mutations. Additional
29600 // triggers are redundant and are very costly
29601 if (mutations
.length
=== 1) {
29602 swiper
.emit('observerUpdate', mutations
[0]);
29605 var observerUpdate
= function observerUpdate() {
29606 swiper
.emit('observerUpdate', mutations
[0]);
29609 if (win
.requestAnimationFrame
) {
29610 win
.requestAnimationFrame(observerUpdate
);
29612 win
.setTimeout(observerUpdate
, 0);
29616 observer
.observe(target
, {
29617 attributes
: typeof options
.attributes
=== 'undefined' ? true : options
.attributes
,
29618 childList
: typeof options
.childList
=== 'undefined' ? true : options
.childList
,
29619 characterData
: typeof options
.characterData
=== 'undefined' ? true : options
.characterData
,
29622 swiper
.observer
.observers
.push(observer
);
29624 init
: function init() {
29626 if (!Support
.observer
|| !swiper
.params
.observer
) { return; }
29627 if (swiper
.params
.observeParents
) {
29628 var containerParents
= swiper
.$el
.parents();
29629 for (var i
= 0; i
< containerParents
.length
; i
+= 1) {
29630 swiper
.observer
.attach(containerParents
[i
]);
29633 // Observe container
29634 swiper
.observer
.attach(swiper
.$el
[0], { childList
: swiper
.params
.observeSlideChildren
});
29637 swiper
.observer
.attach(swiper
.$wrapperEl
[0], { attributes
: false });
29639 destroy
: function destroy() {
29641 swiper
.observer
.observers
.forEach(function (observer
) {
29642 observer
.disconnect();
29644 swiper
.observer
.observers
= [];
29652 observeParents
: false,
29653 observeSlideChildren
: false,
29655 create
: function create() {
29657 Utils
.extend(swiper
, {
29659 init
: Observer
.init
.bind(swiper
),
29660 attach
: Observer
.attach
.bind(swiper
),
29661 destroy
: Observer
.destroy
.bind(swiper
),
29667 init
: function init() {
29669 swiper
.observer
.init();
29671 destroy
: function destroy() {
29673 swiper
.observer
.destroy();
29679 update
: function update(force
) {
29681 var ref
= swiper
.params
;
29682 var slidesPerView
= ref
.slidesPerView
;
29683 var slidesPerGroup
= ref
.slidesPerGroup
;
29684 var centeredSlides
= ref
.centeredSlides
;
29685 var ref
$1 = swiper
.params
.virtual
;
29686 var addSlidesBefore
= ref
$1.addSlidesBefore
;
29687 var addSlidesAfter
= ref
$1.addSlidesAfter
;
29688 var ref
$2 = swiper
.virtual
;
29689 var previousFrom
= ref
$2.from;
29690 var previousTo
= ref
$2.to
;
29691 var slides
= ref
$2.slides
;
29692 var previousSlidesGrid
= ref
$2.slidesGrid
;
29693 var renderSlide
= ref
$2.renderSlide
;
29694 var previousOffset
= ref
$2.offset
;
29695 swiper
.updateActiveIndex();
29696 var activeIndex
= swiper
.activeIndex
|| 0;
29699 if (swiper
.rtlTranslate
) { offsetProp
= 'right'; }
29700 else { offsetProp
= swiper
.isHorizontal() ? 'left' : 'top'; }
29704 if (centeredSlides
) {
29705 slidesAfter
= Math
.floor(slidesPerView
/ 2) + slidesPerGroup
+ addSlidesBefore
;
29706 slidesBefore
= Math
.floor(slidesPerView
/ 2) + slidesPerGroup
+ addSlidesAfter
;
29708 slidesAfter
= slidesPerView
+ (slidesPerGroup
- 1) + addSlidesBefore
;
29709 slidesBefore
= slidesPerGroup
+ addSlidesAfter
;
29711 var from = Math
.max((activeIndex
|| 0) - slidesBefore
, 0);
29712 var to
= Math
.min((activeIndex
|| 0) + slidesAfter
, slides
.length
- 1);
29713 var offset
= (swiper
.slidesGrid
[from] || 0) - (swiper
.slidesGrid
[0] || 0);
29715 Utils
.extend(swiper
.virtual
, {
29719 slidesGrid
: swiper
.slidesGrid
,
29722 function onRendered() {
29723 swiper
.updateSlides();
29724 swiper
.updateProgress();
29725 swiper
.updateSlidesClasses();
29726 if (swiper
.lazy
&& swiper
.params
.lazy
.enabled
) {
29727 swiper
.lazy
.load();
29731 if (previousFrom
=== from && previousTo
=== to
&& !force
) {
29732 if (swiper
.slidesGrid
!== previousSlidesGrid
&& offset
!== previousOffset
) {
29733 swiper
.slides
.css(offsetProp
, (offset
+ "px"));
29735 swiper
.updateProgress();
29738 if (swiper
.params
.virtual
.renderExternal
) {
29739 swiper
.params
.virtual
.renderExternal
.call(swiper
, {
29743 slides
: (function getSlides() {
29744 var slidesToRender
= [];
29745 for (var i
= from; i
<= to
; i
+= 1) {
29746 slidesToRender
.push(slides
[i
]);
29748 return slidesToRender
;
29754 var prependIndexes
= [];
29755 var appendIndexes
= [];
29757 swiper
.$wrapperEl
.find(("." + (swiper
.params
.slideClass
))).remove();
29759 for (var i
= previousFrom
; i
<= previousTo
; i
+= 1) {
29760 if (i
< from || i
> to
) {
29761 swiper
.$wrapperEl
.find(("." + (swiper
.params
.slideClass
) + "[data-swiper-slide-index=\"" + i
+ "\"]")).remove();
29765 for (var i
$1 = 0; i
$1 < slides
.length
; i
$1 += 1) {
29766 if (i
$1 >= from && i
$1 <= to
) {
29767 if (typeof previousTo
=== 'undefined' || force
) {
29768 appendIndexes
.push(i
$1);
29770 if (i
$1 > previousTo
) { appendIndexes
.push(i
$1); }
29771 if (i
$1 < previousFrom
) { prependIndexes
.push(i
$1); }
29775 appendIndexes
.forEach(function (index
) {
29776 swiper
.$wrapperEl
.append(renderSlide(slides
[index
], index
));
29778 prependIndexes
.sort(function (a
, b
) { return b
- a
; }).forEach(function (index
) {
29779 swiper
.$wrapperEl
.prepend(renderSlide(slides
[index
], index
));
29781 swiper
.$wrapperEl
.children('.swiper-slide').css(offsetProp
, (offset
+ "px"));
29784 renderSlide
: function renderSlide(slide
, index
) {
29786 var params
= swiper
.params
.virtual
;
29787 if (params
.cache
&& swiper
.virtual
.cache
[index
]) {
29788 return swiper
.virtual
.cache
[index
];
29790 var $slideEl
= params
.renderSlide
29791 ? $(params
.renderSlide
.call(swiper
, slide
, index
))
29792 : $(("<div class=\"" + (swiper
.params
.slideClass
) + "\" data-swiper-slide-index=\"" + index
+ "\">" + slide
+ "</div>"));
29793 if (!$slideEl
.attr('data-swiper-slide-index')) { $slideEl
.attr('data-swiper-slide-index', index
); }
29794 if (params
.cache
) { swiper
.virtual
.cache
[index
] = $slideEl
; }
29797 appendSlide
: function appendSlide(slide
) {
29799 swiper
.virtual
.slides
.push(slide
);
29800 swiper
.virtual
.update(true);
29802 prependSlide
: function prependSlide(slide
) {
29804 swiper
.virtual
.slides
.unshift(slide
);
29805 if (swiper
.params
.virtual
.cache
) {
29806 var cache
= swiper
.virtual
.cache
;
29808 Object
.keys(cache
).forEach(function (cachedIndex
) {
29809 newCache
[cachedIndex
+ 1] = cache
[cachedIndex
];
29811 swiper
.virtual
.cache
= newCache
;
29813 swiper
.virtual
.update(true);
29814 swiper
.slideNext(0);
29826 renderExternal
: null,
29827 addSlidesBefore
: 0,
29831 create
: function create() {
29833 Utils
.extend(swiper
, {
29835 update
: Virtual
.update
.bind(swiper
),
29836 appendSlide
: Virtual
.appendSlide
.bind(swiper
),
29837 prependSlide
: Virtual
.prependSlide
.bind(swiper
),
29838 renderSlide
: Virtual
.renderSlide
.bind(swiper
),
29839 slides
: swiper
.params
.virtual
.slides
,
29845 beforeInit
: function beforeInit() {
29847 if (!swiper
.params
.virtual
.enabled
) { return; }
29848 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "virtual"));
29849 var overwriteParams
= {
29850 watchSlidesProgress
: true,
29852 Utils
.extend(swiper
.params
, overwriteParams
);
29853 Utils
.extend(swiper
.originalParams
, overwriteParams
);
29855 if (!swiper
.params
.initialSlide
) {
29856 swiper
.virtual
.update();
29859 setTranslate
: function setTranslate() {
29861 if (!swiper
.params
.virtual
.enabled
) { return; }
29862 swiper
.virtual
.update();
29868 update
: function update() {
29869 // Update Navigation Buttons
29871 var params
= swiper
.params
.navigation
;
29873 if (swiper
.params
.loop
) { return; }
29874 var ref
= swiper
.navigation
;
29875 var $nextEl
= ref
.$nextEl
;
29876 var $prevEl
= ref
.$prevEl
;
29878 if ($prevEl
&& $prevEl
.length
> 0) {
29879 if (swiper
.isBeginning
) {
29880 $prevEl
.addClass(params
.disabledClass
);
29882 $prevEl
.removeClass(params
.disabledClass
);
29884 $prevEl
[swiper
.params
.watchOverflow
&& swiper
.isLocked
? 'addClass' : 'removeClass'](params
.lockClass
);
29886 if ($nextEl
&& $nextEl
.length
> 0) {
29887 if (swiper
.isEnd
) {
29888 $nextEl
.addClass(params
.disabledClass
);
29890 $nextEl
.removeClass(params
.disabledClass
);
29892 $nextEl
[swiper
.params
.watchOverflow
&& swiper
.isLocked
? 'addClass' : 'removeClass'](params
.lockClass
);
29895 onPrevClick
: function onPrevClick(e
) {
29897 e
.preventDefault();
29898 if (swiper
.isBeginning
&& !swiper
.params
.loop
) { return; }
29899 swiper
.slidePrev();
29901 onNextClick
: function onNextClick(e
) {
29903 e
.preventDefault();
29904 if (swiper
.isEnd
&& !swiper
.params
.loop
) { return; }
29905 swiper
.slideNext();
29907 init
: function init() {
29909 var params
= swiper
.params
.navigation
;
29910 if (!(params
.nextEl
|| params
.prevEl
)) { return; }
29914 if (params
.nextEl
) {
29915 $nextEl
= $(params
.nextEl
);
29917 swiper
.params
.uniqueNavElements
29918 && typeof params
.nextEl
=== 'string'
29919 && $nextEl
.length
> 1
29920 && swiper
.$el
.find(params
.nextEl
).length
=== 1
29922 $nextEl
= swiper
.$el
.find(params
.nextEl
);
29925 if (params
.prevEl
) {
29926 $prevEl
= $(params
.prevEl
);
29928 swiper
.params
.uniqueNavElements
29929 && typeof params
.prevEl
=== 'string'
29930 && $prevEl
.length
> 1
29931 && swiper
.$el
.find(params
.prevEl
).length
=== 1
29933 $prevEl
= swiper
.$el
.find(params
.prevEl
);
29937 if ($nextEl
&& $nextEl
.length
> 0) {
29938 $nextEl
.on('click', swiper
.navigation
.onNextClick
);
29940 if ($prevEl
&& $prevEl
.length
> 0) {
29941 $prevEl
.on('click', swiper
.navigation
.onPrevClick
);
29944 Utils
.extend(swiper
.navigation
, {
29946 nextEl
: $nextEl
&& $nextEl
[0],
29948 prevEl
: $prevEl
&& $prevEl
[0],
29951 destroy
: function destroy() {
29953 var ref
= swiper
.navigation
;
29954 var $nextEl
= ref
.$nextEl
;
29955 var $prevEl
= ref
.$prevEl
;
29956 if ($nextEl
&& $nextEl
.length
) {
29957 $nextEl
.off('click', swiper
.navigation
.onNextClick
);
29958 $nextEl
.removeClass(swiper
.params
.navigation
.disabledClass
);
29960 if ($prevEl
&& $prevEl
.length
) {
29961 $prevEl
.off('click', swiper
.navigation
.onPrevClick
);
29962 $prevEl
.removeClass(swiper
.params
.navigation
.disabledClass
);
29967 var Navigation
$1 = {
29968 name
: 'navigation',
29974 hideOnClick
: false,
29975 disabledClass
: 'swiper-button-disabled',
29976 hiddenClass
: 'swiper-button-hidden',
29977 lockClass
: 'swiper-button-lock',
29980 create
: function create() {
29982 Utils
.extend(swiper
, {
29984 init
: Navigation
.init
.bind(swiper
),
29985 update
: Navigation
.update
.bind(swiper
),
29986 destroy
: Navigation
.destroy
.bind(swiper
),
29987 onNextClick
: Navigation
.onNextClick
.bind(swiper
),
29988 onPrevClick
: Navigation
.onPrevClick
.bind(swiper
),
29993 init
: function init() {
29995 swiper
.navigation
.init();
29996 swiper
.navigation
.update();
29998 toEdge
: function toEdge() {
30000 swiper
.navigation
.update();
30002 fromEdge
: function fromEdge() {
30004 swiper
.navigation
.update();
30006 destroy
: function destroy() {
30008 swiper
.navigation
.destroy();
30010 click
: function click(e
) {
30012 var ref
= swiper
.navigation
;
30013 var $nextEl
= ref
.$nextEl
;
30014 var $prevEl
= ref
.$prevEl
;
30016 swiper
.params
.navigation
.hideOnClick
30017 && !$(e
.target
).is($prevEl
)
30018 && !$(e
.target
).is($nextEl
)
30020 if ($nextEl
) { $nextEl
.toggleClass(swiper
.params
.navigation
.hiddenClass
); }
30021 if ($prevEl
) { $prevEl
.toggleClass(swiper
.params
.navigation
.hiddenClass
); }
30028 update
: function update() {
30029 // Render || Update Pagination bullets/items
30031 var rtl
= swiper
.rtl
;
30032 var params
= swiper
.params
.pagination
;
30033 if (!params
.el
|| !swiper
.pagination
.el
|| !swiper
.pagination
.$el
|| swiper
.pagination
.$el
.length
=== 0) { return; }
30034 var slidesLength
= swiper
.virtual
&& swiper
.params
.virtual
.enabled
? swiper
.virtual
.slides
.length
: swiper
.slides
.length
;
30035 var $el
= swiper
.pagination
.$el
;
30038 var total
= swiper
.params
.loop
? Math
.ceil((slidesLength
- (swiper
.loopedSlides
* 2)) / swiper
.params
.slidesPerGroup
) : swiper
.snapGrid
.length
;
30039 if (swiper
.params
.loop
) {
30040 current
= Math
.ceil((swiper
.activeIndex
- swiper
.loopedSlides
) / swiper
.params
.slidesPerGroup
);
30041 if (current
> slidesLength
- 1 - (swiper
.loopedSlides
* 2)) {
30042 current
-= (slidesLength
- (swiper
.loopedSlides
* 2));
30044 if (current
> total
- 1) { current
-= total
; }
30045 if (current
< 0 && swiper
.params
.paginationType
!== 'bullets') { current
= total
+ current
; }
30046 } else if (typeof swiper
.snapIndex
!== 'undefined') {
30047 current
= swiper
.snapIndex
;
30049 current
= swiper
.activeIndex
|| 0;
30052 if (params
.type
=== 'bullets' && swiper
.pagination
.bullets
&& swiper
.pagination
.bullets
.length
> 0) {
30053 var bullets
= swiper
.pagination
.bullets
;
30057 if (params
.dynamicBullets
) {
30058 swiper
.pagination
.bulletSize
= bullets
.eq(0)[swiper
.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
30059 $el
.css(swiper
.isHorizontal() ? 'width' : 'height', ((swiper
.pagination
.bulletSize
* (params
.dynamicMainBullets
+ 4)) + "px"));
30060 if (params
.dynamicMainBullets
> 1 && swiper
.previousIndex
!== undefined) {
30061 swiper
.pagination
.dynamicBulletIndex
+= (current
- swiper
.previousIndex
);
30062 if (swiper
.pagination
.dynamicBulletIndex
> (params
.dynamicMainBullets
- 1)) {
30063 swiper
.pagination
.dynamicBulletIndex
= params
.dynamicMainBullets
- 1;
30064 } else if (swiper
.pagination
.dynamicBulletIndex
< 0) {
30065 swiper
.pagination
.dynamicBulletIndex
= 0;
30068 firstIndex
= current
- swiper
.pagination
.dynamicBulletIndex
;
30069 lastIndex
= firstIndex
+ (Math
.min(bullets
.length
, params
.dynamicMainBullets
) - 1);
30070 midIndex
= (lastIndex
+ firstIndex
) / 2;
30072 bullets
.removeClass(((params
.bulletActiveClass
) + " " + (params
.bulletActiveClass
) + "-next " + (params
.bulletActiveClass
) + "-next-next " + (params
.bulletActiveClass
) + "-prev " + (params
.bulletActiveClass
) + "-prev-prev " + (params
.bulletActiveClass
) + "-main"));
30073 if ($el
.length
> 1) {
30074 bullets
.each(function (index
, bullet
) {
30075 var $bullet
= $(bullet
);
30076 var bulletIndex
= $bullet
.index();
30077 if (bulletIndex
=== current
) {
30078 $bullet
.addClass(params
.bulletActiveClass
);
30080 if (params
.dynamicBullets
) {
30081 if (bulletIndex
>= firstIndex
&& bulletIndex
<= lastIndex
) {
30082 $bullet
.addClass(((params
.bulletActiveClass
) + "-main"));
30084 if (bulletIndex
=== firstIndex
) {
30087 .addClass(((params
.bulletActiveClass
) + "-prev"))
30089 .addClass(((params
.bulletActiveClass
) + "-prev-prev"));
30091 if (bulletIndex
=== lastIndex
) {
30094 .addClass(((params
.bulletActiveClass
) + "-next"))
30096 .addClass(((params
.bulletActiveClass
) + "-next-next"));
30101 var $bullet
= bullets
.eq(current
);
30102 $bullet
.addClass(params
.bulletActiveClass
);
30103 if (params
.dynamicBullets
) {
30104 var $firstDisplayedBullet
= bullets
.eq(firstIndex
);
30105 var $lastDisplayedBullet
= bullets
.eq(lastIndex
);
30106 for (var i
= firstIndex
; i
<= lastIndex
; i
+= 1) {
30107 bullets
.eq(i
).addClass(((params
.bulletActiveClass
) + "-main"));
30109 $firstDisplayedBullet
30111 .addClass(((params
.bulletActiveClass
) + "-prev"))
30113 .addClass(((params
.bulletActiveClass
) + "-prev-prev"));
30114 $lastDisplayedBullet
30116 .addClass(((params
.bulletActiveClass
) + "-next"))
30118 .addClass(((params
.bulletActiveClass
) + "-next-next"));
30121 if (params
.dynamicBullets
) {
30122 var dynamicBulletsLength
= Math
.min(bullets
.length
, params
.dynamicMainBullets
+ 4);
30123 var bulletsOffset
= (((swiper
.pagination
.bulletSize
* dynamicBulletsLength
) - (swiper
.pagination
.bulletSize
)) / 2) - (midIndex
* swiper
.pagination
.bulletSize
);
30124 var offsetProp
= rtl
? 'right' : 'left';
30125 bullets
.css(swiper
.isHorizontal() ? offsetProp
: 'top', (bulletsOffset
+ "px"));
30128 if (params
.type
=== 'fraction') {
30129 $el
.find(("." + (params
.currentClass
))).text(params
.formatFractionCurrent(current
+ 1));
30130 $el
.find(("." + (params
.totalClass
))).text(params
.formatFractionTotal(total
));
30132 if (params
.type
=== 'progressbar') {
30133 var progressbarDirection
;
30134 if (params
.progressbarOpposite
) {
30135 progressbarDirection
= swiper
.isHorizontal() ? 'vertical' : 'horizontal';
30137 progressbarDirection
= swiper
.isHorizontal() ? 'horizontal' : 'vertical';
30139 var scale
= (current
+ 1) / total
;
30142 if (progressbarDirection
=== 'horizontal') {
30147 $el
.find(("." + (params
.progressbarFillClass
))).transform(("translate3d(0,0,0) scaleX(" + scaleX
+ ") scaleY(" + scaleY
+ ")")).transition(swiper
.params
.speed
);
30149 if (params
.type
=== 'custom' && params
.renderCustom
) {
30150 $el
.html(params
.renderCustom(swiper
, current
+ 1, total
));
30151 swiper
.emit('paginationRender', swiper
, $el
[0]);
30153 swiper
.emit('paginationUpdate', swiper
, $el
[0]);
30155 $el
[swiper
.params
.watchOverflow
&& swiper
.isLocked
? 'addClass' : 'removeClass'](params
.lockClass
);
30157 render
: function render() {
30158 // Render Container
30160 var params
= swiper
.params
.pagination
;
30161 if (!params
.el
|| !swiper
.pagination
.el
|| !swiper
.pagination
.$el
|| swiper
.pagination
.$el
.length
=== 0) { return; }
30162 var slidesLength
= swiper
.virtual
&& swiper
.params
.virtual
.enabled
? swiper
.virtual
.slides
.length
: swiper
.slides
.length
;
30164 var $el
= swiper
.pagination
.$el
;
30165 var paginationHTML
= '';
30166 if (params
.type
=== 'bullets') {
30167 var numberOfBullets
= swiper
.params
.loop
? Math
.ceil((slidesLength
- (swiper
.loopedSlides
* 2)) / swiper
.params
.slidesPerGroup
) : swiper
.snapGrid
.length
;
30168 for (var i
= 0; i
< numberOfBullets
; i
+= 1) {
30169 if (params
.renderBullet
) {
30170 paginationHTML
+= params
.renderBullet
.call(swiper
, i
, params
.bulletClass
);
30172 paginationHTML
+= "<" + (params
.bulletElement
) + " class=\"" + (params
.bulletClass
) + "\"></" + (params
.bulletElement
) + ">";
30175 $el
.html(paginationHTML
);
30176 swiper
.pagination
.bullets
= $el
.find(("." + (params
.bulletClass
)));
30178 if (params
.type
=== 'fraction') {
30179 if (params
.renderFraction
) {
30180 paginationHTML
= params
.renderFraction
.call(swiper
, params
.currentClass
, params
.totalClass
);
30182 paginationHTML
= "<span class=\"" + (params
.currentClass
) + "\"></span>"
30184 + "<span class=\"" + (params
.totalClass
) + "\"></span>";
30186 $el
.html(paginationHTML
);
30188 if (params
.type
=== 'progressbar') {
30189 if (params
.renderProgressbar
) {
30190 paginationHTML
= params
.renderProgressbar
.call(swiper
, params
.progressbarFillClass
);
30192 paginationHTML
= "<span class=\"" + (params
.progressbarFillClass
) + "\"></span>";
30194 $el
.html(paginationHTML
);
30196 if (params
.type
!== 'custom') {
30197 swiper
.emit('paginationRender', swiper
.pagination
.$el
[0]);
30200 init
: function init() {
30202 var params
= swiper
.params
.pagination
;
30203 if (!params
.el
) { return; }
30205 var $el
= $(params
.el
);
30206 if ($el
.length
=== 0) { return; }
30209 swiper
.params
.uniqueNavElements
30210 && typeof params
.el
=== 'string'
30212 && swiper
.$el
.find(params
.el
).length
=== 1
30214 $el
= swiper
.$el
.find(params
.el
);
30217 if (params
.type
=== 'bullets' && params
.clickable
) {
30218 $el
.addClass(params
.clickableClass
);
30221 $el
.addClass(params
.modifierClass
+ params
.type
);
30223 if (params
.type
=== 'bullets' && params
.dynamicBullets
) {
30224 $el
.addClass(("" + (params
.modifierClass
) + (params
.type
) + "-dynamic"));
30225 swiper
.pagination
.dynamicBulletIndex
= 0;
30226 if (params
.dynamicMainBullets
< 1) {
30227 params
.dynamicMainBullets
= 1;
30230 if (params
.type
=== 'progressbar' && params
.progressbarOpposite
) {
30231 $el
.addClass(params
.progressbarOppositeClass
);
30234 if (params
.clickable
) {
30235 $el
.on('click', ("." + (params
.bulletClass
)), function onClick(e
) {
30236 e
.preventDefault();
30237 var index
= $(this).index() * swiper
.params
.slidesPerGroup
;
30238 if (swiper
.params
.loop
) { index
+= swiper
.loopedSlides
; }
30239 swiper
.slideTo(index
);
30243 Utils
.extend(swiper
.pagination
, {
30248 destroy
: function destroy() {
30250 var params
= swiper
.params
.pagination
;
30251 if (!params
.el
|| !swiper
.pagination
.el
|| !swiper
.pagination
.$el
|| swiper
.pagination
.$el
.length
=== 0) { return; }
30252 var $el
= swiper
.pagination
.$el
;
30254 $el
.removeClass(params
.hiddenClass
);
30255 $el
.removeClass(params
.modifierClass
+ params
.type
);
30256 if (swiper
.pagination
.bullets
) { swiper
.pagination
.bullets
.removeClass(params
.bulletActiveClass
); }
30257 if (params
.clickable
) {
30258 $el
.off('click', ("." + (params
.bulletClass
)));
30263 var Pagination
$1 = {
30264 name
: 'pagination',
30268 bulletElement
: 'span',
30270 hideOnClick
: false,
30271 renderBullet
: null,
30272 renderProgressbar
: null,
30273 renderFraction
: null,
30274 renderCustom
: null,
30275 progressbarOpposite
: false,
30276 type
: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
30277 dynamicBullets
: false,
30278 dynamicMainBullets
: 1,
30279 formatFractionCurrent: function (number
) { return number
; },
30280 formatFractionTotal: function (number
) { return number
; },
30281 bulletClass
: 'swiper-pagination-bullet',
30282 bulletActiveClass
: 'swiper-pagination-bullet-active',
30283 modifierClass
: 'swiper-pagination-', // NEW
30284 currentClass
: 'swiper-pagination-current',
30285 totalClass
: 'swiper-pagination-total',
30286 hiddenClass
: 'swiper-pagination-hidden',
30287 progressbarFillClass
: 'swiper-pagination-progressbar-fill',
30288 progressbarOppositeClass
: 'swiper-pagination-progressbar-opposite',
30289 clickableClass
: 'swiper-pagination-clickable', // NEW
30290 lockClass
: 'swiper-pagination-lock',
30293 create
: function create() {
30295 Utils
.extend(swiper
, {
30297 init
: Pagination
.init
.bind(swiper
),
30298 render
: Pagination
.render
.bind(swiper
),
30299 update
: Pagination
.update
.bind(swiper
),
30300 destroy
: Pagination
.destroy
.bind(swiper
),
30301 dynamicBulletIndex
: 0,
30306 init
: function init() {
30308 swiper
.pagination
.init();
30309 swiper
.pagination
.render();
30310 swiper
.pagination
.update();
30312 activeIndexChange
: function activeIndexChange() {
30314 if (swiper
.params
.loop
) {
30315 swiper
.pagination
.update();
30316 } else if (typeof swiper
.snapIndex
=== 'undefined') {
30317 swiper
.pagination
.update();
30320 snapIndexChange
: function snapIndexChange() {
30322 if (!swiper
.params
.loop
) {
30323 swiper
.pagination
.update();
30326 slidesLengthChange
: function slidesLengthChange() {
30328 if (swiper
.params
.loop
) {
30329 swiper
.pagination
.render();
30330 swiper
.pagination
.update();
30333 snapGridLengthChange
: function snapGridLengthChange() {
30335 if (!swiper
.params
.loop
) {
30336 swiper
.pagination
.render();
30337 swiper
.pagination
.update();
30340 destroy
: function destroy() {
30342 swiper
.pagination
.destroy();
30344 click
: function click(e
) {
30347 swiper
.params
.pagination
.el
30348 && swiper
.params
.pagination
.hideOnClick
30349 && swiper
.pagination
.$el
.length
> 0
30350 && !$(e
.target
).hasClass(swiper
.params
.pagination
.bulletClass
)
30352 swiper
.pagination
.$el
.toggleClass(swiper
.params
.pagination
.hiddenClass
);
30359 setTranslate
: function setTranslate() {
30361 if (!swiper
.params
.scrollbar
.el
|| !swiper
.scrollbar
.el
) { return; }
30362 var scrollbar
= swiper
.scrollbar
;
30363 var rtl
= swiper
.rtlTranslate
;
30364 var progress
= swiper
.progress
;
30365 var dragSize
= scrollbar
.dragSize
;
30366 var trackSize
= scrollbar
.trackSize
;
30367 var $dragEl
= scrollbar
.$dragEl
;
30368 var $el
= scrollbar
.$el
;
30369 var params
= swiper
.params
.scrollbar
;
30371 var newSize
= dragSize
;
30372 var newPos
= (trackSize
- dragSize
) * progress
;
30376 newSize
= dragSize
- newPos
;
30378 } else if (-newPos
+ dragSize
> trackSize
) {
30379 newSize
= trackSize
+ newPos
;
30381 } else if (newPos
< 0) {
30382 newSize
= dragSize
+ newPos
;
30384 } else if (newPos
+ dragSize
> trackSize
) {
30385 newSize
= trackSize
- newPos
;
30387 if (swiper
.isHorizontal()) {
30388 if (Support
.transforms3d
) {
30389 $dragEl
.transform(("translate3d(" + newPos
+ "px, 0, 0)"));
30391 $dragEl
.transform(("translateX(" + newPos
+ "px)"));
30393 $dragEl
[0].style
.width
= newSize
+ "px";
30395 if (Support
.transforms3d
) {
30396 $dragEl
.transform(("translate3d(0px, " + newPos
+ "px, 0)"));
30398 $dragEl
.transform(("translateY(" + newPos
+ "px)"));
30400 $dragEl
[0].style
.height
= newSize
+ "px";
30403 clearTimeout(swiper
.scrollbar
.timeout
);
30404 $el
[0].style
.opacity
= 1;
30405 swiper
.scrollbar
.timeout
= setTimeout(function () {
30406 $el
[0].style
.opacity
= 0;
30407 $el
.transition(400);
30411 setTransition
: function setTransition(duration
) {
30413 if (!swiper
.params
.scrollbar
.el
|| !swiper
.scrollbar
.el
) { return; }
30414 swiper
.scrollbar
.$dragEl
.transition(duration
);
30416 updateSize
: function updateSize() {
30418 if (!swiper
.params
.scrollbar
.el
|| !swiper
.scrollbar
.el
) { return; }
30420 var scrollbar
= swiper
.scrollbar
;
30421 var $dragEl
= scrollbar
.$dragEl
;
30422 var $el
= scrollbar
.$el
;
30424 $dragEl
[0].style
.width
= '';
30425 $dragEl
[0].style
.height
= '';
30426 var trackSize
= swiper
.isHorizontal() ? $el
[0].offsetWidth
: $el
[0].offsetHeight
;
30428 var divider
= swiper
.size
/ swiper
.virtualSize
;
30429 var moveDivider
= divider
* (trackSize
/ swiper
.size
);
30431 if (swiper
.params
.scrollbar
.dragSize
=== 'auto') {
30432 dragSize
= trackSize
* divider
;
30434 dragSize
= parseInt(swiper
.params
.scrollbar
.dragSize
, 10);
30437 if (swiper
.isHorizontal()) {
30438 $dragEl
[0].style
.width
= dragSize
+ "px";
30440 $dragEl
[0].style
.height
= dragSize
+ "px";
30443 if (divider
>= 1) {
30444 $el
[0].style
.display
= 'none';
30446 $el
[0].style
.display
= '';
30448 if (swiper
.params
.scrollbarHide
) {
30449 $el
[0].style
.opacity
= 0;
30451 Utils
.extend(scrollbar
, {
30452 trackSize
: trackSize
,
30454 moveDivider
: moveDivider
,
30455 dragSize
: dragSize
,
30457 scrollbar
.$el
[swiper
.params
.watchOverflow
&& swiper
.isLocked
? 'addClass' : 'removeClass'](swiper
.params
.scrollbar
.lockClass
);
30459 setDragPosition
: function setDragPosition(e
) {
30461 var scrollbar
= swiper
.scrollbar
;
30462 var rtl
= swiper
.rtlTranslate
;
30463 var $el
= scrollbar
.$el
;
30464 var dragSize
= scrollbar
.dragSize
;
30465 var trackSize
= scrollbar
.trackSize
;
30467 var pointerPosition
;
30468 if (swiper
.isHorizontal()) {
30469 pointerPosition
= ((e
.type
=== 'touchstart' || e
.type
=== 'touchmove') ? e
.targetTouches
[0].pageX
: e
.pageX
|| e
.clientX
);
30471 pointerPosition
= ((e
.type
=== 'touchstart' || e
.type
=== 'touchmove') ? e
.targetTouches
[0].pageY
: e
.pageY
|| e
.clientY
);
30474 positionRatio
= ((pointerPosition
) - $el
.offset()[swiper
.isHorizontal() ? 'left' : 'top'] - (dragSize
/ 2)) / (trackSize
- dragSize
);
30475 positionRatio
= Math
.max(Math
.min(positionRatio
, 1), 0);
30477 positionRatio
= 1 - positionRatio
;
30480 var position
= swiper
.minTranslate() + ((swiper
.maxTranslate() - swiper
.minTranslate()) * positionRatio
);
30482 swiper
.updateProgress(position
);
30483 swiper
.setTranslate(position
);
30484 swiper
.updateActiveIndex();
30485 swiper
.updateSlidesClasses();
30487 onDragStart
: function onDragStart(e
) {
30489 var params
= swiper
.params
.scrollbar
;
30490 var scrollbar
= swiper
.scrollbar
;
30491 var $wrapperEl
= swiper
.$wrapperEl
;
30492 var $el
= scrollbar
.$el
;
30493 var $dragEl
= scrollbar
.$dragEl
;
30494 swiper
.scrollbar
.isTouched
= true;
30495 e
.preventDefault();
30496 e
.stopPropagation();
30498 $wrapperEl
.transition(100);
30499 $dragEl
.transition(100);
30500 scrollbar
.setDragPosition(e
);
30502 clearTimeout(swiper
.scrollbar
.dragTimeout
);
30506 $el
.css('opacity', 1);
30508 swiper
.emit('scrollbarDragStart', e
);
30510 onDragMove
: function onDragMove(e
) {
30512 var scrollbar
= swiper
.scrollbar
;
30513 var $wrapperEl
= swiper
.$wrapperEl
;
30514 var $el
= scrollbar
.$el
;
30515 var $dragEl
= scrollbar
.$dragEl
;
30517 if (!swiper
.scrollbar
.isTouched
) { return; }
30518 if (e
.preventDefault
) { e
.preventDefault(); }
30519 else { e
.returnValue
= false; }
30520 scrollbar
.setDragPosition(e
);
30521 $wrapperEl
.transition(0);
30523 $dragEl
.transition(0);
30524 swiper
.emit('scrollbarDragMove', e
);
30526 onDragEnd
: function onDragEnd(e
) {
30529 var params
= swiper
.params
.scrollbar
;
30530 var scrollbar
= swiper
.scrollbar
;
30531 var $el
= scrollbar
.$el
;
30533 if (!swiper
.scrollbar
.isTouched
) { return; }
30534 swiper
.scrollbar
.isTouched
= false;
30536 clearTimeout(swiper
.scrollbar
.dragTimeout
);
30537 swiper
.scrollbar
.dragTimeout
= Utils
.nextTick(function () {
30538 $el
.css('opacity', 0);
30539 $el
.transition(400);
30542 swiper
.emit('scrollbarDragEnd', e
);
30543 if (params
.snapOnRelease
) {
30544 swiper
.slideToClosest();
30547 enableDraggable
: function enableDraggable() {
30549 if (!swiper
.params
.scrollbar
.el
) { return; }
30550 var scrollbar
= swiper
.scrollbar
;
30551 var touchEventsTouch
= swiper
.touchEventsTouch
;
30552 var touchEventsDesktop
= swiper
.touchEventsDesktop
;
30553 var params
= swiper
.params
;
30554 var $el
= scrollbar
.$el
;
30555 var target
= $el
[0];
30556 var activeListener
= Support
.passiveListener
&& params
.passiveListeners
? { passive
: false, capture
: false } : false;
30557 var passiveListener
= Support
.passiveListener
&& params
.passiveListeners
? { passive
: true, capture
: false } : false;
30558 if (!Support
.touch
) {
30559 target
.addEventListener(touchEventsDesktop
.start
, swiper
.scrollbar
.onDragStart
, activeListener
);
30560 doc
.addEventListener(touchEventsDesktop
.move, swiper
.scrollbar
.onDragMove
, activeListener
);
30561 doc
.addEventListener(touchEventsDesktop
.end
, swiper
.scrollbar
.onDragEnd
, passiveListener
);
30563 target
.addEventListener(touchEventsTouch
.start
, swiper
.scrollbar
.onDragStart
, activeListener
);
30564 target
.addEventListener(touchEventsTouch
.move, swiper
.scrollbar
.onDragMove
, activeListener
);
30565 target
.addEventListener(touchEventsTouch
.end
, swiper
.scrollbar
.onDragEnd
, passiveListener
);
30568 disableDraggable
: function disableDraggable() {
30570 if (!swiper
.params
.scrollbar
.el
) { return; }
30571 var scrollbar
= swiper
.scrollbar
;
30572 var touchEventsTouch
= swiper
.touchEventsTouch
;
30573 var touchEventsDesktop
= swiper
.touchEventsDesktop
;
30574 var params
= swiper
.params
;
30575 var $el
= scrollbar
.$el
;
30576 var target
= $el
[0];
30577 var activeListener
= Support
.passiveListener
&& params
.passiveListeners
? { passive
: false, capture
: false } : false;
30578 var passiveListener
= Support
.passiveListener
&& params
.passiveListeners
? { passive
: true, capture
: false } : false;
30579 if (!Support
.touch
) {
30580 target
.removeEventListener(touchEventsDesktop
.start
, swiper
.scrollbar
.onDragStart
, activeListener
);
30581 doc
.removeEventListener(touchEventsDesktop
.move, swiper
.scrollbar
.onDragMove
, activeListener
);
30582 doc
.removeEventListener(touchEventsDesktop
.end
, swiper
.scrollbar
.onDragEnd
, passiveListener
);
30584 target
.removeEventListener(touchEventsTouch
.start
, swiper
.scrollbar
.onDragStart
, activeListener
);
30585 target
.removeEventListener(touchEventsTouch
.move, swiper
.scrollbar
.onDragMove
, activeListener
);
30586 target
.removeEventListener(touchEventsTouch
.end
, swiper
.scrollbar
.onDragEnd
, passiveListener
);
30589 init
: function init() {
30591 if (!swiper
.params
.scrollbar
.el
) { return; }
30592 var scrollbar
= swiper
.scrollbar
;
30593 var $swiperEl
= swiper
.$el
;
30594 var params
= swiper
.params
.scrollbar
;
30596 var $el
= $(params
.el
);
30597 if (swiper
.params
.uniqueNavElements
&& typeof params
.el
=== 'string' && $el
.length
> 1 && $swiperEl
.find(params
.el
).length
=== 1) {
30598 $el
= $swiperEl
.find(params
.el
);
30601 var $dragEl
= $el
.find(("." + (swiper
.params
.scrollbar
.dragClass
)));
30602 if ($dragEl
.length
=== 0) {
30603 $dragEl
= $(("<div class=\"" + (swiper
.params
.scrollbar
.dragClass
) + "\"></div>"));
30604 $el
.append($dragEl
);
30607 Utils
.extend(scrollbar
, {
30611 dragEl
: $dragEl
[0],
30614 if (params
.draggable
) {
30615 scrollbar
.enableDraggable();
30618 destroy
: function destroy() {
30620 swiper
.scrollbar
.disableDraggable();
30624 var Scrollbar
$1 = {
30632 snapOnRelease
: true,
30633 lockClass
: 'swiper-scrollbar-lock',
30634 dragClass
: 'swiper-scrollbar-drag',
30637 create
: function create() {
30639 Utils
.extend(swiper
, {
30641 init
: Scrollbar
.init
.bind(swiper
),
30642 destroy
: Scrollbar
.destroy
.bind(swiper
),
30643 updateSize
: Scrollbar
.updateSize
.bind(swiper
),
30644 setTranslate
: Scrollbar
.setTranslate
.bind(swiper
),
30645 setTransition
: Scrollbar
.setTransition
.bind(swiper
),
30646 enableDraggable
: Scrollbar
.enableDraggable
.bind(swiper
),
30647 disableDraggable
: Scrollbar
.disableDraggable
.bind(swiper
),
30648 setDragPosition
: Scrollbar
.setDragPosition
.bind(swiper
),
30649 onDragStart
: Scrollbar
.onDragStart
.bind(swiper
),
30650 onDragMove
: Scrollbar
.onDragMove
.bind(swiper
),
30651 onDragEnd
: Scrollbar
.onDragEnd
.bind(swiper
),
30659 init
: function init() {
30661 swiper
.scrollbar
.init();
30662 swiper
.scrollbar
.updateSize();
30663 swiper
.scrollbar
.setTranslate();
30665 update
: function update() {
30667 swiper
.scrollbar
.updateSize();
30669 resize
: function resize() {
30671 swiper
.scrollbar
.updateSize();
30673 observerUpdate
: function observerUpdate() {
30675 swiper
.scrollbar
.updateSize();
30677 setTranslate
: function setTranslate() {
30679 swiper
.scrollbar
.setTranslate();
30681 setTransition
: function setTransition(duration
) {
30683 swiper
.scrollbar
.setTransition(duration
);
30685 destroy
: function destroy() {
30687 swiper
.scrollbar
.destroy();
30693 setTransform
: function setTransform(el
, progress
) {
30695 var rtl
= swiper
.rtl
;
30698 var rtlFactor
= rtl
? -1 : 1;
30700 var p
= $el
.attr('data-swiper-parallax') || '0';
30701 var x
= $el
.attr('data-swiper-parallax-x');
30702 var y
= $el
.attr('data-swiper-parallax-y');
30703 var scale
= $el
.attr('data-swiper-parallax-scale');
30704 var opacity
= $el
.attr('data-swiper-parallax-opacity');
30709 } else if (swiper
.isHorizontal()) {
30717 if ((x
).indexOf('%') >= 0) {
30718 x
= (parseInt(x
, 10) * progress
* rtlFactor
) + "%";
30720 x
= (x
* progress
* rtlFactor
) + "px";
30722 if ((y
).indexOf('%') >= 0) {
30723 y
= (parseInt(y
, 10) * progress
) + "%";
30725 y
= (y
* progress
) + "px";
30728 if (typeof opacity
!== 'undefined' && opacity
!== null) {
30729 var currentOpacity
= opacity
- ((opacity
- 1) * (1 - Math
.abs(progress
)));
30730 $el
[0].style
.opacity
= currentOpacity
;
30732 if (typeof scale
=== 'undefined' || scale
=== null) {
30733 $el
.transform(("translate3d(" + x
+ ", " + y
+ ", 0px)"));
30735 var currentScale
= scale
- ((scale
- 1) * (1 - Math
.abs(progress
)));
30736 $el
.transform(("translate3d(" + x
+ ", " + y
+ ", 0px) scale(" + currentScale
+ ")"));
30739 setTranslate
: function setTranslate() {
30741 var $el
= swiper
.$el
;
30742 var slides
= swiper
.slides
;
30743 var progress
= swiper
.progress
;
30744 var snapGrid
= swiper
.snapGrid
;
30745 $el
.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
30746 .each(function (index
, el
) {
30747 swiper
.parallax
.setTransform(el
, progress
);
30749 slides
.each(function (slideIndex
, slideEl
) {
30750 var slideProgress
= slideEl
.progress
;
30751 if (swiper
.params
.slidesPerGroup
> 1 && swiper
.params
.slidesPerView
!== 'auto') {
30752 slideProgress
+= Math
.ceil(slideIndex
/ 2) - (progress
* (snapGrid
.length
- 1));
30754 slideProgress
= Math
.min(Math
.max(slideProgress
, -1), 1);
30755 $(slideEl
).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
30756 .each(function (index
, el
) {
30757 swiper
.parallax
.setTransform(el
, slideProgress
);
30761 setTransition
: function setTransition(duration
) {
30762 if ( duration
=== void 0 ) duration
= this.params
.speed
;
30765 var $el
= swiper
.$el
;
30766 $el
.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]')
30767 .each(function (index
, parallaxEl
) {
30768 var $parallaxEl
= $(parallaxEl
);
30769 var parallaxDuration
= parseInt($parallaxEl
.attr('data-swiper-parallax-duration'), 10) || duration
;
30770 if (duration
=== 0) { parallaxDuration
= 0; }
30771 $parallaxEl
.transition(parallaxDuration
);
30783 create
: function create() {
30785 Utils
.extend(swiper
, {
30787 setTransform
: Parallax
.setTransform
.bind(swiper
),
30788 setTranslate
: Parallax
.setTranslate
.bind(swiper
),
30789 setTransition
: Parallax
.setTransition
.bind(swiper
),
30794 beforeInit
: function beforeInit() {
30796 if (!swiper
.params
.parallax
.enabled
) { return; }
30797 swiper
.params
.watchSlidesProgress
= true;
30798 swiper
.originalParams
.watchSlidesProgress
= true;
30800 init
: function init() {
30802 if (!swiper
.params
.parallax
) { return; }
30803 swiper
.parallax
.setTranslate();
30805 setTranslate
: function setTranslate() {
30807 if (!swiper
.params
.parallax
) { return; }
30808 swiper
.parallax
.setTranslate();
30810 setTransition
: function setTransition(duration
) {
30812 if (!swiper
.params
.parallax
) { return; }
30813 swiper
.parallax
.setTransition(duration
);
30819 // Calc Scale From Multi-touches
30820 getDistanceBetweenTouches
: function getDistanceBetweenTouches(e
) {
30821 if (e
.targetTouches
.length
< 2) { return 1; }
30822 var x1
= e
.targetTouches
[0].pageX
;
30823 var y1
= e
.targetTouches
[0].pageY
;
30824 var x2
= e
.targetTouches
[1].pageX
;
30825 var y2
= e
.targetTouches
[1].pageY
;
30826 var distance
= Math
.sqrt((Math
.pow( (x2
- x1
), 2 )) + (Math
.pow( (y2
- y1
), 2 )));
30830 onGestureStart
: function onGestureStart(e
) {
30832 var params
= swiper
.params
.zoom
;
30833 var zoom
= swiper
.zoom
;
30834 var gesture
= zoom
.gesture
;
30835 zoom
.fakeGestureTouched
= false;
30836 zoom
.fakeGestureMoved
= false;
30837 if (!Support
.gestures
) {
30838 if (e
.type
!== 'touchstart' || (e
.type
=== 'touchstart' && e
.targetTouches
.length
< 2)) {
30841 zoom
.fakeGestureTouched
= true;
30842 gesture
.scaleStart
= Zoom
.getDistanceBetweenTouches(e
);
30844 if (!gesture
.$slideEl
|| !gesture
.$slideEl
.length
) {
30845 gesture
.$slideEl
= $(e
.target
).closest('.swiper-slide');
30846 if (gesture
.$slideEl
.length
=== 0) { gesture
.$slideEl
= swiper
.slides
.eq(swiper
.activeIndex
); }
30847 gesture
.$imageEl
= gesture
.$slideEl
.find('img, svg, canvas');
30848 gesture
.$imageWrapEl
= gesture
.$imageEl
.parent(("." + (params
.containerClass
)));
30849 gesture
.maxRatio
= gesture
.$imageWrapEl
.attr('data-swiper-zoom') || params
.maxRatio
;
30850 if (gesture
.$imageWrapEl
.length
=== 0) {
30851 gesture
.$imageEl
= undefined;
30855 gesture
.$imageEl
.transition(0);
30856 swiper
.zoom
.isScaling
= true;
30858 onGestureChange
: function onGestureChange(e
) {
30860 var params
= swiper
.params
.zoom
;
30861 var zoom
= swiper
.zoom
;
30862 var gesture
= zoom
.gesture
;
30863 if (!Support
.gestures
) {
30864 if (e
.type
!== 'touchmove' || (e
.type
=== 'touchmove' && e
.targetTouches
.length
< 2)) {
30867 zoom
.fakeGestureMoved
= true;
30868 gesture
.scaleMove
= Zoom
.getDistanceBetweenTouches(e
);
30870 if (!gesture
.$imageEl
|| gesture
.$imageEl
.length
=== 0) { return; }
30871 if (Support
.gestures
) {
30872 zoom
.scale
= e
.scale
* zoom
.currentScale
;
30874 zoom
.scale
= (gesture
.scaleMove
/ gesture
.scaleStart
) * zoom
.currentScale
;
30876 if (zoom
.scale
> gesture
.maxRatio
) {
30877 zoom
.scale
= (gesture
.maxRatio
- 1) + (Math
.pow( ((zoom
.scale
- gesture
.maxRatio
) + 1), 0.5 ));
30879 if (zoom
.scale
< params
.minRatio
) {
30880 zoom
.scale
= (params
.minRatio
+ 1) - (Math
.pow( ((params
.minRatio
- zoom
.scale
) + 1), 0.5 ));
30882 gesture
.$imageEl
.transform(("translate3d(0,0,0) scale(" + (zoom
.scale
) + ")"));
30884 onGestureEnd
: function onGestureEnd(e
) {
30886 var params
= swiper
.params
.zoom
;
30887 var zoom
= swiper
.zoom
;
30888 var gesture
= zoom
.gesture
;
30889 if (!Support
.gestures
) {
30890 if (!zoom
.fakeGestureTouched
|| !zoom
.fakeGestureMoved
) {
30893 if (e
.type
!== 'touchend' || (e
.type
=== 'touchend' && e
.changedTouches
.length
< 2 && !Device
.android
)) {
30896 zoom
.fakeGestureTouched
= false;
30897 zoom
.fakeGestureMoved
= false;
30899 if (!gesture
.$imageEl
|| gesture
.$imageEl
.length
=== 0) { return; }
30900 zoom
.scale
= Math
.max(Math
.min(zoom
.scale
, gesture
.maxRatio
), params
.minRatio
);
30901 gesture
.$imageEl
.transition(swiper
.params
.speed
).transform(("translate3d(0,0,0) scale(" + (zoom
.scale
) + ")"));
30902 zoom
.currentScale
= zoom
.scale
;
30903 zoom
.isScaling
= false;
30904 if (zoom
.scale
=== 1) { gesture
.$slideEl
= undefined; }
30906 onTouchStart
: function onTouchStart(e
) {
30908 var zoom
= swiper
.zoom
;
30909 var gesture
= zoom
.gesture
;
30910 var image
= zoom
.image
;
30911 if (!gesture
.$imageEl
|| gesture
.$imageEl
.length
=== 0) { return; }
30912 if (image
.isTouched
) { return; }
30913 if (Device
.android
) { e
.preventDefault(); }
30914 image
.isTouched
= true;
30915 image
.touchesStart
.x
= e
.type
=== 'touchstart' ? e
.targetTouches
[0].pageX
: e
.pageX
;
30916 image
.touchesStart
.y
= e
.type
=== 'touchstart' ? e
.targetTouches
[0].pageY
: e
.pageY
;
30918 onTouchMove
: function onTouchMove(e
) {
30920 var zoom
= swiper
.zoom
;
30921 var gesture
= zoom
.gesture
;
30922 var image
= zoom
.image
;
30923 var velocity
= zoom
.velocity
;
30924 if (!gesture
.$imageEl
|| gesture
.$imageEl
.length
=== 0) { return; }
30925 swiper
.allowClick
= false;
30926 if (!image
.isTouched
|| !gesture
.$slideEl
) { return; }
30928 if (!image
.isMoved
) {
30929 image
.width
= gesture
.$imageEl
[0].offsetWidth
;
30930 image
.height
= gesture
.$imageEl
[0].offsetHeight
;
30931 image
.startX
= Utils
.getTranslate(gesture
.$imageWrapEl
[0], 'x') || 0;
30932 image
.startY
= Utils
.getTranslate(gesture
.$imageWrapEl
[0], 'y') || 0;
30933 gesture
.slideWidth
= gesture
.$slideEl
[0].offsetWidth
;
30934 gesture
.slideHeight
= gesture
.$slideEl
[0].offsetHeight
;
30935 gesture
.$imageWrapEl
.transition(0);
30937 image
.startX
= -image
.startX
;
30938 image
.startY
= -image
.startY
;
30941 // Define if we need image drag
30942 var scaledWidth
= image
.width
* zoom
.scale
;
30943 var scaledHeight
= image
.height
* zoom
.scale
;
30945 if (scaledWidth
< gesture
.slideWidth
&& scaledHeight
< gesture
.slideHeight
) { return; }
30947 image
.minX
= Math
.min(((gesture
.slideWidth
/ 2) - (scaledWidth
/ 2)), 0);
30948 image
.maxX
= -image
.minX
;
30949 image
.minY
= Math
.min(((gesture
.slideHeight
/ 2) - (scaledHeight
/ 2)), 0);
30950 image
.maxY
= -image
.minY
;
30952 image
.touchesCurrent
.x
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageX
: e
.pageX
;
30953 image
.touchesCurrent
.y
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageY
: e
.pageY
;
30955 if (!image
.isMoved
&& !zoom
.isScaling
) {
30957 swiper
.isHorizontal()
30959 (Math
.floor(image
.minX
) === Math
.floor(image
.startX
) && image
.touchesCurrent
.x
< image
.touchesStart
.x
)
30960 || (Math
.floor(image
.maxX
) === Math
.floor(image
.startX
) && image
.touchesCurrent
.x
> image
.touchesStart
.x
)
30963 image
.isTouched
= false;
30966 !swiper
.isHorizontal()
30968 (Math
.floor(image
.minY
) === Math
.floor(image
.startY
) && image
.touchesCurrent
.y
< image
.touchesStart
.y
)
30969 || (Math
.floor(image
.maxY
) === Math
.floor(image
.startY
) && image
.touchesCurrent
.y
> image
.touchesStart
.y
)
30972 image
.isTouched
= false;
30976 e
.preventDefault();
30977 e
.stopPropagation();
30979 image
.isMoved
= true;
30980 image
.currentX
= (image
.touchesCurrent
.x
- image
.touchesStart
.x
) + image
.startX
;
30981 image
.currentY
= (image
.touchesCurrent
.y
- image
.touchesStart
.y
) + image
.startY
;
30983 if (image
.currentX
< image
.minX
) {
30984 image
.currentX
= (image
.minX
+ 1) - (Math
.pow( ((image
.minX
- image
.currentX
) + 1), 0.8 ));
30986 if (image
.currentX
> image
.maxX
) {
30987 image
.currentX
= (image
.maxX
- 1) + (Math
.pow( ((image
.currentX
- image
.maxX
) + 1), 0.8 ));
30990 if (image
.currentY
< image
.minY
) {
30991 image
.currentY
= (image
.minY
+ 1) - (Math
.pow( ((image
.minY
- image
.currentY
) + 1), 0.8 ));
30993 if (image
.currentY
> image
.maxY
) {
30994 image
.currentY
= (image
.maxY
- 1) + (Math
.pow( ((image
.currentY
- image
.maxY
) + 1), 0.8 ));
30998 if (!velocity
.prevPositionX
) { velocity
.prevPositionX
= image
.touchesCurrent
.x
; }
30999 if (!velocity
.prevPositionY
) { velocity
.prevPositionY
= image
.touchesCurrent
.y
; }
31000 if (!velocity
.prevTime
) { velocity
.prevTime
= Date
.now(); }
31001 velocity
.x
= (image
.touchesCurrent
.x
- velocity
.prevPositionX
) / (Date
.now() - velocity
.prevTime
) / 2;
31002 velocity
.y
= (image
.touchesCurrent
.y
- velocity
.prevPositionY
) / (Date
.now() - velocity
.prevTime
) / 2;
31003 if (Math
.abs(image
.touchesCurrent
.x
- velocity
.prevPositionX
) < 2) { velocity
.x
= 0; }
31004 if (Math
.abs(image
.touchesCurrent
.y
- velocity
.prevPositionY
) < 2) { velocity
.y
= 0; }
31005 velocity
.prevPositionX
= image
.touchesCurrent
.x
;
31006 velocity
.prevPositionY
= image
.touchesCurrent
.y
;
31007 velocity
.prevTime
= Date
.now();
31009 gesture
.$imageWrapEl
.transform(("translate3d(" + (image
.currentX
) + "px, " + (image
.currentY
) + "px,0)"));
31011 onTouchEnd
: function onTouchEnd() {
31013 var zoom
= swiper
.zoom
;
31014 var gesture
= zoom
.gesture
;
31015 var image
= zoom
.image
;
31016 var velocity
= zoom
.velocity
;
31017 if (!gesture
.$imageEl
|| gesture
.$imageEl
.length
=== 0) { return; }
31018 if (!image
.isTouched
|| !image
.isMoved
) {
31019 image
.isTouched
= false;
31020 image
.isMoved
= false;
31023 image
.isTouched
= false;
31024 image
.isMoved
= false;
31025 var momentumDurationX
= 300;
31026 var momentumDurationY
= 300;
31027 var momentumDistanceX
= velocity
.x
* momentumDurationX
;
31028 var newPositionX
= image
.currentX
+ momentumDistanceX
;
31029 var momentumDistanceY
= velocity
.y
* momentumDurationY
;
31030 var newPositionY
= image
.currentY
+ momentumDistanceY
;
31033 if (velocity
.x
!== 0) { momentumDurationX
= Math
.abs((newPositionX
- image
.currentX
) / velocity
.x
); }
31034 if (velocity
.y
!== 0) { momentumDurationY
= Math
.abs((newPositionY
- image
.currentY
) / velocity
.y
); }
31035 var momentumDuration
= Math
.max(momentumDurationX
, momentumDurationY
);
31037 image
.currentX
= newPositionX
;
31038 image
.currentY
= newPositionY
;
31040 // Define if we need image drag
31041 var scaledWidth
= image
.width
* zoom
.scale
;
31042 var scaledHeight
= image
.height
* zoom
.scale
;
31043 image
.minX
= Math
.min(((gesture
.slideWidth
/ 2) - (scaledWidth
/ 2)), 0);
31044 image
.maxX
= -image
.minX
;
31045 image
.minY
= Math
.min(((gesture
.slideHeight
/ 2) - (scaledHeight
/ 2)), 0);
31046 image
.maxY
= -image
.minY
;
31047 image
.currentX
= Math
.max(Math
.min(image
.currentX
, image
.maxX
), image
.minX
);
31048 image
.currentY
= Math
.max(Math
.min(image
.currentY
, image
.maxY
), image
.minY
);
31050 gesture
.$imageWrapEl
.transition(momentumDuration
).transform(("translate3d(" + (image
.currentX
) + "px, " + (image
.currentY
) + "px,0)"));
31052 onTransitionEnd
: function onTransitionEnd() {
31054 var zoom
= swiper
.zoom
;
31055 var gesture
= zoom
.gesture
;
31056 if (gesture
.$slideEl
&& swiper
.previousIndex
!== swiper
.activeIndex
) {
31057 gesture
.$imageEl
.transform('translate3d(0,0,0) scale(1)');
31058 gesture
.$imageWrapEl
.transform('translate3d(0,0,0)');
31061 zoom
.currentScale
= 1;
31063 gesture
.$slideEl
= undefined;
31064 gesture
.$imageEl
= undefined;
31065 gesture
.$imageWrapEl
= undefined;
31069 toggle
: function toggle(e
) {
31071 var zoom
= swiper
.zoom
;
31073 if (zoom
.scale
&& zoom
.scale
!== 1) {
31081 in: function in$1(e
) {
31084 var zoom
= swiper
.zoom
;
31085 var params
= swiper
.params
.zoom
;
31086 var gesture
= zoom
.gesture
;
31087 var image
= zoom
.image
;
31089 if (!gesture
.$slideEl
) {
31090 gesture
.$slideEl
= swiper
.clickedSlide
? $(swiper
.clickedSlide
) : swiper
.slides
.eq(swiper
.activeIndex
);
31091 gesture
.$imageEl
= gesture
.$slideEl
.find('img, svg, canvas');
31092 gesture
.$imageWrapEl
= gesture
.$imageEl
.parent(("." + (params
.containerClass
)));
31094 if (!gesture
.$imageEl
|| gesture
.$imageEl
.length
=== 0) { return; }
31096 gesture
.$slideEl
.addClass(("" + (params
.zoomedSlideClass
)));
31117 if (typeof image
.touchesStart
.x
=== 'undefined' && e
) {
31118 touchX
= e
.type
=== 'touchend' ? e
.changedTouches
[0].pageX
: e
.pageX
;
31119 touchY
= e
.type
=== 'touchend' ? e
.changedTouches
[0].pageY
: e
.pageY
;
31121 touchX
= image
.touchesStart
.x
;
31122 touchY
= image
.touchesStart
.y
;
31125 zoom
.scale
= gesture
.$imageWrapEl
.attr('data-swiper-zoom') || params
.maxRatio
;
31126 zoom
.currentScale
= gesture
.$imageWrapEl
.attr('data-swiper-zoom') || params
.maxRatio
;
31128 slideWidth
= gesture
.$slideEl
[0].offsetWidth
;
31129 slideHeight
= gesture
.$slideEl
[0].offsetHeight
;
31130 offsetX
= gesture
.$slideEl
.offset().left
;
31131 offsetY
= gesture
.$slideEl
.offset().top
;
31132 diffX
= (offsetX
+ (slideWidth
/ 2)) - touchX
;
31133 diffY
= (offsetY
+ (slideHeight
/ 2)) - touchY
;
31135 imageWidth
= gesture
.$imageEl
[0].offsetWidth
;
31136 imageHeight
= gesture
.$imageEl
[0].offsetHeight
;
31137 scaledWidth
= imageWidth
* zoom
.scale
;
31138 scaledHeight
= imageHeight
* zoom
.scale
;
31140 translateMinX
= Math
.min(((slideWidth
/ 2) - (scaledWidth
/ 2)), 0);
31141 translateMinY
= Math
.min(((slideHeight
/ 2) - (scaledHeight
/ 2)), 0);
31142 translateMaxX
= -translateMinX
;
31143 translateMaxY
= -translateMinY
;
31145 translateX
= diffX
* zoom
.scale
;
31146 translateY
= diffY
* zoom
.scale
;
31148 if (translateX
< translateMinX
) {
31149 translateX
= translateMinX
;
31151 if (translateX
> translateMaxX
) {
31152 translateX
= translateMaxX
;
31155 if (translateY
< translateMinY
) {
31156 translateY
= translateMinY
;
31158 if (translateY
> translateMaxY
) {
31159 translateY
= translateMaxY
;
31165 gesture
.$imageWrapEl
.transition(300).transform(("translate3d(" + translateX
+ "px, " + translateY
+ "px,0)"));
31166 gesture
.$imageEl
.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom
.scale
) + ")"));
31168 out
: function out() {
31171 var zoom
= swiper
.zoom
;
31172 var params
= swiper
.params
.zoom
;
31173 var gesture
= zoom
.gesture
;
31175 if (!gesture
.$slideEl
) {
31176 gesture
.$slideEl
= swiper
.clickedSlide
? $(swiper
.clickedSlide
) : swiper
.slides
.eq(swiper
.activeIndex
);
31177 gesture
.$imageEl
= gesture
.$slideEl
.find('img, svg, canvas');
31178 gesture
.$imageWrapEl
= gesture
.$imageEl
.parent(("." + (params
.containerClass
)));
31180 if (!gesture
.$imageEl
|| gesture
.$imageEl
.length
=== 0) { return; }
31183 zoom
.currentScale
= 1;
31184 gesture
.$imageWrapEl
.transition(300).transform('translate3d(0,0,0)');
31185 gesture
.$imageEl
.transition(300).transform('translate3d(0,0,0) scale(1)');
31186 gesture
.$slideEl
.removeClass(("" + (params
.zoomedSlideClass
)));
31187 gesture
.$slideEl
= undefined;
31189 // Attach/Detach Events
31190 enable
: function enable() {
31192 var zoom
= swiper
.zoom
;
31193 if (zoom
.enabled
) { return; }
31194 zoom
.enabled
= true;
31196 var passiveListener
= swiper
.touchEvents
.start
=== 'touchstart' && Support
.passiveListener
&& swiper
.params
.passiveListeners
? { passive
: true, capture
: false } : false;
31199 if (Support
.gestures
) {
31200 swiper
.$wrapperEl
.on('gesturestart', '.swiper-slide', zoom
.onGestureStart
, passiveListener
);
31201 swiper
.$wrapperEl
.on('gesturechange', '.swiper-slide', zoom
.onGestureChange
, passiveListener
);
31202 swiper
.$wrapperEl
.on('gestureend', '.swiper-slide', zoom
.onGestureEnd
, passiveListener
);
31203 } else if (swiper
.touchEvents
.start
=== 'touchstart') {
31204 swiper
.$wrapperEl
.on(swiper
.touchEvents
.start
, '.swiper-slide', zoom
.onGestureStart
, passiveListener
);
31205 swiper
.$wrapperEl
.on(swiper
.touchEvents
.move, '.swiper-slide', zoom
.onGestureChange
, passiveListener
);
31206 swiper
.$wrapperEl
.on(swiper
.touchEvents
.end
, '.swiper-slide', zoom
.onGestureEnd
, passiveListener
);
31210 swiper
.$wrapperEl
.on(swiper
.touchEvents
.move, ("." + (swiper
.params
.zoom
.containerClass
)), zoom
.onTouchMove
);
31212 disable
: function disable() {
31214 var zoom
= swiper
.zoom
;
31215 if (!zoom
.enabled
) { return; }
31217 swiper
.zoom
.enabled
= false;
31219 var passiveListener
= swiper
.touchEvents
.start
=== 'touchstart' && Support
.passiveListener
&& swiper
.params
.passiveListeners
? { passive
: true, capture
: false } : false;
31222 if (Support
.gestures
) {
31223 swiper
.$wrapperEl
.off('gesturestart', '.swiper-slide', zoom
.onGestureStart
, passiveListener
);
31224 swiper
.$wrapperEl
.off('gesturechange', '.swiper-slide', zoom
.onGestureChange
, passiveListener
);
31225 swiper
.$wrapperEl
.off('gestureend', '.swiper-slide', zoom
.onGestureEnd
, passiveListener
);
31226 } else if (swiper
.touchEvents
.start
=== 'touchstart') {
31227 swiper
.$wrapperEl
.off(swiper
.touchEvents
.start
, '.swiper-slide', zoom
.onGestureStart
, passiveListener
);
31228 swiper
.$wrapperEl
.off(swiper
.touchEvents
.move, '.swiper-slide', zoom
.onGestureChange
, passiveListener
);
31229 swiper
.$wrapperEl
.off(swiper
.touchEvents
.end
, '.swiper-slide', zoom
.onGestureEnd
, passiveListener
);
31233 swiper
.$wrapperEl
.off(swiper
.touchEvents
.move, ("." + (swiper
.params
.zoom
.containerClass
)), zoom
.onTouchMove
);
31245 containerClass
: 'swiper-zoom-container',
31246 zoomedSlideClass
: 'swiper-slide-zoomed',
31249 create
: function create() {
31257 $slideEl
: undefined,
31258 slideWidth
: undefined,
31259 slideHeight
: undefined,
31260 $imageEl
: undefined,
31261 $imageWrapEl
: undefined,
31265 isTouched
: undefined,
31266 isMoved
: undefined,
31267 currentX
: undefined,
31268 currentY
: undefined,
31278 touchesCurrent
: {},
31283 prevPositionX
: undefined,
31284 prevPositionY
: undefined,
31285 prevTime
: undefined,
31289 ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName
) {
31290 zoom
[methodName
] = Zoom
[methodName
].bind(swiper
);
31292 Utils
.extend(swiper
, {
31297 Object
.defineProperty(swiper
.zoom
, 'scale', {
31298 get: function get() {
31301 set: function set(value
) {
31302 if (scale
!== value
) {
31303 var imageEl
= swiper
.zoom
.gesture
.$imageEl
? swiper
.zoom
.gesture
.$imageEl
[0] : undefined;
31304 var slideEl
= swiper
.zoom
.gesture
.$slideEl
? swiper
.zoom
.gesture
.$slideEl
[0] : undefined;
31305 swiper
.emit('zoomChange', value
, imageEl
, slideEl
);
31312 init
: function init() {
31314 if (swiper
.params
.zoom
.enabled
) {
31315 swiper
.zoom
.enable();
31318 destroy
: function destroy() {
31320 swiper
.zoom
.disable();
31322 touchStart
: function touchStart(e
) {
31324 if (!swiper
.zoom
.enabled
) { return; }
31325 swiper
.zoom
.onTouchStart(e
);
31327 touchEnd
: function touchEnd(e
) {
31329 if (!swiper
.zoom
.enabled
) { return; }
31330 swiper
.zoom
.onTouchEnd(e
);
31332 doubleTap
: function doubleTap(e
) {
31334 if (swiper
.params
.zoom
.enabled
&& swiper
.zoom
.enabled
&& swiper
.params
.zoom
.toggle
) {
31335 swiper
.zoom
.toggle(e
);
31338 transitionEnd
: function transitionEnd() {
31340 if (swiper
.zoom
.enabled
&& swiper
.params
.zoom
.enabled
) {
31341 swiper
.zoom
.onTransitionEnd();
31348 loadInSlide
: function loadInSlide(index
, loadInDuplicate
) {
31349 if ( loadInDuplicate
=== void 0 ) loadInDuplicate
= true;
31352 var params
= swiper
.params
.lazy
;
31353 if (typeof index
=== 'undefined') { return; }
31354 if (swiper
.slides
.length
=== 0) { return; }
31355 var isVirtual
= swiper
.virtual
&& swiper
.params
.virtual
.enabled
;
31357 var $slideEl
= isVirtual
31358 ? swiper
.$wrapperEl
.children(("." + (swiper
.params
.slideClass
) + "[data-swiper-slide-index=\"" + index
+ "\"]"))
31359 : swiper
.slides
.eq(index
);
31361 var $images
= $slideEl
.find(("." + (params
.elementClass
) + ":not(." + (params
.loadedClass
) + "):not(." + (params
.loadingClass
) + ")"));
31362 if ($slideEl
.hasClass(params
.elementClass
) && !$slideEl
.hasClass(params
.loadedClass
) && !$slideEl
.hasClass(params
.loadingClass
)) {
31363 $images
= $images
.add($slideEl
[0]);
31365 if ($images
.length
=== 0) { return; }
31367 $images
.each(function (imageIndex
, imageEl
) {
31368 var $imageEl
= $(imageEl
);
31369 $imageEl
.addClass(params
.loadingClass
);
31371 var background
= $imageEl
.attr('data-background');
31372 var src
= $imageEl
.attr('data-src');
31373 var srcset
= $imageEl
.attr('data-srcset');
31374 var sizes
= $imageEl
.attr('data-sizes');
31376 swiper
.loadImage($imageEl
[0], (src
|| background
), srcset
, sizes
, false, function () {
31377 if (typeof swiper
=== 'undefined' || swiper
=== null || !swiper
|| (swiper
&& !swiper
.params
) || swiper
.destroyed
) { return; }
31379 $imageEl
.css('background-image', ("url(\"" + background
+ "\")"));
31380 $imageEl
.removeAttr('data-background');
31383 $imageEl
.attr('srcset', srcset
);
31384 $imageEl
.removeAttr('data-srcset');
31387 $imageEl
.attr('sizes', sizes
);
31388 $imageEl
.removeAttr('data-sizes');
31391 $imageEl
.attr('src', src
);
31392 $imageEl
.removeAttr('data-src');
31396 $imageEl
.addClass(params
.loadedClass
).removeClass(params
.loadingClass
);
31397 $slideEl
.find(("." + (params
.preloaderClass
))).remove();
31398 if (swiper
.params
.loop
&& loadInDuplicate
) {
31399 var slideOriginalIndex
= $slideEl
.attr('data-swiper-slide-index');
31400 if ($slideEl
.hasClass(swiper
.params
.slideDuplicateClass
)) {
31401 var originalSlide
= swiper
.$wrapperEl
.children(("[data-swiper-slide-index=\"" + slideOriginalIndex
+ "\"]:not(." + (swiper
.params
.slideDuplicateClass
) + ")"));
31402 swiper
.lazy
.loadInSlide(originalSlide
.index(), false);
31404 var duplicatedSlide
= swiper
.$wrapperEl
.children(("." + (swiper
.params
.slideDuplicateClass
) + "[data-swiper-slide-index=\"" + slideOriginalIndex
+ "\"]"));
31405 swiper
.lazy
.loadInSlide(duplicatedSlide
.index(), false);
31408 swiper
.emit('lazyImageReady', $slideEl
[0], $imageEl
[0]);
31411 swiper
.emit('lazyImageLoad', $slideEl
[0], $imageEl
[0]);
31414 load
: function load() {
31416 var $wrapperEl
= swiper
.$wrapperEl
;
31417 var swiperParams
= swiper
.params
;
31418 var slides
= swiper
.slides
;
31419 var activeIndex
= swiper
.activeIndex
;
31420 var isVirtual
= swiper
.virtual
&& swiperParams
.virtual
.enabled
;
31421 var params
= swiperParams
.lazy
;
31423 var slidesPerView
= swiperParams
.slidesPerView
;
31424 if (slidesPerView
=== 'auto') {
31428 function slideExist(index
) {
31430 if ($wrapperEl
.children(("." + (swiperParams
.slideClass
) + "[data-swiper-slide-index=\"" + index
+ "\"]")).length
) {
31433 } else if (slides
[index
]) { return true; }
31436 function slideIndex(slideEl
) {
31438 return $(slideEl
).attr('data-swiper-slide-index');
31440 return $(slideEl
).index();
31443 if (!swiper
.lazy
.initialImageLoaded
) { swiper
.lazy
.initialImageLoaded
= true; }
31444 if (swiper
.params
.watchSlidesVisibility
) {
31445 $wrapperEl
.children(("." + (swiperParams
.slideVisibleClass
))).each(function (elIndex
, slideEl
) {
31446 var index
= isVirtual
? $(slideEl
).attr('data-swiper-slide-index') : $(slideEl
).index();
31447 swiper
.lazy
.loadInSlide(index
);
31449 } else if (slidesPerView
> 1) {
31450 for (var i
= activeIndex
; i
< activeIndex
+ slidesPerView
; i
+= 1) {
31451 if (slideExist(i
)) { swiper
.lazy
.loadInSlide(i
); }
31454 swiper
.lazy
.loadInSlide(activeIndex
);
31456 if (params
.loadPrevNext
) {
31457 if (slidesPerView
> 1 || (params
.loadPrevNextAmount
&& params
.loadPrevNextAmount
> 1)) {
31458 var amount
= params
.loadPrevNextAmount
;
31459 var spv
= slidesPerView
;
31460 var maxIndex
= Math
.min(activeIndex
+ spv
+ Math
.max(amount
, spv
), slides
.length
);
31461 var minIndex
= Math
.max(activeIndex
- Math
.max(spv
, amount
), 0);
31463 for (var i
$1 = activeIndex
+ slidesPerView
; i
$1 < maxIndex
; i
$1 += 1) {
31464 if (slideExist(i
$1)) { swiper
.lazy
.loadInSlide(i
$1); }
31467 for (var i
$2 = minIndex
; i
$2 < activeIndex
; i
$2 += 1) {
31468 if (slideExist(i
$2)) { swiper
.lazy
.loadInSlide(i
$2); }
31471 var nextSlide
= $wrapperEl
.children(("." + (swiperParams
.slideNextClass
)));
31472 if (nextSlide
.length
> 0) { swiper
.lazy
.loadInSlide(slideIndex(nextSlide
)); }
31474 var prevSlide
= $wrapperEl
.children(("." + (swiperParams
.slidePrevClass
)));
31475 if (prevSlide
.length
> 0) { swiper
.lazy
.loadInSlide(slideIndex(prevSlide
)); }
31486 loadPrevNext
: false,
31487 loadPrevNextAmount
: 1,
31488 loadOnTransitionStart
: false,
31490 elementClass
: 'swiper-lazy',
31491 loadingClass
: 'swiper-lazy-loading',
31492 loadedClass
: 'swiper-lazy-loaded',
31493 preloaderClass
: 'swiper-lazy-preloader',
31496 create
: function create() {
31498 Utils
.extend(swiper
, {
31500 initialImageLoaded
: false,
31501 load
: Lazy
$2.load
.bind(swiper
),
31502 loadInSlide
: Lazy
$2.loadInSlide
.bind(swiper
),
31507 beforeInit
: function beforeInit() {
31509 if (swiper
.params
.lazy
.enabled
&& swiper
.params
.preloadImages
) {
31510 swiper
.params
.preloadImages
= false;
31513 init
: function init() {
31515 if (swiper
.params
.lazy
.enabled
&& !swiper
.params
.loop
&& swiper
.params
.initialSlide
=== 0) {
31516 swiper
.lazy
.load();
31519 scroll
: function scroll() {
31521 if (swiper
.params
.freeMode
&& !swiper
.params
.freeModeSticky
) {
31522 swiper
.lazy
.load();
31525 resize
: function resize() {
31527 if (swiper
.params
.lazy
.enabled
) {
31528 swiper
.lazy
.load();
31531 scrollbarDragMove
: function scrollbarDragMove() {
31533 if (swiper
.params
.lazy
.enabled
) {
31534 swiper
.lazy
.load();
31537 transitionStart
: function transitionStart() {
31539 if (swiper
.params
.lazy
.enabled
) {
31540 if (swiper
.params
.lazy
.loadOnTransitionStart
|| (!swiper
.params
.lazy
.loadOnTransitionStart
&& !swiper
.lazy
.initialImageLoaded
)) {
31541 swiper
.lazy
.load();
31545 transitionEnd
: function transitionEnd() {
31547 if (swiper
.params
.lazy
.enabled
&& !swiper
.params
.lazy
.loadOnTransitionStart
) {
31548 swiper
.lazy
.load();
31554 /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
31557 LinearSpline
: function LinearSpline(x
, y
) {
31558 var binarySearch
= (function search() {
31562 return function (array
, val
) {
31564 maxIndex
= array
.length
;
31565 while (maxIndex
- minIndex
> 1) {
31566 guess
= maxIndex
+ minIndex
>> 1;
31567 if (array
[guess
] <= val
) {
31578 this.lastIndex
= x
.length
- 1;
31579 // Given an x value (x2), return the expected y2 value:
31580 // (x1,y1) is the known point before given value,
31581 // (x3,y3) is the known point after given value.
31585 this.interpolate
= function interpolate(x2
) {
31586 if (!x2
) { return 0; }
31588 // Get the indexes of x1 and x3 (the array indexes before and after given x2):
31589 i3
= binarySearch(this.x
, x2
);
31592 // We have our indexes i1 & i3, so we can calculate already:
31593 // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
31594 return (((x2
- this.x
[i1
]) * (this.y
[i3
] - this.y
[i1
])) / (this.x
[i3
] - this.x
[i1
])) + this.y
[i1
];
31598 // xxx: for now i will just save one spline function to to
31599 getInterpolateFunction
: function getInterpolateFunction(c
) {
31601 if (!swiper
.controller
.spline
) {
31602 swiper
.controller
.spline
= swiper
.params
.loop
31603 ? new Controller
.LinearSpline(swiper
.slidesGrid
, c
.slidesGrid
)
31604 : new Controller
.LinearSpline(swiper
.snapGrid
, c
.snapGrid
);
31607 setTranslate
: function setTranslate(setTranslate
$1, byController
) {
31609 var controlled
= swiper
.controller
.control
;
31611 var controlledTranslate
;
31612 function setControlledTranslate(c
) {
31613 // this will create an Interpolate function based on the snapGrids
31614 // x is the Grid of the scrolled scroller and y will be the controlled scroller
31615 // it makes sense to create this only once and recall it for the interpolation
31616 // the function does a lot of value caching for performance
31617 var translate
= swiper
.rtlTranslate
? -swiper
.translate
: swiper
.translate
;
31618 if (swiper
.params
.controller
.by
=== 'slide') {
31619 swiper
.controller
.getInterpolateFunction(c
);
31620 // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
31621 // but it did not work out
31622 controlledTranslate
= -swiper
.controller
.spline
.interpolate(-translate
);
31625 if (!controlledTranslate
|| swiper
.params
.controller
.by
=== 'container') {
31626 multiplier
= (c
.maxTranslate() - c
.minTranslate()) / (swiper
.maxTranslate() - swiper
.minTranslate());
31627 controlledTranslate
= ((translate
- swiper
.minTranslate()) * multiplier
) + c
.minTranslate();
31630 if (swiper
.params
.controller
.inverse
) {
31631 controlledTranslate
= c
.maxTranslate() - controlledTranslate
;
31633 c
.updateProgress(controlledTranslate
);
31634 c
.setTranslate(controlledTranslate
, swiper
);
31635 c
.updateActiveIndex();
31636 c
.updateSlidesClasses();
31638 if (Array
.isArray(controlled
)) {
31639 for (var i
= 0; i
< controlled
.length
; i
+= 1) {
31640 if (controlled
[i
] !== byController
&& controlled
[i
] instanceof Swiper
) {
31641 setControlledTranslate(controlled
[i
]);
31644 } else if (controlled
instanceof Swiper
&& byController
!== controlled
) {
31645 setControlledTranslate(controlled
);
31648 setTransition
: function setTransition(duration
, byController
) {
31650 var controlled
= swiper
.controller
.control
;
31652 function setControlledTransition(c
) {
31653 c
.setTransition(duration
, swiper
);
31654 if (duration
!== 0) {
31655 c
.transitionStart();
31656 if (c
.params
.autoHeight
) {
31657 Utils
.nextTick(function () {
31658 c
.updateAutoHeight();
31661 c
.$wrapperEl
.transitionEnd(function () {
31662 if (!controlled
) { return; }
31663 if (c
.params
.loop
&& swiper
.params
.controller
.by
=== 'slide') {
31670 if (Array
.isArray(controlled
)) {
31671 for (i
= 0; i
< controlled
.length
; i
+= 1) {
31672 if (controlled
[i
] !== byController
&& controlled
[i
] instanceof Swiper
) {
31673 setControlledTransition(controlled
[i
]);
31676 } else if (controlled
instanceof Swiper
&& byController
!== controlled
) {
31677 setControlledTransition(controlled
);
31681 var Controller
$1 = {
31682 name
: 'controller',
31685 control
: undefined,
31687 by
: 'slide', // or 'container'
31690 create
: function create() {
31692 Utils
.extend(swiper
, {
31694 control
: swiper
.params
.controller
.control
,
31695 getInterpolateFunction
: Controller
.getInterpolateFunction
.bind(swiper
),
31696 setTranslate
: Controller
.setTranslate
.bind(swiper
),
31697 setTransition
: Controller
.setTransition
.bind(swiper
),
31702 update
: function update() {
31704 if (!swiper
.controller
.control
) { return; }
31705 if (swiper
.controller
.spline
) {
31706 swiper
.controller
.spline
= undefined;
31707 delete swiper
.controller
.spline
;
31710 resize
: function resize() {
31712 if (!swiper
.controller
.control
) { return; }
31713 if (swiper
.controller
.spline
) {
31714 swiper
.controller
.spline
= undefined;
31715 delete swiper
.controller
.spline
;
31718 observerUpdate
: function observerUpdate() {
31720 if (!swiper
.controller
.control
) { return; }
31721 if (swiper
.controller
.spline
) {
31722 swiper
.controller
.spline
= undefined;
31723 delete swiper
.controller
.spline
;
31726 setTranslate
: function setTranslate(translate
, byController
) {
31728 if (!swiper
.controller
.control
) { return; }
31729 swiper
.controller
.setTranslate(translate
, byController
);
31731 setTransition
: function setTransition(duration
, byController
) {
31733 if (!swiper
.controller
.control
) { return; }
31734 swiper
.controller
.setTransition(duration
, byController
);
31740 makeElFocusable
: function makeElFocusable($el
) {
31741 $el
.attr('tabIndex', '0');
31744 addElRole
: function addElRole($el
, role
) {
31745 $el
.attr('role', role
);
31748 addElLabel
: function addElLabel($el
, label
) {
31749 $el
.attr('aria-label', label
);
31752 disableEl
: function disableEl($el
) {
31753 $el
.attr('aria-disabled', true);
31756 enableEl
: function enableEl($el
) {
31757 $el
.attr('aria-disabled', false);
31760 onEnterKey
: function onEnterKey(e
) {
31762 var params
= swiper
.params
.a11y
;
31763 if (e
.keyCode
!== 13) { return; }
31764 var $targetEl
= $(e
.target
);
31765 if (swiper
.navigation
&& swiper
.navigation
.$nextEl
&& $targetEl
.is(swiper
.navigation
.$nextEl
)) {
31766 if (!(swiper
.isEnd
&& !swiper
.params
.loop
)) {
31767 swiper
.slideNext();
31769 if (swiper
.isEnd
) {
31770 swiper
.a11y
.notify(params
.lastSlideMessage
);
31772 swiper
.a11y
.notify(params
.nextSlideMessage
);
31775 if (swiper
.navigation
&& swiper
.navigation
.$prevEl
&& $targetEl
.is(swiper
.navigation
.$prevEl
)) {
31776 if (!(swiper
.isBeginning
&& !swiper
.params
.loop
)) {
31777 swiper
.slidePrev();
31779 if (swiper
.isBeginning
) {
31780 swiper
.a11y
.notify(params
.firstSlideMessage
);
31782 swiper
.a11y
.notify(params
.prevSlideMessage
);
31785 if (swiper
.pagination
&& $targetEl
.is(("." + (swiper
.params
.pagination
.bulletClass
)))) {
31786 $targetEl
[0].click();
31789 notify
: function notify(message
) {
31791 var notification
= swiper
.a11y
.liveRegion
;
31792 if (notification
.length
=== 0) { return; }
31793 notification
.html('');
31794 notification
.html(message
);
31796 updateNavigation
: function updateNavigation() {
31799 if (swiper
.params
.loop
) { return; }
31800 var ref
= swiper
.navigation
;
31801 var $nextEl
= ref
.$nextEl
;
31802 var $prevEl
= ref
.$prevEl
;
31804 if ($prevEl
&& $prevEl
.length
> 0) {
31805 if (swiper
.isBeginning
) {
31806 swiper
.a11y
.disableEl($prevEl
);
31808 swiper
.a11y
.enableEl($prevEl
);
31811 if ($nextEl
&& $nextEl
.length
> 0) {
31812 if (swiper
.isEnd
) {
31813 swiper
.a11y
.disableEl($nextEl
);
31815 swiper
.a11y
.enableEl($nextEl
);
31819 updatePagination
: function updatePagination() {
31821 var params
= swiper
.params
.a11y
;
31822 if (swiper
.pagination
&& swiper
.params
.pagination
.clickable
&& swiper
.pagination
.bullets
&& swiper
.pagination
.bullets
.length
) {
31823 swiper
.pagination
.bullets
.each(function (bulletIndex
, bulletEl
) {
31824 var $bulletEl
= $(bulletEl
);
31825 swiper
.a11y
.makeElFocusable($bulletEl
);
31826 swiper
.a11y
.addElRole($bulletEl
, 'button');
31827 swiper
.a11y
.addElLabel($bulletEl
, params
.paginationBulletMessage
.replace(/{{index}}/, $bulletEl
.index() + 1));
31831 init
: function init() {
31834 swiper
.$el
.append(swiper
.a11y
.liveRegion
);
31837 var params
= swiper
.params
.a11y
;
31840 if (swiper
.navigation
&& swiper
.navigation
.$nextEl
) {
31841 $nextEl
= swiper
.navigation
.$nextEl
;
31843 if (swiper
.navigation
&& swiper
.navigation
.$prevEl
) {
31844 $prevEl
= swiper
.navigation
.$prevEl
;
31847 swiper
.a11y
.makeElFocusable($nextEl
);
31848 swiper
.a11y
.addElRole($nextEl
, 'button');
31849 swiper
.a11y
.addElLabel($nextEl
, params
.nextSlideMessage
);
31850 $nextEl
.on('keydown', swiper
.a11y
.onEnterKey
);
31853 swiper
.a11y
.makeElFocusable($prevEl
);
31854 swiper
.a11y
.addElRole($prevEl
, 'button');
31855 swiper
.a11y
.addElLabel($prevEl
, params
.prevSlideMessage
);
31856 $prevEl
.on('keydown', swiper
.a11y
.onEnterKey
);
31860 if (swiper
.pagination
&& swiper
.params
.pagination
.clickable
&& swiper
.pagination
.bullets
&& swiper
.pagination
.bullets
.length
) {
31861 swiper
.pagination
.$el
.on('keydown', ("." + (swiper
.params
.pagination
.bulletClass
)), swiper
.a11y
.onEnterKey
);
31864 destroy
: function destroy() {
31866 if (swiper
.a11y
.liveRegion
&& swiper
.a11y
.liveRegion
.length
> 0) { swiper
.a11y
.liveRegion
.remove(); }
31870 if (swiper
.navigation
&& swiper
.navigation
.$nextEl
) {
31871 $nextEl
= swiper
.navigation
.$nextEl
;
31873 if (swiper
.navigation
&& swiper
.navigation
.$prevEl
) {
31874 $prevEl
= swiper
.navigation
.$prevEl
;
31877 $nextEl
.off('keydown', swiper
.a11y
.onEnterKey
);
31880 $prevEl
.off('keydown', swiper
.a11y
.onEnterKey
);
31884 if (swiper
.pagination
&& swiper
.params
.pagination
.clickable
&& swiper
.pagination
.bullets
&& swiper
.pagination
.bullets
.length
) {
31885 swiper
.pagination
.$el
.off('keydown', ("." + (swiper
.params
.pagination
.bulletClass
)), swiper
.a11y
.onEnterKey
);
31894 notificationClass
: 'swiper-notification',
31895 prevSlideMessage
: 'Previous slide',
31896 nextSlideMessage
: 'Next slide',
31897 firstSlideMessage
: 'This is the first slide',
31898 lastSlideMessage
: 'This is the last slide',
31899 paginationBulletMessage
: 'Go to slide {{index}}',
31902 create
: function create() {
31904 Utils
.extend(swiper
, {
31906 liveRegion
: $(("<span class=\"" + (swiper
.params
.a11y
.notificationClass
) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
31909 Object
.keys(a11y
).forEach(function (methodName
) {
31910 swiper
.a11y
[methodName
] = a11y
[methodName
].bind(swiper
);
31914 init
: function init() {
31916 if (!swiper
.params
.a11y
.enabled
) { return; }
31917 swiper
.a11y
.init();
31918 swiper
.a11y
.updateNavigation();
31920 toEdge
: function toEdge() {
31922 if (!swiper
.params
.a11y
.enabled
) { return; }
31923 swiper
.a11y
.updateNavigation();
31925 fromEdge
: function fromEdge() {
31927 if (!swiper
.params
.a11y
.enabled
) { return; }
31928 swiper
.a11y
.updateNavigation();
31930 paginationUpdate
: function paginationUpdate() {
31932 if (!swiper
.params
.a11y
.enabled
) { return; }
31933 swiper
.a11y
.updatePagination();
31935 destroy
: function destroy() {
31937 if (!swiper
.params
.a11y
.enabled
) { return; }
31938 swiper
.a11y
.destroy();
31943 /* eslint no-underscore-dangle: "off" */
31946 run
: function run() {
31948 var $activeSlideEl
= swiper
.slides
.eq(swiper
.activeIndex
);
31949 var delay
= swiper
.params
.autoplay
.delay
;
31950 if ($activeSlideEl
.attr('data-swiper-autoplay')) {
31951 delay
= $activeSlideEl
.attr('data-swiper-autoplay') || swiper
.params
.autoplay
.delay
;
31953 swiper
.autoplay
.timeout
= Utils
.nextTick(function () {
31954 if (swiper
.params
.autoplay
.reverseDirection
) {
31955 if (swiper
.params
.loop
) {
31957 swiper
.slidePrev(swiper
.params
.speed
, true, true);
31958 swiper
.emit('autoplay');
31959 } else if (!swiper
.isBeginning
) {
31960 swiper
.slidePrev(swiper
.params
.speed
, true, true);
31961 swiper
.emit('autoplay');
31962 } else if (!swiper
.params
.autoplay
.stopOnLastSlide
) {
31963 swiper
.slideTo(swiper
.slides
.length
- 1, swiper
.params
.speed
, true, true);
31964 swiper
.emit('autoplay');
31966 swiper
.autoplay
.stop();
31968 } else if (swiper
.params
.loop
) {
31970 swiper
.slideNext(swiper
.params
.speed
, true, true);
31971 swiper
.emit('autoplay');
31972 } else if (!swiper
.isEnd
) {
31973 swiper
.slideNext(swiper
.params
.speed
, true, true);
31974 swiper
.emit('autoplay');
31975 } else if (!swiper
.params
.autoplay
.stopOnLastSlide
) {
31976 swiper
.slideTo(0, swiper
.params
.speed
, true, true);
31977 swiper
.emit('autoplay');
31979 swiper
.autoplay
.stop();
31983 start
: function start() {
31985 if (typeof swiper
.autoplay
.timeout
!== 'undefined') { return false; }
31986 if (swiper
.autoplay
.running
) { return false; }
31987 swiper
.autoplay
.running
= true;
31988 swiper
.emit('autoplayStart');
31989 swiper
.autoplay
.run();
31992 stop
: function stop() {
31994 if (!swiper
.autoplay
.running
) { return false; }
31995 if (typeof swiper
.autoplay
.timeout
=== 'undefined') { return false; }
31997 if (swiper
.autoplay
.timeout
) {
31998 clearTimeout(swiper
.autoplay
.timeout
);
31999 swiper
.autoplay
.timeout
= undefined;
32001 swiper
.autoplay
.running
= false;
32002 swiper
.emit('autoplayStop');
32005 pause
: function pause(speed
) {
32007 if (!swiper
.autoplay
.running
) { return; }
32008 if (swiper
.autoplay
.paused
) { return; }
32009 if (swiper
.autoplay
.timeout
) { clearTimeout(swiper
.autoplay
.timeout
); }
32010 swiper
.autoplay
.paused
= true;
32011 if (speed
=== 0 || !swiper
.params
.autoplay
.waitForTransition
) {
32012 swiper
.autoplay
.paused
= false;
32013 swiper
.autoplay
.run();
32015 swiper
.$wrapperEl
[0].addEventListener('transitionend', swiper
.autoplay
.onTransitionEnd
);
32016 swiper
.$wrapperEl
[0].addEventListener('webkitTransitionEnd', swiper
.autoplay
.onTransitionEnd
);
32027 waitForTransition
: true,
32028 disableOnInteraction
: true,
32029 stopOnLastSlide
: false,
32030 reverseDirection
: false,
32033 create
: function create() {
32035 Utils
.extend(swiper
, {
32039 run
: Autoplay
.run
.bind(swiper
),
32040 start
: Autoplay
.start
.bind(swiper
),
32041 stop
: Autoplay
.stop
.bind(swiper
),
32042 pause
: Autoplay
.pause
.bind(swiper
),
32043 onTransitionEnd
: function onTransitionEnd(e
) {
32044 if (!swiper
|| swiper
.destroyed
|| !swiper
.$wrapperEl
) { return; }
32045 if (e
.target
!== this) { return; }
32046 swiper
.$wrapperEl
[0].removeEventListener('transitionend', swiper
.autoplay
.onTransitionEnd
);
32047 swiper
.$wrapperEl
[0].removeEventListener('webkitTransitionEnd', swiper
.autoplay
.onTransitionEnd
);
32048 swiper
.autoplay
.paused
= false;
32049 if (!swiper
.autoplay
.running
) {
32050 swiper
.autoplay
.stop();
32052 swiper
.autoplay
.run();
32059 init
: function init() {
32061 if (swiper
.params
.autoplay
.enabled
) {
32062 swiper
.autoplay
.start();
32065 beforeTransitionStart
: function beforeTransitionStart(speed
, internal) {
32067 if (swiper
.autoplay
.running
) {
32068 if (internal || !swiper
.params
.autoplay
.disableOnInteraction
) {
32069 swiper
.autoplay
.pause(speed
);
32071 swiper
.autoplay
.stop();
32075 sliderFirstMove
: function sliderFirstMove() {
32077 if (swiper
.autoplay
.running
) {
32078 if (swiper
.params
.autoplay
.disableOnInteraction
) {
32079 swiper
.autoplay
.stop();
32081 swiper
.autoplay
.pause();
32085 destroy
: function destroy() {
32087 if (swiper
.autoplay
.running
) {
32088 swiper
.autoplay
.stop();
32095 setTranslate
: function setTranslate() {
32097 var slides
= swiper
.slides
;
32098 for (var i
= 0; i
< slides
.length
; i
+= 1) {
32099 var $slideEl
= swiper
.slides
.eq(i
);
32100 var offset
= $slideEl
[0].swiperSlideOffset
;
32102 if (!swiper
.params
.virtualTranslate
) { tx
-= swiper
.translate
; }
32104 if (!swiper
.isHorizontal()) {
32108 var slideOpacity
= swiper
.params
.fadeEffect
.crossFade
32109 ? Math
.max(1 - Math
.abs($slideEl
[0].progress
), 0)
32110 : 1 + Math
.min(Math
.max($slideEl
[0].progress
, -1), 0);
32113 opacity
: slideOpacity
,
32115 .transform(("translate3d(" + tx
+ "px, " + ty
+ "px, 0px)"));
32118 setTransition
: function setTransition(duration
) {
32120 var slides
= swiper
.slides
;
32121 var $wrapperEl
= swiper
.$wrapperEl
;
32122 slides
.transition(duration
);
32123 if (swiper
.params
.virtualTranslate
&& duration
!== 0) {
32124 var eventTriggered
= false;
32125 slides
.transitionEnd(function () {
32126 if (eventTriggered
) { return; }
32127 if (!swiper
|| swiper
.destroyed
) { return; }
32128 eventTriggered
= true;
32129 swiper
.animating
= false;
32130 var triggerEvents
= ['webkitTransitionEnd', 'transitionend'];
32131 for (var i
= 0; i
< triggerEvents
.length
; i
+= 1) {
32132 $wrapperEl
.trigger(triggerEvents
[i
]);
32140 name
: 'effect-fade',
32146 create
: function create() {
32148 Utils
.extend(swiper
, {
32150 setTranslate
: Fade
.setTranslate
.bind(swiper
),
32151 setTransition
: Fade
.setTransition
.bind(swiper
),
32156 beforeInit
: function beforeInit() {
32158 if (swiper
.params
.effect
!== 'fade') { return; }
32159 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "fade"));
32160 var overwriteParams
= {
32162 slidesPerColumn
: 1,
32164 watchSlidesProgress
: true,
32166 virtualTranslate
: true,
32168 Utils
.extend(swiper
.params
, overwriteParams
);
32169 Utils
.extend(swiper
.originalParams
, overwriteParams
);
32171 setTranslate
: function setTranslate() {
32173 if (swiper
.params
.effect
!== 'fade') { return; }
32174 swiper
.fadeEffect
.setTranslate();
32176 setTransition
: function setTransition(duration
) {
32178 if (swiper
.params
.effect
!== 'fade') { return; }
32179 swiper
.fadeEffect
.setTransition(duration
);
32185 setTranslate
: function setTranslate() {
32187 var $el
= swiper
.$el
;
32188 var $wrapperEl
= swiper
.$wrapperEl
;
32189 var slides
= swiper
.slides
;
32190 var swiperWidth
= swiper
.width
;
32191 var swiperHeight
= swiper
.height
;
32192 var rtl
= swiper
.rtlTranslate
;
32193 var swiperSize
= swiper
.size
;
32194 var params
= swiper
.params
.cubeEffect
;
32195 var isHorizontal
= swiper
.isHorizontal();
32196 var isVirtual
= swiper
.virtual
&& swiper
.params
.virtual
.enabled
;
32197 var wrapperRotate
= 0;
32199 if (params
.shadow
) {
32200 if (isHorizontal
) {
32201 $cubeShadowEl
= $wrapperEl
.find('.swiper-cube-shadow');
32202 if ($cubeShadowEl
.length
=== 0) {
32203 $cubeShadowEl
= $('<div class="swiper-cube-shadow"></div>');
32204 $wrapperEl
.append($cubeShadowEl
);
32206 $cubeShadowEl
.css({ height
: (swiperWidth
+ "px") });
32208 $cubeShadowEl
= $el
.find('.swiper-cube-shadow');
32209 if ($cubeShadowEl
.length
=== 0) {
32210 $cubeShadowEl
= $('<div class="swiper-cube-shadow"></div>');
32211 $el
.append($cubeShadowEl
);
32215 for (var i
= 0; i
< slides
.length
; i
+= 1) {
32216 var $slideEl
= slides
.eq(i
);
32217 var slideIndex
= i
;
32219 slideIndex
= parseInt($slideEl
.attr('data-swiper-slide-index'), 10);
32221 var slideAngle
= slideIndex
* 90;
32222 var round
= Math
.floor(slideAngle
/ 360);
32224 slideAngle
= -slideAngle
;
32225 round
= Math
.floor(-slideAngle
/ 360);
32227 var progress
= Math
.max(Math
.min($slideEl
[0].progress
, 1), -1);
32231 if (slideIndex
% 4 === 0) {
32232 tx
= -round
* 4 * swiperSize
;
32234 } else if ((slideIndex
- 1) % 4 === 0) {
32236 tz
= -round
* 4 * swiperSize
;
32237 } else if ((slideIndex
- 2) % 4 === 0) {
32238 tx
= swiperSize
+ (round
* 4 * swiperSize
);
32240 } else if ((slideIndex
- 3) % 4 === 0) {
32242 tz
= (3 * swiperSize
) + (swiperSize
* 4 * round
);
32248 if (!isHorizontal
) {
32253 var transform
= "rotateX(" + (isHorizontal
? 0 : -slideAngle
) + "deg) rotateY(" + (isHorizontal
? slideAngle
: 0) + "deg) translate3d(" + tx
+ "px, " + ty
+ "px, " + tz
+ "px)";
32254 if (progress
<= 1 && progress
> -1) {
32255 wrapperRotate
= (slideIndex
* 90) + (progress
* 90);
32256 if (rtl
) { wrapperRotate
= (-slideIndex
* 90) - (progress
* 90); }
32258 $slideEl
.transform(transform
);
32259 if (params
.slideShadows
) {
32261 var shadowBefore
= isHorizontal
? $slideEl
.find('.swiper-slide-shadow-left') : $slideEl
.find('.swiper-slide-shadow-top');
32262 var shadowAfter
= isHorizontal
? $slideEl
.find('.swiper-slide-shadow-right') : $slideEl
.find('.swiper-slide-shadow-bottom');
32263 if (shadowBefore
.length
=== 0) {
32264 shadowBefore
= $(("<div class=\"swiper-slide-shadow-" + (isHorizontal
? 'left' : 'top') + "\"></div>"));
32265 $slideEl
.append(shadowBefore
);
32267 if (shadowAfter
.length
=== 0) {
32268 shadowAfter
= $(("<div class=\"swiper-slide-shadow-" + (isHorizontal
? 'right' : 'bottom') + "\"></div>"));
32269 $slideEl
.append(shadowAfter
);
32271 if (shadowBefore
.length
) { shadowBefore
[0].style
.opacity
= Math
.max(-progress
, 0); }
32272 if (shadowAfter
.length
) { shadowAfter
[0].style
.opacity
= Math
.max(progress
, 0); }
32276 '-webkit-transform-origin': ("50% 50% -" + (swiperSize
/ 2) + "px"),
32277 '-moz-transform-origin': ("50% 50% -" + (swiperSize
/ 2) + "px"),
32278 '-ms-transform-origin': ("50% 50% -" + (swiperSize
/ 2) + "px"),
32279 'transform-origin': ("50% 50% -" + (swiperSize
/ 2) + "px"),
32282 if (params
.shadow
) {
32283 if (isHorizontal
) {
32284 $cubeShadowEl
.transform(("translate3d(0px, " + ((swiperWidth
/ 2) + params
.shadowOffset
) + "px, " + (-swiperWidth
/ 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params
.shadowScale
) + ")"));
32286 var shadowAngle
= Math
.abs(wrapperRotate
) - (Math
.floor(Math
.abs(wrapperRotate
) / 90) * 90);
32287 var multiplier
= 1.5 - (
32288 (Math
.sin((shadowAngle
* 2 * Math
.PI
) / 360) / 2)
32289 + (Math
.cos((shadowAngle
* 2 * Math
.PI
) / 360) / 2)
32291 var scale1
= params
.shadowScale
;
32292 var scale2
= params
.shadowScale
/ multiplier
;
32293 var offset
= params
.shadowOffset
;
32294 $cubeShadowEl
.transform(("scale3d(" + scale1
+ ", 1, " + scale2
+ ") translate3d(0px, " + ((swiperHeight
/ 2) + offset
) + "px, " + (-swiperHeight
/ 2 / scale2
) + "px) rotateX(-90deg)"));
32297 var zFactor
= (Browser
.isSafari
|| Browser
.isUiWebView
) ? (-swiperSize
/ 2) : 0;
32299 .transform(("translate3d(0px,0," + zFactor
+ "px) rotateX(" + (swiper
.isHorizontal() ? 0 : wrapperRotate
) + "deg) rotateY(" + (swiper
.isHorizontal() ? -wrapperRotate
: 0) + "deg)"));
32301 setTransition
: function setTransition(duration
) {
32303 var $el
= swiper
.$el
;
32304 var slides
= swiper
.slides
;
32306 .transition(duration
)
32307 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
32308 .transition(duration
);
32309 if (swiper
.params
.cubeEffect
.shadow
&& !swiper
.isHorizontal()) {
32310 $el
.find('.swiper-cube-shadow').transition(duration
);
32316 name
: 'effect-cube',
32319 slideShadows
: true,
32325 create
: function create() {
32327 Utils
.extend(swiper
, {
32329 setTranslate
: Cube
.setTranslate
.bind(swiper
),
32330 setTransition
: Cube
.setTransition
.bind(swiper
),
32335 beforeInit
: function beforeInit() {
32337 if (swiper
.params
.effect
!== 'cube') { return; }
32338 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "cube"));
32339 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "3d"));
32340 var overwriteParams
= {
32342 slidesPerColumn
: 1,
32344 watchSlidesProgress
: true,
32345 resistanceRatio
: 0,
32347 centeredSlides
: false,
32348 virtualTranslate
: true,
32350 Utils
.extend(swiper
.params
, overwriteParams
);
32351 Utils
.extend(swiper
.originalParams
, overwriteParams
);
32353 setTranslate
: function setTranslate() {
32355 if (swiper
.params
.effect
!== 'cube') { return; }
32356 swiper
.cubeEffect
.setTranslate();
32358 setTransition
: function setTransition(duration
) {
32360 if (swiper
.params
.effect
!== 'cube') { return; }
32361 swiper
.cubeEffect
.setTransition(duration
);
32367 setTranslate
: function setTranslate() {
32369 var slides
= swiper
.slides
;
32370 var rtl
= swiper
.rtlTranslate
;
32371 for (var i
= 0; i
< slides
.length
; i
+= 1) {
32372 var $slideEl
= slides
.eq(i
);
32373 var progress
= $slideEl
[0].progress
;
32374 if (swiper
.params
.flipEffect
.limitRotation
) {
32375 progress
= Math
.max(Math
.min($slideEl
[0].progress
, 1), -1);
32377 var offset
= $slideEl
[0].swiperSlideOffset
;
32378 var rotate
= -180 * progress
;
32379 var rotateY
= rotate
;
32383 if (!swiper
.isHorizontal()) {
32386 rotateX
= -rotateY
;
32389 rotateY
= -rotateY
;
32392 $slideEl
[0].style
.zIndex
= -Math
.abs(Math
.round(progress
)) + slides
.length
;
32394 if (swiper
.params
.flipEffect
.slideShadows
) {
32396 var shadowBefore
= swiper
.isHorizontal() ? $slideEl
.find('.swiper-slide-shadow-left') : $slideEl
.find('.swiper-slide-shadow-top');
32397 var shadowAfter
= swiper
.isHorizontal() ? $slideEl
.find('.swiper-slide-shadow-right') : $slideEl
.find('.swiper-slide-shadow-bottom');
32398 if (shadowBefore
.length
=== 0) {
32399 shadowBefore
= $(("<div class=\"swiper-slide-shadow-" + (swiper
.isHorizontal() ? 'left' : 'top') + "\"></div>"));
32400 $slideEl
.append(shadowBefore
);
32402 if (shadowAfter
.length
=== 0) {
32403 shadowAfter
= $(("<div class=\"swiper-slide-shadow-" + (swiper
.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
32404 $slideEl
.append(shadowAfter
);
32406 if (shadowBefore
.length
) { shadowBefore
[0].style
.opacity
= Math
.max(-progress
, 0); }
32407 if (shadowAfter
.length
) { shadowAfter
[0].style
.opacity
= Math
.max(progress
, 0); }
32410 .transform(("translate3d(" + tx
+ "px, " + ty
+ "px, 0px) rotateX(" + rotateX
+ "deg) rotateY(" + rotateY
+ "deg)"));
32413 setTransition
: function setTransition(duration
) {
32415 var slides
= swiper
.slides
;
32416 var activeIndex
= swiper
.activeIndex
;
32417 var $wrapperEl
= swiper
.$wrapperEl
;
32419 .transition(duration
)
32420 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
32421 .transition(duration
);
32422 if (swiper
.params
.virtualTranslate
&& duration
!== 0) {
32423 var eventTriggered
= false;
32424 // eslint-disable-next-line
32425 slides
.eq(activeIndex
).transitionEnd(function onTransitionEnd() {
32426 if (eventTriggered
) { return; }
32427 if (!swiper
|| swiper
.destroyed
) { return; }
32428 // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
32429 eventTriggered
= true;
32430 swiper
.animating
= false;
32431 var triggerEvents
= ['webkitTransitionEnd', 'transitionend'];
32432 for (var i
= 0; i
< triggerEvents
.length
; i
+= 1) {
32433 $wrapperEl
.trigger(triggerEvents
[i
]);
32441 name
: 'effect-flip',
32444 slideShadows
: true,
32445 limitRotation
: true,
32448 create
: function create() {
32450 Utils
.extend(swiper
, {
32452 setTranslate
: Flip
.setTranslate
.bind(swiper
),
32453 setTransition
: Flip
.setTransition
.bind(swiper
),
32458 beforeInit
: function beforeInit() {
32460 if (swiper
.params
.effect
!== 'flip') { return; }
32461 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "flip"));
32462 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "3d"));
32463 var overwriteParams
= {
32465 slidesPerColumn
: 1,
32467 watchSlidesProgress
: true,
32469 virtualTranslate
: true,
32471 Utils
.extend(swiper
.params
, overwriteParams
);
32472 Utils
.extend(swiper
.originalParams
, overwriteParams
);
32474 setTranslate
: function setTranslate() {
32476 if (swiper
.params
.effect
!== 'flip') { return; }
32477 swiper
.flipEffect
.setTranslate();
32479 setTransition
: function setTransition(duration
) {
32481 if (swiper
.params
.effect
!== 'flip') { return; }
32482 swiper
.flipEffect
.setTransition(duration
);
32488 setTranslate
: function setTranslate() {
32490 var swiperWidth
= swiper
.width
;
32491 var swiperHeight
= swiper
.height
;
32492 var slides
= swiper
.slides
;
32493 var $wrapperEl
= swiper
.$wrapperEl
;
32494 var slidesSizesGrid
= swiper
.slidesSizesGrid
;
32495 var params
= swiper
.params
.coverflowEffect
;
32496 var isHorizontal
= swiper
.isHorizontal();
32497 var transform
= swiper
.translate
;
32498 var center
= isHorizontal
? -transform
+ (swiperWidth
/ 2) : -transform
+ (swiperHeight
/ 2);
32499 var rotate
= isHorizontal
? params
.rotate
: -params
.rotate
;
32500 var translate
= params
.depth
;
32501 // Each slide offset from center
32502 for (var i
= 0, length
= slides
.length
; i
< length
; i
+= 1) {
32503 var $slideEl
= slides
.eq(i
);
32504 var slideSize
= slidesSizesGrid
[i
];
32505 var slideOffset
= $slideEl
[0].swiperSlideOffset
;
32506 var offsetMultiplier
= ((center
- slideOffset
- (slideSize
/ 2)) / slideSize
) * params
.modifier
;
32508 var rotateY
= isHorizontal
? rotate
* offsetMultiplier
: 0;
32509 var rotateX
= isHorizontal
? 0 : rotate
* offsetMultiplier
;
32511 var translateZ
= -translate
* Math
.abs(offsetMultiplier
);
32513 var translateY
= isHorizontal
? 0 : params
.stretch
* (offsetMultiplier
);
32514 var translateX
= isHorizontal
? params
.stretch
* (offsetMultiplier
) : 0;
32516 // Fix for ultra small values
32517 if (Math
.abs(translateX
) < 0.001) { translateX
= 0; }
32518 if (Math
.abs(translateY
) < 0.001) { translateY
= 0; }
32519 if (Math
.abs(translateZ
) < 0.001) { translateZ
= 0; }
32520 if (Math
.abs(rotateY
) < 0.001) { rotateY
= 0; }
32521 if (Math
.abs(rotateX
) < 0.001) { rotateX
= 0; }
32523 var slideTransform
= "translate3d(" + translateX
+ "px," + translateY
+ "px," + translateZ
+ "px) rotateX(" + rotateX
+ "deg) rotateY(" + rotateY
+ "deg)";
32525 $slideEl
.transform(slideTransform
);
32526 $slideEl
[0].style
.zIndex
= -Math
.abs(Math
.round(offsetMultiplier
)) + 1;
32527 if (params
.slideShadows
) {
32529 var $shadowBeforeEl
= isHorizontal
? $slideEl
.find('.swiper-slide-shadow-left') : $slideEl
.find('.swiper-slide-shadow-top');
32530 var $shadowAfterEl
= isHorizontal
? $slideEl
.find('.swiper-slide-shadow-right') : $slideEl
.find('.swiper-slide-shadow-bottom');
32531 if ($shadowBeforeEl
.length
=== 0) {
32532 $shadowBeforeEl
= $(("<div class=\"swiper-slide-shadow-" + (isHorizontal
? 'left' : 'top') + "\"></div>"));
32533 $slideEl
.append($shadowBeforeEl
);
32535 if ($shadowAfterEl
.length
=== 0) {
32536 $shadowAfterEl
= $(("<div class=\"swiper-slide-shadow-" + (isHorizontal
? 'right' : 'bottom') + "\"></div>"));
32537 $slideEl
.append($shadowAfterEl
);
32539 if ($shadowBeforeEl
.length
) { $shadowBeforeEl
[0].style
.opacity
= offsetMultiplier
> 0 ? offsetMultiplier
: 0; }
32540 if ($shadowAfterEl
.length
) { $shadowAfterEl
[0].style
.opacity
= (-offsetMultiplier
) > 0 ? -offsetMultiplier
: 0; }
32544 // Set correct perspective for IE10
32545 if (Support
.pointerEvents
|| Support
.prefixedPointerEvents
) {
32546 var ws
= $wrapperEl
[0].style
;
32547 ws
.perspectiveOrigin
= center
+ "px 50%";
32550 setTransition
: function setTransition(duration
) {
32553 .transition(duration
)
32554 .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
32555 .transition(duration
);
32559 var EffectCoverflow
= {
32560 name
: 'effect-coverflow',
32567 slideShadows
: true,
32570 create
: function create() {
32572 Utils
.extend(swiper
, {
32574 setTranslate
: Coverflow
.setTranslate
.bind(swiper
),
32575 setTransition
: Coverflow
.setTransition
.bind(swiper
),
32580 beforeInit
: function beforeInit() {
32582 if (swiper
.params
.effect
!== 'coverflow') { return; }
32584 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "coverflow"));
32585 swiper
.classNames
.push(((swiper
.params
.containerModifierClass
) + "3d"));
32587 swiper
.params
.watchSlidesProgress
= true;
32588 swiper
.originalParams
.watchSlidesProgress
= true;
32590 setTranslate
: function setTranslate() {
32592 if (swiper
.params
.effect
!== 'coverflow') { return; }
32593 swiper
.coverflowEffect
.setTranslate();
32595 setTransition
: function setTransition(duration
) {
32597 if (swiper
.params
.effect
!== 'coverflow') { return; }
32598 swiper
.coverflowEffect
.setTransition(duration
);
32604 init
: function init() {
32606 var ref
= swiper
.params
;
32607 var thumbsParams
= ref
.thumbs
;
32608 var SwiperClass
= swiper
.constructor;
32609 if (thumbsParams
.swiper
instanceof SwiperClass
) {
32610 swiper
.thumbs
.swiper
= thumbsParams
.swiper
;
32611 Utils
.extend(swiper
.thumbs
.swiper
.originalParams
, {
32612 watchSlidesProgress
: true,
32613 slideToClickedSlide
: false,
32615 Utils
.extend(swiper
.thumbs
.swiper
.params
, {
32616 watchSlidesProgress
: true,
32617 slideToClickedSlide
: false,
32619 } else if (Utils
.isObject(thumbsParams
.swiper
)) {
32620 swiper
.thumbs
.swiper
= new SwiperClass(Utils
.extend({}, thumbsParams
.swiper
, {
32621 watchSlidesVisibility
: true,
32622 watchSlidesProgress
: true,
32623 slideToClickedSlide
: false,
32625 swiper
.thumbs
.swiperCreated
= true;
32627 swiper
.thumbs
.swiper
.$el
.addClass(swiper
.params
.thumbs
.thumbsContainerClass
);
32628 swiper
.thumbs
.swiper
.on('tap', swiper
.thumbs
.onThumbClick
);
32630 onThumbClick
: function onThumbClick() {
32632 var thumbsSwiper
= swiper
.thumbs
.swiper
;
32633 if (!thumbsSwiper
) { return; }
32634 var clickedIndex
= thumbsSwiper
.clickedIndex
;
32635 var clickedSlide
= thumbsSwiper
.clickedSlide
;
32636 if (clickedSlide
&& $(clickedSlide
).hasClass(swiper
.params
.thumbs
.slideThumbActiveClass
)) { return; }
32637 if (typeof clickedIndex
=== 'undefined' || clickedIndex
=== null) { return; }
32639 if (thumbsSwiper
.params
.loop
) {
32640 slideToIndex
= parseInt($(thumbsSwiper
.clickedSlide
).attr('data-swiper-slide-index'), 10);
32642 slideToIndex
= clickedIndex
;
32644 if (swiper
.params
.loop
) {
32645 var currentIndex
= swiper
.activeIndex
;
32646 if (swiper
.slides
.eq(currentIndex
).hasClass(swiper
.params
.slideDuplicateClass
)) {
32648 // eslint-disable-next-line
32649 swiper
._clientLeft
= swiper
.$wrapperEl
[0].clientLeft
;
32650 currentIndex
= swiper
.activeIndex
;
32652 var prevIndex
= swiper
.slides
.eq(currentIndex
).prevAll(("[data-swiper-slide-index=\"" + slideToIndex
+ "\"]")).eq(0).index();
32653 var nextIndex
= swiper
.slides
.eq(currentIndex
).nextAll(("[data-swiper-slide-index=\"" + slideToIndex
+ "\"]")).eq(0).index();
32654 if (typeof prevIndex
=== 'undefined') { slideToIndex
= nextIndex
; }
32655 else if (typeof nextIndex
=== 'undefined') { slideToIndex
= prevIndex
; }
32656 else if (nextIndex
- currentIndex
< currentIndex
- prevIndex
) { slideToIndex
= nextIndex
; }
32657 else { slideToIndex
= prevIndex
; }
32659 swiper
.slideTo(slideToIndex
);
32661 update
: function update(initial
) {
32663 var thumbsSwiper
= swiper
.thumbs
.swiper
;
32664 if (!thumbsSwiper
) { return; }
32666 var slidesPerView
= thumbsSwiper
.params
.slidesPerView
=== 'auto'
32667 ? thumbsSwiper
.slidesPerViewDynamic()
32668 : thumbsSwiper
.params
.slidesPerView
;
32670 if (swiper
.realIndex
!== thumbsSwiper
.realIndex
) {
32671 var currentThumbsIndex
= thumbsSwiper
.activeIndex
;
32672 var newThumbsIndex
;
32673 if (thumbsSwiper
.params
.loop
) {
32674 if (thumbsSwiper
.slides
.eq(currentThumbsIndex
).hasClass(thumbsSwiper
.params
.slideDuplicateClass
)) {
32675 thumbsSwiper
.loopFix();
32676 // eslint-disable-next-line
32677 thumbsSwiper
._clientLeft
= thumbsSwiper
.$wrapperEl
[0].clientLeft
;
32678 currentThumbsIndex
= thumbsSwiper
.activeIndex
;
32680 // Find actual thumbs index to slide to
32681 var prevThumbsIndex
= thumbsSwiper
.slides
.eq(currentThumbsIndex
).prevAll(("[data-swiper-slide-index=\"" + (swiper
.realIndex
) + "\"]")).eq(0).index();
32682 var nextThumbsIndex
= thumbsSwiper
.slides
.eq(currentThumbsIndex
).nextAll(("[data-swiper-slide-index=\"" + (swiper
.realIndex
) + "\"]")).eq(0).index();
32683 if (typeof prevThumbsIndex
=== 'undefined') { newThumbsIndex
= nextThumbsIndex
; }
32684 else if (typeof nextThumbsIndex
=== 'undefined') { newThumbsIndex
= prevThumbsIndex
; }
32685 else if (nextThumbsIndex
- currentThumbsIndex
=== currentThumbsIndex
- prevThumbsIndex
) { newThumbsIndex
= currentThumbsIndex
; }
32686 else if (nextThumbsIndex
- currentThumbsIndex
< currentThumbsIndex
- prevThumbsIndex
) { newThumbsIndex
= nextThumbsIndex
; }
32687 else { newThumbsIndex
= prevThumbsIndex
; }
32689 newThumbsIndex
= swiper
.realIndex
;
32691 if (thumbsSwiper
.visibleSlidesIndexes
.indexOf(newThumbsIndex
) < 0) {
32692 if (thumbsSwiper
.params
.centeredSlides
) {
32693 if (newThumbsIndex
> currentThumbsIndex
) {
32694 newThumbsIndex
= newThumbsIndex
- Math
.floor(slidesPerView
/ 2) + 1;
32696 newThumbsIndex
= newThumbsIndex
+ Math
.floor(slidesPerView
/ 2) - 1;
32698 } else if (newThumbsIndex
> currentThumbsIndex
) {
32699 newThumbsIndex
= newThumbsIndex
- slidesPerView
+ 1;
32701 thumbsSwiper
.slideTo(newThumbsIndex
, initial
? 0 : undefined);
32706 var thumbsToActivate
= 1;
32707 var thumbActiveClass
= swiper
.params
.thumbs
.slideThumbActiveClass
;
32709 if (swiper
.params
.slidesPerView
> 1 && !swiper
.params
.centeredSlides
) {
32710 thumbsToActivate
= swiper
.params
.slidesPerView
;
32713 thumbsSwiper
.slides
.removeClass(thumbActiveClass
);
32714 if (thumbsSwiper
.params
.loop
) {
32715 for (var i
= 0; i
< thumbsToActivate
; i
+= 1) {
32716 thumbsSwiper
.$wrapperEl
.children(("[data-swiper-slide-index=\"" + (swiper
.realIndex
+ i
) + "\"]")).addClass(thumbActiveClass
);
32719 for (var i
$1 = 0; i
$1 < thumbsToActivate
; i
$1 += 1) {
32720 thumbsSwiper
.slides
.eq(swiper
.realIndex
+ i
$1).addClass(thumbActiveClass
);
32730 slideThumbActiveClass
: 'swiper-slide-thumb-active',
32731 thumbsContainerClass
: 'swiper-container-thumbs',
32734 create
: function create() {
32736 Utils
.extend(swiper
, {
32739 init
: Thumbs
.init
.bind(swiper
),
32740 update
: Thumbs
.update
.bind(swiper
),
32741 onThumbClick
: Thumbs
.onThumbClick
.bind(swiper
),
32746 beforeInit
: function beforeInit() {
32748 var ref
= swiper
.params
;
32749 var thumbs
= ref
.thumbs
;
32750 if (!thumbs
|| !thumbs
.swiper
) { return; }
32751 swiper
.thumbs
.init();
32752 swiper
.thumbs
.update(true);
32754 slideChange
: function slideChange() {
32756 if (!swiper
.thumbs
.swiper
) { return; }
32757 swiper
.thumbs
.update();
32759 update
: function update() {
32761 if (!swiper
.thumbs
.swiper
) { return; }
32762 swiper
.thumbs
.update();
32764 resize
: function resize() {
32766 if (!swiper
.thumbs
.swiper
) { return; }
32767 swiper
.thumbs
.update();
32769 observerUpdate
: function observerUpdate() {
32771 if (!swiper
.thumbs
.swiper
) { return; }
32772 swiper
.thumbs
.update();
32774 setTransition
: function setTransition(duration
) {
32776 var thumbsSwiper
= swiper
.thumbs
.swiper
;
32777 if (!thumbsSwiper
) { return; }
32778 thumbsSwiper
.setTransition(duration
);
32780 beforeDestroy
: function beforeDestroy() {
32782 var thumbsSwiper
= swiper
.thumbs
.swiper
;
32783 if (!thumbsSwiper
) { return; }
32784 if (swiper
.thumbs
.swiperCreated
&& thumbsSwiper
) {
32785 thumbsSwiper
.destroy();
32816 if (!window
.Swiper
) {
32817 window
.Swiper
= Swiper
;
32821 function initSwiper(swiperEl
) {
32823 var $swiperEl
= $(swiperEl
);
32824 if ($swiperEl
.length
=== 0) { return; }
32825 if ($swiperEl
[0].swiper
) { return; }
32829 var isRoutableTabs
;
32830 if ($swiperEl
.hasClass('tabs-swipeable-wrap')) {
32832 .addClass('swiper-container')
32834 .addClass('swiper-wrapper')
32836 .addClass('swiper-slide');
32837 initialSlide
= $swiperEl
.children('.tabs').children('.tab-active').index();
32839 isRoutableTabs
= $swiperEl
.find('.tabs-routable').length
> 0;
32841 if ($swiperEl
.attr('data-swiper')) {
32842 params
= JSON
.parse($swiperEl
.attr('data-swiper'));
32844 params
= $swiperEl
.dataset();
32845 Object
.keys(params
).forEach(function (key
) {
32846 var value
= params
[key
];
32847 if (typeof value
=== 'string' && value
.indexOf('{') === 0 && value
.indexOf('}') > 0) {
32849 params
[key
] = JSON
.parse(value
);
32856 if (typeof params
.initialSlide
=== 'undefined' && typeof initialSlide
!== 'undefined') {
32857 params
.initialSlide
= initialSlide
;
32860 var swiper
= app
.swiper
.create($swiperEl
[0], params
);
32862 swiper
.on('slideChange', function () {
32863 if (isRoutableTabs
) {
32864 var view
= app
.views
.get($swiperEl
.parents('.view'));
32865 if (!view
) { view
= app
.views
.main
; }
32866 var router
= view
.router
;
32867 var tabRoute
= router
.findTabRoute(swiper
.slides
.eq(swiper
.activeIndex
)[0]);
32869 setTimeout(function () {
32870 router
.navigate(tabRoute
.path
);
32875 tabEl
: swiper
.slides
.eq(swiper
.activeIndex
),
32887 create
: function create() {
32889 app
.swiper
= ConstructorMethods({
32890 defaultSelector
: '.swiper-container',
32891 constructor: Swiper
,
32896 pageBeforeRemove
: function pageBeforeRemove(page
) {
32898 page
.$el
.find('.swiper-init, .tabs-swipeable-wrap').each(function (index
, swiperEl
) {
32899 app
.swiper
.destroy(swiperEl
);
32902 pageMounted
: function pageMounted(page
) {
32904 page
.$el
.find('.tabs-swipeable-wrap').each(function (index
, swiperEl
) {
32905 initSwiper
.call(app
, swiperEl
);
32908 pageInit
: function pageInit(page
) {
32910 page
.$el
.find('.swiper-init, .tabs-swipeable-wrap').each(function (index
, swiperEl
) {
32911 initSwiper
.call(app
, swiperEl
);
32914 pageReinit
: function pageReinit(page
) {
32916 page
.$el
.find('.swiper-init, .tabs-swipeable-wrap').each(function (index
, swiperEl
) {
32917 var swiper
= app
.swiper
.get(swiperEl
);
32918 if (swiper
&& swiper
.update
) { swiper
.update(); }
32921 tabMounted
: function tabMounted(tabEl
) {
32923 $(tabEl
).find('.swiper-init, .tabs-swipeable-wrap').each(function (index
, swiperEl
) {
32924 initSwiper
.call(app
, swiperEl
);
32927 tabShow
: function tabShow(tabEl
) {
32929 $(tabEl
).find('.swiper-init, .tabs-swipeable-wrap').each(function (index
, swiperEl
) {
32930 var swiper
= app
.swiper
.get(swiperEl
);
32931 if (swiper
&& swiper
.update
) { swiper
.update(); }
32934 tabBeforeRemove
: function tabBeforeRemove(tabEl
) {
32936 $(tabEl
).find('.swiper-init, .tabs-swipeable-wrap').each(function (index
, swiperEl
) {
32937 app
.swiper
.destroy(swiperEl
);
32943 insert
: function insert(vnode
) {
32945 var swiperEl
= vnode
.elm
;
32946 initSwiper
.call(app
, swiperEl
);
32948 destroy
: function destroy(vnode
) {
32950 var swiperEl
= vnode
.elm
;
32951 app
.swiper
.destroy(swiperEl
);
32954 'tabs-swipeable-wrap': {
32955 insert
: function insert(vnode
) {
32957 var swiperEl
= vnode
.elm
;
32958 initSwiper
.call(app
, swiperEl
);
32960 destroy
: function destroy(vnode
) {
32962 var swiperEl
= vnode
.elm
;
32963 app
.swiper
.destroy(swiperEl
);
32969 /* eslint indent: ["off"] */
32971 var PhotoBrowser
= /*@__PURE__*/(function (Framework7Class
$$1) {
32972 function PhotoBrowser(app
, params
) {
32973 if ( params
=== void 0 ) params
= {};
32975 Framework7Class
$$1.call(this, params
, [app
]);
32980 var defaults
= Utils
.extend({
32982 }, app
.params
.photoBrowser
);
32984 // Extend defaults with modules params
32985 pb
.useModulesParams(defaults
);
32987 pb
.params
= Utils
.extend(defaults
, params
);
32992 activeIndex
: pb
.params
.swiper
.initialSlide
,
32993 url
: pb
.params
.url
,
32994 view
: pb
.params
.view
|| app
.views
.main
,
33000 current
: undefined,
33002 activeSlide
: undefined,
33003 timeStart
: undefined,
33014 if ( Framework7Class
$$1 ) PhotoBrowser
.__proto__
= Framework7Class
$$1;
33015 PhotoBrowser
.prototype = Object
.create( Framework7Class
$$1 && Framework7Class
$$1.prototype );
33016 PhotoBrowser
.prototype.constructor = PhotoBrowser
;
33018 PhotoBrowser
.prototype.onSlideChange
= function onSlideChange (swiper
) {
33020 pb
.activeIndex
= swiper
.activeIndex
;
33022 var current
= swiper
.activeIndex
+ 1;
33023 var total
= pb
.params
.virtualSlides
? pb
.params
.photos
.length
: swiper
.slides
.length
;
33024 if (swiper
.params
.loop
) {
33026 current
-= swiper
.loopedSlides
;
33027 if (current
< 1) { current
= total
+ current
; }
33028 if (current
> total
) { current
-= total
; }
33031 var $activeSlideEl
= pb
.params
.virtualSlides
33032 ? swiper
.$wrapperEl
.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper
.activeIndex
) + "\"]"))
33033 : swiper
.slides
.eq(swiper
.activeIndex
);
33034 var $previousSlideEl
= pb
.params
.virtualSlides
33035 ? swiper
.$wrapperEl
.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper
.previousIndex
) + "\"]"))
33036 : swiper
.slides
.eq(swiper
.previousIndex
);
33038 var $currentEl
= pb
.$el
.find('.photo-browser-current');
33039 var $totalEl
= pb
.$el
.find('.photo-browser-total');
33040 if (pb
.params
.type
=== 'page' && pb
.params
.navbar
&& $currentEl
.length
=== 0 && pb
.app
.theme
=== 'ios') {
33041 var navbarEl
= pb
.app
.navbar
.getElByPage(pb
.$el
);
33043 $currentEl
= $(navbarEl
).find('.photo-browser-current');
33044 $totalEl
= $(navbarEl
).find('.photo-browser-total');
33047 $currentEl
.text(current
);
33048 $totalEl
.text(total
);
33051 if (pb
.captions
.length
> 0) {
33052 var captionIndex
= swiper
.params
.loop
? $activeSlideEl
.attr('data-swiper-slide-index') : pb
.activeIndex
;
33053 pb
.$captionsContainerEl
.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');
33054 pb
.$captionsContainerEl
.find(("[data-caption-index=\"" + captionIndex
+ "\"]")).addClass('photo-browser-caption-active');
33058 var previousSlideVideo
= $previousSlideEl
.find('video');
33059 if (previousSlideVideo
.length
> 0) {
33060 if ('pause' in previousSlideVideo
[0]) { previousSlideVideo
[0].pause(); }
33064 PhotoBrowser
.prototype.onTouchStart
= function onTouchStart () {
33066 var swipeToClose
= pb
.swipeToClose
;
33067 if (!swipeToClose
.allow
) { return; }
33068 swipeToClose
.isTouched
= true;
33071 PhotoBrowser
.prototype.onTouchMove
= function onTouchMove (e
) {
33073 var swipeToClose
= pb
.swipeToClose
;
33075 if (!swipeToClose
.isTouched
) { return; }
33076 if (!swipeToClose
.started
) {
33077 swipeToClose
.started
= true;
33078 swipeToClose
.start
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageY
: e
.pageY
;
33079 if (pb
.params
.virtualSlides
) {
33080 swipeToClose
.activeSlide
= pb
.swiper
.$wrapperEl
.children('.swiper-slide-active');
33082 swipeToClose
.activeSlide
= pb
.swiper
.slides
.eq(pb
.swiper
.activeIndex
);
33084 swipeToClose
.timeStart
= Utils
.now();
33086 e
.preventDefault();
33087 swipeToClose
.current
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageY
: e
.pageY
;
33088 swipeToClose
.diff
= swipeToClose
.start
- swipeToClose
.current
;
33089 var opacity
= 1 - (Math
.abs(swipeToClose
.diff
) / 300);
33090 var color
= pb
.exposed
|| pb
.params
.theme
=== 'dark' ? 0 : 255;
33091 swipeToClose
.activeSlide
.transform(("translate3d(0," + (-swipeToClose
.diff
) + "px,0)"));
33092 pb
.swiper
.$el
.css('background-color', ("rgba(" + color
+ ", " + color
+ ", " + color
+ ", " + opacity
+ ")")).transition(0);
33095 PhotoBrowser
.prototype.onTouchEnd
= function onTouchEnd () {
33097 var swipeToClose
= pb
.swipeToClose
;
33098 swipeToClose
.isTouched
= false;
33099 if (!swipeToClose
.started
) {
33100 swipeToClose
.started
= false;
33103 swipeToClose
.started
= false;
33104 swipeToClose
.allow
= false;
33105 var diff
= Math
.abs(swipeToClose
.diff
);
33106 var timeDiff
= (new Date()).getTime() - swipeToClose
.timeStart
;
33107 if ((timeDiff
< 300 && diff
> 20) || (timeDiff
>= 300 && diff
> 100)) {
33108 Utils
.nextTick(function () {
33110 if (swipeToClose
.diff
< 0) { pb
.$el
.addClass('swipe-close-to-bottom'); }
33111 else { pb
.$el
.addClass('swipe-close-to-top'); }
33113 pb
.emit('local::swipeToClose', pb
);
33115 swipeToClose
.allow
= true;
33120 swipeToClose
.activeSlide
.addClass('photo-browser-transitioning').transitionEnd(function () {
33121 swipeToClose
.allow
= true;
33122 swipeToClose
.activeSlide
.removeClass('photo-browser-transitioning');
33125 swipeToClose
.allow
= true;
33127 pb
.swiper
.$el
.transition('').css('background-color', '');
33128 swipeToClose
.activeSlide
.transform('');
33131 // Render Functions
33132 PhotoBrowser
.prototype.renderNavbar
= function renderNavbar () {
33134 if (pb
.params
.renderNavbar
) { return pb
.params
.renderNavbar
.call(pb
); }
33136 var iconsColor
= pb
.params
.iconsColor
;
33137 if (!pb
.params
.iconsColor
&& pb
.params
.theme
=== 'dark') { iconsColor
= 'white'; }
33139 var backLinkText
= pb
.app
.theme
=== 'ios' && pb
.params
.backLinkText
? pb
.params
.backLinkText
: '';
33141 var isPopup
= pb
.params
.type
!== 'page';
33142 var navbarHtml
= ("\n <div class=\"navbar\">\n <div class=\"navbar-inner sliding\">\n <div class=\"left\">\n <a href=\"#\" class=\"link " + (isPopup
? 'popup-close' : '') + " " + (!backLinkText
? 'icon-only' : '') + " " + (!isPopup
? 'back' : '') + "\" " + (isPopup
? 'data-popup=".photo-browser-popup"' : '') + ">\n <i class=\"icon icon-back " + (iconsColor
? ("color-" + iconsColor
) : '') + "\"></i>\n " + (backLinkText
? ("<span>" + backLinkText
+ "</span>") : '') + "\n </a>\n </div>\n <div class=\"title\">\n <span class=\"photo-browser-current\"></span>\n <span class=\"photo-browser-of\">" + (pb
.params
.navbarOfText
) + "</span>\n <span class=\"photo-browser-total\"></span>\n </div>\n <div class=\"right\"></div>\n </div>\n </div>\n ").trim();
33146 PhotoBrowser
.prototype.renderToolbar
= function renderToolbar () {
33148 if (pb
.params
.renderToolbar
) { return pb
.params
.renderToolbar
.call(pb
); }
33150 var iconsColor
= pb
.params
.iconsColor
;
33151 if (!pb
.params
.iconsColor
&& pb
.params
.theme
=== 'dark') { iconsColor
= 'white'; }
33153 var toolbarHtml
= ("\n <div class=\"toolbar toolbar-bottom tabbar\">\n <div class=\"toolbar-inner\">\n <a href=\"#\" class=\"link photo-browser-prev\">\n <i class=\"icon icon-back " + (iconsColor
? ("color-" + iconsColor
) : '') + "\"></i>\n </a>\n <a href=\"#\" class=\"link photo-browser-next\">\n <i class=\"icon icon-forward " + (iconsColor
? ("color-" + iconsColor
) : '') + "\"></i>\n </a>\n </div>\n </div>\n ").trim();
33154 return toolbarHtml
;
33157 PhotoBrowser
.prototype.renderCaption
= function renderCaption (caption
, index
) {
33159 if (pb
.params
.renderCaption
) { return pb
.params
.renderCaption
.call(pb
, caption
, index
); }
33160 var captionHtml
= ("\n <div class=\"photo-browser-caption\" data-caption-index=\"" + index
+ "\">\n " + caption
+ "\n </div>\n ").trim();
33161 return captionHtml
;
33164 PhotoBrowser
.prototype.renderObject
= function renderObject (photo
, index
) {
33166 if (pb
.params
.renderObject
) { return pb
.params
.renderObject
.call(pb
, photo
, index
); }
33167 var objHtml
= "\n <div class=\"photo-browser-slide photo-browser-object-slide swiper-slide\" data-swiper-slide-index=\"" + index
+ "\">" + (photo
.html
? photo
.html
: photo
) + "</div>\n ";
33171 PhotoBrowser
.prototype.renderLazyPhoto
= function renderLazyPhoto (photo
, index
) {
33173 if (pb
.params
.renderLazyPhoto
) { return pb
.params
.renderLazyPhoto
.call(pb
, photo
, index
); }
33174 var photoHtml
= ("\n <div class=\"photo-browser-slide photo-browser-slide-lazy swiper-slide\" data-swiper-slide-index=\"" + index
+ "\">\n <div class=\"preloader swiper-lazy-preloader " + (pb
.params
.theme
=== 'dark' ? 'color-white' : '') + "\">" + (Utils
[((pb
.app
.theme
) + "PreloaderContent")] || '') + "</div>\n <span class=\"swiper-zoom-container\">\n <img data-src=\"" + (photo
.url
? photo
.url
: photo
) + "\" class=\"swiper-lazy\">\n </span>\n </div>\n ").trim();
33178 PhotoBrowser
.prototype.renderPhoto
= function renderPhoto (photo
, index
) {
33180 if (pb
.params
.renderPhoto
) { return pb
.params
.renderPhoto
.call(pb
, photo
, index
); }
33181 var photoHtml
= ("\n <div class=\"photo-browser-slide swiper-slide\" data-swiper-slide-index=\"" + index
+ "\">\n <span class=\"swiper-zoom-container\">\n <img src=\"" + (photo
.url
? photo
.url
: photo
) + "\">\n </span>\n </div>\n ").trim();
33185 PhotoBrowser
.prototype.render
= function render () {
33187 if (pb
.params
.render
) { return pb
.params
.render
.call(pb
, pb
.params
); }
33188 var html
= ("\n <div class=\"photo-browser photo-browser-" + (pb
.params
.theme
) + "\">\n <div class=\"view\">\n <div class=\"page photo-browser-page photo-browser-page-" + (pb
.params
.theme
) + " no-toolbar " + (!pb
.params
.navbar
? 'no-navbar' : '') + "\" data-name=\"photo-browser-page\">\n " + (pb
.params
.navbar
? pb
.renderNavbar() : '') + "\n " + (pb
.params
.toolbar
? pb
.renderToolbar() : '') + "\n <div class=\"photo-browser-captions photo-browser-captions-" + (pb
.params
.captionsTheme
|| pb
.params
.theme
) + "\">\n " + (pb
.params
.photos
.map(function (photo
, index
) {
33189 if (photo
.caption
) { return pb
.renderCaption(photo
.caption
, index
); }
33191 }).join(' ')) + "\n </div>\n <div class=\"photo-browser-swiper-container swiper-container\">\n <div class=\"photo-browser-swiper-wrapper swiper-wrapper\">\n " + (pb
.params
.virtualSlides
? '' : pb
.params
.photos
.map(function (photo
, index
) {
33192 if (photo
.html
|| ((typeof photo
=== 'string' || photo
instanceof String
) && photo
.indexOf('<') >= 0 && photo
.indexOf('>') >= 0)) {
33193 return pb
.renderObject(photo
, index
);
33195 if (pb
.params
.swiper
.lazy
=== true || (pb
.params
.swiper
.lazy
&& pb
.params
.swiper
.lazy
.enabled
)) {
33196 return pb
.renderLazyPhoto(photo
, index
);
33198 return pb
.renderPhoto(photo
, index
);
33199 }).join(' ')) + "\n </div>\n </div>\n </div>\n </div>\n </div>\n ").trim();
33203 PhotoBrowser
.prototype.renderStandalone
= function renderStandalone () {
33205 if (pb
.params
.renderStandalone
) { return pb
.params
.renderStandalone
.call(pb
); }
33206 var standaloneHtml
= "<div class=\"popup photo-browser-popup photo-browser-standalone popup-tablet-fullscreen\">" + (pb
.render()) + "</div>";
33207 return standaloneHtml
;
33210 PhotoBrowser
.prototype.renderPage
= function renderPage () {
33212 if (pb
.params
.renderPage
) { return pb
.params
.renderPage
.call(pb
); }
33213 var pageHtml
= pb
.render();
33218 PhotoBrowser
.prototype.renderPopup
= function renderPopup () {
33220 if (pb
.params
.renderPopup
) { return pb
.params
.renderPopup
.call(pb
); }
33221 var popupHtml
= "<div class=\"popup photo-browser-popup\">" + (pb
.render()) + "</div>";
33227 PhotoBrowser
.prototype.onOpen
= function onOpen (type
, el
) {
33232 $el
[0].f7PhotoBrowser
= pb
;
33236 pb
.openedIn
= type
;
33239 pb
.$swiperContainerEl
= pb
.$el
.find('.photo-browser-swiper-container');
33240 pb
.$swiperWrapperEl
= pb
.$el
.find('.photo-browser-swiper-wrapper');
33241 pb
.slides
= pb
.$el
.find('.photo-browser-slide');
33242 pb
.$captionsContainerEl
= pb
.$el
.find('.photo-browser-captions');
33243 pb
.captions
= pb
.$el
.find('.photo-browser-caption');
33246 var swiperParams
= Utils
.extend({}, pb
.params
.swiper
, {
33247 initialSlide
: pb
.activeIndex
,
33249 tap
: function tap(e
) {
33250 pb
.emit('local::tap', e
);
33252 click
: function click(e
) {
33253 if (pb
.params
.exposition
) {
33254 pb
.expositionToggle();
33256 pb
.emit('local::click', e
);
33258 doubleTap
: function doubleTap(e
) {
33259 pb
.emit('local::doubleTap', e
);
33261 slideChange
: function slideChange() {
33262 var args
= [], len
= arguments
.length
;
33263 while ( len
-- ) args
[ len
] = arguments
[ len
];
33266 pb
.onSlideChange(swiper
);
33267 pb
.emit
.apply(pb
, [ 'local::slideChange' ].concat( args
));
33269 transitionStart
: function transitionStart() {
33270 var args
= [], len
= arguments
.length
;
33271 while ( len
-- ) args
[ len
] = arguments
[ len
];
33273 pb
.emit
.apply(pb
, [ 'local::transitionStart' ].concat( args
));
33275 transitionEnd
: function transitionEnd() {
33276 var args
= [], len
= arguments
.length
;
33277 while ( len
-- ) args
[ len
] = arguments
[ len
];
33279 pb
.emit
.apply(pb
, [ 'local::transitionEnd' ].concat( args
));
33281 slideChangeTransitionStart
: function slideChangeTransitionStart() {
33282 var args
= [], len
= arguments
.length
;
33283 while ( len
-- ) args
[ len
] = arguments
[ len
];
33285 pb
.emit
.apply(pb
, [ 'local::slideChangeTransitionStart' ].concat( args
));
33287 slideChangeTransitionEnd
: function slideChangeTransitionEnd() {
33288 var args
= [], len
= arguments
.length
;
33289 while ( len
-- ) args
[ len
] = arguments
[ len
];
33291 pb
.emit
.apply(pb
, [ 'local::slideChangeTransitionEnd' ].concat( args
));
33293 lazyImageLoad
: function lazyImageLoad() {
33294 var args
= [], len
= arguments
.length
;
33295 while ( len
-- ) args
[ len
] = arguments
[ len
];
33297 pb
.emit
.apply(pb
, [ 'local::lazyImageLoad' ].concat( args
));
33299 lazyImageReady
: function lazyImageReady() {
33300 var args
= [], len
= arguments
.length
;
33301 while ( len
-- ) args
[ len
] = arguments
[ len
];
33303 var slideEl
= args
[0];
33304 $(slideEl
).removeClass('photo-browser-slide-lazy');
33305 pb
.emit
.apply(pb
, [ 'local::lazyImageReady' ].concat( args
));
33309 if (pb
.params
.swipeToClose
&& pb
.params
.type
!== 'page') {
33310 Utils
.extend(swiperParams
.on
, {
33311 touchStart
: function touchStart(e
) {
33312 pb
.onTouchStart(e
);
33313 pb
.emit('local::touchStart', e
);
33315 touchMoveOpposite
: function touchMoveOpposite(e
) {
33317 pb
.emit('local::touchMoveOpposite', e
);
33319 touchEnd
: function touchEnd(e
) {
33321 pb
.emit('local::touchEnd', e
);
33325 if (pb
.params
.virtualSlides
) {
33326 Utils
.extend(swiperParams
, {
33328 slides
: pb
.params
.photos
,
33329 renderSlide
: function renderSlide(photo
, index
) {
33330 if (photo
.html
|| ((typeof photo
=== 'string' || photo
instanceof String
) && photo
.indexOf('<') >= 0 && photo
.indexOf('>') >= 0)) {
33331 return pb
.renderObject(photo
, index
);
33333 if (pb
.params
.swiper
.lazy
=== true || (pb
.params
.swiper
.lazy
&& pb
.params
.swiper
.lazy
.enabled
)) {
33334 return pb
.renderLazyPhoto(photo
, index
);
33336 return pb
.renderPhoto(photo
, index
);
33342 pb
.swiper
= app
.swiper
.create(pb
.$swiperContainerEl
, swiperParams
);
33344 if (pb
.activeIndex
=== 0) {
33345 pb
.onSlideChange(pb
.swiper
);
33348 pb
.$el
.trigger('photobrowser:open');
33350 pb
.emit('local::open photoBrowserOpen', pb
);
33353 PhotoBrowser
.prototype.onOpened
= function onOpened () {
33357 pb
.$el
.trigger('photobrowser:opened');
33359 pb
.emit('local::opened photoBrowserOpened', pb
);
33362 PhotoBrowser
.prototype.onClose
= function onClose () {
33364 if (pb
.destroyed
) { return; }
33367 if (pb
.swiper
&& pb
.swiper
.destroy
) {
33368 pb
.swiper
.destroy(true, false);
33373 pb
.$el
.trigger('photobrowser:close');
33375 pb
.emit('local::close photoBrowserClose', pb
);
33378 PhotoBrowser
.prototype.onClosed
= function onClosed () {
33380 if (pb
.destroyed
) { return; }
33387 pb
.$el
.trigger('photobrowser:closed');
33389 pb
.emit('local::closed photoBrowserClosed', pb
);
33393 PhotoBrowser
.prototype.openPage
= function openPage () {
33395 if (pb
.opened
) { return pb
; }
33397 var pageHtml
= pb
.renderPage();
33399 pb
.view
.router
.navigate({
33405 pageBeforeIn
: function pageBeforeIn(e
, page
) {
33406 pb
.view
.$el
.addClass(("with-photo-browser-page with-photo-browser-page-" + (pb
.params
.theme
)));
33407 pb
.onOpen('page', page
.el
);
33409 pageAfterIn
: function pageAfterIn(e
, page
) {
33410 pb
.onOpened('page', page
.el
);
33412 pageBeforeOut
: function pageBeforeOut(e
, page
) {
33413 pb
.view
.$el
.removeClass(("with-photo-browser-page with-photo-browser-page-exposed with-photo-browser-page-" + (pb
.params
.theme
)));
33414 pb
.onClose('page', page
.el
);
33416 pageAfterOut
: function pageAfterOut(e
, page
) {
33417 pb
.onClosed('page', page
.el
);
33425 PhotoBrowser
.prototype.openStandalone
= function openStandalone () {
33427 if (pb
.opened
) { return pb
; }
33429 var standaloneHtml
= pb
.renderStandalone();
33431 var popupParams
= {
33433 content
: standaloneHtml
,
33435 popupOpen
: function popupOpen(popup
) {
33436 pb
.onOpen('popup', popup
.el
);
33438 popupOpened
: function popupOpened(popup
) {
33439 pb
.onOpened('popup', popup
.el
);
33441 popupClose
: function popupClose(popup
) {
33442 pb
.onClose('popup', popup
.el
);
33444 popupClosed
: function popupClosed(popup
) {
33445 pb
.onClosed('popup', popup
.el
);
33450 if (pb
.params
.routableModals
) {
33451 pb
.view
.router
.navigate({
33455 popup
: popupParams
,
33459 pb
.modal
= pb
.app
.popup
.create(popupParams
).open();
33464 PhotoBrowser
.prototype.openPopup
= function openPopup () {
33466 if (pb
.opened
) { return pb
; }
33468 var popupHtml
= pb
.renderPopup();
33470 var popupParams
= {
33471 content
: popupHtml
,
33473 popupOpen
: function popupOpen(popup
) {
33474 pb
.onOpen('popup', popup
.el
);
33476 popupOpened
: function popupOpened(popup
) {
33477 pb
.onOpened('popup', popup
.el
);
33479 popupClose
: function popupClose(popup
) {
33480 pb
.onClose('popup', popup
.el
);
33482 popupClosed
: function popupClosed(popup
) {
33483 pb
.onClosed('popup', popup
.el
);
33488 if (pb
.params
.routableModals
) {
33489 pb
.view
.router
.navigate({
33493 popup
: popupParams
,
33497 pb
.modal
= pb
.app
.popup
.create(popupParams
).open();
33503 PhotoBrowser
.prototype.expositionEnable
= function expositionEnable () {
33505 if (pb
.params
.type
=== 'page') {
33506 pb
.view
.$el
.addClass('with-photo-browser-page-exposed');
33508 if (pb
.$el
) { pb
.$el
.addClass('photo-browser-exposed'); }
33509 if (pb
.params
.expositionHideCaptions
) { pb
.$captionsContainerEl
.addClass('photo-browser-captions-exposed'); }
33514 PhotoBrowser
.prototype.expositionDisable
= function expositionDisable () {
33516 if (pb
.params
.type
=== 'page') {
33517 pb
.view
.$el
.removeClass('with-photo-browser-page-exposed');
33519 if (pb
.$el
) { pb
.$el
.removeClass('photo-browser-exposed'); }
33520 if (pb
.params
.expositionHideCaptions
) { pb
.$captionsContainerEl
.removeClass('photo-browser-captions-exposed'); }
33521 pb
.exposed
= false;
33525 PhotoBrowser
.prototype.expositionToggle
= function expositionToggle () {
33527 if (pb
.params
.type
=== 'page') {
33528 pb
.view
.$el
.toggleClass('with-photo-browser-page-exposed');
33530 if (pb
.$el
) { pb
.$el
.toggleClass('photo-browser-exposed'); }
33531 if (pb
.params
.expositionHideCaptions
) { pb
.$captionsContainerEl
.toggleClass('photo-browser-captions-exposed'); }
33532 pb
.exposed
= !pb
.exposed
;
33536 PhotoBrowser
.prototype.open
= function open (index
) {
33538 var type
= pb
.params
.type
;
33540 if (pb
.swiper
&& typeof index
!== 'undefined') {
33541 pb
.swiper
.slideTo(parseInt(index
, 10));
33545 if (typeof index
!== 'undefined') {
33546 pb
.activeIndex
= index
;
33548 if (type
=== 'standalone') {
33549 pb
.openStandalone();
33551 if (type
=== 'page') {
33554 if (type
=== 'popup') {
33560 PhotoBrowser
.prototype.close
= function close () {
33562 if (!pb
.opened
) { return pb
; }
33563 if (pb
.params
.routableModals
|| pb
.openedIn
=== 'page') {
33564 if (pb
.view
) { pb
.view
.router
.back(); }
33566 pb
.modal
.once('modalClosed', function () {
33567 Utils
.nextTick(function () {
33568 pb
.modal
.destroy();
33576 // eslint-disable-next-line
33577 PhotoBrowser
.prototype.init
= function init () {};
33579 PhotoBrowser
.prototype.destroy
= function destroy () {
33581 pb
.emit('local::beforeDestroy photoBrowserBeforeDestroy', pb
);
33583 pb
.$el
.trigger('photobrowser:beforedestroy');
33584 pb
.$el
[0].f7PhotoBrowser
= null;
33585 delete pb
.$el
[0].f7PhotoBrowser
;
33587 Utils
.deleteProps(pb
);
33591 return PhotoBrowser
;
33592 }(Framework7Class
));
33594 var PhotoBrowser
$1 = {
33595 name
: 'photoBrowser',
33600 expositionHideCaptions
: false,
33601 type
: 'standalone',
33605 captionsTheme
: undefined,
33606 iconsColor
: undefined,
33607 swipeToClose
: true,
33608 backLinkText
: 'Close',
33609 navbarOfText
: 'of',
33612 routableModals
: true,
33613 virtualSlides
: true,
33615 renderNavbar
: undefined,
33616 renderToolbar
: undefined,
33617 renderCaption
: undefined,
33618 renderObject
: undefined,
33619 renderLazyPhoto
: undefined,
33620 renderPhoto
: undefined,
33621 renderPage
: undefined,
33622 renderPopup
: undefined,
33623 renderStandalone
: undefined,
33630 preloadImages
: true,
33632 nextEl
: '.photo-browser-next',
33633 prevEl
: '.photo-browser-prev',
33646 create
: function create() {
33648 app
.photoBrowser
= ConstructorMethods({
33649 defaultSelector
: '.photo-browser',
33650 constructor: PhotoBrowser
,
33652 domProp
: 'f7PhotoBrowser',
33656 PhotoBrowser
: PhotoBrowser
,
33660 var Notification
= /*@__PURE__*/(function (Modal
$$1) {
33661 function Notification(app
, params
) {
33662 var extendedParams
= Utils
.extend({
33664 }, app
.params
.notification
, params
);
33666 // Extends with open/close Modal methods;
33667 Modal
$$1.call(this, app
, extendedParams
);
33669 var notification
= this;
33671 notification
.app
= app
;
33673 notification
.params
= extendedParams
;
33675 var ref
= notification
.params
;
33676 var icon
= ref
.icon
;
33677 var title
= ref
.title
;
33678 var titleRightText
= ref
.titleRightText
;
33679 var subtitle
= ref
.subtitle
;
33680 var text
= ref
.text
;
33681 var closeButton
= ref
.closeButton
;
33682 var closeTimeout
= ref
.closeTimeout
;
33683 var cssClass
= ref
.cssClass
;
33684 var closeOnClick
= ref
.closeOnClick
;
33687 if (!notification
.params
.el
) {
33689 var notificationHtml
= notification
.render({
33692 titleRightText
: titleRightText
,
33693 subtitle
: subtitle
,
33695 closeButton
: closeButton
,
33696 cssClass
: cssClass
,
33699 $el
= $(notificationHtml
);
33701 $el
= $(notification
.params
.el
);
33704 if ($el
&& $el
.length
> 0 && $el
[0].f7Modal
) {
33705 return $el
[0].f7Modal
;
33708 if ($el
.length
=== 0) {
33709 return notification
.destroy();
33712 Utils
.extend(notification
, {
33715 type
: 'notification',
33718 $el
[0].f7Modal
= notification
;
33721 $el
.find('.notification-close-button').on('click', function () {
33722 notification
.close();
33725 $el
.on('click', function (e
) {
33726 if (closeButton
&& $(e
.target
).closest('.notification-close-button').length
) {
33729 notification
.emit('local::click notificationClick', notification
);
33730 if (closeOnClick
) { notification
.close(); }
33733 notification
.on('beforeDestroy', function () {
33742 var touchStartTime
;
33743 var notificationHeight
;
33744 var touchesStart
= {};
33745 function handleTouchStart(e
) {
33746 if (isTouched
) { return; }
33749 isScrolling
= undefined;
33750 touchStartTime
= Utils
.now();
33751 touchesStart
.x
= e
.type
=== 'touchstart' ? e
.targetTouches
[0].pageX
: e
.pageX
;
33752 touchesStart
.y
= e
.type
=== 'touchstart' ? e
.targetTouches
[0].pageY
: e
.pageY
;
33754 function handleTouchMove(e
) {
33755 if (!isTouched
) { return; }
33756 var pageX
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageX
: e
.pageX
;
33757 var pageY
= e
.type
=== 'touchmove' ? e
.targetTouches
[0].pageY
: e
.pageY
;
33758 if (typeof isScrolling
=== 'undefined') {
33759 isScrolling
= !!(isScrolling
|| Math
.abs(pageY
- touchesStart
.y
) < Math
.abs(pageX
- touchesStart
.x
));
33765 e
.preventDefault();
33767 notification
.$el
.removeClass('notification-transitioning');
33768 notification
.$el
.transition(0);
33769 notificationHeight
= notification
.$el
[0].offsetHeight
/ 2;
33772 touchesDiff
= (pageY
- touchesStart
.y
);
33773 var newTranslate
= touchesDiff
;
33774 if (touchesDiff
> 0) {
33775 newTranslate
= Math
.pow( touchesDiff
, 0.8 );
33777 notification
.$el
.transform(("translate3d(0, " + newTranslate
+ "px, 0)"));
33779 function handleTouchEnd() {
33780 if (!isTouched
|| !isMoved
) {
33787 if (touchesDiff
=== 0) {
33791 var timeDiff
= Utils
.now() - touchStartTime
;
33792 notification
.$el
.transition('');
33793 notification
.$el
.addClass('notification-transitioning');
33794 notification
.$el
.transform('');
33797 (touchesDiff
< -10 && timeDiff
< 300)
33798 || (-touchesDiff
>= notificationHeight
/ 1)
33800 notification
.close();
33804 function attachTouchEvents() {
33806 notification
.$el
.on(app
.touchEvents
.start
, handleTouchStart
, { passive
: true });
33807 app
.on('touchmove:active', handleTouchMove
);
33808 app
.on('touchend:passive', handleTouchEnd
);
33811 function detachTouchEvents() {
33813 notification
.$el
.off(app
.touchEvents
.start
, handleTouchStart
, { passive
: true });
33814 app
.off('touchmove:active', handleTouchMove
);
33815 app
.off('touchend:passive', handleTouchEnd
);
33820 function closeOnTimeout() {
33821 timeoutId
= Utils
.nextTick(function () {
33822 if (isTouched
&& isMoved
) {
33826 notification
.close();
33829 notification
.on('open', function () {
33830 if (notification
.params
.swipeToClose
) {
33831 attachTouchEvents();
33833 $('.notification.modal-in').each(function (index
, openedEl
) {
33834 var notificationInstance
= app
.notification
.get(openedEl
);
33835 if (openedEl
!== notification
.el
&& notificationInstance
) {
33836 notificationInstance
.close();
33839 if (closeTimeout
) {
33843 notification
.on('close beforeDestroy', function () {
33844 if (notification
.params
.swipeToClose
) {
33845 detachTouchEvents();
33847 win
.clearTimeout(timeoutId
);
33850 return notification
;
33853 if ( Modal
$$1 ) Notification
.__proto__
= Modal
$$1;
33854 Notification
.prototype = Object
.create( Modal
$$1 && Modal
$$1.prototype );
33855 Notification
.prototype.constructor = Notification
;
33857 Notification
.prototype.render
= function render () {
33858 var notification
= this;
33859 if (notification
.params
.render
) { return notification
.params
.render
.call(notification
, notification
); }
33860 var ref
= notification
.params
;
33861 var icon
= ref
.icon
;
33862 var title
= ref
.title
;
33863 var titleRightText
= ref
.titleRightText
;
33864 var subtitle
= ref
.subtitle
;
33865 var text
= ref
.text
;
33866 var closeButton
= ref
.closeButton
;
33867 var cssClass
= ref
.cssClass
;
33868 return ("\n <div class=\"notification " + (cssClass
|| '') + "\">\n <div class=\"notification-header\">\n " + (icon
? ("<div class=\"notification-icon\">" + icon
+ "</div>") : '') + "\n " + (title
? ("<div class=\"notification-title\">" + title
+ "</div>") : '') + "\n " + (titleRightText
? ("<div class=\"notification-title-right-text\">" + titleRightText
+ "</div>") : '') + "\n " + (closeButton
? '<span class="notification-close-button"></span>' : '') + "\n </div>\n <div class=\"notification-content\">\n " + (subtitle
? ("<div class=\"notification-subtitle\">" + subtitle
+ "</div>") : '') + "\n " + (text
? ("<div class=\"notification-text\">" + text
+ "</div>") : '') + "\n </div>\n </div>\n ").trim();
33871 return Notification
;
33874 var Notification
$1 = {
33875 name
: 'notification',
33877 Notification
: Notification
,
33879 create
: function create() {
33881 app
.notification
= Utils
.extend(
33885 constructor: Notification
,
33886 defaultSelector
: '.notification.modal-in',
33894 titleRightText
: null,
33897 closeButton
: false,
33898 closeTimeout
: null,
33899 closeOnClick
: false,
33900 swipeToClose
: true,
33907 /* eslint "no-useless-escape": "off" */
33909 var Autocomplete
= /*@__PURE__*/(function (Framework7Class
$$1) {
33910 function Autocomplete(app
, params
) {
33911 if ( params
=== void 0 ) params
= {};
33913 Framework7Class
$$1.call(this, params
, [app
]);
33918 var defaults
= Utils
.extend({
33920 }, app
.params
.autocomplete
);
33923 // Extend defaults with modules params
33924 ac
.useModulesParams(defaults
);
33926 ac
.params
= Utils
.extend(defaults
, params
);
33929 if (ac
.params
.openerEl
) {
33930 $openerEl
= $(ac
.params
.openerEl
);
33931 if ($openerEl
.length
) { $openerEl
[0].f7Autocomplete
= ac
; }
33935 if (ac
.params
.inputEl
) {
33936 $inputEl
= $(ac
.params
.inputEl
);
33937 if ($inputEl
.length
) { $inputEl
[0].f7Autocomplete
= ac
; }
33941 if (ac
.params
.view
) {
33942 view
= ac
.params
.view
;
33943 } else if ($openerEl
|| $inputEl
) {
33944 view
= app
.views
.get($openerEl
|| $inputEl
);
33946 if (!view
) { view
= app
.views
.main
; }
33948 var id
= Utils
.id();
33950 var url
= params
.url
;
33951 if (!url
&& $openerEl
&& $openerEl
.length
) {
33952 if ($openerEl
.attr('href')) { url
= $openerEl
.attr('href'); }
33953 else if ($openerEl
.find('a').length
> 0) {
33954 url
= $openerEl
.find('a').attr('href');
33957 if (!url
|| url
=== '#' || url
=== '') { url
= ac
.params
.url
; }
33959 var inputType
= ac
.params
.multiple
? 'checkbox' : 'radio';
33962 $openerEl
: $openerEl
,
33963 openerEl
: $openerEl
&& $openerEl
[0],
33964 $inputEl
: $inputEl
,
33965 inputEl
: $inputEl
&& $inputEl
[0],
33969 value
: ac
.params
.value
|| [],
33970 inputType
: inputType
,
33971 inputName
: (inputType
+ "-" + id
),
33972 $modalEl
: undefined,
33973 $dropdownEl
: undefined,
33976 var previousQuery
= '';
33977 function onInputChange() {
33978 var query
= ac
.$inputEl
.val().trim();
33980 if (!ac
.params
.source
) { return; }
33981 ac
.params
.source
.call(ac
, query
, function (items
) {
33982 var itemsHTML
= '';
33983 var limit
= ac
.params
.limit
? Math
.min(ac
.params
.limit
, items
.length
) : items
.length
;
33986 if (ac
.params
.highlightMatches
) {
33987 query
= query
.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
33988 regExp
= new RegExp(("(" + query
+ ")"), 'i');
33993 for (var i
= 0; i
< limit
; i
+= 1) {
33994 var itemValue
= typeof items
[i
] === 'object' ? items
[i
][ac
.params
.valueProperty
] : items
[i
];
33995 var itemText
= typeof items
[i
] === 'object' ? items
[i
][ac
.params
.textProperty
] : items
[i
];
33997 firstValue
= itemValue
;
33998 firstItem
= ac
.items
[i
];
34000 itemsHTML
+= ac
.renderItem({
34002 text
: ac
.params
.highlightMatches
? itemText
.replace(regExp
, '<b>$1</b>') : itemText
,
34005 if (itemsHTML
=== '' && query
=== '' && ac
.params
.dropdownPlaceholderText
) {
34006 itemsHTML
+= ac
.renderItem({
34008 text
: ac
.params
.dropdownPlaceholderText
,
34011 ac
.$dropdownEl
.find('ul').html(itemsHTML
);
34012 if (ac
.params
.typeahead
) {
34013 if (!firstValue
|| !firstItem
) {
34016 if (firstValue
.toLowerCase().indexOf(query
.toLowerCase()) !== 0) {
34019 if (previousQuery
.toLowerCase() === query
.toLowerCase()) {
34024 if (previousQuery
.toLowerCase().indexOf(query
.toLowerCase()) === 0) {
34025 previousQuery
= query
;
34029 $inputEl
.val(firstValue
);
34030 $inputEl
[0].setSelectionRange(query
.length
, firstValue
.length
);
34032 var previousValue
= typeof ac
.value
[0] === 'object' ? ac
.value
[0][ac
.params
.valueProperty
] : ac
.value
[0];
34033 if (!previousValue
|| firstValue
.toLowerCase() !== previousValue
.toLowerCase()) {
34034 ac
.value
= [firstItem
];
34035 ac
.emit('local::change autocompleteChange', [firstItem
]);
34039 previousQuery
= query
;
34042 function onPageInputChange() {
34044 var value
= input
.value
;
34045 var isValues
= $(input
).parents('.autocomplete-values').length
> 0;
34050 if (ac
.inputType
=== 'checkbox' && !input
.checked
) {
34051 for (var i
= 0; i
< ac
.value
.length
; i
+= 1) {
34052 aValue
= typeof ac
.value
[i
] === 'string' ? ac
.value
[i
] : ac
.value
[i
][ac
.params
.valueProperty
];
34053 if (aValue
=== value
|| aValue
* 1 === value
* 1) {
34054 ac
.value
.splice(i
, 1);
34058 ac
.emit('local::change autocompleteChange', ac
.value
);
34063 // Find Related Item
34064 for (var i
$1 = 0; i
$1 < ac
.items
.length
; i
$1 += 1) {
34065 itemValue
= typeof ac
.items
[i
$1] === 'object' ? ac
.items
[i
$1][ac
.params
.valueProperty
] : ac
.items
[i
$1];
34066 if (itemValue
=== value
|| itemValue
* 1 === value
* 1) { item
= ac
.items
[i
$1]; }
34068 if (ac
.inputType
=== 'radio') {
34070 } else if (input
.checked
) {
34071 ac
.value
.push(item
);
34073 for (var i
$2 = 0; i
$2 < ac
.value
.length
; i
$2 += 1) {
34074 aValue
= typeof ac
.value
[i
$2] === 'object' ? ac
.value
[i
$2][ac
.params
.valueProperty
] : ac
.value
[i
$2];
34075 if (aValue
=== value
|| aValue
* 1 === value
* 1) {
34076 ac
.value
.splice(i
$2, 1);
34081 // Update Values Block
34084 // On Select Callback
34085 if (((ac
.inputType
=== 'radio' && input
.checked
) || ac
.inputType
=== 'checkbox')) {
34086 ac
.emit('local::change autocompleteChange', ac
.value
);
34089 function onHtmlClick(e
) {
34090 var $targetEl
= $(e
.target
);
34091 if ($targetEl
.is(ac
.$inputEl
[0]) || (ac
.$dropdownEl
&& $targetEl
.closest(ac
.$dropdownEl
[0]).length
)) { return; }
34094 function onOpenerClick() {
34097 function onInputFocus() {
34100 function onInputBlur() {
34101 if (ac
.$dropdownEl
.find('label.active-state').length
> 0) { return; }
34104 function onResize() {
34105 ac
.positionDropdown();
34108 function onKeyDown(e
) {
34109 if (ac
.opened
&& e
.keyCode
=== 13) {
34110 e
.preventDefault();
34111 ac
.$inputEl
.blur();
34114 function onDropdownclick() {
34115 var $clickedEl
= $(this);
34117 for (var i
= 0; i
< ac
.items
.length
; i
+= 1) {
34118 var itemValue
= typeof ac
.items
[i
] === 'object' ? ac
.items
[i
][ac
.params
.valueProperty
] : ac
.items
[i
];
34119 var value
= $clickedEl
.attr('data-value');
34120 if (itemValue
=== value
|| itemValue
* 1 === value
* 1) {
34121 clickedItem
= ac
.items
[i
];
34124 if (ac
.params
.updateInputValueOnSelect
) {
34125 ac
.$inputEl
.val(typeof clickedItem
=== 'object' ? clickedItem
[ac
.params
.valueProperty
] : clickedItem
);
34126 ac
.$inputEl
.trigger('input change');
34128 ac
.value
= [clickedItem
];
34129 ac
.emit('local::change autocompleteChange', [clickedItem
]);
34134 ac
.attachEvents
= function attachEvents() {
34135 if (ac
.params
.openIn
!== 'dropdown' && ac
.$openerEl
) {
34136 ac
.$openerEl
.on('click', onOpenerClick
);
34138 if (ac
.params
.openIn
=== 'dropdown' && ac
.$inputEl
) {
34139 ac
.$inputEl
.on('focus', onInputFocus
);
34140 ac
.$inputEl
.on(ac
.params
.inputEvents
, onInputChange
);
34141 if (app
.device
.android
) {
34142 $('html').on('click', onHtmlClick
);
34144 ac
.$inputEl
.on('blur', onInputBlur
);
34146 if (ac
.params
.typeahead
) {
34147 ac
.$inputEl
.on('keydown', onKeyDown
);
34151 ac
.detachEvents
= function attachEvents() {
34152 if (ac
.params
.openIn
!== 'dropdown' && ac
.$openerEl
) {
34153 ac
.$openerEl
.off('click', onOpenerClick
);
34155 if (ac
.params
.openIn
=== 'dropdown' && ac
.$inputEl
) {
34156 ac
.$inputEl
.off('focus', onInputFocus
);
34157 ac
.$inputEl
.off(ac
.params
.inputEvents
, onInputChange
);
34158 if (app
.device
.android
) {
34159 $('html').off('click', onHtmlClick
);
34161 ac
.$inputEl
.off('blur', onInputBlur
);
34163 if (ac
.params
.typeahead
) {
34164 ac
.$inputEl
.off('keydown', onKeyDown
);
34168 ac
.attachDropdownEvents
= function attachDropdownEvents() {
34169 ac
.$dropdownEl
.on('click', 'label', onDropdownclick
);
34170 app
.on('resize', onResize
);
34172 ac
.detachDropdownEvents
= function detachDropdownEvents() {
34173 ac
.$dropdownEl
.off('click', 'label', onDropdownclick
);
34174 app
.off('resize', onResize
);
34177 ac
.attachPageEvents
= function attachPageEvents() {
34178 ac
.$el
.on('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange
);
34179 if (ac
.params
.closeOnSelect
&& !ac
.params
.multiple
) {
34180 ac
.$el
.once('click', '.list label', function () {
34181 Utils
.nextTick(function () {
34187 ac
.detachPageEvents
= function detachPageEvents() {
34188 ac
.$el
.off('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange
);
34200 if ( Framework7Class
$$1 ) Autocomplete
.__proto__
= Framework7Class
$$1;
34201 Autocomplete
.prototype = Object
.create( Framework7Class
$$1 && Framework7Class
$$1.prototype );
34202 Autocomplete
.prototype.constructor = Autocomplete
;
34204 Autocomplete
.prototype.positionDropdown
= function positionDropdown () {
34208 var $inputEl
= ac
.$inputEl
;
34210 var $dropdownEl
= ac
.$dropdownEl
;
34212 var $pageContentEl
= $inputEl
.parents('.page-content');
34213 if ($pageContentEl
.length
=== 0) { return; }
34214 var inputOffset
= $inputEl
.offset();
34215 var inputOffsetWidth
= $inputEl
[0].offsetWidth
;
34216 var inputOffsetHeight
= $inputEl
[0].offsetHeight
;
34217 var $listEl
= $inputEl
.parents('.list');
34220 $listEl
.parents().each(function (index
, parentEl
) {
34221 if ($listParent
) { return; }
34222 var $parentEl
= $(parentEl
);
34223 if ($parentEl
.parent($pageContentEl
).length
) { $listParent
= $parentEl
; }
34226 var listOffset
= $listEl
.offset();
34227 var paddingBottom
= parseInt($pageContentEl
.css('padding-bottom'), 10);
34228 var listOffsetLeft
= $listEl
.length
> 0 ? listOffset
.left
- $pageContentEl
.offset().left
: 0;
34229 var inputOffsetLeft
= inputOffset
.left
- ($listEl
.length
> 0 ? listOffset
.left
: 0) - (app
.rtl
? 0 : 0);
34230 var inputOffsetTop
= inputOffset
.top
- ($pageContentEl
.offset().top
- $pageContentEl
[0].scrollTop
);
34232 var maxHeight
= $pageContentEl
[0].scrollHeight
- paddingBottom
- (inputOffsetTop
+ $pageContentEl
[0].scrollTop
) - $inputEl
[0].offsetHeight
;
34234 var paddingProp
= app
.rtl
? 'padding-right' : 'padding-left';
34236 if ($listEl
.length
&& !ac
.params
.expandInput
) {
34237 paddingValue
= (app
.rtl
? $listEl
[0].offsetWidth
- inputOffsetLeft
- inputOffsetWidth
: inputOffsetLeft
) - (app
.theme
=== 'md' ? 16 : 15);
34241 left
: (($listEl
.length
> 0 ? listOffsetLeft
: inputOffsetLeft
) + "px"),
34242 top
: ((inputOffsetTop
+ $pageContentEl
[0].scrollTop
+ inputOffsetHeight
) + "px"),
34243 width
: (($listEl
.length
> 0 ? $listEl
[0].offsetWidth
: inputOffsetWidth
) + "px"),
34245 $dropdownEl
.children('.autocomplete-dropdown-inner').css(( obj
= {
34246 maxHeight
: (maxHeight
+ "px")
34247 }, obj
[paddingProp
] = $listEl
.length
> 0 && !ac
.params
.expandInput
? (paddingValue
+ "px") : '', obj
));
34250 Autocomplete
.prototype.focus
= function focus () {
34252 ac
.$el
.find('input[type=search]').focus();
34255 Autocomplete
.prototype.source
= function source (query
) {
34257 if (!ac
.params
.source
) { return; }
34261 ac
.params
.source
.call(ac
, query
, function (items
) {
34262 var itemsHTML
= '';
34263 var limit
= ac
.params
.limit
? Math
.min(ac
.params
.limit
, items
.length
) : items
.length
;
34265 for (var i
= 0; i
< limit
; i
+= 1) {
34266 var selected
= false;
34267 var itemValue
= typeof items
[i
] === 'object' ? items
[i
][ac
.params
.valueProperty
] : items
[i
];
34268 for (var j
= 0; j
< ac
.value
.length
; j
+= 1) {
34269 var aValue
= typeof ac
.value
[j
] === 'object' ? ac
.value
[j
][ac
.params
.valueProperty
] : ac
.value
[j
];
34270 if (aValue
=== itemValue
|| aValue
* 1 === itemValue
* 1) { selected
= true; }
34272 itemsHTML
+= ac
.renderItem({
34274 text
: typeof items
[i
] === 'object' ? items
[i
][ac
.params
.textProperty
] : items
[i
],
34275 inputType
: ac
.inputType
,
34277 inputName
: ac
.inputName
,
34278 selected
: selected
,
34281 $el
.find('.autocomplete-found ul').html(itemsHTML
);
34282 if (items
.length
=== 0) {
34283 if (query
.length
!== 0) {
34284 $el
.find('.autocomplete-not-found').show();
34285 $el
.find('.autocomplete-found, .autocomplete-values').hide();
34287 $el
.find('.autocomplete-values').show();
34288 $el
.find('.autocomplete-found, .autocomplete-not-found').hide();
34291 $el
.find('.autocomplete-found').show();
34292 $el
.find('.autocomplete-not-found, .autocomplete-values').hide();
34297 Autocomplete
.prototype.updateValues
= function updateValues () {
34299 var valuesHTML
= '';
34300 for (var i
= 0; i
< ac
.value
.length
; i
+= 1) {
34301 valuesHTML
+= ac
.renderItem({
34302 value
: typeof ac
.value
[i
] === 'object' ? ac
.value
[i
][ac
.params
.valueProperty
] : ac
.value
[i
],
34303 text
: typeof ac
.value
[i
] === 'object' ? ac
.value
[i
][ac
.params
.textProperty
] : ac
.value
[i
],
34304 inputType
: ac
.inputType
,
34306 inputName
: ((ac
.inputName
) + "-checked}"),
34310 ac
.$el
.find('.autocomplete-values ul').html(valuesHTML
);
34313 Autocomplete
.prototype.preloaderHide
= function preloaderHide () {
34315 if (ac
.params
.openIn
=== 'dropdown' && ac
.$dropdownEl
) {
34316 ac
.$dropdownEl
.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
34318 $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
34322 Autocomplete
.prototype.preloaderShow
= function preloaderShow () {
34324 if (ac
.params
.openIn
=== 'dropdown' && ac
.$dropdownEl
) {
34325 ac
.$dropdownEl
.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
34327 $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
34331 Autocomplete
.prototype.renderPreloader
= function renderPreloader () {
34333 return ("\n <div class=\"autocomplete-preloader preloader " + (ac
.params
.preloaderColor
? ("color-" + (ac
.params
.preloaderColor
)) : '') + "\">" + (Utils
[((ac
.app
.theme
) + "PreloaderContent")] || '') + "</div>\n ").trim();
34336 Autocomplete
.prototype.renderSearchbar
= function renderSearchbar () {
34338 if (ac
.params
.renderSearchbar
) { return ac
.params
.renderSearchbar
.call(ac
); }
34339 var searchbarHTML
= ("\n <form class=\"searchbar\">\n <div class=\"searchbar-inner\">\n <div class=\"searchbar-input-wrap\">\n <input type=\"search\" placeholder=\"" + (ac
.params
.searchbarPlaceholder
) + "\"/>\n <i class=\"searchbar-icon\"></i>\n <span class=\"input-clear-button\"></span>\n </div>\n <span class=\"searchbar-disable-button\">" + (ac
.params
.searchbarDisableText
) + "</span>\n </div>\n </form>\n ").trim();
34340 return searchbarHTML
;
34343 Autocomplete
.prototype.renderItem
= function renderItem (item
, index
) {
34345 if (ac
.params
.renderItem
) { return ac
.params
.renderItem
.call(ac
, item
, index
); }
34347 var itemValue
= item
.value
&& typeof item
.value
=== 'string' ? item
.value
.replace(/"/g, '"') : item.value;
34348 if (ac.params.openIn !== 'dropdown') {
34349 itemHtml = "\n <li
>\n <label
class=\"item
-" + (item.inputType) + " item
-content
\">\n <input type
=\"" + (item.inputType) + "\" name
=\"" + (item.inputName) + "\" value
=\"" + itemValue + "\" " + (item.selected ? 'checked' : '') + ">\n <i
class=\"icon icon
-" + (item.inputType) + "\"></i>\n <div class=\"item-inner\">\n <div class=\"item-title\">" + (item.text) + "</div>\n </div>\n </label>\n </li
>\n ";
34350 } else if (!item.placeholder) {
34352 itemHtml = "\n <li
>\n <label
class=\"item
-radio item
-content
\" data
-value
=\"" + itemValue + "\">\n <div
class=\"item
-inner
\">\n <div
class=\"item
-title
\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
34354 // Dropwdown placeholder
34355 itemHtml = "\n <li
class=\"autocomplete
-dropdown
-placeholder
\">\n <label
class=\"item
-content
\">\n <div
class=\"item
-inner
\">\n <div
class=\"item
-title
\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
34357 return itemHtml.trim();
34360 Autocomplete.prototype.renderNavbar = function renderNavbar () {
34362 if (ac.params.renderNavbar) { return ac.params.renderNavbar.call(ac); }
34363 var pageTitle = ac.params.pageTitle;
34364 if (typeof pageTitle === 'undefined' && ac.$openerEl && ac.$openerEl.length) {
34365 pageTitle = ac.$openerEl.find('.item-title').text().trim();
34367 var navbarHtml = ("\n <div
class=\"navbar
" + (ac.params.navbarColorTheme ? ("color
-" + (ac.params.navbarColorTheme)) : '') + "\">\n <div
class=\"navbar
-inner
" + (ac.params.navbarColorTheme ? ("color
-" + (ac.params.navbarColorTheme)) : '') + "\">\n <div
class=\"left sliding
\">\n <a href
=\"#\" class=\"link
" + (ac.params.openIn === 'page' ? 'back' : 'popup-close') + "\" " + (ac.params.openIn === 'popup' ? 'data-popup=".autocomplete
-popup
"' : '') + ">\n <i
class=\"icon icon
-back
\"></i>\n <span class=\"ios-only\">" + (ac.params.openIn === 'page' ? ac.params.pageBackLinkText : ac.params.popupCloseLinkText) + "</span>\n </a>\n </div>\n " + (pageTitle ? ("<div
class=\"title sliding
\">" + pageTitle + "</div>") : '') + "\n " + (ac.params.preloader ? ("\n <div class=\"right\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n <div
class=\"subnavbar sliding
\">" + (ac.renderSearchbar()) + "</div>\n </div>\n </div
>\n ").trim();
34371 Autocomplete.prototype.renderDropdown = function renderDropdown () {
34373 if (ac.params.renderDropdown) { return ac.params.renderDropdown.call(ac, ac.items); }
34374 var dropdownHtml = ("\n <div
class=\"autocomplete
-dropdown
\">\n <div
class=\"autocomplete
-dropdown
-inner
\">\n <div
class=\"list
" + (!ac.params.expandInput ? 'no-safe-areas' : '') + "\">\n <ul
></ul>\n </div>\n </div>\n " + (ac.params.preloader ? ac.renderPreloader() : '') + "\n </div>\n ").trim();
34375 return dropdownHtml;
34378 Autocomplete.prototype.renderPage = function renderPage () {
34380 if (ac.params.renderPage) { return ac.params.renderPage.call(ac, ac.items); }
34382 var pageHtml = ("\n <div
class=\"page page
-with-subnavbar autocomplete
-page
\" data
-name
=\"autocomplete
-page
\">\n " + (ac.renderNavbar()) + "\n <div
class=\"searchbar
-backdrop
\"></div>\n <div class=\"page-content\">\n <div class=\"list autocomplete-list autocomplete-found autocomplete-list-" + (ac.id) + " " + (ac.params.formColorTheme ? ("color-" + (ac.params.formColorTheme)) : '') + "\">\n <ul></ul>\n </div>\n <div class=\"list autocomplete-not-found\">\n <ul>\n <li class=\"item-content\"><div class=\"item-inner\"><div class=\"item-title\">" + (ac.params.notFoundText) + "</div></div></li>\n </ul>\n </div>\n <div
class=\"list autocomplete
-values
\">\n <ul
></ul>\n </div>\n </div>\n </div>\n ").trim();
34386 Autocomplete.prototype.renderPopup = function renderPopup () {
34388 if (ac.params.renderPopup) { return ac.params.renderPopup.call(ac, ac.items); }
34389 var popupHtml = ("\n <div
class=\"popup autocomplete
-popup
\">\n <div
class=\"view
\">\n " + (ac.renderPage()) + ";\n </div>\n </div>\n ").trim();
34393 Autocomplete.prototype.onOpen = function onOpen (type, el) {
34399 ac.openedIn = type;
34402 if (ac.params.openIn === 'dropdown') {
34403 ac.attachDropdownEvents();
34405 ac.$dropdownEl.addClass('autocomplete-dropdown-in');
34406 ac.$inputEl.trigger('input');
34409 var $searchbarEl = $el.find('.searchbar');
34410 if (ac.params.openIn === 'page' && app.theme === 'ios' && $searchbarEl.length === 0) {
34411 $searchbarEl = $(app.navbar.getElByPage($el)).find('.searchbar');
34413 ac.searchbar = app.searchbar.create({
34415 backdropEl: $el.find('.searchbar-backdrop'),
34416 customSearch: true,
34418 search: function search(sb, query) {
34419 if (query.length === 0 && ac.searchbar.enabled) {
34420 ac.searchbar.backdropShow();
34422 ac.searchbar.backdropHide();
34429 // Attach page events
34430 ac.attachPageEvents();
34432 // Update Values On Page Init
34436 if (ac.params.requestSourceOnOpen) { ac.source(''); }
34439 ac.emit('local::open autocompleteOpen', ac);
34442 Autocomplete.prototype.autoFocus = function autoFocus () {
34444 if (ac.searchbar && ac.searchbar.$inputEl) {
34445 ac.searchbar.$inputEl.focus();
34450 Autocomplete.prototype.onOpened = function onOpened () {
34452 if (ac.params.openIn !== 'dropdown' && ac.params.autoFocus) {
34455 ac.emit('local::opened autocompleteOpened', ac);
34458 Autocomplete.prototype.onClose = function onClose () {
34460 if (ac.destroyed) { return; }
34463 if (ac.searchbar && ac.searchbar.destroy) {
34464 ac.searchbar.destroy();
34465 ac.searchbar = null;
34466 delete ac.searchbar;
34469 if (ac.params.openIn === 'dropdown') {
34470 ac.detachDropdownEvents();
34471 ac.$dropdownEl.removeClass('autocomplete-dropdown-in').remove();
34472 ac.$inputEl.parents('.item-content-dropdown-expanded').removeClass('item-content-dropdown-expanded');
34474 ac.detachPageEvents();
34477 ac.emit('local::close autocompleteClose', ac);
34480 Autocomplete.prototype.onClosed = function onClosed () {
34482 if (ac.destroyed) { return; }
34489 ac.emit('local::closed autocompleteClosed', ac);
34492 Autocomplete.prototype.openPage = function openPage () {
34494 if (ac.opened) { return ac; }
34495 var pageHtml = ac.renderPage();
34496 ac.view.router.navigate({
34502 pageBeforeIn: function pageBeforeIn(e, page) {
34503 ac.onOpen('page', page.el);
34505 pageAfterIn: function pageAfterIn(e, page) {
34506 ac.onOpened('page', page.el);
34508 pageBeforeOut: function pageBeforeOut(e, page) {
34509 ac.onClose('page', page.el);
34511 pageAfterOut: function pageAfterOut(e, page) {
34512 ac.onClosed('page', page.el);
34516 animate: ac.params.animate,
34523 Autocomplete.prototype.openPopup = function openPopup () {
34525 if (ac.opened) { return ac; }
34526 var popupHtml = ac.renderPopup();
34528 var popupParams = {
34529 content: popupHtml,
34530 animate: ac.params.animate,
34532 popupOpen: function popupOpen(popup) {
34533 ac.onOpen('popup', popup.el);
34535 popupOpened: function popupOpened(popup) {
34536 ac.onOpened('popup', popup.el);
34538 popupClose: function popupClose(popup) {
34539 ac.onClose('popup', popup.el);
34541 popupClosed: function popupClosed(popup) {
34542 ac.onClosed('popup', popup.el);
34547 if (ac.params.routableModals) {
34548 ac.view.router.navigate({
34552 popup: popupParams,
34556 ac.modal = ac.app.popup.create(popupParams).open(ac.params.animate);
34561 Autocomplete.prototype.openDropdown = function openDropdown () {
34564 if (!ac.$dropdownEl) {
34565 ac.$dropdownEl = $(ac.renderDropdown());
34567 var $listEl = ac.$inputEl.parents('.list');
34568 if ($listEl.length && ac.$inputEl.parents('.item-content').length > 0 && ac.params.expandInput) {
34569 ac.$inputEl.parents('.item-content').addClass('item-content-dropdown-expanded');
34572 var $pageContentEl = ac.$inputEl.parents('.page-content');
34573 if (ac.params.dropdownContainerEl) {
34574 $(ac.params.dropdownContainerEl).append(ac.$dropdownEl);
34575 } else if ($pageContentEl.length === 0) {
34576 ac.$dropdownEl.insertAfter(ac.$inputEl);
34578 ac.positionDropdown();
34579 $pageContentEl.append(ac.$dropdownEl);
34581 ac.onOpen('dropdown', ac.$dropdownEl);
34582 ac.onOpened('dropdown', ac.$dropdownEl);
34585 Autocomplete.prototype.open = function open () {
34587 if (ac.opened) { return ac; }
34588 var openIn = ac.params.openIn;
34589 ac[("open
" + (openIn.split('').map(function (el, index) {
34590 if (index === 0) { return el.toUpperCase(); }
34596 Autocomplete.prototype.close = function close () {
34598 if (!ac.opened) { return ac; }
34599 if (ac.params.openIn === 'dropdown') {
34602 } else if (ac.params.routableModals || ac.openedIn === 'page') {
34603 ac.view.router.back({ animate: ac.params.animate });
34605 ac.modal.once('modalClosed', function () {
34606 Utils.nextTick(function () {
34607 ac.modal.destroy();
34616 Autocomplete.prototype.init = function init () {
34621 Autocomplete.prototype.destroy = function destroy () {
34623 ac.emit('local::beforeDestroy autocompleteBeforeDestroy', ac);
34625 if (ac.$inputEl && ac.$inputEl[0]) {
34626 delete ac.$inputEl[0].f7Autocomplete;
34628 if (ac.$openerEl && ac.$openerEl[0]) {
34629 delete ac.$openerEl[0].f7Autocomplete;
34631 Utils.deleteProps(ac);
34632 ac.destroyed = true;
34635 return Autocomplete;
34636 }(Framework7Class));
34638 var Autocomplete$1 = {
34639 name: 'autocomplete',
34642 openerEl: undefined,
34643 inputEl: undefined,
34647 dropdownContainerEl: undefined,
34648 dropdownPlaceholderText: undefined,
34650 highlightMatches: true,
34651 expandInput: false,
34652 updateInputValueOnSelect: true,
34653 inputEvents: 'input',
34660 valueProperty: 'id',
34661 textProperty: 'text',
34663 openIn: 'page', // or 'popup' or 'dropdown'
34664 pageBackLinkText: 'Back',
34665 popupCloseLinkText: 'Close',
34666 pageTitle: undefined,
34667 searchbarPlaceholder: 'Search...',
34668 searchbarDisableText: 'Cancel',
34673 closeOnSelect: false,
34674 notFoundText: 'Nothing found',
34675 requestSourceOnOpen: false,
34678 preloaderColor: undefined,
34682 formColorTheme: undefined,
34683 navbarColorTheme: undefined,
34686 routableModals: true,
34689 // Custom render functions
34690 renderDropdown: undefined,
34691 renderPage: undefined,
34692 renderPopup: undefined,
34693 renderItem: undefined,
34694 renderSearchbar: undefined,
34695 renderNavbar: undefined,
34700 Autocomplete: Autocomplete,
34702 create: function create() {
34704 app.autocomplete = Utils.extend(
34705 ConstructorMethods({
34706 defaultSelector: undefined,
34707 constructor: Autocomplete,
34709 domProp: 'f7Autocomplete',
34712 open: function open(autocompleteEl) {
34713 var ac = app.autocomplete.get(autocompleteEl);
34714 if (ac && ac.open) { return ac.open(); }
34717 close: function close(autocompleteEl) {
34718 var ac = app.autocomplete.get(autocompleteEl);
34719 if (ac && ac.close) { return ac.close(); }
34727 var Tooltip = /*@__PURE__*/(function (Framework7Class$$1) {
34728 function Tooltip(app, params) {
34729 if ( params === void 0 ) params = {};
34731 Framework7Class$$1.call(this, app, params);
34733 var tooltip = this;
34735 var defaults = Utils.extend({}, app.params.tooltip);
34737 // Extend defaults with modules params
34738 tooltip.useModulesParams(defaults);
34740 tooltip.params = Utils.extend(defaults, params);
34742 var ref = tooltip.params;
34743 var targetEl = ref.targetEl;
34744 if (!targetEl) { return tooltip; }
34746 var $targetEl = $(targetEl);
34747 if ($targetEl.length === 0) { return tooltip; }
34749 if ($targetEl[0].f7Tooltip) { return $targetEl[0].f7Tooltip; }
34751 var $el = $(tooltip.render()).eq(0);
34753 Utils.extend(tooltip, {
34755 $targetEl: $targetEl,
34756 targetEl: $targetEl && $targetEl[0],
34759 text: tooltip.params.text || '',
34764 $targetEl[0].f7Tooltip = tooltip;
34766 var touchesStart = {};
34768 function handleTouchStart(e) {
34769 if (isTouched) { return; }
34771 touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
34772 touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
34773 tooltip.show(this);
34775 function handleTouchMove(e) {
34776 if (!isTouched) { return; }
34777 var x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
34778 var y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
34779 var distance = Math.pow( (
34780 (Math.pow( (x - touchesStart.x), 2 ))
34781 + (Math.pow( (y - touchesStart.y), 2 ))
34783 if (distance > 50) {
34788 function handleTouchEnd() {
34789 if (!isTouched) { return; }
34793 function handleMouseEnter() {
34794 tooltip.show(this);
34796 function handleMouseLeave() {
34799 function handleTransitionEnd() {
34800 if (!$el.hasClass('tooltip-in')) {
34801 $el.removeClass('tooltip-out').remove();
34805 tooltip.attachEvents = function attachEvents() {
34806 $el.on('transitionend', handleTransitionEnd);
34807 if (Support.touch) {
34808 var passive = Support.passiveListener ? { passive: true } : false;
34809 $targetEl.on(app.touchEvents.start, handleTouchStart, passive);
34810 app.on('touchmove', handleTouchMove);
34811 app.on('touchend:passive', handleTouchEnd);
34813 $targetEl.on('mouseenter', handleMouseEnter);
34814 $targetEl.on('mouseleave', handleMouseLeave);
34817 tooltip.detachEvents = function detachEvents() {
34818 $el.off('transitionend', handleTransitionEnd);
34819 if (Support.touch) {
34820 var passive = Support.passiveListener ? { passive: true } : false;
34821 $targetEl.off(app.touchEvents.start, handleTouchStart, passive);
34822 app.off('touchmove', handleTouchMove);
34823 app.off('touchend:passive', handleTouchEnd);
34825 $targetEl.off('mouseenter', handleMouseEnter);
34826 $targetEl.off('mouseleave', handleMouseLeave);
34831 tooltip.useModules();
34838 if ( Framework7Class$$1 ) Tooltip.__proto__ = Framework7Class$$1;
34839 Tooltip.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
34840 Tooltip.prototype.constructor = Tooltip;
34842 Tooltip.prototype.position = function position (targetEl) {
34843 var tooltip = this;
34844 var $el = tooltip.$el;
34845 var app = tooltip.app;
34846 $el.css({ left: '', top: '' });
34847 var $targetEl = $(targetEl || tooltip.targetEl);
34848 var ref = [$el.width(), $el.height()];
34849 var width = ref[0];
34850 var height = ref[1];
34852 $el.css({ left: '', top: '' });
34856 var targetOffsetLeft;
34857 var targetOffsetTop;
34858 if ($targetEl && $targetEl.length > 0) {
34859 targetWidth = $targetEl.outerWidth();
34860 targetHeight = $targetEl.outerHeight();
34862 var targetOffset = $targetEl.offset();
34863 targetOffsetLeft = targetOffset.left - app.left;
34864 targetOffsetTop = targetOffset.top - app.top;
34866 var targetParentPage = $targetEl.parents('.page');
34867 if (targetParentPage.length > 0) {
34868 targetOffsetTop -= targetParentPage[0].scrollTop;
34871 var ref$1 = [0, 0, 0];
34872 var left = ref$1[0];
34873 var top = ref$1[1];
34876 var position = 'top';
34878 if (height < targetOffsetTop) {
34880 top = targetOffsetTop - height;
34881 } else if (height < app.height - targetOffsetTop - targetHeight) {
34883 position = 'bottom';
34884 top = targetOffsetTop + targetHeight;
34887 position = 'middle';
34888 top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
34891 } else if (top + height >= app.height) {
34892 top = app.height - height - 8;
34896 // Horizontal Position
34897 if (position === 'top' || position === 'bottom') {
34898 left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
34899 if (left < 8) { left = 8; }
34900 if (left + width > app.width) { left = app.width - width - 8; }
34901 if (left < 0) { left = 0; }
34902 } else if (position === 'middle') {
34903 left = targetOffsetLeft - width;
34904 if (left < 8 || (left + width > app.width)) {
34905 if (left < 8) { left = targetOffsetLeft + targetWidth; }
34906 if (left + width > app.width) { left = app.width - width - 8; }
34911 $el.css({ top: (top + "px
"), left: (left + "px
") });
34914 Tooltip.prototype.show = function show (aroundEl) {
34915 var tooltip = this;
34916 var app = tooltip.app;
34917 var $el = tooltip.$el;
34918 var $targetEl = tooltip.$targetEl;
34919 app.root.append($el);
34920 tooltip.position(aroundEl);
34921 var $aroundEl = $(aroundEl);
34922 tooltip.visible = true;
34923 tooltip.opened = true;
34924 $targetEl.trigger('tooltip:show', tooltip);
34925 $el.trigger('tooltip:show', tooltip);
34926 if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {
34927 $aroundEl.trigger('tooltip:show', tooltip);
34929 tooltip.emit('local::show tooltipShow', tooltip);
34930 $el.removeClass('tooltip-out').addClass('tooltip-in');
34934 Tooltip.prototype.hide = function hide () {
34935 var tooltip = this;
34936 var $el = tooltip.$el;
34937 var $targetEl = tooltip.$targetEl;
34938 tooltip.visible = false;
34939 tooltip.opened = false;
34940 $targetEl.trigger('tooltip:hide', tooltip);
34941 $el.trigger('tooltip:hide', tooltip);
34942 tooltip.emit('local::hide tooltipHide', tooltip);
34943 $el.addClass('tooltip-out').removeClass('tooltip-in');
34947 Tooltip.prototype.render = function render () {
34948 var tooltip = this;
34949 if (tooltip.params.render) { return tooltip.params.render.call(tooltip, tooltip); }
34950 var ref = tooltip.params;
34951 var cssClass = ref.cssClass;
34952 var text = ref.text;
34953 return ("\n <div
class=\"tooltip
" + (cssClass || '') + "\">\n <div
class=\"tooltip
-content
\">" + (text || '') + "</div>\n </div>\n ").trim();
34956 Tooltip.prototype.setText = function setText (newText) {
34957 var tooltip = this;
34958 if (typeof newText === 'undefined') {
34961 tooltip.params.text = newText;
34962 tooltip.text = newText;
34964 tooltip.$el.children('.tooltip-content').html(newText);
34966 if (tooltip.opened) {
34967 tooltip.position();
34972 Tooltip.prototype.init = function init () {
34973 var tooltip = this;
34974 tooltip.attachEvents();
34977 Tooltip.prototype.destroy = function destroy () {
34978 var tooltip = this;
34979 if (!tooltip.$targetEl || tooltip.destroyed) { return; }
34980 tooltip.$targetEl.trigger('tooltip:beforedestroy', tooltip);
34981 tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);
34982 tooltip.$el.remove();
34983 delete tooltip.$targetEl[0].f7Tooltip;
34984 tooltip.detachEvents();
34985 Utils.deleteProps(tooltip);
34986 tooltip.destroyed = true;
34990 }(Framework7Class));
34997 create: function create() {
34999 app.tooltip = ConstructorMethods({
35000 defaultSelector: '.tooltip',
35001 constructor: Tooltip,
35003 domProp: 'f7Tooltip',
35005 app.tooltip.show = function show(el) {
35007 if ($el.length === 0) { return undefined; }
35008 var tooltip = $el[0].f7Tooltip;
35009 if (!tooltip) { return undefined; }
35010 tooltip.show($el[0]);
35013 app.tooltip.hide = function hide(el) {
35015 if ($el.length === 0) { return undefined; }
35016 var tooltip = $el[0].f7Tooltip;
35017 if (!tooltip) { return undefined; }
35021 app.tooltip.setText = function text(el, newText) {
35023 if ($el.length === 0) { return undefined; }
35024 var tooltip = $el[0].f7Tooltip;
35025 if (!tooltip) { return undefined; }
35026 tooltip.setText(newText);
35039 tabMounted: function tabMounted(tabEl) {
35041 $(tabEl).find('.tooltip-init').each(function (index, el) {
35042 var text = $(el).attr('data-tooltip');
35043 if (!text) { return; }
35044 app.tooltip.create({ targetEl: el, text: text });
35047 tabBeforeRemove: function tabBeforeRemove(tabEl) {
35048 $(tabEl).find('.tooltip-init').each(function (index, el) {
35049 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
35052 pageInit: function pageInit(page) {
35054 page.$el.find('.tooltip-init').each(function (index, el) {
35055 var text = $(el).attr('data-tooltip');
35056 if (!text) { return; }
35057 app.tooltip.create({ targetEl: el, text: text });
35060 pageBeforeRemove: function pageBeforeRemove(page) {
35061 page.$el.find('.tooltip-init').each(function (index, el) {
35062 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
35068 insert: function insert(vnode) {
35070 var el = vnode.elm;
35071 var text = $(el).attr('data-tooltip');
35072 if (!text) { return; }
35073 app.tooltip.create({ targetEl: el, text: text });
35075 destroy: function destroy(vnode) {
35076 var el = vnode.elm;
35077 if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
35083 /* eslint no-nested-ternary: off */
35085 var Gauge = /*@__PURE__*/(function (Framework7Class$$1) {
35086 function Gauge(app, params) {
35087 if ( params === void 0 ) params = {};
35089 // Extends with open/close Modal methods;
35090 Framework7Class$$1.call(this, app, params);
35094 var defaults = Utils.extend({}, app.params.gauge);
35096 // Extend defaults with modules params
35097 gauge.useModulesParams(defaults);
35099 gauge.params = Utils.extend(defaults, params);
35101 var ref = gauge.params;
35103 if (!el) { return gauge; }
35106 if ($el.length === 0) { return gauge; }
35108 if ($el[0].f7Gauge) { return $el[0].f7Gauge; }
35110 Utils.extend(gauge, {
35116 $el[0].f7Gauge = gauge;
35119 gauge.useModules();
35126 if ( Framework7Class$$1 ) Gauge.__proto__ = Framework7Class$$1;
35127 Gauge.prototype = Object.create( Framework7Class$$1 && Framework7Class$$1.prototype );
35128 Gauge.prototype.constructor = Gauge;
35130 Gauge.prototype.calcRadius = function calcRadius () {
35132 var ref = gauge.params;
35133 var size = ref.size;
35134 var borderWidth = ref.borderWidth;
35135 return (size / 2) - (borderWidth / 2);
35138 Gauge.prototype.calcBorderLength = function calcBorderLength () {
35140 var radius = gauge.calcRadius();
35141 return 2 * Math.PI * radius;
35144 Gauge.prototype.render = function render () {
35146 if (gauge.params.render) { return gauge.params.render.call(gauge, gauge); }
35148 var ref = gauge.params;
35149 var type = ref.type;
35150 var value = ref.value;
35151 var size = ref.size;
35152 var bgColor = ref.bgColor;
35153 var borderBgColor = ref.borderBgColor;
35154 var borderColor = ref.borderColor;
35155 var borderWidth = ref.borderWidth;
35156 var valueText = ref.valueText;
35157 var valueTextColor = ref.valueTextColor;
35158 var valueFontSize = ref.valueFontSize;
35159 var valueFontWeight = ref.valueFontWeight;
35160 var labelText = ref.labelText;
35161 var labelTextColor = ref.labelTextColor;
35162 var labelFontSize = ref.labelFontSize;
35163 var labelFontWeight = ref.labelFontWeight;
35165 var semiCircle = type === 'semicircle';
35166 var radius = gauge.calcRadius();
35167 var length = gauge.calcBorderLength();
35168 var progress = Math.max(Math.min(value, 1), 0);
35170 return ("\n <svg
class=\"gauge
-svg
\" width
=\"" + size + "px
\" height
=\"" + (semiCircle ? size / 2 : size) + "px
\" viewBox
=\"0 0 " + size + " " + (semiCircle ? size / 2 : size) + "\">\n " + (semiCircle ? ("\n <path
\n class=\"gauge
-back
-semi
\"\n d
=\"M
" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1
,1 0 0,0 -" + (size - borderWidth) + ",0\"\n stroke
=\"" + borderBgColor + "\"\n stroke
-width
=\"" + borderWidth + "\"\n fill
=\"" + (bgColor || 'none') + "\"\n />\n <path\n class=\"gauge-front-semi\"\n d=\"M" + (size - (borderWidth / 2)) + "," + (size
/ 2) + " a1,1 0 0,0 -" + (size
- borderWidth
) + ",0\"\n stroke=\"" + borderColor
+ "\"\n stroke-width=\"" + borderWidth
+ "\"\n stroke-dasharray=\"" + (length
/ 2) + "\"\n stroke-dashoffset=\"" + ((length
/ 2) * (1 + progress
)) + "\"\n fill=\"" + (borderBgColor
? 'none' : (bgColor
|| 'none')) + "\"\n />\n ") : ("\n " + (borderBgColor
? ("\n <circle\n class=\"gauge-back-circle\"\n stroke=\"" + borderBgColor
+ "\"\n stroke-width=\"" + borderWidth
+ "\"\n fill=\"" + (bgColor
|| 'none') + "\"\n cx=\"" + (size
/ 2) + "\"\n cy=\"" + (size
/ 2) + "\"\n r=\"" + radius
+ "\"\n ></circle>\n ") : '') + "\n <circle\n class=\"gauge-front-circle\"\n transform=\"" + ("rotate(-90 " + (size
/ 2) + " " + (size
/ 2) + ")") + "\"\n stroke=\"" + borderColor
+ "\"\n stroke-width=\"" + borderWidth
+ "\"\n stroke-dasharray=\"" + length
+ "\"\n stroke-dashoffset=\"" + (length
* (1 - progress
)) + "\"\n fill=\"" + (borderBgColor
? 'none' : bgColor
|| 'none') + "\"\n cx=\"" + (size
/ 2) + "\"\n cy=\"" + (size
/ 2) + "\"\n r=\"" + radius
+ "\"\n ></circle>\n ")) + "\n " + (valueText
? ("\n <text\n class=\"gauge-value-text\"\n x=\"50%\"\n y=\"" + (semiCircle
? '100%' : '50%') + "\"\n font-weight=\"" + valueFontWeight
+ "\"\n font-size=\"" + valueFontSize
+ "\"\n fill=\"" + valueTextColor
+ "\"\n dy=\"" + (semiCircle
? (labelText
? -labelFontSize
- 15 : -5) : 0) + "\"\n text-anchor=\"middle\"\n dominant-baseline=\"" + (!semiCircle
&& 'middle') + "\"\n >" + valueText
+ "</text>\n ") : '') + "\n " + (labelText
? ("\n <text\n class=\"gauge-label-text\"\n x=\"50%\"\n y=\"" + (semiCircle
? '100%' : '50%') + "\"\n font-weight=\"" + labelFontWeight
+ "\"\n font-size=\"" + labelFontSize
+ "\"\n fill=\"" + labelTextColor
+ "\"\n dy=\"" + (semiCircle
? -5 : (valueText
? ((valueFontSize
/ 2) + 10) : 0)) + "\"\n text-anchor=\"middle\"\n dominant-baseline=\"" + (!semiCircle
&& 'middle') + "\"\n >" + labelText
+ "</text>\n ") : '') + "\n </svg>\n ").trim();
35173 Gauge
.prototype.update
= function update (newParams
) {
35174 if ( newParams
=== void 0 ) newParams
= {};
35177 var params
= gauge
.params
;
35178 var $gaugeSvgEl
= gauge
.$gaugeSvgEl
;
35180 Object
.keys(newParams
).forEach(function (param
) {
35181 if (typeof newParams
[param
] !== 'undefined') {
35182 params
[param
] = newParams
[param
];
35185 if ($gaugeSvgEl
.length
=== 0) { return gauge
; }
35187 var value
= params
.value
;
35188 var size
= params
.size
;
35189 var bgColor
= params
.bgColor
;
35190 var borderBgColor
= params
.borderBgColor
;
35191 var borderColor
= params
.borderColor
;
35192 var borderWidth
= params
.borderWidth
;
35193 var valueText
= params
.valueText
;
35194 var valueTextColor
= params
.valueTextColor
;
35195 var valueFontSize
= params
.valueFontSize
;
35196 var valueFontWeight
= params
.valueFontWeight
;
35197 var labelText
= params
.labelText
;
35198 var labelTextColor
= params
.labelTextColor
;
35199 var labelFontSize
= params
.labelFontSize
;
35200 var labelFontWeight
= params
.labelFontWeight
;
35202 var length
= gauge
.calcBorderLength();
35203 var progress
= Math
.max(Math
.min(value
, 1), 0);
35204 var radius
= gauge
.calcRadius();
35205 var semiCircle
= params
.type
=== 'semicircle';
35208 width
: (size
+ "px"),
35209 height
: ((semiCircle
? size
/ 2 : size
) + "px"),
35210 viewBox
: ("0 0 " + size
+ " " + (semiCircle
? size
/ 2 : size
)),
35212 Object
.keys(svgAttrs
).forEach(function (attr
) {
35213 $gaugeSvgEl
.attr(attr
, svgAttrs
[attr
]);
35217 d
: ("M" + (size
- (borderWidth
/ 2)) + "," + (size
/ 2) + " a1,1 0 0,0 -" + (size
- borderWidth
) + ",0"),
35218 stroke
: borderBgColor
,
35219 'stroke-width': borderWidth
,
35220 fill
: bgColor
|| 'none',
35223 d
: ("M" + (size
- (borderWidth
/ 2)) + "," + (size
/ 2) + " a1,1 0 0,0 -" + (size
- borderWidth
) + ",0"),
35224 stroke
: borderColor
,
35225 'stroke-width': borderWidth
,
35226 'stroke-dasharray': length
/ 2,
35227 'stroke-dashoffset': (length
/ 2) * (progress
- 1),
35228 fill
: borderBgColor
? 'none' : (bgColor
|| 'none'),
35230 Object
.keys(backAttrs
).forEach(function (attr
) {
35231 $gaugeSvgEl
.find('.gauge-back-semi').attr(attr
, backAttrs
[attr
]);
35233 Object
.keys(frontAttrs
).forEach(function (attr
) {
35234 $gaugeSvgEl
.find('.gauge-front-semi').attr(attr
, frontAttrs
[attr
]);
35237 var backAttrs
$1 = {
35238 stroke
: borderBgColor
,
35239 'stroke-width': borderWidth
,
35240 fill
: bgColor
|| 'none',
35245 var frontAttrs
$1 = {
35246 transform
: ("rotate(-90 " + (size
/ 2) + " " + (size
/ 2) + ")"),
35247 stroke
: borderColor
,
35248 'stroke-width': borderWidth
,
35249 'stroke-dasharray': length
,
35250 'stroke-dashoffset': length
* (1 - progress
),
35251 fill
: borderBgColor
? 'none' : bgColor
|| 'none',
35256 Object
.keys(backAttrs
$1).forEach(function (attr
) {
35257 $gaugeSvgEl
.find('.gauge-back-circle').attr(attr
, backAttrs
$1[attr
]);
35259 Object
.keys(frontAttrs
$1).forEach(function (attr
) {
35260 $gaugeSvgEl
.find('.gauge-front-circle').attr(attr
, frontAttrs
$1[attr
]);
35264 if (!$gaugeSvgEl
.find('.gauge-value-text').length
) {
35265 $gaugeSvgEl
.append('<text class="gauge-value-text"></text>');
35269 y
: semiCircle
? '100%' : '50%',
35270 'font-weight': valueFontWeight
,
35271 'font-size': valueFontSize
,
35272 fill
: valueTextColor
,
35273 dy
: semiCircle
? (labelText
? -labelFontSize
- 15 : -5) : 0,
35274 'text-anchor': 'middle',
35275 'dominant-baseline': !semiCircle
&& 'middle',
35277 Object
.keys(textAttrs
).forEach(function (attr
) {
35278 $gaugeSvgEl
.find('.gauge-value-text').attr(attr
, textAttrs
[attr
]);
35280 $gaugeSvgEl
.find('.gauge-value-text').text(valueText
);
35282 $gaugeSvgEl
.find('.gauge-value-text').remove();
35285 if (!$gaugeSvgEl
.find('.gauge-label-text').length
) {
35286 $gaugeSvgEl
.append('<text class="gauge-label-text"></text>');
35290 y
: semiCircle
? '100%' : '50%',
35291 'font-weight': labelFontWeight
,
35292 'font-size': labelFontSize
,
35293 fill
: labelTextColor
,
35294 dy
: semiCircle
? -5 : (valueText
? ((valueFontSize
/ 2) + 10) : 0),
35295 'text-anchor': 'middle',
35296 'dominant-baseline': !semiCircle
&& 'middle',
35298 Object
.keys(labelAttrs
).forEach(function (attr
) {
35299 $gaugeSvgEl
.find('.gauge-label-text').attr(attr
, labelAttrs
[attr
]);
35301 $gaugeSvgEl
.find('.gauge-label-text').text(labelText
);
35303 $gaugeSvgEl
.find('.gauge-label-text').remove();
35308 Gauge
.prototype.init
= function init () {
35310 var $gaugeSvgEl
= $(gauge
.render()).eq(0);
35311 $gaugeSvgEl
.f7Gauge
= gauge
;
35312 Utils
.extend(gauge
, {
35313 $gaugeSvgEl
: $gaugeSvgEl
,
35314 gaugeSvgEl
: $gaugeSvgEl
&& $gaugeSvgEl
[0],
35316 gauge
.$el
.append($gaugeSvgEl
);
35320 Gauge
.prototype.destroy
= function destroy () {
35322 if (!gauge
.$el
|| gauge
.destroyed
) { return; }
35323 gauge
.$el
.trigger('gauge:beforedestroy', gauge
);
35324 gauge
.emit('local::beforeDestroy gaugeBeforeDestroy', gauge
);
35325 gauge
.$gaugeSvgEl
.remove();
35326 delete gauge
.$el
[0].f7Gauge
;
35327 Utils
.deleteProps(gauge
);
35328 gauge
.destroyed
= true;
35332 }(Framework7Class
));
35339 create
: function create() {
35341 app
.gauge
= ConstructorMethods({
35342 defaultSelector
: '.gauge',
35343 constructor: Gauge
,
35345 domProp
: 'f7Gauge',
35347 app
.gauge
.update
= function update(el
, newParams
) {
35349 if ($el
.length
=== 0) { return undefined; }
35350 var gauge
= app
.gauge
.get(el
);
35351 if (!gauge
) { return undefined; }
35352 gauge
.update(newParams
);
35362 bgColor
: 'transparent',
35363 borderBgColor
: '#eeeeee',
35364 borderColor
: '#000000',
35367 valueTextColor
: '#000000',
35369 valueFontWeight
: 500,
35371 labelTextColor
: '#888888',
35373 labelFontWeight
: 400,
35377 tabMounted
: function tabMounted(tabEl
) {
35379 $(tabEl
).find('.gauge-init').each(function (index
, el
) {
35380 app
.gauge
.create(Utils
.extend({ el
: el
}, $(el
).dataset() || {}));
35383 tabBeforeRemove
: function tabBeforeRemove(tabEl
) {
35384 $(tabEl
).find('.gauge-init').each(function (index
, el
) {
35385 if (el
.f7Gauge
) { el
.f7Gauge
.destroy(); }
35388 pageInit
: function pageInit(page
) {
35390 page
.$el
.find('.gauge-init').each(function (index
, el
) {
35391 app
.gauge
.create(Utils
.extend({ el
: el
}, $(el
).dataset() || {}));
35394 pageBeforeRemove
: function pageBeforeRemove(page
) {
35395 page
.$el
.find('.gauge-init').each(function (index
, el
) {
35396 if (el
.f7Gauge
) { el
.f7Gauge
.destroy(); }
35402 insert
: function insert(vnode
) {
35404 var el
= vnode
.elm
;
35405 app
.gauge
.create(Utils
.extend({ el
: el
}, $(el
).dataset() || {}));
35407 destroy
: function destroy(vnode
) {
35408 var el
= vnode
.elm
;
35409 if (el
.f7Gauge
) { el
.f7Gauge
.destroy(); }
35420 open
: function open(el
) {
35421 if ( el
=== void 0 ) el
= '.menu-item-dropdown';
35424 if (!el
) { return; }
35425 var $el
= $(el
).closest('.menu-item-dropdown');
35426 if (!$el
.length
) { return; }
35427 $el
.eq(0).addClass('menu-item-dropdown-opened').trigger('menu:opened');
35428 app
.emit('menuOpened', $el
.eq(0)[0]);
35430 close
: function close(el
) {
35431 if ( el
=== void 0 ) el
= '.menu-item-dropdown-opened';
35434 if (!el
) { return; }
35435 var $el
= $(el
).closest('.menu-item-dropdown-opened');
35436 if (!$el
.length
) { return; }
35437 $el
.eq(0).removeClass('menu-item-dropdown-opened').trigger('menu:closed');
35438 app
.emit('menuClosed', $el
.eq(0)[0]);
35444 create
: function create() {
35447 open
: Menu
.open
.bind(app
),
35448 close
: Menu
.close
.bind(app
),
35452 click
: function click(e
) {
35454 var openedMenus
= $('.menu-item-dropdown-opened');
35455 if (!openedMenus
.length
) { return; }
35456 openedMenus
.each(function (index
, el
) {
35457 if (!$(e
.target
).closest('.menu-item-dropdown-opened').length
) {
35458 app
.menu
.close(el
);
35464 '.menu-item-dropdown': function onClick($clickedEl
, dataset
, e
) {
35466 if ($clickedEl
.hasClass('menu-item-dropdown-opened')) {
35467 if ($(e
.target
).closest('.menu-dropdown').length
) { return; }
35468 app
.menu
.close($clickedEl
);
35470 app
.menu
.open($clickedEl
);
35473 '.menu-close': function onClick() {
35480 var ViAd
= /*@__PURE__*/(function (Framework7Class
$$1) {
35481 function ViAd(app
, params
) {
35482 if ( params
=== void 0 ) params
= {};
35484 Framework7Class
$$1.call(this, params
, [app
]);
35487 throw new Error('Framework7: vi SDK not found.');
35491 if (typeof win
.orientation
!== 'undefined') {
35492 orientation
= win
.orientation
=== -90 || win
.orientation
=== 90 ? 'horizontal' : 'vertical';
35494 var defaults
= Utils
.extend(
35499 appVer
: app
.version
,
35500 language
: app
.language
,
35502 height
: app
.height
,
35504 osVersion
: Device
.osVersion
,
35505 orientation
: orientation
,
35509 // Extend defaults with modules params
35510 vi
.useModulesParams(defaults
);
35512 vi
.params
= Utils
.extend(defaults
, params
);
35515 var skipParams
= ('on autoplay fallbackOverlay fallbackOverlayText enabled').split(' ');
35516 Object
.keys(vi
.params
).forEach(function (paramName
) {
35517 if (skipParams
.indexOf(paramName
) >= 0) { return; }
35518 var paramValue
= vi
.params
[paramName
];
35519 if ([null, undefined].indexOf(paramValue
) >= 0) { return; }
35520 adParams
[paramName
] = paramValue
;
35523 if (!vi
.params
.appId
) {
35524 throw new Error('Framework7: "app.id" is required to display an ad. Make sure you have specified it on app initialization.');
35526 if (!vi
.params
.placementId
) {
35527 throw new Error('Framework7: "placementId" is required to display an ad.');
35530 function onResize() {
35531 var $viFrame
= $('iframe#viAd');
35532 if ($viFrame
.length
=== 0) { return; }
35535 width
: ((app
.width
) + "px"),
35536 height
: ((app
.height
) + "px"),
35540 function removeOverlay() {
35541 if (!vi
.$overlayEl
) { return; }
35542 vi
.$overlayEl
.off('click touchstart');
35543 vi
.$overlayEl
.remove();
35545 function createOverlay(videoEl
) {
35546 if (!videoEl
) { return; }
35547 vi
.$overlayEl
= $(("\n <div class=\"vi-overlay no-fastclick\">\n " + (vi
.params
.fallbackOverlayText
? ("<div class=\"vi-overlay-text\">" + (vi
.params
.fallbackOverlayText
) + "</div>") : '') + "\n <div class=\"vi-overlay-play-button\"></div>\n </div>\n ").trim());
35549 var touchStartTime
;
35550 vi
.$overlayEl
.on('touchstart', function () {
35551 touchStartTime
= Utils
.now();
35553 vi
.$overlayEl
.on('click', function () {
35554 var timeDiff
= Utils
.now() - touchStartTime
;
35555 if (timeDiff
> 300) { return; }
35564 app
.root
.append(vi
.$overlayEl
);
35568 vi
.ad
= new win
.vi
.Ad(adParams
);
35570 Utils
.extend(vi
.ad
, {
35571 onAdReady
: function onAdReady() {
35572 app
.on('resize', onResize
);
35573 vi
.emit('local::ready');
35574 if (vi
.params
.autoplay
) {
35578 onAdStarted
: function onAdStarted() {
35579 vi
.emit('local::started');
35581 onAdClick
: function onAdClick(targetUrl
) {
35582 vi
.emit('local::click', targetUrl
);
35584 onAdImpression
: function onAdImpression() {
35585 vi
.emit('local::impression');
35587 onAdStopped
: function onAdStopped(reason
) {
35588 app
.off('resize', onResize
);
35591 vi
.emit('local::stopped', reason
);
35592 if (reason
=== 'complete') {
35593 vi
.emit('local::complete');
35594 vi
.emit('local::completed');
35596 if (reason
=== 'userexit') {
35597 vi
.emit('local::userexit');
35599 vi
.destroyed
= true;
35601 onAutoPlayFailed
: function onAutoPlayFailed(reason
, videoEl
) {
35602 vi
.emit('local::autoplayFailed', reason
, videoEl
);
35603 if (reason
&& reason
.name
&& reason
.name
.indexOf('NotAllowedError') !== -1 && vi
.params
.fallbackOverlay
) {
35604 createOverlay(videoEl
);
35607 onAdError
: function onAdError(msg
) {
35609 app
.off('resize', onResize
);
35610 vi
.emit('local::error', msg
);
35611 vi
.destroyed
= true;
35622 if ( Framework7Class
$$1 ) ViAd
.__proto__
= Framework7Class
$$1;
35623 ViAd
.prototype = Object
.create( Framework7Class
$$1 && Framework7Class
$$1.prototype );
35624 ViAd
.prototype.constructor = ViAd
;
35626 ViAd
.prototype.start
= function start () {
35628 if (vi
.destroyed
) { return; }
35629 if (vi
.ad
) { vi
.ad
.startAd(); }
35632 ViAd
.prototype.pause
= function pause () {
35634 if (vi
.destroyed
) { return; }
35635 if (vi
.ad
) { vi
.ad
.pauseAd(); }
35638 ViAd
.prototype.resume
= function resume () {
35640 if (vi
.destroyed
) { return; }
35641 if (vi
.ad
) { vi
.ad
.resumeAd(); }
35644 ViAd
.prototype.stop
= function stop () {
35646 if (vi
.destroyed
) { return; }
35647 if (vi
.ad
) { vi
.ad
.stopAd(); }
35650 ViAd
.prototype.init
= function init () {
35652 if (vi
.destroyed
) { return; }
35653 if (vi
.ad
) { vi
.ad
.initAd(); }
35656 ViAd
.prototype.destroy
= function destroy () {
35658 vi
.destroyed
= true;
35659 vi
.emit('local::beforeDestroy');
35660 Utils
.deleteProps(vi
);
35664 }(Framework7Class
));
35672 fallbackOverlay
: true,
35673 fallbackOverlayText
: 'Please watch this ad',
35675 startMuted
: (Device
.ios
|| Device
.android
) && !Device
.cordova
,
35681 placementId
: 'pltd4o7ibb9rc653x14',
35682 placementType
: 'interstitial',
35684 showProgress
: true,
35685 showBranding
: true,
35691 advertiserId
: null,
35697 manufacturer
: null,
35699 connectionType
: null,
35700 connectionProvider
: null,
35703 create
: function create() {
35707 createAd
: function createAd(adParams
) {
35708 return new ViAd(app
, adParams
);
35710 loadSdk
: function loadSdk() {
35711 if (app
.vi
.sdkReady
) { return; }
35712 var script
= doc
.createElement('script');
35713 script
.onload
= function onload() {
35714 app
.emit('viSdkReady');
35715 app
.vi
.sdkReady
= true;
35717 script
.src
= 'https://c.vi-serve.com/viadshtml/vi.min.js';
35718 $('head').append(script
);
35723 init
: function init() {
35725 if (app
.params
.vi
.enabled
|| (app
.passedParams
.vi
&& app
.passedParams
.vi
.enabled
!== false)) { app
.vi
.loadSdk(); }
35735 name
: 'typography',
35739 if (typeof window
!== 'undefined') {
35741 if (!window
.Template7
) { window
.Template7
= Template7
; }
35744 if (!window
.Dom7
) { window
.Dom7
= $; }
35748 // Install Core Modules & Components
35750 RouterTemplateLoaderModule
,
35751 RouterComponentLoaderModule
]);
35765 ServiceWorkerModule
,