Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

13718 строки
464 KiB

  1. /**
  2. * Framework7 5.7.14
  3. * Full featured mobile HTML framework for building iOS & Android apps
  4. * https://framework7.io/
  5. *
  6. * Copyright 2014-2020 Vladimir Kharlampidi
  7. *
  8. * Released under the MIT License
  9. *
  10. * Released on: November 9, 2020
  11. */
  12. (function (global, factory) {
  13. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  14. typeof define === 'function' && define.amd ? define(factory) :
  15. (global = global || self, global.Framework7 = factory());
  16. }(this, (function () { 'use strict';
  17. /**
  18. * Template7 1.4.2
  19. * Mobile-first HTML template engine
  20. *
  21. * http://www.idangero.us/template7/
  22. *
  23. * Copyright 2019, Vladimir Kharlampidi
  24. * The iDangero.us
  25. * http://www.idangero.us/
  26. *
  27. * Licensed under MIT
  28. *
  29. * Released on: June 14, 2019
  30. */
  31. var t7ctx;
  32. if (typeof window !== 'undefined') {
  33. t7ctx = window;
  34. } else if (typeof global !== 'undefined') {
  35. t7ctx = global;
  36. } else {
  37. t7ctx = undefined;
  38. }
  39. var Template7Context = t7ctx;
  40. var Template7Utils = {
  41. quoteSingleRexExp: new RegExp('\'', 'g'),
  42. quoteDoubleRexExp: new RegExp('"', 'g'),
  43. isFunction: function isFunction(func) {
  44. return typeof func === 'function';
  45. },
  46. escape: function escape(string) {
  47. if ( string === void 0 ) string = '';
  48. return string
  49. .replace(/&/g, '&')
  50. .replace(/</g, '&lt;')
  51. .replace(/>/g, '&gt;')
  52. .replace(/"/g, '&quot;')
  53. .replace(/'/g, '&#039;');
  54. },
  55. helperToSlices: function helperToSlices(string) {
  56. var quoteDoubleRexExp = Template7Utils.quoteDoubleRexExp;
  57. var quoteSingleRexExp = Template7Utils.quoteSingleRexExp;
  58. var helperParts = string.replace(/[{}#}]/g, '').trim().split(' ');
  59. var slices = [];
  60. var shiftIndex;
  61. var i;
  62. var j;
  63. for (i = 0; i < helperParts.length; i += 1) {
  64. var part = helperParts[i];
  65. var blockQuoteRegExp = (void 0);
  66. var openingQuote = (void 0);
  67. if (i === 0) { slices.push(part); }
  68. else if (part.indexOf('"') === 0 || part.indexOf('\'') === 0) {
  69. blockQuoteRegExp = part.indexOf('"') === 0 ? quoteDoubleRexExp : quoteSingleRexExp;
  70. openingQuote = part.indexOf('"') === 0 ? '"' : '\'';
  71. // Plain String
  72. if (part.match(blockQuoteRegExp).length === 2) {
  73. // One word string
  74. slices.push(part);
  75. } else {
  76. // Find closed Index
  77. shiftIndex = 0;
  78. for (j = i + 1; j < helperParts.length; j += 1) {
  79. part += " " + (helperParts[j]);
  80. if (helperParts[j].indexOf(openingQuote) >= 0) {
  81. shiftIndex = j;
  82. slices.push(part);
  83. break;
  84. }
  85. }
  86. if (shiftIndex) { i = shiftIndex; }
  87. }
  88. } else if (part.indexOf('=') > 0) {
  89. // Hash
  90. var hashParts = part.split('=');
  91. var hashName = hashParts[0];
  92. var hashContent = hashParts[1];
  93. if (!blockQuoteRegExp) {
  94. blockQuoteRegExp = hashContent.indexOf('"') === 0 ? quoteDoubleRexExp : quoteSingleRexExp;
  95. openingQuote = hashContent.indexOf('"') === 0 ? '"' : '\'';
  96. }
  97. if (hashContent.match(blockQuoteRegExp).length !== 2) {
  98. shiftIndex = 0;
  99. for (j = i + 1; j < helperParts.length; j += 1) {
  100. hashContent += " " + (helperParts[j]);
  101. if (helperParts[j].indexOf(openingQuote) >= 0) {
  102. shiftIndex = j;
  103. break;
  104. }
  105. }
  106. if (shiftIndex) { i = shiftIndex; }
  107. }
  108. var hash = [hashName, hashContent.replace(blockQuoteRegExp, '')];
  109. slices.push(hash);
  110. } else {
  111. // Plain variable
  112. slices.push(part);
  113. }
  114. }
  115. return slices;
  116. },
  117. stringToBlocks: function stringToBlocks(string) {
  118. var blocks = [];
  119. var i;
  120. var j;
  121. if (!string) { return []; }
  122. var stringBlocks = string.split(/({{[^{^}]*}})/);
  123. for (i = 0; i < stringBlocks.length; i += 1) {
  124. var block = stringBlocks[i];
  125. if (block === '') { continue; }
  126. if (block.indexOf('{{') < 0) {
  127. blocks.push({
  128. type: 'plain',
  129. content: block,
  130. });
  131. } else {
  132. if (block.indexOf('{/') >= 0) {
  133. continue;
  134. }
  135. block = block
  136. .replace(/{{([#/])*([ ])*/, '{{$1')
  137. .replace(/([ ])*}}/, '}}');
  138. if (block.indexOf('{#') < 0 && block.indexOf(' ') < 0 && block.indexOf('else') < 0) {
  139. // Simple variable
  140. blocks.push({
  141. type: 'variable',
  142. contextName: block.replace(/[{}]/g, ''),
  143. });
  144. continue;
  145. }
  146. // Helpers
  147. var helperSlices = Template7Utils.helperToSlices(block);
  148. var helperName = helperSlices[0];
  149. var isPartial = helperName === '>';
  150. var helperContext = [];
  151. var helperHash = {};
  152. for (j = 1; j < helperSlices.length; j += 1) {
  153. var slice = helperSlices[j];
  154. if (Array.isArray(slice)) {
  155. // Hash
  156. helperHash[slice[0]] = slice[1] === 'false' ? false : slice[1];
  157. } else {
  158. helperContext.push(slice);
  159. }
  160. }
  161. if (block.indexOf('{#') >= 0) {
  162. // Condition/Helper
  163. var helperContent = '';
  164. var elseContent = '';
  165. var toSkip = 0;
  166. var shiftIndex = (void 0);
  167. var foundClosed = false;
  168. var foundElse = false;
  169. var depth = 0;
  170. for (j = i + 1; j < stringBlocks.length; j += 1) {
  171. if (stringBlocks[j].indexOf('{{#') >= 0) {
  172. depth += 1;
  173. }
  174. if (stringBlocks[j].indexOf('{{/') >= 0) {
  175. depth -= 1;
  176. }
  177. if (stringBlocks[j].indexOf(("{{#" + helperName)) >= 0) {
  178. helperContent += stringBlocks[j];
  179. if (foundElse) { elseContent += stringBlocks[j]; }
  180. toSkip += 1;
  181. } else if (stringBlocks[j].indexOf(("{{/" + helperName)) >= 0) {
  182. if (toSkip > 0) {
  183. toSkip -= 1;
  184. helperContent += stringBlocks[j];
  185. if (foundElse) { elseContent += stringBlocks[j]; }
  186. } else {
  187. shiftIndex = j;
  188. foundClosed = true;
  189. break;
  190. }
  191. } else if (stringBlocks[j].indexOf('else') >= 0 && depth === 0) {
  192. foundElse = true;
  193. } else {
  194. if (!foundElse) { helperContent += stringBlocks[j]; }
  195. if (foundElse) { elseContent += stringBlocks[j]; }
  196. }
  197. }
  198. if (foundClosed) {
  199. if (shiftIndex) { i = shiftIndex; }
  200. if (helperName === 'raw') {
  201. blocks.push({
  202. type: 'plain',
  203. content: helperContent,
  204. });
  205. } else {
  206. blocks.push({
  207. type: 'helper',
  208. helperName: helperName,
  209. contextName: helperContext,
  210. content: helperContent,
  211. inverseContent: elseContent,
  212. hash: helperHash,
  213. });
  214. }
  215. }
  216. } else if (block.indexOf(' ') > 0) {
  217. if (isPartial) {
  218. helperName = '_partial';
  219. if (helperContext[0]) {
  220. if (helperContext[0].indexOf('[') === 0) { helperContext[0] = helperContext[0].replace(/[[\]]/g, ''); }
  221. else { helperContext[0] = "\"" + (helperContext[0].replace(/"|'/g, '')) + "\""; }
  222. }
  223. }
  224. blocks.push({
  225. type: 'helper',
  226. helperName: helperName,
  227. contextName: helperContext,
  228. hash: helperHash,
  229. });
  230. }
  231. }
  232. }
  233. return blocks;
  234. },
  235. parseJsVariable: function parseJsVariable(expression, replace, object) {
  236. return expression.split(/([+ \-*/^()&=|<>!%:?])/g).reduce(function (arr, part) {
  237. if (!part) {
  238. return arr;
  239. }
  240. if (part.indexOf(replace) < 0) {
  241. arr.push(part);
  242. return arr;
  243. }
  244. if (!object) {
  245. arr.push(JSON.stringify(''));
  246. return arr;
  247. }
  248. var variable = object;
  249. if (part.indexOf((replace + ".")) >= 0) {
  250. part.split((replace + "."))[1].split('.').forEach(function (partName) {
  251. if (partName in variable) { variable = variable[partName]; }
  252. else { variable = undefined; }
  253. });
  254. }
  255. if (
  256. (typeof variable === 'string')
  257. || Array.isArray(variable)
  258. || (variable.constructor && variable.constructor === Object)
  259. ) {
  260. variable = JSON.stringify(variable);
  261. }
  262. if (variable === undefined) { variable = 'undefined'; }
  263. arr.push(variable);
  264. return arr;
  265. }, []).join('');
  266. },
  267. parseJsParents: function parseJsParents(expression, parents) {
  268. return expression.split(/([+ \-*^()&=|<>!%:?])/g).reduce(function (arr, part) {
  269. if (!part) {
  270. return arr;
  271. }
  272. if (part.indexOf('../') < 0) {
  273. arr.push(part);
  274. return arr;
  275. }
  276. if (!parents || parents.length === 0) {
  277. arr.push(JSON.stringify(''));
  278. return arr;
  279. }
  280. var levelsUp = part.split('../').length - 1;
  281. var parentData = levelsUp > parents.length ? parents[parents.length - 1] : parents[levelsUp - 1];
  282. var variable = parentData;
  283. var parentPart = part.replace(/..\//g, '');
  284. parentPart.split('.').forEach(function (partName) {
  285. if (typeof variable[partName] !== 'undefined') { variable = variable[partName]; }
  286. else { variable = 'undefined'; }
  287. });
  288. if (variable === false || variable === true) {
  289. arr.push(JSON.stringify(variable));
  290. return arr;
  291. }
  292. if (variable === null || variable === 'undefined') {
  293. arr.push(JSON.stringify(''));
  294. return arr;
  295. }
  296. arr.push(JSON.stringify(variable));
  297. return arr;
  298. }, []).join('');
  299. },
  300. getCompileVar: function getCompileVar(name, ctx, data) {
  301. if ( data === void 0 ) data = 'data_1';
  302. var variable = ctx;
  303. var parts;
  304. var levelsUp = 0;
  305. var newDepth;
  306. if (name.indexOf('../') === 0) {
  307. levelsUp = name.split('../').length - 1;
  308. newDepth = variable.split('_')[1] - levelsUp;
  309. variable = "ctx_" + (newDepth >= 1 ? newDepth : 1);
  310. parts = name.split('../')[levelsUp].split('.');
  311. } else if (name.indexOf('@global') === 0) {
  312. variable = 'Template7.global';
  313. parts = name.split('@global.')[1].split('.');
  314. } else if (name.indexOf('@root') === 0) {
  315. variable = 'root';
  316. parts = name.split('@root.')[1].split('.');
  317. } else {
  318. parts = name.split('.');
  319. }
  320. for (var i = 0; i < parts.length; i += 1) {
  321. var part = parts[i];
  322. if (part.indexOf('@') === 0) {
  323. var dataLevel = data.split('_')[1];
  324. if (levelsUp > 0) {
  325. dataLevel = newDepth;
  326. }
  327. if (i > 0) {
  328. variable += "[(data_" + dataLevel + " && data_" + dataLevel + "." + (part.replace('@', '')) + ")]";
  329. } else {
  330. variable = "(data_" + dataLevel + " && data_" + dataLevel + "." + (part.replace('@', '')) + ")";
  331. }
  332. } else if (Number.isFinite ? Number.isFinite(part) : Template7Context.isFinite(part)) {
  333. variable += "[" + part + "]";
  334. } else if (part === 'this' || part.indexOf('this.') >= 0 || part.indexOf('this[') >= 0 || part.indexOf('this(') >= 0) {
  335. variable = part.replace('this', ctx);
  336. } else {
  337. variable += "." + part;
  338. }
  339. }
  340. return variable;
  341. },
  342. getCompiledArguments: function getCompiledArguments(contextArray, ctx, data) {
  343. var arr = [];
  344. for (var i = 0; i < contextArray.length; i += 1) {
  345. if (/^['"]/.test(contextArray[i])) { arr.push(contextArray[i]); }
  346. else if (/^(true|false|\d+)$/.test(contextArray[i])) { arr.push(contextArray[i]); }
  347. else {
  348. arr.push(Template7Utils.getCompileVar(contextArray[i], ctx, data));
  349. }
  350. }
  351. return arr.join(', ');
  352. },
  353. };
  354. /* eslint no-eval: "off" */
  355. var Template7Helpers = {
  356. _partial: function _partial(partialName, options) {
  357. var ctx = this;
  358. var p = Template7Class.partials[partialName];
  359. if (!p || (p && !p.template)) { return ''; }
  360. if (!p.compiled) {
  361. p.compiled = new Template7Class(p.template).compile();
  362. }
  363. Object.keys(options.hash).forEach(function (hashName) {
  364. ctx[hashName] = options.hash[hashName];
  365. });
  366. return p.compiled(ctx, options.data, options.root);
  367. },
  368. escape: function escape(context) {
  369. if (typeof context === 'undefined' || context === null) { return ''; }
  370. if (typeof context !== 'string') {
  371. throw new Error('Template7: Passed context to "escape" helper should be a string');
  372. }
  373. return Template7Utils.escape(context);
  374. },
  375. if: function if$1(context, options) {
  376. var ctx = context;
  377. if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
  378. if (ctx) {
  379. return options.fn(this, options.data);
  380. }
  381. return options.inverse(this, options.data);
  382. },
  383. unless: function unless(context, options) {
  384. var ctx = context;
  385. if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
  386. if (!ctx) {
  387. return options.fn(this, options.data);
  388. }
  389. return options.inverse(this, options.data);
  390. },
  391. each: function each(context, options) {
  392. var ctx = context;
  393. var ret = '';
  394. var i = 0;
  395. if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
  396. if (Array.isArray(ctx)) {
  397. if (options.hash.reverse) {
  398. ctx = ctx.reverse();
  399. }
  400. for (i = 0; i < ctx.length; i += 1) {
  401. ret += options.fn(ctx[i], { first: i === 0, last: i === ctx.length - 1, index: i });
  402. }
  403. if (options.hash.reverse) {
  404. ctx = ctx.reverse();
  405. }
  406. } else {
  407. // eslint-disable-next-line
  408. for (var key in ctx) {
  409. i += 1;
  410. ret += options.fn(ctx[key], { key: key });
  411. }
  412. }
  413. if (i > 0) { return ret; }
  414. return options.inverse(this);
  415. },
  416. with: function with$1(context, options) {
  417. var ctx = context;
  418. if (Template7Utils.isFunction(ctx)) { ctx = context.call(this); }
  419. return options.fn(ctx);
  420. },
  421. join: function join(context, options) {
  422. var ctx = context;
  423. if (Template7Utils.isFunction(ctx)) { ctx = ctx.call(this); }
  424. return ctx.join(options.hash.delimiter || options.hash.delimeter);
  425. },
  426. js: function js(expression, options) {
  427. var data = options.data;
  428. var func;
  429. var execute = expression;
  430. ('index first last key').split(' ').forEach(function (prop) {
  431. if (typeof data[prop] !== 'undefined') {
  432. var re1 = new RegExp(("this.@" + prop), 'g');
  433. var re2 = new RegExp(("@" + prop), 'g');
  434. execute = execute
  435. .replace(re1, JSON.stringify(data[prop]))
  436. .replace(re2, JSON.stringify(data[prop]));
  437. }
  438. });
  439. if (options.root && execute.indexOf('@root') >= 0) {
  440. execute = Template7Utils.parseJsVariable(execute, '@root', options.root);
  441. }
  442. if (execute.indexOf('@global') >= 0) {
  443. execute = Template7Utils.parseJsVariable(execute, '@global', Template7Context.Template7.global);
  444. }
  445. if (execute.indexOf('../') >= 0) {
  446. execute = Template7Utils.parseJsParents(execute, options.parents);
  447. }
  448. if (execute.indexOf('return') >= 0) {
  449. func = "(function(){" + execute + "})";
  450. } else {
  451. func = "(function(){return (" + execute + ")})";
  452. }
  453. return eval(func).call(this);
  454. },
  455. js_if: function js_if(expression, options) {
  456. var data = options.data;
  457. var func;
  458. var execute = expression;
  459. ('index first last key').split(' ').forEach(function (prop) {
  460. if (typeof data[prop] !== 'undefined') {
  461. var re1 = new RegExp(("this.@" + prop), 'g');
  462. var re2 = new RegExp(("@" + prop), 'g');
  463. execute = execute
  464. .replace(re1, JSON.stringify(data[prop]))
  465. .replace(re2, JSON.stringify(data[prop]));
  466. }
  467. });
  468. if (options.root && execute.indexOf('@root') >= 0) {
  469. execute = Template7Utils.parseJsVariable(execute, '@root', options.root);
  470. }
  471. if (execute.indexOf('@global') >= 0) {
  472. execute = Template7Utils.parseJsVariable(execute, '@global', Template7Context.Template7.global);
  473. }
  474. if (execute.indexOf('../') >= 0) {
  475. execute = Template7Utils.parseJsParents(execute, options.parents);
  476. }
  477. if (execute.indexOf('return') >= 0) {
  478. func = "(function(){" + execute + "})";
  479. } else {
  480. func = "(function(){return (" + execute + ")})";
  481. }
  482. var condition = eval(func).call(this);
  483. if (condition) {
  484. return options.fn(this, options.data);
  485. }
  486. return options.inverse(this, options.data);
  487. },
  488. };
  489. Template7Helpers.js_compare = Template7Helpers.js_if;
  490. var Template7Options = {};
  491. var Template7Partials = {};
  492. var Template7Class = function Template7Class(template) {
  493. var t = this;
  494. t.template = template;
  495. };
  496. var staticAccessors = { options: { configurable: true },partials: { configurable: true },helpers: { configurable: true } };
  497. Template7Class.prototype.compile = function compile (template, depth) {
  498. if ( template === void 0 ) template = this.template;
  499. if ( depth === void 0 ) depth = 1;
  500. var t = this;
  501. if (t.compiled) { return t.compiled; }
  502. if (typeof template !== 'string') {
  503. throw new Error('Template7: Template must be a string');
  504. }
  505. var stringToBlocks = Template7Utils.stringToBlocks;
  506. var getCompileVar = Template7Utils.getCompileVar;
  507. var getCompiledArguments = Template7Utils.getCompiledArguments;
  508. var blocks = stringToBlocks(template);
  509. var ctx = "ctx_" + depth;
  510. var data = "data_" + depth;
  511. if (blocks.length === 0) {
  512. return function empty() { return ''; };
  513. }
  514. function getCompileFn(block, newDepth) {
  515. if (block.content) { return t.compile(block.content, newDepth); }
  516. return function empty() { return ''; };
  517. }
  518. function getCompileInverse(block, newDepth) {
  519. if (block.inverseContent) { return t.compile(block.inverseContent, newDepth); }
  520. return function empty() { return ''; };
  521. }
  522. var resultString = '';
  523. if (depth === 1) {
  524. resultString += "(function (" + ctx + ", " + data + ", root) {\n";
  525. } else {
  526. resultString += "(function (" + ctx + ", " + data + ") {\n";
  527. }
  528. if (depth === 1) {
  529. resultString += 'function isArray(arr){return Array.isArray(arr);}\n';
  530. resultString += 'function isFunction(func){return (typeof func === \'function\');}\n';
  531. resultString += 'function c(val, ctx) {if (typeof val !== "undefined" && val !== null) {if (isFunction(val)) {return val.call(ctx);} else return val;} else return "";}\n';
  532. resultString += 'root = root || ctx_1 || {};\n';
  533. }
  534. resultString += 'var r = \'\';\n';
  535. var i;
  536. for (i = 0; i < blocks.length; i += 1) {
  537. var block = blocks[i];
  538. // Plain block
  539. if (block.type === 'plain') {
  540. // eslint-disable-next-line
  541. resultString += "r +='" + ((block.content).replace(/\r/g, '\\r').replace(/\n/g, '\\n').replace(/'/g, '\\' + '\'')) + "';";
  542. continue;
  543. }
  544. var variable = (void 0);
  545. var compiledArguments = (void 0);
  546. // Variable block
  547. if (block.type === 'variable') {
  548. variable = getCompileVar(block.contextName, ctx, data);
  549. resultString += "r += c(" + variable + ", " + ctx + ");";
  550. }
  551. // Helpers block
  552. if (block.type === 'helper') {
  553. var parents = (void 0);
  554. if (ctx !== 'ctx_1') {
  555. var level = ctx.split('_')[1];
  556. var parentsString = "ctx_" + (level - 1);
  557. for (var j = level - 2; j >= 1; j -= 1) {
  558. parentsString += ", ctx_" + j;
  559. }
  560. parents = "[" + parentsString + "]";
  561. } else {
  562. parents = "[" + ctx + "]";
  563. }
  564. var dynamicHelper = (void 0);
  565. if (block.helperName.indexOf('[') === 0) {
  566. block.helperName = getCompileVar(block.helperName.replace(/[[\]]/g, ''), ctx, data);
  567. dynamicHelper = true;
  568. }
  569. if (dynamicHelper || block.helperName in Template7Helpers) {
  570. compiledArguments = getCompiledArguments(block.contextName, ctx, data);
  571. 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 + "});";
  572. } else if (block.contextName.length > 0) {
  573. throw new Error(("Template7: Missing helper: \"" + (block.helperName) + "\""));
  574. } else {
  575. variable = getCompileVar(block.helperName, ctx, data);
  576. resultString += "if (" + variable + ") {";
  577. resultString += "if (isArray(" + variable + ")) {";
  578. 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 + "});";
  579. resultString += '}else {';
  580. 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 + "});";
  581. resultString += '}}';
  582. }
  583. }
  584. }
  585. resultString += '\nreturn r;})';
  586. if (depth === 1) {
  587. // eslint-disable-next-line
  588. t.compiled = eval(resultString);
  589. return t.compiled;
  590. }
  591. return resultString;
  592. };
  593. staticAccessors.options.get = function () {
  594. return Template7Options;
  595. };
  596. staticAccessors.partials.get = function () {
  597. return Template7Partials;
  598. };
  599. staticAccessors.helpers.get = function () {
  600. return Template7Helpers;
  601. };
  602. Object.defineProperties( Template7Class, staticAccessors );
  603. function Template7() {
  604. var args = [], len = arguments.length;
  605. while ( len-- ) args[ len ] = arguments[ len ];
  606. var template = args[0];
  607. var data = args[1];
  608. if (args.length === 2) {
  609. var instance = new Template7Class(template);
  610. var rendered = instance.compile()(data);
  611. instance = null;
  612. return (rendered);
  613. }
  614. return new Template7Class(template);
  615. }
  616. Template7.registerHelper = function registerHelper(name, fn) {
  617. Template7Class.helpers[name] = fn;
  618. };
  619. Template7.unregisterHelper = function unregisterHelper(name) {
  620. Template7Class.helpers[name] = undefined;
  621. delete Template7Class.helpers[name];
  622. };
  623. Template7.registerPartial = function registerPartial(name, template) {
  624. Template7Class.partials[name] = { template: template };
  625. };
  626. Template7.unregisterPartial = function unregisterPartial(name) {
  627. if (Template7Class.partials[name]) {
  628. Template7Class.partials[name] = undefined;
  629. delete Template7Class.partials[name];
  630. }
  631. };
  632. Template7.compile = function compile(template, options) {
  633. var instance = new Template7Class(template, options);
  634. return instance.compile();
  635. };
  636. Template7.options = Template7Class.options;
  637. Template7.helpers = Template7Class.helpers;
  638. Template7.partials = Template7Class.partials;
  639. /**
  640. * SSR Window 2.0.0
  641. * Better handling for window object in SSR environment
  642. * https://github.com/nolimits4web/ssr-window
  643. *
  644. * Copyright 2020, Vladimir Kharlampidi
  645. *
  646. * Licensed under MIT
  647. *
  648. * Released on: May 12, 2020
  649. */
  650. /* eslint-disable no-param-reassign */
  651. function isObject(obj) {
  652. return (obj !== null &&
  653. typeof obj === 'object' &&
  654. 'constructor' in obj &&
  655. obj.constructor === Object);
  656. }
  657. function extend(target, src) {
  658. if (target === void 0) { target = {}; }
  659. if (src === void 0) { src = {}; }
  660. Object.keys(src).forEach(function (key) {
  661. if (typeof target[key] === 'undefined')
  662. { target[key] = src[key]; }
  663. else if (isObject(src[key]) &&
  664. isObject(target[key]) &&
  665. Object.keys(src[key]).length > 0) {
  666. extend(target[key], src[key]);
  667. }
  668. });
  669. }
  670. var doc = typeof document !== 'undefined' ? document : {};
  671. var ssrDocument = {
  672. body: {},
  673. addEventListener: function () { },
  674. removeEventListener: function () { },
  675. activeElement: {
  676. blur: function () { },
  677. nodeName: '',
  678. },
  679. querySelector: function () {
  680. return null;
  681. },
  682. querySelectorAll: function () {
  683. return [];
  684. },
  685. getElementById: function () {
  686. return null;
  687. },
  688. createEvent: function () {
  689. return {
  690. initEvent: function () { },
  691. };
  692. },
  693. createElement: function () {
  694. return {
  695. children: [],
  696. childNodes: [],
  697. style: {},
  698. setAttribute: function () { },
  699. getElementsByTagName: function () {
  700. return [];
  701. },
  702. };
  703. },
  704. createElementNS: function () {
  705. return {};
  706. },
  707. importNode: function () {
  708. return null;
  709. },
  710. location: {
  711. hash: '',
  712. host: '',
  713. hostname: '',
  714. href: '',
  715. origin: '',
  716. pathname: '',
  717. protocol: '',
  718. search: '',
  719. },
  720. };
  721. extend(doc, ssrDocument);
  722. var win = typeof window !== 'undefined' ? window : {};
  723. var ssrWindow = {
  724. document: ssrDocument,
  725. navigator: {
  726. userAgent: '',
  727. },
  728. location: {
  729. hash: '',
  730. host: '',
  731. hostname: '',
  732. href: '',
  733. origin: '',
  734. pathname: '',
  735. protocol: '',
  736. search: '',
  737. },
  738. history: {
  739. replaceState: function () { },
  740. pushState: function () { },
  741. go: function () { },
  742. back: function () { },
  743. },
  744. CustomEvent: function CustomEvent() {
  745. return this;
  746. },
  747. addEventListener: function () { },
  748. removeEventListener: function () { },
  749. getComputedStyle: function () {
  750. return {
  751. getPropertyValue: function () {
  752. return '';
  753. },
  754. };
  755. },
  756. Image: function () { },
  757. Date: function () { },
  758. screen: {},
  759. setTimeout: function () { },
  760. clearTimeout: function () { },
  761. matchMedia: function () {
  762. return {};
  763. },
  764. };
  765. extend(win, ssrWindow);
  766. /**
  767. * Dom7 2.1.5
  768. * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API
  769. * http://framework7.io/docs/dom.html
  770. *
  771. * Copyright 2020, Vladimir Kharlampidi
  772. * The iDangero.us
  773. * http://www.idangero.us/
  774. *
  775. * Licensed under MIT
  776. *
  777. * Released on: May 15, 2020
  778. */
  779. var Dom7 = function Dom7(arr) {
  780. var self = this;
  781. // Create array-like object
  782. for (var i = 0; i < arr.length; i += 1) {
  783. self[i] = arr[i];
  784. }
  785. self.length = arr.length;
  786. // Return collection with methods
  787. return this;
  788. };
  789. function $(selector, context) {
  790. var arr = [];
  791. var i = 0;
  792. if (selector && !context) {
  793. if (selector instanceof Dom7) {
  794. return selector;
  795. }
  796. }
  797. if (selector) {
  798. // String
  799. if (typeof selector === 'string') {
  800. var els;
  801. var tempParent;
  802. var html = selector.trim();
  803. if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {
  804. var toCreate = 'div';
  805. if (html.indexOf('<li') === 0) { toCreate = 'ul'; }
  806. if (html.indexOf('<tr') === 0) { toCreate = 'tbody'; }
  807. if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) { toCreate = 'tr'; }
  808. if (html.indexOf('<tbody') === 0) { toCreate = 'table'; }
  809. if (html.indexOf('<option') === 0) { toCreate = 'select'; }
  810. tempParent = doc.createElement(toCreate);
  811. tempParent.innerHTML = html;
  812. for (i = 0; i < tempParent.childNodes.length; i += 1) {
  813. arr.push(tempParent.childNodes[i]);
  814. }
  815. } else {
  816. if (!context && selector[0] === '#' && !selector.match(/[ .<>:~]/)) {
  817. // Pure ID selector
  818. els = [doc.getElementById(selector.trim().split('#')[1])];
  819. } else {
  820. // Other selectors
  821. els = (context || doc).querySelectorAll(selector.trim());
  822. }
  823. for (i = 0; i < els.length; i += 1) {
  824. if (els[i]) { arr.push(els[i]); }
  825. }
  826. }
  827. } else if (selector.nodeType || selector === win || selector === doc) {
  828. // Node/element
  829. arr.push(selector);
  830. } else if (selector.length > 0 && selector[0].nodeType) {
  831. // Array of elements or instance of Dom
  832. for (i = 0; i < selector.length; i += 1) {
  833. arr.push(selector[i]);
  834. }
  835. }
  836. }
  837. return new Dom7(arr);
  838. }
  839. $.fn = Dom7.prototype;
  840. $.Class = Dom7;
  841. $.Dom7 = Dom7;
  842. function unique(arr) {
  843. var uniqueArray = [];
  844. for (var i = 0; i < arr.length; i += 1) {
  845. if (uniqueArray.indexOf(arr[i]) === -1) { uniqueArray.push(arr[i]); }
  846. }
  847. return uniqueArray;
  848. }
  849. function toCamelCase(string) {
  850. return string.toLowerCase().replace(/-(.)/g, function (match, group1) { return group1.toUpperCase(); });
  851. }
  852. function requestAnimationFrame(callback) {
  853. if (win.requestAnimationFrame) { return win.requestAnimationFrame(callback); }
  854. else if (win.webkitRequestAnimationFrame) { return win.webkitRequestAnimationFrame(callback); }
  855. return win.setTimeout(callback, 1000 / 60);
  856. }
  857. function cancelAnimationFrame(id) {
  858. if (win.cancelAnimationFrame) { return win.cancelAnimationFrame(id); }
  859. else if (win.webkitCancelAnimationFrame) { return win.webkitCancelAnimationFrame(id); }
  860. return win.clearTimeout(id);
  861. }
  862. // Classes and attributes
  863. function addClass(className) {
  864. if (typeof className === 'undefined') {
  865. return this;
  866. }
  867. var classes = className.split(' ');
  868. for (var i = 0; i < classes.length; i += 1) {
  869. for (var j = 0; j < this.length; j += 1) {
  870. if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.add(classes[i]); }
  871. }
  872. }
  873. return this;
  874. }
  875. function removeClass(className) {
  876. var classes = className.split(' ');
  877. for (var i = 0; i < classes.length; i += 1) {
  878. for (var j = 0; j < this.length; j += 1) {
  879. if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.remove(classes[i]); }
  880. }
  881. }
  882. return this;
  883. }
  884. function hasClass(className) {
  885. if (!this[0]) { return false; }
  886. return this[0].classList.contains(className);
  887. }
  888. function toggleClass(className) {
  889. var classes = className.split(' ');
  890. for (var i = 0; i < classes.length; i += 1) {
  891. for (var j = 0; j < this.length; j += 1) {
  892. if (typeof this[j] !== 'undefined' && typeof this[j].classList !== 'undefined') { this[j].classList.toggle(classes[i]); }
  893. }
  894. }
  895. return this;
  896. }
  897. function attr(attrs, value) {
  898. var arguments$1 = arguments;
  899. if (arguments.length === 1 && typeof attrs === 'string') {
  900. // Get attr
  901. if (this[0]) { return this[0].getAttribute(attrs); }
  902. return undefined;
  903. }
  904. // Set attrs
  905. for (var i = 0; i < this.length; i += 1) {
  906. if (arguments$1.length === 2) {
  907. // String
  908. this[i].setAttribute(attrs, value);
  909. } else {
  910. // Object
  911. // eslint-disable-next-line
  912. for (var attrName in attrs) {
  913. this[i][attrName] = attrs[attrName];
  914. this[i].setAttribute(attrName, attrs[attrName]);
  915. }
  916. }
  917. }
  918. return this;
  919. }
  920. // eslint-disable-next-line
  921. function removeAttr(attr) {
  922. for (var i = 0; i < this.length; i += 1) {
  923. this[i].removeAttribute(attr);
  924. }
  925. return this;
  926. }
  927. // eslint-disable-next-line
  928. function prop(props, value) {
  929. var arguments$1 = arguments;
  930. if (arguments.length === 1 && typeof props === 'string') {
  931. // Get prop
  932. if (this[0]) { return this[0][props]; }
  933. } else {
  934. // Set props
  935. for (var i = 0; i < this.length; i += 1) {
  936. if (arguments$1.length === 2) {
  937. // String
  938. this[i][props] = value;
  939. } else {
  940. // Object
  941. // eslint-disable-next-line
  942. for (var propName in props) {
  943. this[i][propName] = props[propName];
  944. }
  945. }
  946. }
  947. return this;
  948. }
  949. }
  950. function data(key, value) {
  951. var el;
  952. if (typeof value === 'undefined') {
  953. el = this[0];
  954. // Get value
  955. if (el) {
  956. if (el.dom7ElementDataStorage && (key in el.dom7ElementDataStorage)) {
  957. return el.dom7ElementDataStorage[key];
  958. }
  959. var dataKey = el.getAttribute(("data-" + key));
  960. if (dataKey) {
  961. return dataKey;
  962. }
  963. return undefined;
  964. }
  965. return undefined;
  966. }
  967. // Set value
  968. for (var i = 0; i < this.length; i += 1) {
  969. el = this[i];
  970. if (!el.dom7ElementDataStorage) { el.dom7ElementDataStorage = {}; }
  971. el.dom7ElementDataStorage[key] = value;
  972. }
  973. return this;
  974. }
  975. function removeData(key) {
  976. for (var i = 0; i < this.length; i += 1) {
  977. var el = this[i];
  978. if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {
  979. el.dom7ElementDataStorage[key] = null;
  980. delete el.dom7ElementDataStorage[key];
  981. }
  982. }
  983. }
  984. function dataset() {
  985. var el = this[0];
  986. if (!el) { return undefined; }
  987. var dataset = {}; // eslint-disable-line
  988. if (el.dataset) {
  989. // eslint-disable-next-line
  990. for (var dataKey in el.dataset) {
  991. dataset[dataKey] = el.dataset[dataKey];
  992. }
  993. } else {
  994. for (var i = 0; i < el.attributes.length; i += 1) {
  995. // eslint-disable-next-line
  996. var attr = el.attributes[i];
  997. if (attr.name.indexOf('data-') >= 0) {
  998. dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;
  999. }
  1000. }
  1001. }
  1002. // eslint-disable-next-line
  1003. for (var key in dataset) {
  1004. if (dataset[key] === 'false') { dataset[key] = false; }
  1005. else if (dataset[key] === 'true') { dataset[key] = true; }
  1006. else if (parseFloat(dataset[key]) === dataset[key] * 1) { dataset[key] *= 1; }
  1007. }
  1008. return dataset;
  1009. }
  1010. function val(value) {
  1011. var dom = this;
  1012. if (typeof value === 'undefined') {
  1013. if (dom[0]) {
  1014. if (dom[0].multiple && dom[0].nodeName.toLowerCase() === 'select') {
  1015. var values = [];
  1016. for (var i = 0; i < dom[0].selectedOptions.length; i += 1) {
  1017. values.push(dom[0].selectedOptions[i].value);
  1018. }
  1019. return values;
  1020. }
  1021. return dom[0].value;
  1022. }
  1023. return undefined;
  1024. }
  1025. for (var i$1 = 0; i$1 < dom.length; i$1 += 1) {
  1026. var el = dom[i$1];
  1027. if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {
  1028. for (var j = 0; j < el.options.length; j += 1) {
  1029. el.options[j].selected = value.indexOf(el.options[j].value) >= 0;
  1030. }
  1031. } else {
  1032. el.value = value;
  1033. }
  1034. }
  1035. return dom;
  1036. }
  1037. // Transforms
  1038. // eslint-disable-next-line
  1039. function transform(transform) {
  1040. for (var i = 0; i < this.length; i += 1) {
  1041. var elStyle = this[i].style;
  1042. elStyle.webkitTransform = transform;
  1043. elStyle.transform = transform;
  1044. }
  1045. return this;
  1046. }
  1047. function transition(duration) {
  1048. if (typeof duration !== 'string') {
  1049. duration = duration + "ms"; // eslint-disable-line
  1050. }
  1051. for (var i = 0; i < this.length; i += 1) {
  1052. var elStyle = this[i].style;
  1053. elStyle.webkitTransitionDuration = duration;
  1054. elStyle.transitionDuration = duration;
  1055. }
  1056. return this;
  1057. }
  1058. // Events
  1059. function on() {
  1060. var assign;
  1061. var args = [], len = arguments.length;
  1062. while ( len-- ) args[ len ] = arguments[ len ];
  1063. var eventType = args[0];
  1064. var targetSelector = args[1];
  1065. var listener = args[2];
  1066. var capture = args[3];
  1067. if (typeof args[1] === 'function') {
  1068. (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
  1069. targetSelector = undefined;
  1070. }
  1071. if (!capture) { capture = false; }
  1072. function handleLiveEvent(e) {
  1073. var target = e.target;
  1074. if (!target) { return; }
  1075. var eventData = e.target.dom7EventData || [];
  1076. if (eventData.indexOf(e) < 0) {
  1077. eventData.unshift(e);
  1078. }
  1079. if ($(target).is(targetSelector)) { listener.apply(target, eventData); }
  1080. else {
  1081. var parents = $(target).parents(); // eslint-disable-line
  1082. for (var k = 0; k < parents.length; k += 1) {
  1083. if ($(parents[k]).is(targetSelector)) { listener.apply(parents[k], eventData); }
  1084. }
  1085. }
  1086. }
  1087. function handleEvent(e) {
  1088. var eventData = e && e.target ? e.target.dom7EventData || [] : [];
  1089. if (eventData.indexOf(e) < 0) {
  1090. eventData.unshift(e);
  1091. }
  1092. listener.apply(this, eventData);
  1093. }
  1094. var events = eventType.split(' ');
  1095. var j;
  1096. for (var i = 0; i < this.length; i += 1) {
  1097. var el = this[i];
  1098. if (!targetSelector) {
  1099. for (j = 0; j < events.length; j += 1) {
  1100. var event = events[j];
  1101. if (!el.dom7Listeners) { el.dom7Listeners = {}; }
  1102. if (!el.dom7Listeners[event]) { el.dom7Listeners[event] = []; }
  1103. el.dom7Listeners[event].push({
  1104. listener: listener,
  1105. proxyListener: handleEvent,
  1106. });
  1107. el.addEventListener(event, handleEvent, capture);
  1108. }
  1109. } else {
  1110. // Live events
  1111. for (j = 0; j < events.length; j += 1) {
  1112. var event$1 = events[j];
  1113. if (!el.dom7LiveListeners) { el.dom7LiveListeners = {}; }
  1114. if (!el.dom7LiveListeners[event$1]) { el.dom7LiveListeners[event$1] = []; }
  1115. el.dom7LiveListeners[event$1].push({
  1116. listener: listener,
  1117. proxyListener: handleLiveEvent,
  1118. });
  1119. el.addEventListener(event$1, handleLiveEvent, capture);
  1120. }
  1121. }
  1122. }
  1123. return this;
  1124. }
  1125. function off() {
  1126. var assign;
  1127. var args = [], len = arguments.length;
  1128. while ( len-- ) args[ len ] = arguments[ len ];
  1129. var eventType = args[0];
  1130. var targetSelector = args[1];
  1131. var listener = args[2];
  1132. var capture = args[3];
  1133. if (typeof args[1] === 'function') {
  1134. (assign = args, eventType = assign[0], listener = assign[1], capture = assign[2]);
  1135. targetSelector = undefined;
  1136. }
  1137. if (!capture) { capture = false; }
  1138. var events = eventType.split(' ');
  1139. for (var i = 0; i < events.length; i += 1) {
  1140. var event = events[i];
  1141. for (var j = 0; j < this.length; j += 1) {
  1142. var el = this[j];
  1143. var handlers = (void 0);
  1144. if (!targetSelector && el.dom7Listeners) {
  1145. handlers = el.dom7Listeners[event];
  1146. } else if (targetSelector && el.dom7LiveListeners) {
  1147. handlers = el.dom7LiveListeners[event];
  1148. }
  1149. if (handlers && handlers.length) {
  1150. for (var k = handlers.length - 1; k >= 0; k -= 1) {
  1151. var handler = handlers[k];
  1152. if (listener && handler.listener === listener) {
  1153. el.removeEventListener(event, handler.proxyListener, capture);
  1154. handlers.splice(k, 1);
  1155. } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {
  1156. el.removeEventListener(event, handler.proxyListener, capture);
  1157. handlers.splice(k, 1);
  1158. } else if (!listener) {
  1159. el.removeEventListener(event, handler.proxyListener, capture);
  1160. handlers.splice(k, 1);
  1161. }
  1162. }
  1163. }
  1164. }
  1165. }
  1166. return this;
  1167. }
  1168. function once() {
  1169. var assign;
  1170. var args = [], len = arguments.length;
  1171. while ( len-- ) args[ len ] = arguments[ len ];
  1172. var dom = this;
  1173. var eventName = args[0];
  1174. var targetSelector = args[1];
  1175. var listener = args[2];
  1176. var capture = args[3];
  1177. if (typeof args[1] === 'function') {
  1178. (assign = args, eventName = assign[0], listener = assign[1], capture = assign[2]);
  1179. targetSelector = undefined;
  1180. }
  1181. function onceHandler() {
  1182. var eventArgs = [], len = arguments.length;
  1183. while ( len-- ) eventArgs[ len ] = arguments[ len ];
  1184. listener.apply(this, eventArgs);
  1185. dom.off(eventName, targetSelector, onceHandler, capture);
  1186. if (onceHandler.dom7proxy) {
  1187. delete onceHandler.dom7proxy;
  1188. }
  1189. }
  1190. onceHandler.dom7proxy = listener;
  1191. return dom.on(eventName, targetSelector, onceHandler, capture);
  1192. }
  1193. function trigger() {
  1194. var args = [], len = arguments.length;
  1195. while ( len-- ) args[ len ] = arguments[ len ];
  1196. var events = args[0].split(' ');
  1197. var eventData = args[1];
  1198. for (var i = 0; i < events.length; i += 1) {
  1199. var event = events[i];
  1200. for (var j = 0; j < this.length; j += 1) {
  1201. var el = this[j];
  1202. var evt = (void 0);
  1203. try {
  1204. evt = new win.CustomEvent(event, {
  1205. detail: eventData,
  1206. bubbles: true,
  1207. cancelable: true,
  1208. });
  1209. } catch (e) {
  1210. evt = doc.createEvent('Event');
  1211. evt.initEvent(event, true, true);
  1212. evt.detail = eventData;
  1213. }
  1214. // eslint-disable-next-line
  1215. el.dom7EventData = args.filter(function (data, dataIndex) { return dataIndex > 0; });
  1216. el.dispatchEvent(evt);
  1217. el.dom7EventData = [];
  1218. delete el.dom7EventData;
  1219. }
  1220. }
  1221. return this;
  1222. }
  1223. function transitionEnd(callback) {
  1224. var events = ['webkitTransitionEnd', 'transitionend'];
  1225. var dom = this;
  1226. var i;
  1227. function fireCallBack(e) {
  1228. /* jshint validthis:true */
  1229. if (e.target !== this) { return; }
  1230. callback.call(this, e);
  1231. for (i = 0; i < events.length; i += 1) {
  1232. dom.off(events[i], fireCallBack);
  1233. }
  1234. }
  1235. if (callback) {
  1236. for (i = 0; i < events.length; i += 1) {
  1237. dom.on(events[i], fireCallBack);
  1238. }
  1239. }
  1240. return this;
  1241. }
  1242. function animationEnd(callback) {
  1243. var events = ['webkitAnimationEnd', 'animationend'];
  1244. var dom = this;
  1245. var i;
  1246. function fireCallBack(e) {
  1247. if (e.target !== this) { return; }
  1248. callback.call(this, e);
  1249. for (i = 0; i < events.length; i += 1) {
  1250. dom.off(events[i], fireCallBack);
  1251. }
  1252. }
  1253. if (callback) {
  1254. for (i = 0; i < events.length; i += 1) {
  1255. dom.on(events[i], fireCallBack);
  1256. }
  1257. }
  1258. return this;
  1259. }
  1260. // Sizing/Styles
  1261. function width() {
  1262. if (this[0] === win) {
  1263. return win.innerWidth;
  1264. }
  1265. if (this.length > 0) {
  1266. return parseFloat(this.css('width'));
  1267. }
  1268. return null;
  1269. }
  1270. function outerWidth(includeMargins) {
  1271. if (this.length > 0) {
  1272. if (includeMargins) {
  1273. // eslint-disable-next-line
  1274. var styles = this.styles();
  1275. return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));
  1276. }
  1277. return this[0].offsetWidth;
  1278. }
  1279. return null;
  1280. }
  1281. function height() {
  1282. if (this[0] === win) {
  1283. return win.innerHeight;
  1284. }
  1285. if (this.length > 0) {
  1286. return parseFloat(this.css('height'));
  1287. }
  1288. return null;
  1289. }
  1290. function outerHeight(includeMargins) {
  1291. if (this.length > 0) {
  1292. if (includeMargins) {
  1293. // eslint-disable-next-line
  1294. var styles = this.styles();
  1295. return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));
  1296. }
  1297. return this[0].offsetHeight;
  1298. }
  1299. return null;
  1300. }
  1301. function offset() {
  1302. if (this.length > 0) {
  1303. var el = this[0];
  1304. var box = el.getBoundingClientRect();
  1305. var body = doc.body;
  1306. var clientTop = el.clientTop || body.clientTop || 0;
  1307. var clientLeft = el.clientLeft || body.clientLeft || 0;
  1308. var scrollTop = el === win ? win.scrollY : el.scrollTop;
  1309. var scrollLeft = el === win ? win.scrollX : el.scrollLeft;
  1310. return {
  1311. top: (box.top + scrollTop) - clientTop,
  1312. left: (box.left + scrollLeft) - clientLeft,
  1313. };
  1314. }
  1315. return null;
  1316. }
  1317. function hide() {
  1318. for (var i = 0; i < this.length; i += 1) {
  1319. this[i].style.display = 'none';
  1320. }
  1321. return this;
  1322. }
  1323. function show() {
  1324. for (var i = 0; i < this.length; i += 1) {
  1325. var el = this[i];
  1326. if (el.style.display === 'none') {
  1327. el.style.display = '';
  1328. }
  1329. if (win.getComputedStyle(el, null).getPropertyValue('display') === 'none') {
  1330. // Still not visible
  1331. el.style.display = 'block';
  1332. }
  1333. }
  1334. return this;
  1335. }
  1336. function styles() {
  1337. if (this[0]) { return win.getComputedStyle(this[0], null); }
  1338. return {};
  1339. }
  1340. function css(props, value) {
  1341. var i;
  1342. if (arguments.length === 1) {
  1343. if (typeof props === 'string') {
  1344. if (this[0]) { return win.getComputedStyle(this[0], null).getPropertyValue(props); }
  1345. } else {
  1346. for (i = 0; i < this.length; i += 1) {
  1347. // eslint-disable-next-line
  1348. for (var prop in props) {
  1349. this[i].style[prop] = props[prop];
  1350. }
  1351. }
  1352. return this;
  1353. }
  1354. }
  1355. if (arguments.length === 2 && typeof props === 'string') {
  1356. for (i = 0; i < this.length; i += 1) {
  1357. this[i].style[props] = value;
  1358. }
  1359. return this;
  1360. }
  1361. return this;
  1362. }
  1363. // Dom manipulation
  1364. function toArray() {
  1365. var arr = [];
  1366. for (var i = 0; i < this.length; i += 1) {
  1367. arr.push(this[i]);
  1368. }
  1369. return arr;
  1370. }
  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
  1380. return this;
  1381. }
  1382. }
  1383. // Return `this` to allow chained DOM operations
  1384. return this;
  1385. }
  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
  1394. return this;
  1395. }
  1396. }
  1397. // Return `this` to allow chained DOM operations
  1398. return this;
  1399. }
  1400. function filter(callback) {
  1401. var matchedItems = [];
  1402. var dom = this;
  1403. for (var i = 0; i < dom.length; i += 1) {
  1404. if (callback.call(dom[i], i, dom[i])) { matchedItems.push(dom[i]); }
  1405. }
  1406. return new Dom7(matchedItems);
  1407. }
  1408. function map(callback) {
  1409. var modifiedItems = [];
  1410. var dom = this;
  1411. for (var i = 0; i < dom.length; i += 1) {
  1412. modifiedItems.push(callback.call(dom[i], i, dom[i]));
  1413. }
  1414. return new Dom7(modifiedItems);
  1415. }
  1416. // eslint-disable-next-line
  1417. function html(html) {
  1418. if (typeof html === 'undefined') {
  1419. return this[0] ? this[0].innerHTML : undefined;
  1420. }
  1421. for (var i = 0; i < this.length; i += 1) {
  1422. this[i].innerHTML = html;
  1423. }
  1424. return this;
  1425. }
  1426. // eslint-disable-next-line
  1427. function text(text) {
  1428. if (typeof text === 'undefined') {
  1429. if (this[0]) {
  1430. return this[0].textContent.trim();
  1431. }
  1432. return null;
  1433. }
  1434. for (var i = 0; i < this.length; i += 1) {
  1435. this[i].textContent = text;
  1436. }
  1437. return this;
  1438. }
  1439. function is(selector) {
  1440. var el = this[0];
  1441. var compareWith;
  1442. var i;
  1443. if (!el || typeof selector === 'undefined') { return false; }
  1444. if (typeof selector === 'string') {
  1445. if (el.matches) { return el.matches(selector); }
  1446. else if (el.webkitMatchesSelector) { return el.webkitMatchesSelector(selector); }
  1447. else if (el.msMatchesSelector) { return el.msMatchesSelector(selector); }
  1448. compareWith = $(selector);
  1449. for (i = 0; i < compareWith.length; i += 1) {
  1450. if (compareWith[i] === el) { return true; }
  1451. }
  1452. return false;
  1453. } else if (selector === doc) { return el === doc; }
  1454. else if (selector === win) { return el === win; }
  1455. if (selector.nodeType || selector instanceof Dom7) {
  1456. compareWith = selector.nodeType ? [selector] : selector;
  1457. for (i = 0; i < compareWith.length; i += 1) {
  1458. if (compareWith[i] === el) { return true; }
  1459. }
  1460. return false;
  1461. }
  1462. return false;
  1463. }
  1464. function indexOf(el) {
  1465. for (var i = 0; i < this.length; i += 1) {
  1466. if (this[i] === el) { return i; }
  1467. }
  1468. return -1;
  1469. }
  1470. function index() {
  1471. var child = this[0];
  1472. var i;
  1473. if (child) {
  1474. i = 0;
  1475. // eslint-disable-next-line
  1476. while ((child = child.previousSibling) !== null) {
  1477. if (child.nodeType === 1) { i += 1; }
  1478. }
  1479. return i;
  1480. }
  1481. return undefined;
  1482. }
  1483. // eslint-disable-next-line
  1484. function eq(index) {
  1485. if (typeof index === 'undefined') { return this; }
  1486. var length = this.length;
  1487. var returnIndex;
  1488. if (index > length - 1) {
  1489. return new Dom7([]);
  1490. }
  1491. if (index < 0) {
  1492. returnIndex = length + index;
  1493. if (returnIndex < 0) { return new Dom7([]); }
  1494. return new Dom7([this[returnIndex]]);
  1495. }
  1496. return new Dom7([this[index]]);
  1497. }
  1498. function append() {
  1499. var args = [], len = arguments.length;
  1500. while ( len-- ) args[ len ] = arguments[ len ];
  1501. var newChild;
  1502. for (var k = 0; k < args.length; k += 1) {
  1503. newChild = args[k];
  1504. for (var i = 0; i < this.length; i += 1) {
  1505. if (typeof newChild === 'string') {
  1506. var tempDiv = doc.createElement('div');
  1507. tempDiv.innerHTML = newChild;
  1508. while (tempDiv.firstChild) {
  1509. this[i].appendChild(tempDiv.firstChild);
  1510. }
  1511. } else if (newChild instanceof Dom7) {
  1512. for (var j = 0; j < newChild.length; j += 1) {
  1513. this[i].appendChild(newChild[j]);
  1514. }
  1515. } else {
  1516. this[i].appendChild(newChild);
  1517. }
  1518. }
  1519. }
  1520. return this;
  1521. }
  1522. // eslint-disable-next-line
  1523. function appendTo(parent) {
  1524. $(parent).append(this);
  1525. return this;
  1526. }
  1527. function prepend(newChild) {
  1528. var i;
  1529. var j;
  1530. for (i = 0; i < this.length; i += 1) {
  1531. if (typeof newChild === 'string') {
  1532. var tempDiv = doc.createElement('div');
  1533. tempDiv.innerHTML = newChild;
  1534. for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {
  1535. this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);
  1536. }
  1537. } else if (newChild instanceof Dom7) {
  1538. for (j = 0; j < newChild.length; j += 1) {
  1539. this[i].insertBefore(newChild[j], this[i].childNodes[0]);
  1540. }
  1541. } else {
  1542. this[i].insertBefore(newChild, this[i].childNodes[0]);
  1543. }
  1544. }
  1545. return this;
  1546. }
  1547. // eslint-disable-next-line
  1548. function prependTo(parent) {
  1549. $(parent).prepend(this);
  1550. return this;
  1551. }
  1552. function insertBefore(selector) {
  1553. var before = $(selector);
  1554. for (var i = 0; i < this.length; i += 1) {
  1555. if (before.length === 1) {
  1556. before[0].parentNode.insertBefore(this[i], before[0]);
  1557. } else if (before.length > 1) {
  1558. for (var j = 0; j < before.length; j += 1) {
  1559. before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);
  1560. }
  1561. }
  1562. }
  1563. }
  1564. function insertAfter(selector) {
  1565. var after = $(selector);
  1566. for (var i = 0; i < this.length; i += 1) {
  1567. if (after.length === 1) {
  1568. after[0].parentNode.insertBefore(this[i], after[0].nextSibling);
  1569. } else if (after.length > 1) {
  1570. for (var j = 0; j < after.length; j += 1) {
  1571. after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);
  1572. }
  1573. }
  1574. }
  1575. }
  1576. function next(selector) {
  1577. if (this.length > 0) {
  1578. if (selector) {
  1579. if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {
  1580. return new Dom7([this[0].nextElementSibling]);
  1581. }
  1582. return new Dom7([]);
  1583. }
  1584. if (this[0].nextElementSibling) { return new Dom7([this[0].nextElementSibling]); }
  1585. return new Dom7([]);
  1586. }
  1587. return new Dom7([]);
  1588. }
  1589. function nextAll(selector) {
  1590. var nextEls = [];
  1591. var el = this[0];
  1592. if (!el) { return new Dom7([]); }
  1593. while (el.nextElementSibling) {
  1594. var next = el.nextElementSibling; // eslint-disable-line
  1595. if (selector) {
  1596. if ($(next).is(selector)) { nextEls.push(next); }
  1597. } else { nextEls.push(next); }
  1598. el = next;
  1599. }
  1600. return new Dom7(nextEls);
  1601. }
  1602. function prev(selector) {
  1603. if (this.length > 0) {
  1604. var el = this[0];
  1605. if (selector) {
  1606. if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {
  1607. return new Dom7([el.previousElementSibling]);
  1608. }
  1609. return new Dom7([]);
  1610. }
  1611. if (el.previousElementSibling) { return new Dom7([el.previousElementSibling]); }
  1612. return new Dom7([]);
  1613. }
  1614. return new Dom7([]);
  1615. }
  1616. function prevAll(selector) {
  1617. var prevEls = [];
  1618. var el = this[0];
  1619. if (!el) { return new Dom7([]); }
  1620. while (el.previousElementSibling) {
  1621. var prev = el.previousElementSibling; // eslint-disable-line
  1622. if (selector) {
  1623. if ($(prev).is(selector)) { prevEls.push(prev); }
  1624. } else { prevEls.push(prev); }
  1625. el = prev;
  1626. }
  1627. return new Dom7(prevEls);
  1628. }
  1629. function siblings(selector) {
  1630. return this.nextAll(selector).add(this.prevAll(selector));
  1631. }
  1632. function parent(selector) {
  1633. var parents = []; // eslint-disable-line
  1634. for (var i = 0; i < this.length; i += 1) {
  1635. if (this[i].parentNode !== null) {
  1636. if (selector) {
  1637. if ($(this[i].parentNode).is(selector)) { parents.push(this[i].parentNode); }
  1638. } else {
  1639. parents.push(this[i].parentNode);
  1640. }
  1641. }
  1642. }
  1643. return $(unique(parents));
  1644. }
  1645. function parents(selector) {
  1646. var parents = []; // eslint-disable-line
  1647. for (var i = 0; i < this.length; i += 1) {
  1648. var parent = this[i].parentNode; // eslint-disable-line
  1649. while (parent) {
  1650. if (selector) {
  1651. if ($(parent).is(selector)) { parents.push(parent); }
  1652. } else {
  1653. parents.push(parent);
  1654. }
  1655. parent = parent.parentNode;
  1656. }
  1657. }
  1658. return $(unique(parents));
  1659. }
  1660. function closest(selector) {
  1661. var closest = this; // eslint-disable-line
  1662. if (typeof selector === 'undefined') {
  1663. return new Dom7([]);
  1664. }
  1665. if (!closest.is(selector)) {
  1666. closest = closest.parents(selector).eq(0);
  1667. }
  1668. return closest;
  1669. }
  1670. function find(selector) {
  1671. var foundElements = [];
  1672. for (var i = 0; i < this.length; i += 1) {
  1673. var found = this[i].querySelectorAll(selector);
  1674. for (var j = 0; j < found.length; j += 1) {
  1675. foundElements.push(found[j]);
  1676. }
  1677. }
  1678. return new Dom7(foundElements);
  1679. }
  1680. function children(selector) {
  1681. var children = []; // eslint-disable-line
  1682. for (var i = 0; i < this.length; i += 1) {
  1683. var childNodes = this[i].childNodes;
  1684. for (var j = 0; j < childNodes.length; j += 1) {
  1685. if (!selector) {
  1686. if (childNodes[j].nodeType === 1) { children.push(childNodes[j]); }
  1687. } else if (childNodes[j].nodeType === 1 && $(childNodes[j]).is(selector)) {
  1688. children.push(childNodes[j]);
  1689. }
  1690. }
  1691. }
  1692. return new Dom7(unique(children));
  1693. }
  1694. function remove() {
  1695. for (var i = 0; i < this.length; i += 1) {
  1696. if (this[i].parentNode) { this[i].parentNode.removeChild(this[i]); }
  1697. }
  1698. return this;
  1699. }
  1700. function detach() {
  1701. return this.remove();
  1702. }
  1703. function add() {
  1704. var args = [], len = arguments.length;
  1705. while ( len-- ) args[ len ] = arguments[ len ];
  1706. var dom = this;
  1707. var i;
  1708. var j;
  1709. for (i = 0; i < args.length; i += 1) {
  1710. var toAdd = $(args[i]);
  1711. for (j = 0; j < toAdd.length; j += 1) {
  1712. dom[dom.length] = toAdd[j];
  1713. dom.length += 1;
  1714. }
  1715. }
  1716. return dom;
  1717. }
  1718. function empty() {
  1719. for (var i = 0; i < this.length; i += 1) {
  1720. var el = this[i];
  1721. if (el.nodeType === 1) {
  1722. for (var j = 0; j < el.childNodes.length; j += 1) {
  1723. if (el.childNodes[j].parentNode) {
  1724. el.childNodes[j].parentNode.removeChild(el.childNodes[j]);
  1725. }
  1726. }
  1727. el.textContent = '';
  1728. }
  1729. }
  1730. return this;
  1731. }
  1732. var Methods = /*#__PURE__*/Object.freeze({
  1733. addClass: addClass,
  1734. removeClass: removeClass,
  1735. hasClass: hasClass,
  1736. toggleClass: toggleClass,
  1737. attr: attr,
  1738. removeAttr: removeAttr,
  1739. prop: prop,
  1740. data: data,
  1741. removeData: removeData,
  1742. dataset: dataset,
  1743. val: val,
  1744. transform: transform,
  1745. transition: transition,
  1746. on: on,
  1747. off: off,
  1748. once: once,
  1749. trigger: trigger,
  1750. transitionEnd: transitionEnd,
  1751. animationEnd: animationEnd,
  1752. width: width,
  1753. outerWidth: outerWidth,
  1754. height: height,
  1755. outerHeight: outerHeight,
  1756. offset: offset,
  1757. hide: hide,
  1758. show: show,
  1759. styles: styles,
  1760. css: css,
  1761. toArray: toArray,
  1762. each: each,
  1763. forEach: forEach,
  1764. filter: filter,
  1765. map: map,
  1766. html: html,
  1767. text: text,
  1768. is: is,
  1769. indexOf: indexOf,
  1770. index: index,
  1771. eq: eq,
  1772. append: append,
  1773. appendTo: appendTo,
  1774. prepend: prepend,
  1775. prependTo: prependTo,
  1776. insertBefore: insertBefore,
  1777. insertAfter: insertAfter,
  1778. next: next,
  1779. nextAll: nextAll,
  1780. prev: prev,
  1781. prevAll: prevAll,
  1782. siblings: siblings,
  1783. parent: parent,
  1784. parents: parents,
  1785. closest: closest,
  1786. find: find,
  1787. children: children,
  1788. remove: remove,
  1789. detach: detach,
  1790. add: add,
  1791. empty: empty
  1792. });
  1793. function scrollTo() {
  1794. var assign;
  1795. var args = [], len = arguments.length;
  1796. while ( len-- ) args[ len ] = arguments[ len ];
  1797. var left = args[0];
  1798. var top = args[1];
  1799. var duration = args[2];
  1800. var easing = args[3];
  1801. var callback = args[4];
  1802. if (args.length === 4 && typeof easing === 'function') {
  1803. callback = easing;
  1804. (assign = args, left = assign[0], top = assign[1], duration = assign[2], callback = assign[3], easing = assign[4]);
  1805. }
  1806. if (typeof easing === 'undefined') { easing = 'swing'; }
  1807. return this.each(function animate() {
  1808. var el = this;
  1809. var currentTop;
  1810. var currentLeft;
  1811. var maxTop;
  1812. var maxLeft;
  1813. var newTop;
  1814. var newLeft;
  1815. var scrollTop; // eslint-disable-line
  1816. var scrollLeft; // eslint-disable-line
  1817. var animateTop = top > 0 || top === 0;
  1818. var animateLeft = left > 0 || left === 0;
  1819. if (typeof easing === 'undefined') {
  1820. easing = 'swing';
  1821. }
  1822. if (animateTop) {
  1823. currentTop = el.scrollTop;
  1824. if (!duration) {
  1825. el.scrollTop = top;
  1826. }
  1827. }
  1828. if (animateLeft) {
  1829. currentLeft = el.scrollLeft;
  1830. if (!duration) {
  1831. el.scrollLeft = left;
  1832. }
  1833. }
  1834. if (!duration) { return; }
  1835. if (animateTop) {
  1836. maxTop = el.scrollHeight - el.offsetHeight;
  1837. newTop = Math.max(Math.min(top, maxTop), 0);
  1838. }
  1839. if (animateLeft) {
  1840. maxLeft = el.scrollWidth - el.offsetWidth;
  1841. newLeft = Math.max(Math.min(left, maxLeft), 0);
  1842. }
  1843. var startTime = null;
  1844. if (animateTop && newTop === currentTop) { animateTop = false; }
  1845. if (animateLeft && newLeft === currentLeft) { animateLeft = false; }
  1846. function render(time) {
  1847. if ( time === void 0 ) time = new Date().getTime();
  1848. if (startTime === null) {
  1849. startTime = time;
  1850. }
  1851. var progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
  1852. var easeProgress = easing === 'linear' ? progress : (0.5 - (Math.cos(progress * Math.PI) / 2));
  1853. var done;
  1854. if (animateTop) { scrollTop = currentTop + (easeProgress * (newTop - currentTop)); }
  1855. if (animateLeft) { scrollLeft = currentLeft + (easeProgress * (newLeft - currentLeft)); }
  1856. if (animateTop && newTop > currentTop && scrollTop >= newTop) {
  1857. el.scrollTop = newTop;
  1858. done = true;
  1859. }
  1860. if (animateTop && newTop < currentTop && scrollTop <= newTop) {
  1861. el.scrollTop = newTop;
  1862. done = true;
  1863. }
  1864. if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {
  1865. el.scrollLeft = newLeft;
  1866. done = true;
  1867. }
  1868. if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {
  1869. el.scrollLeft = newLeft;
  1870. done = true;
  1871. }
  1872. if (done) {
  1873. if (callback) { callback(); }
  1874. return;
  1875. }
  1876. if (animateTop) { el.scrollTop = scrollTop; }
  1877. if (animateLeft) { el.scrollLeft = scrollLeft; }
  1878. requestAnimationFrame(render);
  1879. }
  1880. requestAnimationFrame(render);
  1881. });
  1882. }
  1883. // scrollTop(top, duration, easing, callback) {
  1884. function scrollTop() {
  1885. var assign;
  1886. var args = [], len = arguments.length;
  1887. while ( len-- ) args[ len ] = arguments[ len ];
  1888. var top = args[0];
  1889. var duration = args[1];
  1890. var easing = args[2];
  1891. var callback = args[3];
  1892. if (args.length === 3 && typeof easing === 'function') {
  1893. (assign = args, top = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
  1894. }
  1895. var dom = this;
  1896. if (typeof top === 'undefined') {
  1897. if (dom.length > 0) { return dom[0].scrollTop; }
  1898. return null;
  1899. }
  1900. return dom.scrollTo(undefined, top, duration, easing, callback);
  1901. }
  1902. function scrollLeft() {
  1903. var assign;
  1904. var args = [], len = arguments.length;
  1905. while ( len-- ) args[ len ] = arguments[ len ];
  1906. var left = args[0];
  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, left = assign[0], duration = assign[1], callback = assign[2], easing = assign[3]);
  1912. }
  1913. var dom = this;
  1914. if (typeof left === 'undefined') {
  1915. if (dom.length > 0) { return dom[0].scrollLeft; }
  1916. return null;
  1917. }
  1918. return dom.scrollTo(left, undefined, duration, easing, callback);
  1919. }
  1920. var Scroll = /*#__PURE__*/Object.freeze({
  1921. scrollTo: scrollTo,
  1922. scrollTop: scrollTop,
  1923. scrollLeft: scrollLeft
  1924. });
  1925. function animate(initialProps, initialParams) {
  1926. var els = this;
  1927. var a = {
  1928. props: Object.assign({}, initialProps),
  1929. params: Object.assign({
  1930. duration: 300,
  1931. easing: 'swing', // or 'linear'
  1932. /* Callbacks
  1933. begin(elements)
  1934. complete(elements)
  1935. progress(elements, complete, remaining, start, tweenValue)
  1936. */
  1937. }, initialParams),
  1938. elements: els,
  1939. animating: false,
  1940. que: [],
  1941. easingProgress: function easingProgress(easing, progress) {
  1942. if (easing === 'swing') {
  1943. return 0.5 - (Math.cos(progress * Math.PI) / 2);
  1944. }
  1945. if (typeof easing === 'function') {
  1946. return easing(progress);
  1947. }
  1948. return progress;
  1949. },
  1950. stop: function stop() {
  1951. if (a.frameId) {
  1952. cancelAnimationFrame(a.frameId);
  1953. }
  1954. a.animating = false;
  1955. a.elements.each(function (index, el) {
  1956. var element = el;
  1957. delete element.dom7AnimateInstance;
  1958. });
  1959. a.que = [];
  1960. },
  1961. done: function done(complete) {
  1962. a.animating = false;
  1963. a.elements.each(function (index, el) {
  1964. var element = el;
  1965. delete element.dom7AnimateInstance;
  1966. });
  1967. if (complete) { complete(els); }
  1968. if (a.que.length > 0) {
  1969. var que = a.que.shift();
  1970. a.animate(que[0], que[1]);
  1971. }
  1972. },
  1973. animate: function animate(props, params) {
  1974. if (a.animating) {
  1975. a.que.push([props, params]);
  1976. return a;
  1977. }
  1978. var elements = [];
  1979. // Define & Cache Initials & Units
  1980. a.elements.each(function (index, el) {
  1981. var initialFullValue;
  1982. var initialValue;
  1983. var unit;
  1984. var finalValue;
  1985. var finalFullValue;
  1986. if (!el.dom7AnimateInstance) { a.elements[index].dom7AnimateInstance = a; }
  1987. elements[index] = {
  1988. container: el,
  1989. };
  1990. Object.keys(props).forEach(function (prop) {
  1991. initialFullValue = win.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');
  1992. initialValue = parseFloat(initialFullValue);
  1993. unit = initialFullValue.replace(initialValue, '');
  1994. finalValue = parseFloat(props[prop]);
  1995. finalFullValue = props[prop] + unit;
  1996. elements[index][prop] = {
  1997. initialFullValue: initialFullValue,
  1998. initialValue: initialValue,
  1999. unit: unit,
  2000. finalValue: finalValue,
  2001. finalFullValue: finalFullValue,
  2002. currentValue: initialValue,
  2003. };
  2004. });
  2005. });
  2006. var startTime = null;
  2007. var time;
  2008. var elementsDone = 0;
  2009. var propsDone = 0;
  2010. var done;
  2011. var began = false;
  2012. a.animating = true;
  2013. function render() {
  2014. time = new Date().getTime();
  2015. var progress;
  2016. var easeProgress;
  2017. // let el;
  2018. if (!began) {
  2019. began = true;
  2020. if (params.begin) { params.begin(els); }
  2021. }
  2022. if (startTime === null) {
  2023. startTime = time;
  2024. }
  2025. if (params.progress) {
  2026. // eslint-disable-next-line
  2027. params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), ((startTime + params.duration) - time < 0 ? 0 : (startTime + params.duration) - time), startTime);
  2028. }
  2029. elements.forEach(function (element) {
  2030. var el = element;
  2031. if (done || el.done) { return; }
  2032. Object.keys(props).forEach(function (prop) {
  2033. if (done || el.done) { return; }
  2034. progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);
  2035. easeProgress = a.easingProgress(params.easing, progress);
  2036. var ref = el[prop];
  2037. var initialValue = ref.initialValue;
  2038. var finalValue = ref.finalValue;
  2039. var unit = ref.unit;
  2040. el[prop].currentValue = initialValue + (easeProgress * (finalValue - initialValue));
  2041. var currentValue = el[prop].currentValue;
  2042. if (
  2043. (finalValue > initialValue && currentValue >= finalValue) ||
  2044. (finalValue < initialValue && currentValue <= finalValue)) {
  2045. el.container.style[prop] = finalValue + unit;
  2046. propsDone += 1;
  2047. if (propsDone === Object.keys(props).length) {
  2048. el.done = true;
  2049. elementsDone += 1;
  2050. }
  2051. if (elementsDone === elements.length) {
  2052. done = true;
  2053. }
  2054. }
  2055. if (done) {
  2056. a.done(params.complete);
  2057. return;
  2058. }
  2059. el.container.style[prop] = currentValue + unit;
  2060. });
  2061. });
  2062. if (done) { return; }
  2063. // Then call
  2064. a.frameId = requestAnimationFrame(render);
  2065. }
  2066. a.frameId = requestAnimationFrame(render);
  2067. return a;
  2068. },
  2069. };
  2070. if (a.elements.length === 0) {
  2071. return els;
  2072. }
  2073. var animateInstance;
  2074. for (var i = 0; i < a.elements.length; i += 1) {
  2075. if (a.elements[i].dom7AnimateInstance) {
  2076. animateInstance = a.elements[i].dom7AnimateInstance;
  2077. } else { a.elements[i].dom7AnimateInstance = a; }
  2078. }
  2079. if (!animateInstance) {
  2080. animateInstance = a;
  2081. }
  2082. if (initialProps === 'stop') {
  2083. animateInstance.stop();
  2084. } else {
  2085. animateInstance.animate(a.props, a.params);
  2086. }
  2087. return els;
  2088. }
  2089. function stop() {
  2090. var els = this;
  2091. for (var i = 0; i < els.length; i += 1) {
  2092. if (els[i].dom7AnimateInstance) {
  2093. els[i].dom7AnimateInstance.stop();
  2094. }
  2095. }
  2096. }
  2097. var Animate = /*#__PURE__*/Object.freeze({
  2098. animate: animate,
  2099. stop: stop
  2100. });
  2101. var noTrigger = ('resize scroll').split(' ');
  2102. function eventShortcut(name) {
  2103. var ref;
  2104. var args = [], len = arguments.length - 1;
  2105. while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
  2106. if (typeof args[0] === 'undefined') {
  2107. for (var i = 0; i < this.length; i += 1) {
  2108. if (noTrigger.indexOf(name) < 0) {
  2109. if (name in this[i]) { this[i][name](); }
  2110. else {
  2111. $(this[i]).trigger(name);
  2112. }
  2113. }
  2114. }
  2115. return this;
  2116. }
  2117. return (ref = this).on.apply(ref, [ name ].concat( args ));
  2118. }
  2119. function click() {
  2120. var args = [], len = arguments.length;
  2121. while ( len-- ) args[ len ] = arguments[ len ];
  2122. return eventShortcut.bind(this).apply(void 0, [ 'click' ].concat( args ));
  2123. }
  2124. function blur() {
  2125. var args = [], len = arguments.length;
  2126. while ( len-- ) args[ len ] = arguments[ len ];
  2127. return eventShortcut.bind(this).apply(void 0, [ 'blur' ].concat( args ));
  2128. }
  2129. function focus() {
  2130. var args = [], len = arguments.length;
  2131. while ( len-- ) args[ len ] = arguments[ len ];
  2132. return eventShortcut.bind(this).apply(void 0, [ 'focus' ].concat( args ));
  2133. }
  2134. function focusin() {
  2135. var args = [], len = arguments.length;
  2136. while ( len-- ) args[ len ] = arguments[ len ];
  2137. return eventShortcut.bind(this).apply(void 0, [ 'focusin' ].concat( args ));
  2138. }
  2139. function focusout() {
  2140. var args = [], len = arguments.length;
  2141. while ( len-- ) args[ len ] = arguments[ len ];
  2142. return eventShortcut.bind(this).apply(void 0, [ 'focusout' ].concat( args ));
  2143. }
  2144. function keyup() {
  2145. var args = [], len = arguments.length;
  2146. while ( len-- ) args[ len ] = arguments[ len ];
  2147. return eventShortcut.bind(this).apply(void 0, [ 'keyup' ].concat( args ));
  2148. }
  2149. function keydown() {
  2150. var args = [], len = arguments.length;
  2151. while ( len-- ) args[ len ] = arguments[ len ];
  2152. return eventShortcut.bind(this).apply(void 0, [ 'keydown' ].concat( args ));
  2153. }
  2154. function keypress() {
  2155. var args = [], len = arguments.length;
  2156. while ( len-- ) args[ len ] = arguments[ len ];
  2157. return eventShortcut.bind(this).apply(void 0, [ 'keypress' ].concat( args ));
  2158. }
  2159. function submit() {
  2160. var args = [], len = arguments.length;
  2161. while ( len-- ) args[ len ] = arguments[ len ];
  2162. return eventShortcut.bind(this).apply(void 0, [ 'submit' ].concat( args ));
  2163. }
  2164. function change() {
  2165. var args = [], len = arguments.length;
  2166. while ( len-- ) args[ len ] = arguments[ len ];
  2167. return eventShortcut.bind(this).apply(void 0, [ 'change' ].concat( args ));
  2168. }
  2169. function mousedown() {
  2170. var args = [], len = arguments.length;
  2171. while ( len-- ) args[ len ] = arguments[ len ];
  2172. return eventShortcut.bind(this).apply(void 0, [ 'mousedown' ].concat( args ));
  2173. }
  2174. function mousemove() {
  2175. var args = [], len = arguments.length;
  2176. while ( len-- ) args[ len ] = arguments[ len ];
  2177. return eventShortcut.bind(this).apply(void 0, [ 'mousemove' ].concat( args ));
  2178. }
  2179. function mouseup() {
  2180. var args = [], len = arguments.length;
  2181. while ( len-- ) args[ len ] = arguments[ len ];
  2182. return eventShortcut.bind(this).apply(void 0, [ 'mouseup' ].concat( args ));
  2183. }
  2184. function mouseenter() {
  2185. var args = [], len = arguments.length;
  2186. while ( len-- ) args[ len ] = arguments[ len ];
  2187. return eventShortcut.bind(this).apply(void 0, [ 'mouseenter' ].concat( args ));
  2188. }
  2189. function mouseleave() {
  2190. var args = [], len = arguments.length;
  2191. while ( len-- ) args[ len ] = arguments[ len ];
  2192. return eventShortcut.bind(this).apply(void 0, [ 'mouseleave' ].concat( args ));
  2193. }
  2194. function mouseout() {
  2195. var args = [], len = arguments.length;
  2196. while ( len-- ) args[ len ] = arguments[ len ];
  2197. return eventShortcut.bind(this).apply(void 0, [ 'mouseout' ].concat( args ));
  2198. }
  2199. function mouseover() {
  2200. var args = [], len = arguments.length;
  2201. while ( len-- ) args[ len ] = arguments[ len ];
  2202. return eventShortcut.bind(this).apply(void 0, [ 'mouseover' ].concat( args ));
  2203. }
  2204. function touchstart() {
  2205. var args = [], len = arguments.length;
  2206. while ( len-- ) args[ len ] = arguments[ len ];
  2207. return eventShortcut.bind(this).apply(void 0, [ 'touchstart' ].concat( args ));
  2208. }
  2209. function touchend() {
  2210. var args = [], len = arguments.length;
  2211. while ( len-- ) args[ len ] = arguments[ len ];
  2212. return eventShortcut.bind(this).apply(void 0, [ 'touchend' ].concat( args ));
  2213. }
  2214. function touchmove() {
  2215. var args = [], len = arguments.length;
  2216. while ( len-- ) args[ len ] = arguments[ len ];
  2217. return eventShortcut.bind(this).apply(void 0, [ 'touchmove' ].concat( args ));
  2218. }
  2219. function resize() {
  2220. var args = [], len = arguments.length;
  2221. while ( len-- ) args[ len ] = arguments[ len ];
  2222. return eventShortcut.bind(this).apply(void 0, [ 'resize' ].concat( args ));
  2223. }
  2224. function scroll() {
  2225. var args = [], len = arguments.length;
  2226. while ( len-- ) args[ len ] = arguments[ len ];
  2227. return eventShortcut.bind(this).apply(void 0, [ 'scroll' ].concat( args ));
  2228. }
  2229. var eventShortcuts = /*#__PURE__*/Object.freeze({
  2230. click: click,
  2231. blur: blur,
  2232. focus: focus,
  2233. focusin: focusin,
  2234. focusout: focusout,
  2235. keyup: keyup,
  2236. keydown: keydown,
  2237. keypress: keypress,
  2238. submit: submit,
  2239. change: change,
  2240. mousedown: mousedown,
  2241. mousemove: mousemove,
  2242. mouseup: mouseup,
  2243. mouseenter: mouseenter,
  2244. mouseleave: mouseleave,
  2245. mouseout: mouseout,
  2246. mouseover: mouseover,
  2247. touchstart: touchstart,
  2248. touchend: touchend,
  2249. touchmove: touchmove,
  2250. resize: resize,
  2251. scroll: scroll
  2252. });
  2253. [Methods, Scroll, Animate, eventShortcuts].forEach(function (group) {
  2254. Object.keys(group).forEach(function (methodName) {
  2255. $.fn[methodName] = group[methodName];
  2256. });
  2257. });
  2258. /* eslint no-control-regex: "off" */
  2259. // Remove Diacritics
  2260. var defaultDiacriticsRemovalap = [
  2261. { 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' },
  2262. { base: 'AA', letters: '\uA732' },
  2263. { base: 'AE', letters: '\u00C6\u01FC\u01E2' },
  2264. { base: 'AO', letters: '\uA734' },
  2265. { base: 'AU', letters: '\uA736' },
  2266. { base: 'AV', letters: '\uA738\uA73A' },
  2267. { base: 'AY', letters: '\uA73C' },
  2268. { base: 'B', letters: '\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181' },
  2269. { base: 'C', letters: '\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E' },
  2270. { base: 'D', letters: '\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779' },
  2271. { base: 'DZ', letters: '\u01F1\u01C4' },
  2272. { base: 'Dz', letters: '\u01F2\u01C5' },
  2273. { 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' },
  2274. { base: 'F', letters: '\u0046\u24BB\uFF26\u1E1E\u0191\uA77B' },
  2275. { base: 'G', letters: '\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E' },
  2276. { base: 'H', letters: '\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D' },
  2277. { base: 'I', letters: '\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197' },
  2278. { base: 'J', letters: '\u004A\u24BF\uFF2A\u0134\u0248' },
  2279. { base: 'K', letters: '\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2' },
  2280. { base: 'L', letters: '\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780' },
  2281. { base: 'LJ', letters: '\u01C7' },
  2282. { base: 'Lj', letters: '\u01C8' },
  2283. { base: 'M', letters: '\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C' },
  2284. { base: 'N', letters: '\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4' },
  2285. { base: 'NJ', letters: '\u01CA' },
  2286. { base: 'Nj', letters: '\u01CB' },
  2287. { 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' },
  2288. { base: 'OI', letters: '\u01A2' },
  2289. { base: 'OO', letters: '\uA74E' },
  2290. { base: 'OU', letters: '\u0222' },
  2291. { base: 'OE', letters: '\u008C\u0152' },
  2292. { base: 'oe', letters: '\u009C\u0153' },
  2293. { base: 'P', letters: '\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754' },
  2294. { base: 'Q', letters: '\u0051\u24C6\uFF31\uA756\uA758\u024A' },
  2295. { base: 'R', letters: '\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782' },
  2296. { base: 'S', letters: '\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784' },
  2297. { base: 'T', letters: '\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786' },
  2298. { base: 'TZ', letters: '\uA728' },
  2299. { 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' },
  2300. { base: 'V', letters: '\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245' },
  2301. { base: 'VY', letters: '\uA760' },
  2302. { base: 'W', letters: '\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72' },
  2303. { base: 'X', letters: '\u0058\u24CD\uFF38\u1E8A\u1E8C' },
  2304. { base: 'Y', letters: '\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE' },
  2305. { base: 'Z', letters: '\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762' },
  2306. { 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' },
  2307. { base: 'aa', letters: '\uA733' },
  2308. { base: 'ae', letters: '\u00E6\u01FD\u01E3' },
  2309. { base: 'ao', letters: '\uA735' },
  2310. { base: 'au', letters: '\uA737' },
  2311. { base: 'av', letters: '\uA739\uA73B' },
  2312. { base: 'ay', letters: '\uA73D' },
  2313. { base: 'b', letters: '\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253' },
  2314. { base: 'c', letters: '\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184' },
  2315. { base: 'd', letters: '\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A' },
  2316. { base: 'dz', letters: '\u01F3\u01C6' },
  2317. { 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' },
  2318. { base: 'f', letters: '\u0066\u24D5\uFF46\u1E1F\u0192\uA77C' },
  2319. { base: 'g', letters: '\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F' },
  2320. { base: 'h', letters: '\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265' },
  2321. { base: 'hv', letters: '\u0195' },
  2322. { base: 'i', letters: '\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131' },
  2323. { base: 'j', letters: '\u006A\u24D9\uFF4A\u0135\u01F0\u0249' },
  2324. { base: 'k', letters: '\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3' },
  2325. { base: 'l', letters: '\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747' },
  2326. { base: 'lj', letters: '\u01C9' },
  2327. { base: 'm', letters: '\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F' },
  2328. { base: 'n', letters: '\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5' },
  2329. { base: 'nj', letters: '\u01CC' },
  2330. { 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' },
  2331. { base: 'oi', letters: '\u01A3' },
  2332. { base: 'ou', letters: '\u0223' },
  2333. { base: 'oo', letters: '\uA74F' },
  2334. { base: 'p', letters: '\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755' },
  2335. { base: 'q', letters: '\u0071\u24E0\uFF51\u024B\uA757\uA759' },
  2336. { base: 'r', letters: '\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783' },
  2337. { base: 's', letters: '\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B' },
  2338. { base: 't', letters: '\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787' },
  2339. { base: 'tz', letters: '\uA729' },
  2340. { 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' },
  2341. { base: 'v', letters: '\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C' },
  2342. { base: 'vy', letters: '\uA761' },
  2343. { base: 'w', letters: '\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73' },
  2344. { base: 'x', letters: '\u0078\u24E7\uFF58\u1E8B\u1E8D' },
  2345. { base: 'y', letters: '\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF' },
  2346. { base: 'z', letters: '\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763' } ];
  2347. var diacriticsMap = {};
  2348. for (var i = 0; i < defaultDiacriticsRemovalap.length; i += 1) {
  2349. var letters = defaultDiacriticsRemovalap[i].letters;
  2350. for (var j = 0; j < letters.length; j += 1) {
  2351. diacriticsMap[letters[j]] = defaultDiacriticsRemovalap[i].base;
  2352. }
  2353. }
  2354. var uniqueNumber = 1;
  2355. var Utils = {
  2356. uniqueNumber: function uniqueNumber$1() {
  2357. uniqueNumber += 1;
  2358. return uniqueNumber;
  2359. },
  2360. id: function id(mask, map) {
  2361. if ( mask === void 0 ) mask = 'xxxxxxxxxx';
  2362. if ( map === void 0 ) map = '0123456789abcdef';
  2363. var length = map.length;
  2364. return mask.replace(/x/g, function () { return map[Math.floor((Math.random() * length))]; });
  2365. },
  2366. 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(),
  2367. iosPreloaderContent: ("\n <span class=\"preloader-inner\">\n " + ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map(function () { return '<span class="preloader-inner-line"></span>'; }).join('')) + "\n </span>\n ").trim(),
  2368. auroraPreloaderContent: "\n <span class=\"preloader-inner\">\n <span class=\"preloader-inner-circle\"></span>\n </span>\n ",
  2369. eventNameToColonCase: function eventNameToColonCase(eventName) {
  2370. var hasColon;
  2371. return eventName.split('').map(function (char, index) {
  2372. if (char.match(/[A-Z]/) && index !== 0 && !hasColon) {
  2373. hasColon = true;
  2374. return (":" + (char.toLowerCase()));
  2375. }
  2376. return char.toLowerCase();
  2377. }).join('');
  2378. },
  2379. deleteProps: function deleteProps(obj) {
  2380. var object = obj;
  2381. Object.keys(object).forEach(function (key) {
  2382. try {
  2383. object[key] = null;
  2384. } catch (e) {
  2385. // no setter for object
  2386. }
  2387. try {
  2388. delete object[key];
  2389. } catch (e) {
  2390. // something got wrong
  2391. }
  2392. });
  2393. },
  2394. nextTick: function nextTick(callback, delay) {
  2395. if ( delay === void 0 ) delay = 0;
  2396. return setTimeout(callback, delay);
  2397. },
  2398. nextFrame: function nextFrame(callback) {
  2399. return Utils.requestAnimationFrame(function () {
  2400. Utils.requestAnimationFrame(callback);
  2401. });
  2402. },
  2403. now: function now() {
  2404. return Date.now();
  2405. },
  2406. requestAnimationFrame: function requestAnimationFrame(callback) {
  2407. return win.requestAnimationFrame(callback);
  2408. },
  2409. cancelAnimationFrame: function cancelAnimationFrame(id) {
  2410. return win.cancelAnimationFrame(id);
  2411. },
  2412. removeDiacritics: function removeDiacritics(str) {
  2413. return str.replace(/[^\u0000-\u007E]/g, function (a) { return diacriticsMap[a] || a; });
  2414. },
  2415. parseUrlQuery: function parseUrlQuery(url) {
  2416. var query = {};
  2417. var urlToParse = url || win.location.href;
  2418. var i;
  2419. var params;
  2420. var param;
  2421. var length;
  2422. if (typeof urlToParse === 'string' && urlToParse.length) {
  2423. urlToParse = urlToParse.indexOf('?') > -1 ? urlToParse.replace(/\S*\?/, '') : '';
  2424. params = urlToParse.split('&').filter(function (paramsPart) { return paramsPart !== ''; });
  2425. length = params.length;
  2426. for (i = 0; i < length; i += 1) {
  2427. param = params[i].replace(/#\S+/g, '').split('=');
  2428. query[decodeURIComponent(param[0])] = typeof param[1] === 'undefined' ? undefined : decodeURIComponent(param.slice(1).join('=')) || '';
  2429. }
  2430. }
  2431. return query;
  2432. },
  2433. getTranslate: function getTranslate(el, axis) {
  2434. if ( axis === void 0 ) axis = 'x';
  2435. var matrix;
  2436. var curTransform;
  2437. var transformMatrix;
  2438. var curStyle = win.getComputedStyle(el, null);
  2439. if (win.WebKitCSSMatrix) {
  2440. curTransform = curStyle.transform || curStyle.webkitTransform;
  2441. if (curTransform.split(',').length > 6) {
  2442. curTransform = curTransform.split(', ').map(function (a) { return a.replace(',', '.'); }).join(', ');
  2443. }
  2444. // Some old versions of Webkit choke when 'none' is passed; pass
  2445. // empty string instead in this case
  2446. transformMatrix = new win.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
  2447. } else {
  2448. transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
  2449. matrix = transformMatrix.toString().split(',');
  2450. }
  2451. if (axis === 'x') {
  2452. // Latest Chrome and webkits Fix
  2453. if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m41; }
  2454. // Crazy IE10 Matrix
  2455. else if (matrix.length === 16) { curTransform = parseFloat(matrix[12]); }
  2456. // Normal Browsers
  2457. else { curTransform = parseFloat(matrix[4]); }
  2458. }
  2459. if (axis === 'y') {
  2460. // Latest Chrome and webkits Fix
  2461. if (win.WebKitCSSMatrix) { curTransform = transformMatrix.m42; }
  2462. // Crazy IE10 Matrix
  2463. else if (matrix.length === 16) { curTransform = parseFloat(matrix[13]); }
  2464. // Normal Browsers
  2465. else { curTransform = parseFloat(matrix[5]); }
  2466. }
  2467. return curTransform || 0;
  2468. },
  2469. serializeObject: function serializeObject(obj, parents) {
  2470. if ( parents === void 0 ) parents = [];
  2471. if (typeof obj === 'string') { return obj; }
  2472. var resultArray = [];
  2473. var separator = '&';
  2474. var newParents;
  2475. function varName(name) {
  2476. if (parents.length > 0) {
  2477. var parentParts = '';
  2478. for (var j = 0; j < parents.length; j += 1) {
  2479. if (j === 0) { parentParts += parents[j]; }
  2480. else { parentParts += "[" + (encodeURIComponent(parents[j])) + "]"; }
  2481. }
  2482. return (parentParts + "[" + (encodeURIComponent(name)) + "]");
  2483. }
  2484. return encodeURIComponent(name);
  2485. }
  2486. function varValue(value) {
  2487. return encodeURIComponent(value);
  2488. }
  2489. Object.keys(obj).forEach(function (prop) {
  2490. var toPush;
  2491. if (Array.isArray(obj[prop])) {
  2492. toPush = [];
  2493. for (var i = 0; i < obj[prop].length; i += 1) {
  2494. if (!Array.isArray(obj[prop][i]) && typeof obj[prop][i] === 'object') {
  2495. newParents = parents.slice();
  2496. newParents.push(prop);
  2497. newParents.push(String(i));
  2498. toPush.push(Utils.serializeObject(obj[prop][i], newParents));
  2499. } else {
  2500. toPush.push(((varName(prop)) + "[]=" + (varValue(obj[prop][i]))));
  2501. }
  2502. }
  2503. if (toPush.length > 0) { resultArray.push(toPush.join(separator)); }
  2504. } else if (obj[prop] === null || obj[prop] === '') {
  2505. resultArray.push(((varName(prop)) + "="));
  2506. } else if (typeof obj[prop] === 'object') {
  2507. // Object, convert to named array
  2508. newParents = parents.slice();
  2509. newParents.push(prop);
  2510. toPush = Utils.serializeObject(obj[prop], newParents);
  2511. if (toPush !== '') { resultArray.push(toPush); }
  2512. } else if (typeof obj[prop] !== 'undefined' && obj[prop] !== '') {
  2513. // Should be string or plain value
  2514. resultArray.push(((varName(prop)) + "=" + (varValue(obj[prop]))));
  2515. } else if (obj[prop] === '') { resultArray.push(varName(prop)); }
  2516. });
  2517. return resultArray.join(separator);
  2518. },
  2519. isObject: function isObject(o) {
  2520. return typeof o === 'object' && o !== null && o.constructor && o.constructor === Object;
  2521. },
  2522. merge: function merge() {
  2523. var args = [], len$1 = arguments.length;
  2524. while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
  2525. var to = args[0];
  2526. args.splice(0, 1);
  2527. var from = args;
  2528. for (var i = 0; i < from.length; i += 1) {
  2529. var nextSource = args[i];
  2530. if (nextSource !== undefined && nextSource !== null) {
  2531. var keysArray = Object.keys(Object(nextSource));
  2532. for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
  2533. var nextKey = keysArray[nextIndex];
  2534. var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
  2535. if (desc !== undefined && desc.enumerable) {
  2536. to[nextKey] = nextSource[nextKey];
  2537. }
  2538. }
  2539. }
  2540. }
  2541. return to;
  2542. },
  2543. extend: function extend() {
  2544. var args = [], len$1 = arguments.length;
  2545. while ( len$1-- ) args[ len$1 ] = arguments[ len$1 ];
  2546. var deep = true;
  2547. var to;
  2548. var from;
  2549. if (typeof args[0] === 'boolean') {
  2550. deep = args[0];
  2551. to = args[1];
  2552. args.splice(0, 2);
  2553. from = args;
  2554. } else {
  2555. to = args[0];
  2556. args.splice(0, 1);
  2557. from = args;
  2558. }
  2559. for (var i = 0; i < from.length; i += 1) {
  2560. var nextSource = args[i];
  2561. if (nextSource !== undefined && nextSource !== null) {
  2562. var keysArray = Object.keys(Object(nextSource));
  2563. for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
  2564. var nextKey = keysArray[nextIndex];
  2565. var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
  2566. if (desc !== undefined && desc.enumerable) {
  2567. if (!deep) {
  2568. to[nextKey] = nextSource[nextKey];
  2569. } else if (Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
  2570. Utils.extend(to[nextKey], nextSource[nextKey]);
  2571. } else if (!Utils.isObject(to[nextKey]) && Utils.isObject(nextSource[nextKey])) {
  2572. to[nextKey] = {};
  2573. Utils.extend(to[nextKey], nextSource[nextKey]);
  2574. } else {
  2575. to[nextKey] = nextSource[nextKey];
  2576. }
  2577. }
  2578. }
  2579. }
  2580. }
  2581. return to;
  2582. },
  2583. colorHexToRgb: function colorHexToRgb(hex) {
  2584. 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; });
  2585. var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(h);
  2586. return result
  2587. ? result.slice(1).map(function (n) { return parseInt(n, 16); })
  2588. : null;
  2589. },
  2590. colorRgbToHex: function colorRgbToHex(r, g, b) {
  2591. var result = [r, g, b].map(function (n) {
  2592. var hex = n.toString(16);
  2593. return hex.length === 1 ? ("0" + hex) : hex;
  2594. }).join('');
  2595. return ("#" + result);
  2596. },
  2597. colorRgbToHsl: function colorRgbToHsl(r, g, b) {
  2598. r /= 255; // eslint-disable-line
  2599. g /= 255; // eslint-disable-line
  2600. b /= 255; // eslint-disable-line
  2601. var max = Math.max(r, g, b);
  2602. var min = Math.min(r, g, b);
  2603. var d = max - min;
  2604. var h;
  2605. if (d === 0) { h = 0; }
  2606. else if (max === r) { h = ((g - b) / d) % 6; }
  2607. else if (max === g) { h = (b - r) / d + 2; }
  2608. else if (max === b) { h = (r - g) / d + 4; }
  2609. var l = (min + max) / 2;
  2610. var s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
  2611. if (h < 0) { h = 360 / 60 + h; }
  2612. return [h * 60, s, l];
  2613. },
  2614. colorHslToRgb: function colorHslToRgb(h, s, l) {
  2615. var c = (1 - Math.abs(2 * l - 1)) * s;
  2616. var hp = h / 60;
  2617. var x = c * (1 - Math.abs((hp % 2) - 1));
  2618. var rgb1;
  2619. if (Number.isNaN(h) || typeof h === 'undefined') {
  2620. rgb1 = [0, 0, 0];
  2621. } else if (hp <= 1) { rgb1 = [c, x, 0]; }
  2622. else if (hp <= 2) { rgb1 = [x, c, 0]; }
  2623. else if (hp <= 3) { rgb1 = [0, c, x]; }
  2624. else if (hp <= 4) { rgb1 = [0, x, c]; }
  2625. else if (hp <= 5) { rgb1 = [x, 0, c]; }
  2626. else if (hp <= 6) { rgb1 = [c, 0, x]; }
  2627. var m = l - (c / 2);
  2628. return rgb1.map(function (n) { return Math.max(0, Math.min(255, Math.round(255 * (n + m)))); });
  2629. },
  2630. colorHsbToHsl: function colorHsbToHsl(h, s, b) {
  2631. var HSL = {
  2632. h: h,
  2633. s: 0,
  2634. l: 0,
  2635. };
  2636. var HSB = { h: h, s: s, b: b };
  2637. HSL.l = (2 - HSB.s) * HSB.b / 2;
  2638. HSL.s = HSL.l && HSL.l < 1 ? HSB.s * HSB.b / (HSL.l < 0.5 ? HSL.l * 2 : 2 - HSL.l * 2) : HSL.s;
  2639. return [HSL.h, HSL.s, HSL.l];
  2640. },
  2641. colorHslToHsb: function colorHslToHsb(h, s, l) {
  2642. var HSB = {
  2643. h: h,
  2644. s: 0,
  2645. b: 0,
  2646. };
  2647. var HSL = { h: h, s: s, l: l };
  2648. var t = HSL.s * (HSL.l < 0.5 ? HSL.l : 1 - HSL.l);
  2649. HSB.b = HSL.l + t;
  2650. HSB.s = HSL.l > 0 ? 2 * t / HSB.b : HSB.s;
  2651. return [HSB.h, HSB.s, HSB.b];
  2652. },
  2653. colorThemeCSSProperties: function colorThemeCSSProperties() {
  2654. var args = [], len = arguments.length;
  2655. while ( len-- ) args[ len ] = arguments[ len ];
  2656. var hex;
  2657. var rgb;
  2658. if (args.length === 1) {
  2659. hex = args[0];
  2660. rgb = Utils.colorHexToRgb(hex);
  2661. } else if (args.length === 3) {
  2662. rgb = args;
  2663. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  2664. }
  2665. if (!rgb) { return {}; }
  2666. var hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
  2667. var hslShade = [hsl[0], hsl[1], Math.max(0, (hsl[2] - 0.08))];
  2668. var hslTint = [hsl[0], hsl[1], Math.max(0, (hsl[2] + 0.08))];
  2669. var shade = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslShade));
  2670. var tint = Utils.colorRgbToHex.apply(Utils, Utils.colorHslToRgb.apply(Utils, hslTint));
  2671. return {
  2672. '--f7-theme-color': hex,
  2673. '--f7-theme-color-rgb': rgb.join(', '),
  2674. '--f7-theme-color-shade': shade,
  2675. '--f7-theme-color-tint': tint,
  2676. };
  2677. },
  2678. };
  2679. var Support = (function Support() {
  2680. return {
  2681. touch: !!(('ontouchstart' in win) || (win.DocumentTouch && doc instanceof win.DocumentTouch)),
  2682. pointerEvents: !!win.PointerEvent && ('maxTouchPoints' in win.navigator) && win.navigator.maxTouchPoints >= 0,
  2683. observer: (function checkObserver() {
  2684. return ('MutationObserver' in win || 'WebkitMutationObserver' in win);
  2685. }()),
  2686. passiveListener: (function checkPassiveListener() {
  2687. var supportsPassive = false;
  2688. try {
  2689. var opts = Object.defineProperty({}, 'passive', {
  2690. // eslint-disable-next-line
  2691. get: function get() {
  2692. supportsPassive = true;
  2693. },
  2694. });
  2695. win.addEventListener('testPassiveListener', null, opts);
  2696. } catch (e) {
  2697. // No support
  2698. }
  2699. return supportsPassive;
  2700. }()),
  2701. gestures: (function checkGestures() {
  2702. return 'ongesturestart' in win;
  2703. }()),
  2704. intersectionObserver: (function checkObserver() {
  2705. return ('IntersectionObserver' in win);
  2706. }()),
  2707. };
  2708. }());
  2709. var Device = (function Device() {
  2710. var platform = win.navigator.platform;
  2711. var ua = win.navigator.userAgent;
  2712. var device = {
  2713. ios: false,
  2714. android: false,
  2715. androidChrome: false,
  2716. desktop: false,
  2717. iphone: false,
  2718. ipod: false,
  2719. ipad: false,
  2720. edge: false,
  2721. ie: false,
  2722. firefox: false,
  2723. macos: false,
  2724. windows: false,
  2725. cordova: !!(win.cordova || win.phonegap),
  2726. phonegap: !!(win.cordova || win.phonegap),
  2727. electron: false,
  2728. nwjs: false,
  2729. };
  2730. var screenWidth = win.screen.width;
  2731. var screenHeight = win.screen.height;
  2732. var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
  2733. var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
  2734. var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
  2735. var iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
  2736. var ie = ua.indexOf('MSIE ') >= 0 || ua.indexOf('Trident/') >= 0;
  2737. var edge = ua.indexOf('Edge/') >= 0;
  2738. var firefox = ua.indexOf('Gecko/') >= 0 && ua.indexOf('Firefox/') >= 0;
  2739. var windows = platform === 'Win32';
  2740. var electron = ua.toLowerCase().indexOf('electron') >= 0;
  2741. var nwjs = typeof nw !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && typeof process.versions.nw !== 'undefined';
  2742. var macos = platform === 'MacIntel';
  2743. // iPadOs 13 fix
  2744. var iPadScreens = [
  2745. '1024x1366',
  2746. '1366x1024',
  2747. '834x1194',
  2748. '1194x834',
  2749. '834x1112',
  2750. '1112x834',
  2751. '768x1024',
  2752. '1024x768',
  2753. '820x1180',
  2754. '1180x820',
  2755. '810x1080',
  2756. '1080x810' ];
  2757. if (!ipad
  2758. && macos
  2759. && Support.touch
  2760. && iPadScreens.indexOf((screenWidth + "x" + screenHeight)) >= 0
  2761. ) {
  2762. ipad = ua.match(/(Version)\/([\d.]+)/);
  2763. if (!ipad) { ipad = [0, 1, '13_0_0']; }
  2764. macos = false;
  2765. }
  2766. device.ie = ie;
  2767. device.edge = edge;
  2768. device.firefox = firefox;
  2769. // Android
  2770. if (android && !windows) {
  2771. device.os = 'android';
  2772. device.osVersion = android[2];
  2773. device.android = true;
  2774. device.androidChrome = ua.toLowerCase().indexOf('chrome') >= 0;
  2775. }
  2776. if (ipad || iphone || ipod) {
  2777. device.os = 'ios';
  2778. device.ios = true;
  2779. }
  2780. // iOS
  2781. if (iphone && !ipod) {
  2782. device.osVersion = iphone[2].replace(/_/g, '.');
  2783. device.iphone = true;
  2784. }
  2785. if (ipad) {
  2786. device.osVersion = ipad[2].replace(/_/g, '.');
  2787. device.ipad = true;
  2788. }
  2789. if (ipod) {
  2790. device.osVersion = ipod[3] ? ipod[3].replace(/_/g, '.') : null;
  2791. device.ipod = true;
  2792. }
  2793. // iOS 8+ changed UA
  2794. if (device.ios && device.osVersion && ua.indexOf('Version/') >= 0) {
  2795. if (device.osVersion.split('.')[0] === '10') {
  2796. device.osVersion = ua.toLowerCase().split('version/')[1].split(' ')[0];
  2797. }
  2798. }
  2799. // Webview
  2800. device.webView = !!((iphone || ipad || ipod) && (ua.match(/.*AppleWebKit(?!.*Safari)/i) || win.navigator.standalone))
  2801. || (win.matchMedia && win.matchMedia('(display-mode: standalone)').matches);
  2802. device.webview = device.webView;
  2803. device.standalone = device.webView;
  2804. // Desktop
  2805. device.desktop = !(device.ios || device.android) || electron || nwjs;
  2806. if (device.desktop) {
  2807. device.electron = electron;
  2808. device.nwjs = nwjs;
  2809. device.macos = macos;
  2810. device.windows = windows;
  2811. if (device.macos) {
  2812. device.os = 'macos';
  2813. }
  2814. if (device.windows) {
  2815. device.os = 'windows';
  2816. }
  2817. }
  2818. // Pixel Ratio
  2819. device.pixelRatio = win.devicePixelRatio || 1;
  2820. // Color Scheme
  2821. var DARK = '(prefers-color-scheme: dark)';
  2822. var LIGHT = '(prefers-color-scheme: light)';
  2823. device.prefersColorScheme = function prefersColorTheme() {
  2824. var theme;
  2825. if (win.matchMedia && win.matchMedia(LIGHT).matches) {
  2826. theme = 'light';
  2827. }
  2828. if (win.matchMedia && win.matchMedia(DARK).matches) {
  2829. theme = 'dark';
  2830. }
  2831. return theme;
  2832. };
  2833. // Export object
  2834. return device;
  2835. }());
  2836. var EventsClass = function EventsClass(parents) {
  2837. if ( parents === void 0 ) parents = [];
  2838. var self = this;
  2839. self.eventsParents = parents;
  2840. self.eventsListeners = {};
  2841. };
  2842. EventsClass.prototype.on = function on (events, handler, priority) {
  2843. var self = this;
  2844. if (typeof handler !== 'function') { return self; }
  2845. var method = priority ? 'unshift' : 'push';
  2846. events.split(' ').forEach(function (event) {
  2847. if (!self.eventsListeners[event]) { self.eventsListeners[event] = []; }
  2848. self.eventsListeners[event][method](handler);
  2849. });
  2850. return self;
  2851. };
  2852. EventsClass.prototype.once = function once (events, handler, priority) {
  2853. var self = this;
  2854. if (typeof handler !== 'function') { return self; }
  2855. function onceHandler() {
  2856. var args = [], len = arguments.length;
  2857. while ( len-- ) args[ len ] = arguments[ len ];
  2858. self.off(events, onceHandler);
  2859. if (onceHandler.f7proxy) {
  2860. delete onceHandler.f7proxy;
  2861. }
  2862. handler.apply(self, args);
  2863. }
  2864. onceHandler.f7proxy = handler;
  2865. return self.on(events, onceHandler, priority);
  2866. };
  2867. EventsClass.prototype.off = function off (events, handler) {
  2868. var self = this;
  2869. if (!self.eventsListeners) { return self; }
  2870. events.split(' ').forEach(function (event) {
  2871. if (typeof handler === 'undefined') {
  2872. self.eventsListeners[event] = [];
  2873. } else if (self.eventsListeners[event]) {
  2874. self.eventsListeners[event].forEach(function (eventHandler, index) {
  2875. if (eventHandler === handler || (eventHandler.f7proxy && eventHandler.f7proxy === handler)) {
  2876. self.eventsListeners[event].splice(index, 1);
  2877. }
  2878. });
  2879. }
  2880. });
  2881. return self;
  2882. };
  2883. EventsClass.prototype.emit = function emit () {
  2884. var args = [], len = arguments.length;
  2885. while ( len-- ) args[ len ] = arguments[ len ];
  2886. var self = this;
  2887. if (!self.eventsListeners) { return self; }
  2888. var events;
  2889. var data;
  2890. var context;
  2891. var eventsParents;
  2892. if (typeof args[0] === 'string' || Array.isArray(args[0])) {
  2893. events = args[0];
  2894. data = args.slice(1, args.length);
  2895. context = self;
  2896. eventsParents = self.eventsParents;
  2897. } else {
  2898. events = args[0].events;
  2899. data = args[0].data;
  2900. context = args[0].context || self;
  2901. eventsParents = args[0].local ? [] : args[0].parents || self.eventsParents;
  2902. }
  2903. var eventsArray = Array.isArray(events) ? events : events.split(' ');
  2904. var localEvents = eventsArray.map(function (eventName) { return eventName.replace('local::', ''); });
  2905. var parentEvents = eventsArray.filter(function (eventName) { return eventName.indexOf('local::') < 0; });
  2906. localEvents.forEach(function (event) {
  2907. if (self.eventsListeners && self.eventsListeners[event]) {
  2908. var handlers = [];
  2909. self.eventsListeners[event].forEach(function (eventHandler) {
  2910. handlers.push(eventHandler);
  2911. });
  2912. handlers.forEach(function (eventHandler) {
  2913. eventHandler.apply(context, data);
  2914. });
  2915. }
  2916. });
  2917. if (eventsParents && eventsParents.length > 0) {
  2918. eventsParents.forEach(function (eventsParent) {
  2919. eventsParent.emit.apply(eventsParent, [ parentEvents ].concat( data ));
  2920. });
  2921. }
  2922. return self;
  2923. };
  2924. var Framework7Class = /*@__PURE__*/(function (EventsClass) {
  2925. function Framework7Class(params, parents) {
  2926. if ( params === void 0 ) params = {};
  2927. if ( parents === void 0 ) parents = [];
  2928. EventsClass.call(this, parents);
  2929. var self = this;
  2930. self.params = params;
  2931. if (self.params && self.params.on) {
  2932. Object.keys(self.params.on).forEach(function (eventName) {
  2933. self.on(eventName, self.params.on[eventName]);
  2934. });
  2935. }
  2936. }
  2937. if ( EventsClass ) Framework7Class.__proto__ = EventsClass;
  2938. Framework7Class.prototype = Object.create( EventsClass && EventsClass.prototype );
  2939. Framework7Class.prototype.constructor = Framework7Class;
  2940. var staticAccessors = { components: { configurable: true } };
  2941. // eslint-disable-next-line
  2942. Framework7Class.prototype.useModuleParams = function useModuleParams (module, instanceParams) {
  2943. if (module.params) {
  2944. var originalParams = {};
  2945. Object.keys(module.params).forEach(function (paramKey) {
  2946. if (typeof instanceParams[paramKey] === 'undefined') { return; }
  2947. originalParams[paramKey] = Utils.extend({}, instanceParams[paramKey]);
  2948. });
  2949. Utils.extend(instanceParams, module.params);
  2950. Object.keys(originalParams).forEach(function (paramKey) {
  2951. Utils.extend(instanceParams[paramKey], originalParams[paramKey]);
  2952. });
  2953. }
  2954. };
  2955. Framework7Class.prototype.useModulesParams = function useModulesParams (instanceParams) {
  2956. var instance = this;
  2957. if (!instance.modules) { return; }
  2958. Object.keys(instance.modules).forEach(function (moduleName) {
  2959. var module = instance.modules[moduleName];
  2960. // Extend params
  2961. if (module.params) {
  2962. Utils.extend(instanceParams, module.params);
  2963. }
  2964. });
  2965. };
  2966. Framework7Class.prototype.useModule = function useModule (moduleName, moduleParams) {
  2967. if ( moduleName === void 0 ) moduleName = '';
  2968. if ( moduleParams === void 0 ) moduleParams = {};
  2969. var instance = this;
  2970. if (!instance.modules) { return; }
  2971. var module = typeof moduleName === 'string' ? instance.modules[moduleName] : moduleName;
  2972. if (!module) { return; }
  2973. // Extend instance methods and props
  2974. if (module.instance) {
  2975. Object.keys(module.instance).forEach(function (modulePropName) {
  2976. var moduleProp = module.instance[modulePropName];
  2977. if (typeof moduleProp === 'function') {
  2978. instance[modulePropName] = moduleProp.bind(instance);
  2979. } else {
  2980. instance[modulePropName] = moduleProp;
  2981. }
  2982. });
  2983. }
  2984. // Add event listeners
  2985. if (module.on && instance.on) {
  2986. Object.keys(module.on).forEach(function (moduleEventName) {
  2987. instance.on(moduleEventName, module.on[moduleEventName]);
  2988. });
  2989. }
  2990. // Add vnode hooks
  2991. if (module.vnode) {
  2992. if (!instance.vnodeHooks) { instance.vnodeHooks = {}; }
  2993. Object.keys(module.vnode).forEach(function (vnodeId) {
  2994. Object.keys(module.vnode[vnodeId]).forEach(function (hookName) {
  2995. var handler = module.vnode[vnodeId][hookName];
  2996. if (!instance.vnodeHooks[hookName]) { instance.vnodeHooks[hookName] = {}; }
  2997. if (!instance.vnodeHooks[hookName][vnodeId]) { instance.vnodeHooks[hookName][vnodeId] = []; }
  2998. instance.vnodeHooks[hookName][vnodeId].push(handler.bind(instance));
  2999. });
  3000. });
  3001. }
  3002. // Module create callback
  3003. if (module.create) {
  3004. module.create.bind(instance)(moduleParams);
  3005. }
  3006. };
  3007. Framework7Class.prototype.useModules = function useModules (modulesParams) {
  3008. if ( modulesParams === void 0 ) modulesParams = {};
  3009. var instance = this;
  3010. if (!instance.modules) { return; }
  3011. Object.keys(instance.modules).forEach(function (moduleName) {
  3012. var moduleParams = modulesParams[moduleName] || {};
  3013. instance.useModule(moduleName, moduleParams);
  3014. });
  3015. };
  3016. staticAccessors.components.set = function (components) {
  3017. var Class = this;
  3018. if (!Class.use) { return; }
  3019. Class.use(components);
  3020. };
  3021. Framework7Class.installModule = function installModule (module) {
  3022. var params = [], len = arguments.length - 1;
  3023. while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
  3024. var Class = this;
  3025. if (!Class.prototype.modules) { Class.prototype.modules = {}; }
  3026. var name = module.name || (((Object.keys(Class.prototype.modules).length) + "_" + (Utils.now())));
  3027. Class.prototype.modules[name] = module;
  3028. // Prototype
  3029. if (module.proto) {
  3030. Object.keys(module.proto).forEach(function (key) {
  3031. Class.prototype[key] = module.proto[key];
  3032. });
  3033. }
  3034. // Class
  3035. if (module.static) {
  3036. Object.keys(module.static).forEach(function (key) {
  3037. Class[key] = module.static[key];
  3038. });
  3039. }
  3040. // Callback
  3041. if (module.install) {
  3042. module.install.apply(Class, params);
  3043. }
  3044. return Class;
  3045. };
  3046. Framework7Class.use = function use (module) {
  3047. var params = [], len = arguments.length - 1;
  3048. while ( len-- > 0 ) params[ len ] = arguments[ len + 1 ];
  3049. var Class = this;
  3050. if (Array.isArray(module)) {
  3051. module.forEach(function (m) { return Class.installModule(m); });
  3052. return Class;
  3053. }
  3054. return Class.installModule.apply(Class, [ module ].concat( params ));
  3055. };
  3056. Object.defineProperties( Framework7Class, staticAccessors );
  3057. return Framework7Class;
  3058. }(EventsClass));
  3059. function ConstructorMethods (parameters) {
  3060. if ( parameters === void 0 ) parameters = {};
  3061. var defaultSelector = parameters.defaultSelector;
  3062. var Constructor = parameters.constructor;
  3063. var domProp = parameters.domProp;
  3064. var app = parameters.app;
  3065. var addMethods = parameters.addMethods;
  3066. var methods = {
  3067. create: function create() {
  3068. var args = [], len = arguments.length;
  3069. while ( len-- ) args[ len ] = arguments[ len ];
  3070. if (app) { return new (Function.prototype.bind.apply( Constructor, [ null ].concat( [app], args) )); }
  3071. return new (Function.prototype.bind.apply( Constructor, [ null ].concat( args) ));
  3072. },
  3073. get: function get(el) {
  3074. if ( el === void 0 ) el = defaultSelector;
  3075. if (el instanceof Constructor) { return el; }
  3076. var $el = $(el);
  3077. if ($el.length === 0) { return undefined; }
  3078. return $el[0][domProp];
  3079. },
  3080. destroy: function destroy(el) {
  3081. var instance = methods.get(el);
  3082. if (instance && instance.destroy) { return instance.destroy(); }
  3083. return undefined;
  3084. },
  3085. };
  3086. if (addMethods && Array.isArray(addMethods)) {
  3087. addMethods.forEach(function (methodName) {
  3088. methods[methodName] = function (el) {
  3089. if ( el === void 0 ) el = defaultSelector;
  3090. var args = [], len = arguments.length - 1;
  3091. while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
  3092. var instance = methods.get(el);
  3093. if (instance && instance[methodName]) { return instance[methodName].apply(instance, args); }
  3094. return undefined;
  3095. };
  3096. });
  3097. }
  3098. return methods;
  3099. }
  3100. function ModalMethods (parameters) {
  3101. if ( parameters === void 0 ) parameters = {};
  3102. var defaultSelector = parameters.defaultSelector;
  3103. var Constructor = parameters.constructor;
  3104. var app = parameters.app;
  3105. var methods = Utils.extend(
  3106. ConstructorMethods({
  3107. defaultSelector: defaultSelector,
  3108. constructor: Constructor,
  3109. app: app,
  3110. domProp: 'f7Modal',
  3111. }),
  3112. {
  3113. open: function open(el, animate, targetEl) {
  3114. var $el = $(el);
  3115. if ($el.length > 1 && targetEl) {
  3116. // check if same modal in other page
  3117. var $targetPage = $(targetEl).parents('.page');
  3118. if ($targetPage.length) {
  3119. $el.each(function (index, modalEl) {
  3120. var $modalEl = $(modalEl);
  3121. if ($modalEl.parents($targetPage)[0] === $targetPage[0]) {
  3122. $el = $modalEl;
  3123. }
  3124. });
  3125. }
  3126. }
  3127. if ($el.length > 1) {
  3128. $el = $el.eq($el.length - 1);
  3129. }
  3130. if (!$el.length) { return undefined; }
  3131. var instance = $el[0].f7Modal;
  3132. if (!instance) {
  3133. var params = $el.dataset();
  3134. instance = new Constructor(app, Object.assign({}, {el: $el}, params));
  3135. }
  3136. return instance.open(animate);
  3137. },
  3138. close: function close(el, animate, targetEl) {
  3139. if ( el === void 0 ) el = defaultSelector;
  3140. var $el = $(el);
  3141. if (!$el.length) { return undefined; }
  3142. if ($el.length > 1) {
  3143. // check if close link (targetEl) in this modal
  3144. var $parentEl;
  3145. if (targetEl) {
  3146. var $targetEl = $(targetEl);
  3147. if ($targetEl.length) {
  3148. $parentEl = $targetEl.parents($el);
  3149. }
  3150. }
  3151. if ($parentEl && $parentEl.length > 0) {
  3152. $el = $parentEl;
  3153. } else {
  3154. $el = $el.eq($el.length - 1);
  3155. }
  3156. }
  3157. var instance = $el[0].f7Modal;
  3158. if (!instance) {
  3159. var params = $el.dataset();
  3160. instance = new Constructor(app, Object.assign({}, {el: $el}, params));
  3161. }
  3162. return instance.close(animate);
  3163. },
  3164. }
  3165. );
  3166. return methods;
  3167. }
  3168. var fetchedModules = [];
  3169. function loadModule(moduleToLoad) {
  3170. var Framework7 = this;
  3171. return new Promise(function (resolve, reject) {
  3172. var app = Framework7.instance;
  3173. var modulePath;
  3174. var moduleObj;
  3175. var moduleFunc;
  3176. if (!moduleToLoad) {
  3177. reject(new Error('Framework7: Lazy module must be specified'));
  3178. return;
  3179. }
  3180. function install(module) {
  3181. Framework7.use(module);
  3182. if (app) {
  3183. app.useModuleParams(module, app.params);
  3184. app.useModule(module);
  3185. }
  3186. }
  3187. if (typeof moduleToLoad === 'string') {
  3188. var matchNamePattern = moduleToLoad.match(/([a-z0-9-]*)/i);
  3189. if (moduleToLoad.indexOf('.') < 0 && matchNamePattern && matchNamePattern[0].length === moduleToLoad.length) {
  3190. if (!app || (app && !app.params.lazyModulesPath)) {
  3191. reject(new Error('Framework7: "lazyModulesPath" app parameter must be specified to fetch module by name'));
  3192. return;
  3193. }
  3194. modulePath = (app.params.lazyModulesPath) + "/" + moduleToLoad + ".js";
  3195. } else {
  3196. modulePath = moduleToLoad;
  3197. }
  3198. } else if (typeof moduleToLoad === 'function') {
  3199. moduleFunc = moduleToLoad;
  3200. } else {
  3201. // considering F7-Plugin object
  3202. moduleObj = moduleToLoad;
  3203. }
  3204. if (moduleFunc) {
  3205. var module = moduleFunc(Framework7, false);
  3206. if (!module) {
  3207. reject(new Error('Framework7: Can\'t find Framework7 component in specified component function'));
  3208. return;
  3209. }
  3210. // Check if it was added
  3211. if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
  3212. resolve();
  3213. return;
  3214. }
  3215. // Install It
  3216. install(module);
  3217. resolve();
  3218. }
  3219. if (moduleObj) {
  3220. var module$1 = moduleObj;
  3221. if (!module$1) {
  3222. reject(new Error('Framework7: Can\'t find Framework7 component in specified component'));
  3223. return;
  3224. }
  3225. // Check if it was added
  3226. if (Framework7.prototype.modules && Framework7.prototype.modules[module$1.name]) {
  3227. resolve();
  3228. return;
  3229. }
  3230. // Install It
  3231. install(module$1);
  3232. resolve();
  3233. }
  3234. if (modulePath) {
  3235. if (fetchedModules.indexOf(modulePath) >= 0) {
  3236. resolve();
  3237. return;
  3238. }
  3239. fetchedModules.push(modulePath);
  3240. var scriptLoad = new Promise(function (resolveScript, rejectScript) {
  3241. Framework7.request.get(
  3242. modulePath,
  3243. function (scriptContent) {
  3244. var id = Utils.id();
  3245. var callbackLoadName = "f7_component_loader_callback_" + id;
  3246. var scriptEl = doc.createElement('script');
  3247. scriptEl.innerHTML = "window." + callbackLoadName + " = function (Framework7, Framework7AutoInstallComponent) {return " + (scriptContent.trim()) + "}";
  3248. $('head').append(scriptEl);
  3249. var componentLoader = win[callbackLoadName];
  3250. delete win[callbackLoadName];
  3251. $(scriptEl).remove();
  3252. var module = componentLoader(Framework7, false);
  3253. if (!module) {
  3254. rejectScript(new Error(("Framework7: Can't find Framework7 component in " + modulePath + " file")));
  3255. return;
  3256. }
  3257. // Check if it was added
  3258. if (Framework7.prototype.modules && Framework7.prototype.modules[module.name]) {
  3259. resolveScript();
  3260. return;
  3261. }
  3262. // Install It
  3263. install(module);
  3264. resolveScript();
  3265. },
  3266. function (xhr, status) {
  3267. rejectScript(xhr, status);
  3268. }
  3269. );
  3270. });
  3271. var styleLoad = new Promise(function (resolveStyle) {
  3272. Framework7.request.get(
  3273. modulePath.replace('.js', app.rtl ? '.rtl.css' : '.css'),
  3274. function (styleContent) {
  3275. var styleEl = doc.createElement('style');
  3276. styleEl.innerHTML = styleContent;
  3277. $('head').append(styleEl);
  3278. resolveStyle();
  3279. },
  3280. function () {
  3281. resolveStyle();
  3282. }
  3283. );
  3284. });
  3285. Promise.all([scriptLoad, styleLoad]).then(function () {
  3286. resolve();
  3287. }).catch(function (err) {
  3288. reject(err);
  3289. });
  3290. }
  3291. });
  3292. }
  3293. var Framework7 = /*@__PURE__*/(function (Framework7Class) {
  3294. function Framework7(params) {
  3295. Framework7Class.call(this, params);
  3296. if (Framework7.instance) {
  3297. throw new Error('Framework7 is already initialized and can\'t be initialized more than once');
  3298. }
  3299. var passedParams = Utils.extend({}, params);
  3300. // App Instance
  3301. var app = this;
  3302. Framework7.instance = app;
  3303. // Default
  3304. var defaults = {
  3305. version: '1.0.0',
  3306. id: 'io.framework7.testapp',
  3307. root: 'body',
  3308. theme: 'auto',
  3309. language: win.navigator.language,
  3310. routes: [],
  3311. name: 'Framework7',
  3312. lazyModulesPath: null,
  3313. initOnDeviceReady: true,
  3314. init: true,
  3315. autoDarkTheme: false,
  3316. iosTranslucentBars: true,
  3317. iosTranslucentModals: true,
  3318. component: undefined,
  3319. componentUrl: undefined,
  3320. };
  3321. // Extend defaults with modules params
  3322. app.useModulesParams(defaults);
  3323. // Extend defaults with passed params
  3324. app.params = Utils.extend(defaults, params);
  3325. var $rootEl = $(app.params.root);
  3326. Utils.extend(app, {
  3327. // App Id
  3328. id: app.params.id,
  3329. // App Name
  3330. name: app.params.name,
  3331. // App version
  3332. version: app.params.version,
  3333. // Routes
  3334. routes: app.params.routes,
  3335. // Lang
  3336. language: app.params.language,
  3337. // Root
  3338. root: $rootEl,
  3339. // RTL
  3340. rtl: $rootEl.css('direction') === 'rtl',
  3341. // Theme
  3342. theme: (function getTheme() {
  3343. if (app.params.theme === 'auto') {
  3344. if (Device.ios) { return 'ios'; }
  3345. if (Device.desktop && Device.electron) { return 'aurora'; }
  3346. return 'md';
  3347. }
  3348. return app.params.theme;
  3349. }()),
  3350. // Initially passed parameters
  3351. passedParams: passedParams,
  3352. online: win.navigator.onLine,
  3353. });
  3354. // Save Root
  3355. if (app.root && app.root[0]) {
  3356. app.root[0].f7 = app;
  3357. }
  3358. // Install Modules
  3359. app.useModules();
  3360. // Init Data & Methods
  3361. app.initData();
  3362. // Auto Dark Theme
  3363. var DARK = '(prefers-color-scheme: dark)';
  3364. var LIGHT = '(prefers-color-scheme: light)';
  3365. app.mq = {};
  3366. if (win.matchMedia) {
  3367. app.mq.dark = win.matchMedia(DARK);
  3368. app.mq.light = win.matchMedia(LIGHT);
  3369. }
  3370. app.colorSchemeListener = function colorSchemeListener(ref) {
  3371. var matches = ref.matches;
  3372. var media = ref.media;
  3373. if (!matches) {
  3374. return;
  3375. }
  3376. var html = doc.querySelector('html');
  3377. if (media === DARK) {
  3378. html.classList.add('theme-dark');
  3379. app.darkTheme = true;
  3380. app.emit('darkThemeChange', true);
  3381. } else if (media === LIGHT) {
  3382. html.classList.remove('theme-dark');
  3383. app.darkTheme = false;
  3384. app.emit('darkThemeChange', false);
  3385. }
  3386. };
  3387. // Init
  3388. if (app.params.init) {
  3389. if (Device.cordova && app.params.initOnDeviceReady) {
  3390. $(doc).on('deviceready', function () {
  3391. app.init();
  3392. });
  3393. } else {
  3394. app.init();
  3395. }
  3396. }
  3397. // Return app instance
  3398. return app;
  3399. }
  3400. if ( Framework7Class ) Framework7.__proto__ = Framework7Class;
  3401. Framework7.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  3402. Framework7.prototype.constructor = Framework7;
  3403. var prototypeAccessors = { $: { configurable: true },t7: { configurable: true } };
  3404. var staticAccessors = { Dom7: { configurable: true },$: { configurable: true },Template7: { configurable: true },Class: { configurable: true },Events: { configurable: true } };
  3405. Framework7.prototype.initData = function initData () {
  3406. var app = this;
  3407. // Data
  3408. app.data = {};
  3409. if (app.params.data && typeof app.params.data === 'function') {
  3410. Utils.extend(app.data, app.params.data.bind(app)());
  3411. } else if (app.params.data) {
  3412. Utils.extend(app.data, app.params.data);
  3413. }
  3414. // Methods
  3415. app.methods = {};
  3416. if (app.params.methods) {
  3417. Object.keys(app.params.methods).forEach(function (methodName) {
  3418. if (typeof app.params.methods[methodName] === 'function') {
  3419. app.methods[methodName] = app.params.methods[methodName].bind(app);
  3420. } else {
  3421. app.methods[methodName] = app.params.methods[methodName];
  3422. }
  3423. });
  3424. }
  3425. };
  3426. Framework7.prototype.enableAutoDarkTheme = function enableAutoDarkTheme () {
  3427. if (!win.matchMedia) { return; }
  3428. var app = this;
  3429. var html = doc.querySelector('html');
  3430. if (app.mq.dark && app.mq.light) {
  3431. app.mq.dark.addListener(app.colorSchemeListener);
  3432. app.mq.light.addListener(app.colorSchemeListener);
  3433. }
  3434. if (app.mq.dark && app.mq.dark.matches) {
  3435. html.classList.add('theme-dark');
  3436. app.darkTheme = true;
  3437. app.emit('darkThemeChange', true);
  3438. } else if (app.mq.light && app.mq.light.matches) {
  3439. html.classList.remove('theme-dark');
  3440. app.darkTheme = false;
  3441. app.emit('darkThemeChange', false);
  3442. }
  3443. };
  3444. Framework7.prototype.disableAutoDarkTheme = function disableAutoDarkTheme () {
  3445. if (!win.matchMedia) { return; }
  3446. var app = this;
  3447. if (app.mq.dark) { app.mq.dark.removeListener(app.colorSchemeListener); }
  3448. if (app.mq.light) { app.mq.light.removeListener(app.colorSchemeListener); }
  3449. };
  3450. Framework7.prototype.initAppComponent = function initAppComponent (callback) {
  3451. var app = this;
  3452. app.router.componentLoader(
  3453. app.params.component,
  3454. app.params.componentUrl,
  3455. { componentOptions: { el: app.root[0], root: true } },
  3456. function (el) {
  3457. app.root = $(el);
  3458. app.root[0].f7 = app;
  3459. app.rootComponent = el.f7Component;
  3460. if (callback) { callback(); }
  3461. },
  3462. function () {}
  3463. );
  3464. };
  3465. // eslint-disable-next-line
  3466. Framework7.prototype._init = function _init () {
  3467. var app = this;
  3468. if (app.initialized) { return app; }
  3469. app.root.addClass('framework7-initializing');
  3470. // RTL attr
  3471. if (app.rtl) {
  3472. $('html').attr('dir', 'rtl');
  3473. }
  3474. // Auto Dark Theme
  3475. if (app.params.autoDarkTheme) {
  3476. app.enableAutoDarkTheme();
  3477. }
  3478. // Watch for online/offline state
  3479. win.addEventListener('offline', function () {
  3480. app.online = false;
  3481. app.emit('offline');
  3482. app.emit('connection', false);
  3483. });
  3484. win.addEventListener('online', function () {
  3485. app.online = true;
  3486. app.emit('online');
  3487. app.emit('connection', true);
  3488. });
  3489. // Root class
  3490. app.root.addClass('framework7-root');
  3491. // Theme class
  3492. $('html').removeClass('ios md aurora').addClass(app.theme);
  3493. // iOS Translucent
  3494. if (app.params.iosTranslucentBars && app.theme === 'ios' && Device.ios) {
  3495. $('html').addClass('ios-translucent-bars');
  3496. }
  3497. if (app.params.iosTranslucentModals && app.theme === 'ios' && Device.ios) {
  3498. $('html').addClass('ios-translucent-modals');
  3499. }
  3500. // Init class
  3501. Utils.nextFrame(function () {
  3502. app.root.removeClass('framework7-initializing');
  3503. });
  3504. // Emit, init other modules
  3505. app.initialized = true;
  3506. app.emit('init');
  3507. return app;
  3508. };
  3509. Framework7.prototype.init = function init () {
  3510. var app = this;
  3511. if (app.params.component || app.params.componentUrl) {
  3512. app.initAppComponent(function () {
  3513. app._init(); // eslint-disable-line
  3514. });
  3515. } else {
  3516. app._init(); // eslint-disable-line
  3517. }
  3518. };
  3519. // eslint-disable-next-line
  3520. Framework7.prototype.loadModule = function loadModule () {
  3521. var args = [], len = arguments.length;
  3522. while ( len-- ) args[ len ] = arguments[ len ];
  3523. return Framework7.loadModule.apply(Framework7, args);
  3524. };
  3525. // eslint-disable-next-line
  3526. Framework7.prototype.loadModules = function loadModules () {
  3527. var args = [], len = arguments.length;
  3528. while ( len-- ) args[ len ] = arguments[ len ];
  3529. return Framework7.loadModules.apply(Framework7, args);
  3530. };
  3531. Framework7.prototype.getVnodeHooks = function getVnodeHooks (hook, id) {
  3532. var app = this;
  3533. if (!app.vnodeHooks || !app.vnodeHooks[hook]) { return []; }
  3534. return app.vnodeHooks[hook][id] || [];
  3535. };
  3536. // eslint-disable-next-line
  3537. prototypeAccessors.$.get = function () {
  3538. return $;
  3539. };
  3540. // eslint-disable-next-line
  3541. prototypeAccessors.t7.get = function () {
  3542. return Template7;
  3543. };
  3544. staticAccessors.Dom7.get = function () {
  3545. return $;
  3546. };
  3547. staticAccessors.$.get = function () {
  3548. return $;
  3549. };
  3550. staticAccessors.Template7.get = function () {
  3551. return Template7;
  3552. };
  3553. staticAccessors.Class.get = function () {
  3554. return Framework7Class;
  3555. };
  3556. staticAccessors.Events.get = function () {
  3557. return EventsClass;
  3558. };
  3559. Object.defineProperties( Framework7.prototype, prototypeAccessors );
  3560. Object.defineProperties( Framework7, staticAccessors );
  3561. return Framework7;
  3562. }(Framework7Class));
  3563. Framework7.ModalMethods = ModalMethods;
  3564. Framework7.ConstructorMethods = ConstructorMethods;
  3565. Framework7.loadModule = loadModule;
  3566. Framework7.loadModules = function loadModules(modules) {
  3567. return Promise.all(modules.map(function (module) { return Framework7.loadModule(module); }));
  3568. };
  3569. var DeviceModule = {
  3570. name: 'device',
  3571. proto: {
  3572. device: Device,
  3573. },
  3574. static: {
  3575. device: Device,
  3576. },
  3577. on: {
  3578. init: function init() {
  3579. var classNames = [];
  3580. var html = doc.querySelector('html');
  3581. var metaStatusbar = doc.querySelector('meta[name="apple-mobile-web-app-status-bar-style"]');
  3582. if (!html) { return; }
  3583. if (Device.standalone && Device.ios && metaStatusbar && metaStatusbar.content === 'black-translucent') {
  3584. classNames.push('device-full-viewport');
  3585. }
  3586. // Pixel Ratio
  3587. classNames.push(("device-pixel-ratio-" + (Math.floor(Device.pixelRatio))));
  3588. // OS classes
  3589. if (Device.os && !Device.desktop) {
  3590. classNames.push(
  3591. ("device-" + (Device.os))
  3592. );
  3593. } else if (Device.desktop) {
  3594. classNames.push('device-desktop');
  3595. if (Device.os) {
  3596. classNames.push(("device-" + (Device.os)));
  3597. }
  3598. }
  3599. if (Device.cordova || Device.phonegap) {
  3600. classNames.push('device-cordova');
  3601. }
  3602. // Add html classes
  3603. classNames.forEach(function (className) {
  3604. html.classList.add(className);
  3605. });
  3606. },
  3607. },
  3608. };
  3609. var SupportModule = {
  3610. name: 'support',
  3611. proto: {
  3612. support: Support,
  3613. },
  3614. static: {
  3615. support: Support,
  3616. },
  3617. };
  3618. var UtilsModule = {
  3619. name: 'utils',
  3620. proto: {
  3621. utils: Utils,
  3622. },
  3623. static: {
  3624. utils: Utils,
  3625. },
  3626. };
  3627. var ResizeModule = {
  3628. name: 'resize',
  3629. instance: {
  3630. getSize: function getSize() {
  3631. var app = this;
  3632. if (!app.root[0]) { return { width: 0, height: 0, left: 0, top: 0 }; }
  3633. var offset = app.root.offset();
  3634. var ref = [app.root[0].offsetWidth, app.root[0].offsetHeight, offset.left, offset.top];
  3635. var width = ref[0];
  3636. var height = ref[1];
  3637. var left = ref[2];
  3638. var top = ref[3];
  3639. app.width = width;
  3640. app.height = height;
  3641. app.left = left;
  3642. app.top = top;
  3643. return { width: width, height: height, left: left, top: top };
  3644. },
  3645. },
  3646. on: {
  3647. init: function init() {
  3648. var app = this;
  3649. // Get Size
  3650. app.getSize();
  3651. // Emit resize
  3652. win.addEventListener('resize', function () {
  3653. app.emit('resize');
  3654. }, false);
  3655. // Emit orientationchange
  3656. win.addEventListener('orientationchange', function () {
  3657. app.emit('orientationchange');
  3658. });
  3659. },
  3660. orientationchange: function orientationchange() {
  3661. var app = this;
  3662. // Fix iPad weird body scroll
  3663. if (app.device.ipad) {
  3664. doc.body.scrollLeft = 0;
  3665. setTimeout(function () {
  3666. doc.body.scrollLeft = 0;
  3667. }, 0);
  3668. }
  3669. },
  3670. resize: function resize() {
  3671. var app = this;
  3672. app.getSize();
  3673. },
  3674. },
  3675. };
  3676. var globals = {};
  3677. var jsonpRequests = 0;
  3678. function Request(requestOptions) {
  3679. var globalsNoCallbacks = Utils.extend({}, globals);
  3680. ('beforeCreate beforeOpen beforeSend error complete success statusCode').split(' ').forEach(function (callbackName) {
  3681. delete globalsNoCallbacks[callbackName];
  3682. });
  3683. var defaults = Utils.extend({
  3684. url: win.location.toString(),
  3685. method: 'GET',
  3686. data: false,
  3687. async: true,
  3688. cache: true,
  3689. user: '',
  3690. password: '',
  3691. headers: {},
  3692. xhrFields: {},
  3693. statusCode: {},
  3694. processData: true,
  3695. dataType: 'text',
  3696. contentType: 'application/x-www-form-urlencoded',
  3697. timeout: 0,
  3698. }, globalsNoCallbacks);
  3699. var options = Utils.extend({}, defaults, requestOptions);
  3700. var proceedRequest;
  3701. // Function to run XHR callbacks and events
  3702. function fireCallback(callbackName) {
  3703. var data = [], len = arguments.length - 1;
  3704. while ( len-- > 0 ) data[ len ] = arguments[ len + 1 ];
  3705. /*
  3706. Callbacks:
  3707. beforeCreate (options),
  3708. beforeOpen (xhr, options),
  3709. beforeSend (xhr, options),
  3710. error (xhr, status, message),
  3711. complete (xhr, status),
  3712. success (response, status, xhr),
  3713. statusCode ()
  3714. */
  3715. var globalCallbackValue;
  3716. var optionCallbackValue;
  3717. if (globals[callbackName]) {
  3718. globalCallbackValue = globals[callbackName].apply(globals, data);
  3719. }
  3720. if (options[callbackName]) {
  3721. optionCallbackValue = options[callbackName].apply(options, data);
  3722. }
  3723. if (typeof globalCallbackValue !== 'boolean') { globalCallbackValue = true; }
  3724. if (typeof optionCallbackValue !== 'boolean') { optionCallbackValue = true; }
  3725. return (globalCallbackValue && optionCallbackValue);
  3726. }
  3727. // Before create callback
  3728. proceedRequest = fireCallback('beforeCreate', options);
  3729. if (proceedRequest === false) { return undefined; }
  3730. // For jQuery guys
  3731. if (options.type) { options.method = options.type; }
  3732. // Parameters Prefix
  3733. var paramsPrefix = options.url.indexOf('?') >= 0 ? '&' : '?';
  3734. // UC method
  3735. var method = options.method.toUpperCase();
  3736. // Data to modify GET URL
  3737. if ((method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') && options.data) {
  3738. var stringData;
  3739. if (typeof options.data === 'string') {
  3740. // Should be key=value string
  3741. if (options.data.indexOf('?') >= 0) { stringData = options.data.split('?')[1]; }
  3742. else { stringData = options.data; }
  3743. } else {
  3744. // Should be key=value object
  3745. stringData = Utils.serializeObject(options.data);
  3746. }
  3747. if (stringData.length) {
  3748. options.url += paramsPrefix + stringData;
  3749. if (paramsPrefix === '?') { paramsPrefix = '&'; }
  3750. }
  3751. }
  3752. // JSONP
  3753. if (options.dataType === 'json' && options.url.indexOf('callback=') >= 0) {
  3754. var callbackName = "f7jsonp_" + (Date.now() + ((jsonpRequests += 1)));
  3755. var abortTimeout;
  3756. var callbackSplit = options.url.split('callback=');
  3757. var requestUrl = (callbackSplit[0]) + "callback=" + callbackName;
  3758. if (callbackSplit[1].indexOf('&') >= 0) {
  3759. var addVars = callbackSplit[1].split('&').filter(function (el) { return el.indexOf('=') > 0; }).join('&');
  3760. if (addVars.length > 0) { requestUrl += "&" + addVars; }
  3761. }
  3762. // Create script
  3763. var script = doc.createElement('script');
  3764. script.type = 'text/javascript';
  3765. script.onerror = function onerror() {
  3766. clearTimeout(abortTimeout);
  3767. fireCallback('error', null, 'scripterror', 'scripterror');
  3768. fireCallback('complete', null, 'scripterror');
  3769. };
  3770. script.src = requestUrl;
  3771. // Handler
  3772. win[callbackName] = function jsonpCallback(data) {
  3773. clearTimeout(abortTimeout);
  3774. fireCallback('success', data);
  3775. script.parentNode.removeChild(script);
  3776. script = null;
  3777. delete win[callbackName];
  3778. };
  3779. doc.querySelector('head').appendChild(script);
  3780. if (options.timeout > 0) {
  3781. abortTimeout = setTimeout(function () {
  3782. script.parentNode.removeChild(script);
  3783. script = null;
  3784. fireCallback('error', null, 'timeout', 'timeout');
  3785. }, options.timeout);
  3786. }
  3787. return undefined;
  3788. }
  3789. // Cache for GET/HEAD requests
  3790. if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS' || method === 'DELETE') {
  3791. if (options.cache === false) {
  3792. options.url += paramsPrefix + "_nocache" + (Date.now());
  3793. }
  3794. }
  3795. // Create XHR
  3796. var xhr = new XMLHttpRequest();
  3797. // Save Request URL
  3798. xhr.requestUrl = options.url;
  3799. xhr.requestParameters = options;
  3800. // Before open callback
  3801. proceedRequest = fireCallback('beforeOpen', xhr, options);
  3802. if (proceedRequest === false) { return xhr; }
  3803. // Open XHR
  3804. xhr.open(method, options.url, options.async, options.user, options.password);
  3805. // Create POST Data
  3806. var postData = null;
  3807. if ((method === 'POST' || method === 'PUT' || method === 'PATCH') && options.data) {
  3808. if (options.processData) {
  3809. var postDataInstances = [ArrayBuffer, Blob, Document, FormData];
  3810. // Post Data
  3811. if (postDataInstances.indexOf(options.data.constructor) >= 0) {
  3812. postData = options.data;
  3813. } else {
  3814. // POST Headers
  3815. var boundary = "---------------------------" + (Date.now().toString(16));
  3816. if (options.contentType === 'multipart/form-data') {
  3817. xhr.setRequestHeader('Content-Type', ("multipart/form-data; boundary=" + boundary));
  3818. } else {
  3819. xhr.setRequestHeader('Content-Type', options.contentType);
  3820. }
  3821. postData = '';
  3822. var data$1 = Utils.serializeObject(options.data);
  3823. if (options.contentType === 'multipart/form-data') {
  3824. data$1 = data$1.split('&');
  3825. var newData = [];
  3826. for (var i = 0; i < data$1.length; i += 1) {
  3827. newData.push(("Content-Disposition: form-data; name=\"" + (data$1[i].split('=')[0]) + "\"\r\n\r\n" + (data$1[i].split('=')[1]) + "\r\n"));
  3828. }
  3829. postData = "--" + boundary + "\r\n" + (newData.join(("--" + boundary + "\r\n"))) + "--" + boundary + "--\r\n";
  3830. } else if (options.contentType === 'application/json') {
  3831. postData = JSON.stringify(options.data);
  3832. } else {
  3833. postData = data$1;
  3834. }
  3835. }
  3836. } else {
  3837. postData = options.data;
  3838. xhr.setRequestHeader('Content-Type', options.contentType);
  3839. }
  3840. }
  3841. if (options.dataType === 'json' && (!options.headers || !options.headers.Accept)) {
  3842. xhr.setRequestHeader('Accept', 'application/json');
  3843. }
  3844. // Additional headers
  3845. if (options.headers) {
  3846. Object.keys(options.headers).forEach(function (headerName) {
  3847. if (typeof options.headers[headerName] === 'undefined') { return; }
  3848. xhr.setRequestHeader(headerName, options.headers[headerName]);
  3849. });
  3850. }
  3851. // Check for crossDomain
  3852. if (typeof options.crossDomain === 'undefined') {
  3853. // eslint-disable-next-line
  3854. options.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(options.url) && RegExp.$2 !== win.location.host;
  3855. }
  3856. if (!options.crossDomain) {
  3857. xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  3858. }
  3859. if (options.xhrFields) {
  3860. Utils.extend(xhr, options.xhrFields);
  3861. }
  3862. // Handle XHR
  3863. xhr.onload = function onload() {
  3864. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {
  3865. var responseData;
  3866. if (options.dataType === 'json') {
  3867. var parseError;
  3868. try {
  3869. responseData = JSON.parse(xhr.responseText);
  3870. } catch (err) {
  3871. parseError = true;
  3872. }
  3873. if (!parseError) {
  3874. fireCallback('success', responseData, xhr.status, xhr);
  3875. } else {
  3876. fireCallback('error', xhr, 'parseerror', 'parseerror');
  3877. }
  3878. } else {
  3879. responseData = xhr.responseType === 'text' || xhr.responseType === '' ? xhr.responseText : xhr.response;
  3880. fireCallback('success', responseData, xhr.status, xhr);
  3881. }
  3882. } else {
  3883. fireCallback('error', xhr, xhr.status, xhr.statusText);
  3884. }
  3885. if (options.statusCode) {
  3886. if (globals.statusCode && globals.statusCode[xhr.status]) { globals.statusCode[xhr.status](xhr); }
  3887. if (options.statusCode[xhr.status]) { options.statusCode[xhr.status](xhr); }
  3888. }
  3889. fireCallback('complete', xhr, xhr.status);
  3890. };
  3891. xhr.onerror = function onerror() {
  3892. fireCallback('error', xhr, xhr.status, xhr.status);
  3893. fireCallback('complete', xhr, 'error');
  3894. };
  3895. // Timeout
  3896. if (options.timeout > 0) {
  3897. xhr.timeout = options.timeout;
  3898. xhr.ontimeout = function () {
  3899. fireCallback('error', xhr, 'timeout', 'timeout');
  3900. fireCallback('complete', xhr, 'timeout');
  3901. };
  3902. }
  3903. // Ajax start callback
  3904. proceedRequest = fireCallback('beforeSend', xhr, options);
  3905. if (proceedRequest === false) { return xhr; }
  3906. // Send XHR
  3907. xhr.send(postData);
  3908. // Return XHR object
  3909. return xhr;
  3910. }
  3911. function RequestShortcut(method) {
  3912. var assign, assign$1;
  3913. var args = [], len = arguments.length - 1;
  3914. while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
  3915. var ref = [];
  3916. var url = ref[0];
  3917. var data = ref[1];
  3918. var success = ref[2];
  3919. var error = ref[3];
  3920. var dataType = ref[4];
  3921. if (typeof args[1] === 'function') {
  3922. (assign = args, url = assign[0], success = assign[1], error = assign[2], dataType = assign[3]);
  3923. } else {
  3924. (assign$1 = args, url = assign$1[0], data = assign$1[1], success = assign$1[2], error = assign$1[3], dataType = assign$1[4]);
  3925. }
  3926. [success, error].forEach(function (callback) {
  3927. if (typeof callback === 'string') {
  3928. dataType = callback;
  3929. if (callback === success) { success = undefined; }
  3930. else { error = undefined; }
  3931. }
  3932. });
  3933. dataType = dataType || (method === 'json' || method === 'postJSON' ? 'json' : undefined);
  3934. var requestOptions = {
  3935. url: url,
  3936. method: method === 'post' || method === 'postJSON' ? 'POST' : 'GET',
  3937. data: data,
  3938. success: success,
  3939. error: error,
  3940. dataType: dataType,
  3941. };
  3942. if (method === 'postJSON') {
  3943. Utils.extend(requestOptions, {
  3944. contentType: 'application/json',
  3945. processData: false,
  3946. crossDomain: true,
  3947. data: typeof data === 'string' ? data : JSON.stringify(data),
  3948. });
  3949. }
  3950. return Request(requestOptions);
  3951. }
  3952. function RequestShortcutPromise(method) {
  3953. var args = [], len = arguments.length - 1;
  3954. while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
  3955. var url = args[0];
  3956. var data = args[1];
  3957. var dataType = args[2];
  3958. return new Promise(function (resolve, reject) {
  3959. RequestShortcut(
  3960. method,
  3961. url,
  3962. data,
  3963. function (responseData, status, xhr) {
  3964. resolve({ data: responseData, status: status, xhr: xhr });
  3965. },
  3966. function (xhr, status, message) {
  3967. // eslint-disable-next-line
  3968. reject({ xhr: xhr, status: status, message: message });
  3969. },
  3970. dataType
  3971. );
  3972. });
  3973. }
  3974. Object.assign(Request, {
  3975. get: function () {
  3976. var args = [], len = arguments.length;
  3977. while ( len-- ) args[ len ] = arguments[ len ];
  3978. return RequestShortcut.apply(void 0, [ 'get' ].concat( args ));
  3979. },
  3980. post: function () {
  3981. var args = [], len = arguments.length;
  3982. while ( len-- ) args[ len ] = arguments[ len ];
  3983. return RequestShortcut.apply(void 0, [ 'post' ].concat( args ));
  3984. },
  3985. json: function () {
  3986. var args = [], len = arguments.length;
  3987. while ( len-- ) args[ len ] = arguments[ len ];
  3988. return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
  3989. },
  3990. getJSON: function () {
  3991. var args = [], len = arguments.length;
  3992. while ( len-- ) args[ len ] = arguments[ len ];
  3993. return RequestShortcut.apply(void 0, [ 'json' ].concat( args ));
  3994. },
  3995. postJSON: function () {
  3996. var args = [], len = arguments.length;
  3997. while ( len-- ) args[ len ] = arguments[ len ];
  3998. return RequestShortcut.apply(void 0, [ 'postJSON' ].concat( args ));
  3999. },
  4000. });
  4001. Request.promise = function requestPromise(requestOptions) {
  4002. return new Promise(function (resolve, reject) {
  4003. Request(Object.assign(requestOptions, {
  4004. success: function success(data, status, xhr) {
  4005. resolve({ data: data, status: status, xhr: xhr });
  4006. },
  4007. error: function error(xhr, status, message) {
  4008. // eslint-disable-next-line
  4009. reject({ xhr: xhr, status: status, message: message });
  4010. },
  4011. }));
  4012. });
  4013. };
  4014. Object.assign(Request.promise, {
  4015. get: function () {
  4016. var args = [], len = arguments.length;
  4017. while ( len-- ) args[ len ] = arguments[ len ];
  4018. return RequestShortcutPromise.apply(void 0, [ 'get' ].concat( args ));
  4019. },
  4020. post: function () {
  4021. var args = [], len = arguments.length;
  4022. while ( len-- ) args[ len ] = arguments[ len ];
  4023. return RequestShortcutPromise.apply(void 0, [ 'post' ].concat( args ));
  4024. },
  4025. json: function () {
  4026. var args = [], len = arguments.length;
  4027. while ( len-- ) args[ len ] = arguments[ len ];
  4028. return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
  4029. },
  4030. getJSON: function () {
  4031. var args = [], len = arguments.length;
  4032. while ( len-- ) args[ len ] = arguments[ len ];
  4033. return RequestShortcutPromise.apply(void 0, [ 'json' ].concat( args ));
  4034. },
  4035. postJSON: function () {
  4036. var args = [], len = arguments.length;
  4037. while ( len-- ) args[ len ] = arguments[ len ];
  4038. return RequestShortcutPromise.apply(void 0, [ 'postJSON' ].concat( args ));
  4039. },
  4040. });
  4041. Request.setup = function setup(options) {
  4042. if (options.type && !options.method) {
  4043. Utils.extend(options, { method: options.type });
  4044. }
  4045. Utils.extend(globals, options);
  4046. };
  4047. /* eslint no-param-reassign: "off" */
  4048. var RequestModule = {
  4049. name: 'request',
  4050. proto: {
  4051. request: Request,
  4052. },
  4053. static: {
  4054. request: Request,
  4055. },
  4056. };
  4057. /* eslint-disable no-nested-ternary */
  4058. function initTouch() {
  4059. var app = this;
  4060. var params = app.params.touch;
  4061. var useRipple = params[((app.theme) + "TouchRipple")];
  4062. if (Device.ios && Device.webView) {
  4063. // Strange hack required for iOS 8 webview to work on inputs
  4064. win.addEventListener('touchstart', function () {});
  4065. }
  4066. var touchStartX;
  4067. var touchStartY;
  4068. var targetElement;
  4069. var isMoved;
  4070. var tapHoldFired;
  4071. var tapHoldTimeout;
  4072. var preventClick;
  4073. var activableElement;
  4074. var activeTimeout;
  4075. var rippleWave;
  4076. var rippleTarget;
  4077. var rippleTimeout;
  4078. function findActivableElement(el) {
  4079. var target = $(el);
  4080. var parents = target.parents(params.activeStateElements);
  4081. if (target.closest('.no-active-state').length) {
  4082. return null;
  4083. }
  4084. var activable;
  4085. if (target.is(params.activeStateElements)) {
  4086. activable = target;
  4087. }
  4088. if (parents.length > 0) {
  4089. activable = activable ? activable.add(parents) : parents;
  4090. }
  4091. if (activable && activable.length > 1) {
  4092. var newActivable = [];
  4093. var preventPropagation;
  4094. for (var i = 0; i < activable.length; i += 1) {
  4095. if (!preventPropagation) {
  4096. newActivable.push(activable[i]);
  4097. if (activable.eq(i).hasClass('prevent-active-state-propagation')
  4098. || activable.eq(i).hasClass('no-active-state-propagation')
  4099. ) {
  4100. preventPropagation = true;
  4101. }
  4102. }
  4103. }
  4104. activable = $(newActivable);
  4105. }
  4106. return activable || target;
  4107. }
  4108. function isInsideScrollableView(el) {
  4109. var pageContent = el.parents('.page-content');
  4110. return pageContent.length > 0;
  4111. }
  4112. function addActive() {
  4113. if (!activableElement) { return; }
  4114. activableElement.addClass('active-state');
  4115. }
  4116. function removeActive() {
  4117. if (!activableElement) { return; }
  4118. activableElement.removeClass('active-state');
  4119. activableElement = null;
  4120. }
  4121. // Ripple handlers
  4122. function findRippleElement(el) {
  4123. var rippleElements = params.touchRippleElements;
  4124. var $el = $(el);
  4125. if ($el.is(rippleElements)) {
  4126. if ($el.hasClass('no-ripple')) {
  4127. return false;
  4128. }
  4129. return $el;
  4130. }
  4131. if ($el.parents(rippleElements).length > 0) {
  4132. var rippleParent = $el.parents(rippleElements).eq(0);
  4133. if (rippleParent.hasClass('no-ripple')) {
  4134. return false;
  4135. }
  4136. return rippleParent;
  4137. }
  4138. return false;
  4139. }
  4140. function createRipple($el, x, y) {
  4141. if (!$el) { return; }
  4142. rippleWave = app.touchRipple.create($el, x, y);
  4143. }
  4144. function removeRipple() {
  4145. if (!rippleWave) { return; }
  4146. rippleWave.remove();
  4147. rippleWave = undefined;
  4148. rippleTarget = undefined;
  4149. }
  4150. function rippleTouchStart(el) {
  4151. rippleTarget = findRippleElement(el);
  4152. if (!rippleTarget || rippleTarget.length === 0) {
  4153. rippleTarget = undefined;
  4154. return;
  4155. }
  4156. var inScrollable = isInsideScrollableView(rippleTarget);
  4157. if (!inScrollable) {
  4158. removeRipple();
  4159. createRipple(rippleTarget, touchStartX, touchStartY);
  4160. } else {
  4161. clearTimeout(rippleTimeout);
  4162. rippleTimeout = setTimeout(function () {
  4163. removeRipple();
  4164. createRipple(rippleTarget, touchStartX, touchStartY);
  4165. }, 80);
  4166. }
  4167. }
  4168. function rippleTouchMove() {
  4169. clearTimeout(rippleTimeout);
  4170. removeRipple();
  4171. }
  4172. function rippleTouchEnd() {
  4173. if (!rippleWave && rippleTarget && !isMoved) {
  4174. clearTimeout(rippleTimeout);
  4175. createRipple(rippleTarget, touchStartX, touchStartY);
  4176. setTimeout(removeRipple, 0);
  4177. } else {
  4178. removeRipple();
  4179. }
  4180. }
  4181. // Mouse Handlers
  4182. function handleMouseDown(e) {
  4183. var $activableEl = findActivableElement(e.target);
  4184. if ($activableEl) {
  4185. $activableEl.addClass('active-state');
  4186. if ('which' in e && e.which === 3) {
  4187. setTimeout(function () {
  4188. $('.active-state').removeClass('active-state');
  4189. }, 0);
  4190. }
  4191. }
  4192. if (useRipple) {
  4193. touchStartX = e.pageX;
  4194. touchStartY = e.pageY;
  4195. rippleTouchStart(e.target, e.pageX, e.pageY);
  4196. }
  4197. }
  4198. function handleMouseMove() {
  4199. if (!params.activeStateOnMouseMove) {
  4200. $('.active-state').removeClass('active-state');
  4201. }
  4202. if (useRipple) {
  4203. rippleTouchMove();
  4204. }
  4205. }
  4206. function handleMouseUp() {
  4207. $('.active-state').removeClass('active-state');
  4208. if (useRipple) {
  4209. rippleTouchEnd();
  4210. }
  4211. }
  4212. function handleTouchCancel() {
  4213. targetElement = null;
  4214. // Remove Active State
  4215. clearTimeout(activeTimeout);
  4216. clearTimeout(tapHoldTimeout);
  4217. if (params.activeState) {
  4218. removeActive();
  4219. }
  4220. // Remove Ripple
  4221. if (useRipple) {
  4222. rippleTouchEnd();
  4223. }
  4224. }
  4225. function handleTouchStart(e) {
  4226. isMoved = false;
  4227. tapHoldFired = false;
  4228. preventClick = false;
  4229. if (e.targetTouches.length > 1) {
  4230. if (activableElement) { removeActive(); }
  4231. return true;
  4232. }
  4233. if (e.touches.length > 1 && activableElement) {
  4234. removeActive();
  4235. }
  4236. if (params.tapHold) {
  4237. if (tapHoldTimeout) { clearTimeout(tapHoldTimeout); }
  4238. tapHoldTimeout = setTimeout(function () {
  4239. if (e && e.touches && e.touches.length > 1) { return; }
  4240. tapHoldFired = true;
  4241. e.preventDefault();
  4242. preventClick = true;
  4243. $(e.target).trigger('taphold', e);
  4244. app.emit('taphold', e);
  4245. }, params.tapHoldDelay);
  4246. }
  4247. targetElement = e.target;
  4248. touchStartX = e.targetTouches[0].pageX;
  4249. touchStartY = e.targetTouches[0].pageY;
  4250. if (params.activeState) {
  4251. activableElement = findActivableElement(targetElement);
  4252. if (activableElement && !isInsideScrollableView(activableElement)) {
  4253. addActive();
  4254. } else if (activableElement) {
  4255. activeTimeout = setTimeout(addActive, 80);
  4256. }
  4257. }
  4258. if (useRipple) {
  4259. rippleTouchStart(targetElement);
  4260. }
  4261. return true;
  4262. }
  4263. function handleTouchMove(e) {
  4264. var touch;
  4265. var distance;
  4266. if (e.type === 'touchmove') {
  4267. touch = e.targetTouches[0];
  4268. distance = params.touchClicksDistanceThreshold;
  4269. }
  4270. if (distance && touch) {
  4271. var pageX = touch.pageX;
  4272. var pageY = touch.pageY;
  4273. if (Math.abs(pageX - touchStartX) > distance || Math.abs(pageY - touchStartY) > distance) {
  4274. isMoved = true;
  4275. }
  4276. } else {
  4277. isMoved = true;
  4278. }
  4279. if (isMoved) {
  4280. preventClick = true;
  4281. if (params.tapHold) {
  4282. clearTimeout(tapHoldTimeout);
  4283. }
  4284. if (params.activeState) {
  4285. clearTimeout(activeTimeout);
  4286. removeActive();
  4287. }
  4288. if (useRipple) {
  4289. rippleTouchMove();
  4290. }
  4291. }
  4292. }
  4293. function handleTouchEnd(e) {
  4294. clearTimeout(activeTimeout);
  4295. clearTimeout(tapHoldTimeout);
  4296. if (doc.activeElement === e.target) {
  4297. if (params.activeState) { removeActive(); }
  4298. if (useRipple) {
  4299. rippleTouchEnd();
  4300. }
  4301. return true;
  4302. }
  4303. if (params.activeState) {
  4304. addActive();
  4305. setTimeout(removeActive, 0);
  4306. }
  4307. if (useRipple) {
  4308. rippleTouchEnd();
  4309. }
  4310. if ((params.tapHoldPreventClicks && tapHoldFired) || preventClick) {
  4311. if (e.cancelable) { e.preventDefault(); }
  4312. preventClick = true;
  4313. return false;
  4314. }
  4315. return true;
  4316. }
  4317. function handleClick(e) {
  4318. var isOverswipe = e && e.detail && e.detail === 'f7Overswipe';
  4319. var localPreventClick = preventClick;
  4320. if (targetElement && e.target !== targetElement) {
  4321. if (isOverswipe) {
  4322. localPreventClick = false;
  4323. } else {
  4324. localPreventClick = true;
  4325. }
  4326. }
  4327. if (params.tapHold && params.tapHoldPreventClicks && tapHoldFired) {
  4328. localPreventClick = true;
  4329. }
  4330. if (localPreventClick) {
  4331. e.stopImmediatePropagation();
  4332. e.stopPropagation();
  4333. e.preventDefault();
  4334. }
  4335. if (params.tapHold) {
  4336. tapHoldTimeout = setTimeout(
  4337. function () {
  4338. tapHoldFired = false;
  4339. },
  4340. (Device.ios || Device.androidChrome ? 100 : 400)
  4341. );
  4342. }
  4343. preventClick = false;
  4344. targetElement = null;
  4345. return !localPreventClick;
  4346. }
  4347. function emitAppTouchEvent(name, e) {
  4348. app.emit({
  4349. events: name,
  4350. data: [e],
  4351. });
  4352. }
  4353. function appClick(e) {
  4354. emitAppTouchEvent('click', e);
  4355. }
  4356. function appTouchStartActive(e) {
  4357. emitAppTouchEvent('touchstart touchstart:active', e);
  4358. }
  4359. function appTouchMoveActive(e) {
  4360. emitAppTouchEvent('touchmove touchmove:active', e);
  4361. }
  4362. function appTouchEndActive(e) {
  4363. emitAppTouchEvent('touchend touchend:active', e);
  4364. }
  4365. function appTouchStartPassive(e) {
  4366. emitAppTouchEvent('touchstart:passive', e);
  4367. }
  4368. function appTouchMovePassive(e) {
  4369. emitAppTouchEvent('touchmove:passive', e);
  4370. }
  4371. function appTouchEndPassive(e) {
  4372. emitAppTouchEvent('touchend:passive', e);
  4373. }
  4374. function appGestureActive(e) {
  4375. emitAppTouchEvent(((e.type) + " " + (e.type) + ":active"), e);
  4376. }
  4377. function appGesturePassive(e) {
  4378. emitAppTouchEvent(((e.type) + ":passive"), e);
  4379. }
  4380. var passiveListener = Support.passiveListener ? { passive: true } : false;
  4381. var passiveListenerCapture = Support.passiveListener ? { passive: true, capture: true } : true;
  4382. var activeListener = Support.passiveListener ? { passive: false } : false;
  4383. var activeListenerCapture = Support.passiveListener ? { passive: false, capture: true } : true;
  4384. doc.addEventListener('click', appClick, true);
  4385. if (Support.passiveListener) {
  4386. doc.addEventListener(app.touchEvents.start, appTouchStartActive, activeListenerCapture);
  4387. doc.addEventListener(app.touchEvents.move, appTouchMoveActive, activeListener);
  4388. doc.addEventListener(app.touchEvents.end, appTouchEndActive, activeListener);
  4389. doc.addEventListener(app.touchEvents.start, appTouchStartPassive, passiveListenerCapture);
  4390. doc.addEventListener(app.touchEvents.move, appTouchMovePassive, passiveListener);
  4391. doc.addEventListener(app.touchEvents.end, appTouchEndPassive, passiveListener);
  4392. if (Support.touch && Support.gestures) {
  4393. doc.addEventListener('gesturestart', appGestureActive, activeListener);
  4394. doc.addEventListener('gesturechange', appGestureActive, activeListener);
  4395. doc.addEventListener('gestureend', appGestureActive, activeListener);
  4396. doc.addEventListener('gesturestart', appGesturePassive, passiveListener);
  4397. doc.addEventListener('gesturechange', appGesturePassive, passiveListener);
  4398. doc.addEventListener('gestureend', appGesturePassive, passiveListener);
  4399. }
  4400. } else {
  4401. doc.addEventListener(app.touchEvents.start, function (e) {
  4402. appTouchStartActive(e);
  4403. appTouchStartPassive(e);
  4404. }, true);
  4405. doc.addEventListener(app.touchEvents.move, function (e) {
  4406. appTouchMoveActive(e);
  4407. appTouchMovePassive(e);
  4408. }, false);
  4409. doc.addEventListener(app.touchEvents.end, function (e) {
  4410. appTouchEndActive(e);
  4411. appTouchEndPassive(e);
  4412. }, false);
  4413. if (Support.touch && Support.gestures) {
  4414. doc.addEventListener('gesturestart', function (e) {
  4415. appGestureActive(e);
  4416. appGesturePassive(e);
  4417. }, false);
  4418. doc.addEventListener('gesturechange', function (e) {
  4419. appGestureActive(e);
  4420. appGesturePassive(e);
  4421. }, false);
  4422. doc.addEventListener('gestureend', function (e) {
  4423. appGestureActive(e);
  4424. appGesturePassive(e);
  4425. }, false);
  4426. }
  4427. }
  4428. if (Support.touch) {
  4429. app.on('click', handleClick);
  4430. app.on('touchstart', handleTouchStart);
  4431. app.on('touchmove', handleTouchMove);
  4432. app.on('touchend', handleTouchEnd);
  4433. doc.addEventListener('touchcancel', handleTouchCancel, { passive: true });
  4434. } else if (params.activeState) {
  4435. app.on('touchstart', handleMouseDown);
  4436. app.on('touchmove', handleMouseMove);
  4437. app.on('touchend', handleMouseUp);
  4438. doc.addEventListener('pointercancel', handleMouseUp, { passive: true });
  4439. }
  4440. doc.addEventListener('contextmenu', function (e) {
  4441. if (params.disableContextMenu && (Device.ios || Device.android || Device.cordova)) {
  4442. e.preventDefault();
  4443. }
  4444. if (useRipple) {
  4445. if (activableElement) { removeActive(); }
  4446. rippleTouchEnd();
  4447. }
  4448. });
  4449. }
  4450. var TouchModule = {
  4451. name: 'touch',
  4452. params: {
  4453. touch: {
  4454. // Clicks
  4455. touchClicksDistanceThreshold: 5,
  4456. // ContextMenu
  4457. disableContextMenu: false,
  4458. // Tap Hold
  4459. tapHold: false,
  4460. tapHoldDelay: 750,
  4461. tapHoldPreventClicks: true,
  4462. // Active State
  4463. activeState: true,
  4464. activeStateElements: 'a, button, label, span, .actions-button, .stepper-button, .stepper-button-plus, .stepper-button-minus, .card-expandable, .menu-item, .link, .item-link, .accordion-item-toggle',
  4465. activeStateOnMouseMove: false,
  4466. mdTouchRipple: true,
  4467. iosTouchRipple: false,
  4468. auroraTouchRipple: false,
  4469. touchRippleElements: '.ripple, .link, .item-link, .list-button, .links-list a, .button, button, .input-clear-button, .dialog-button, .tab-link, .item-radio, .item-checkbox, .actions-button, .searchbar-disable-button, .fab a, .checkbox, .radio, .data-table .sortable-cell:not(.input-cell), .notification-close-button, .stepper-button, .stepper-button-minus, .stepper-button-plus, .menu-item-content, .list.accordion-list .accordion-item-toggle',
  4470. },
  4471. },
  4472. instance: {
  4473. touchEvents: {
  4474. start: Support.touch ? 'touchstart' : (Support.pointerEvents ? 'pointerdown' : 'mousedown'),
  4475. move: Support.touch ? 'touchmove' : (Support.pointerEvents ? 'pointermove' : 'mousemove'),
  4476. end: Support.touch ? 'touchend' : (Support.pointerEvents ? 'pointerup' : 'mouseup'),
  4477. },
  4478. },
  4479. on: {
  4480. init: initTouch,
  4481. },
  4482. };
  4483. /**
  4484. * Tokenize input string.
  4485. */
  4486. function lexer(str) {
  4487. var tokens = [];
  4488. var i = 0;
  4489. while (i < str.length) {
  4490. var char = str[i];
  4491. if (char === "*" || char === "+" || char === "?") {
  4492. tokens.push({ type: "MODIFIER", index: i, value: str[i++] });
  4493. continue;
  4494. }
  4495. if (char === "\\") {
  4496. tokens.push({ type: "ESCAPED_CHAR", index: i++, value: str[i++] });
  4497. continue;
  4498. }
  4499. if (char === "{") {
  4500. tokens.push({ type: "OPEN", index: i, value: str[i++] });
  4501. continue;
  4502. }
  4503. if (char === "}") {
  4504. tokens.push({ type: "CLOSE", index: i, value: str[i++] });
  4505. continue;
  4506. }
  4507. if (char === ":") {
  4508. var name = "";
  4509. var j = i + 1;
  4510. while (j < str.length) {
  4511. var code = str.charCodeAt(j);
  4512. if (
  4513. // `0-9`
  4514. (code >= 48 && code <= 57) ||
  4515. // `A-Z`
  4516. (code >= 65 && code <= 90) ||
  4517. // `a-z`
  4518. (code >= 97 && code <= 122) ||
  4519. // `_`
  4520. code === 95) {
  4521. name += str[j++];
  4522. continue;
  4523. }
  4524. break;
  4525. }
  4526. if (!name)
  4527. { throw new TypeError("Missing parameter name at " + i); }
  4528. tokens.push({ type: "NAME", index: i, value: name });
  4529. i = j;
  4530. continue;
  4531. }
  4532. if (char === "(") {
  4533. var count = 1;
  4534. var pattern = "";
  4535. var j = i + 1;
  4536. if (str[j] === "?") {
  4537. throw new TypeError("Pattern cannot start with \"?\" at " + j);
  4538. }
  4539. while (j < str.length) {
  4540. if (str[j] === "\\") {
  4541. pattern += str[j++] + str[j++];
  4542. continue;
  4543. }
  4544. if (str[j] === ")") {
  4545. count--;
  4546. if (count === 0) {
  4547. j++;
  4548. break;
  4549. }
  4550. }
  4551. else if (str[j] === "(") {
  4552. count++;
  4553. if (str[j + 1] !== "?") {
  4554. throw new TypeError("Capturing groups are not allowed at " + j);
  4555. }
  4556. }
  4557. pattern += str[j++];
  4558. }
  4559. if (count)
  4560. { throw new TypeError("Unbalanced pattern at " + i); }
  4561. if (!pattern)
  4562. { throw new TypeError("Missing pattern at " + i); }
  4563. tokens.push({ type: "PATTERN", index: i, value: pattern });
  4564. i = j;
  4565. continue;
  4566. }
  4567. tokens.push({ type: "CHAR", index: i, value: str[i++] });
  4568. }
  4569. tokens.push({ type: "END", index: i, value: "" });
  4570. return tokens;
  4571. }
  4572. /**
  4573. * Parse a string for the raw tokens.
  4574. */
  4575. function parse(str, options) {
  4576. if (options === void 0) { options = {}; }
  4577. var tokens = lexer(str);
  4578. var _a = options.prefixes, prefixes = _a === void 0 ? "./" : _a;
  4579. var defaultPattern = "[^" + escapeString(options.delimiter || "/#?") + "]+?";
  4580. var result = [];
  4581. var key = 0;
  4582. var i = 0;
  4583. var path = "";
  4584. var tryConsume = function (type) {
  4585. if (i < tokens.length && tokens[i].type === type)
  4586. { return tokens[i++].value; }
  4587. };
  4588. var mustConsume = function (type) {
  4589. var value = tryConsume(type);
  4590. if (value !== undefined)
  4591. { return value; }
  4592. var _a = tokens[i], nextType = _a.type, index = _a.index;
  4593. throw new TypeError("Unexpected " + nextType + " at " + index + ", expected " + type);
  4594. };
  4595. var consumeText = function () {
  4596. var result = "";
  4597. var value;
  4598. // tslint:disable-next-line
  4599. while ((value = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR"))) {
  4600. result += value;
  4601. }
  4602. return result;
  4603. };
  4604. while (i < tokens.length) {
  4605. var char = tryConsume("CHAR");
  4606. var name = tryConsume("NAME");
  4607. var pattern = tryConsume("PATTERN");
  4608. if (name || pattern) {
  4609. var prefix = char || "";
  4610. if (prefixes.indexOf(prefix) === -1) {
  4611. path += prefix;
  4612. prefix = "";
  4613. }
  4614. if (path) {
  4615. result.push(path);
  4616. path = "";
  4617. }
  4618. result.push({
  4619. name: name || key++,
  4620. prefix: prefix,
  4621. suffix: "",
  4622. pattern: pattern || defaultPattern,
  4623. modifier: tryConsume("MODIFIER") || ""
  4624. });
  4625. continue;
  4626. }
  4627. var value = char || tryConsume("ESCAPED_CHAR");
  4628. if (value) {
  4629. path += value;
  4630. continue;
  4631. }
  4632. if (path) {
  4633. result.push(path);
  4634. path = "";
  4635. }
  4636. var open = tryConsume("OPEN");
  4637. if (open) {
  4638. var prefix = consumeText();
  4639. var name_1 = tryConsume("NAME") || "";
  4640. var pattern_1 = tryConsume("PATTERN") || "";
  4641. var suffix = consumeText();
  4642. mustConsume("CLOSE");
  4643. result.push({
  4644. name: name_1 || (pattern_1 ? key++ : ""),
  4645. pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1,
  4646. prefix: prefix,
  4647. suffix: suffix,
  4648. modifier: tryConsume("MODIFIER") || ""
  4649. });
  4650. continue;
  4651. }
  4652. mustConsume("END");
  4653. }
  4654. return result;
  4655. }
  4656. /**
  4657. * Compile a string to a template function for the path.
  4658. */
  4659. function compile(str, options) {
  4660. return tokensToFunction(parse(str, options), options);
  4661. }
  4662. /**
  4663. * Expose a method for transforming tokens into the path function.
  4664. */
  4665. function tokensToFunction(tokens, options) {
  4666. if (options === void 0) { options = {}; }
  4667. var reFlags = flags(options);
  4668. var _a = options.encode, encode = _a === void 0 ? function (x) { return x; } : _a, _b = options.validate, validate = _b === void 0 ? true : _b;
  4669. // Compile all the tokens into regexps.
  4670. var matches = tokens.map(function (token) {
  4671. if (typeof token === "object") {
  4672. return new RegExp("^(?:" + token.pattern + ")$", reFlags);
  4673. }
  4674. });
  4675. return function (data) {
  4676. var path = "";
  4677. for (var i = 0; i < tokens.length; i++) {
  4678. var token = tokens[i];
  4679. if (typeof token === "string") {
  4680. path += token;
  4681. continue;
  4682. }
  4683. var value = data ? data[token.name] : undefined;
  4684. var optional = token.modifier === "?" || token.modifier === "*";
  4685. var repeat = token.modifier === "*" || token.modifier === "+";
  4686. if (Array.isArray(value)) {
  4687. if (!repeat) {
  4688. throw new TypeError("Expected \"" + token.name + "\" to not repeat, but got an array");
  4689. }
  4690. if (value.length === 0) {
  4691. if (optional)
  4692. { continue; }
  4693. throw new TypeError("Expected \"" + token.name + "\" to not be empty");
  4694. }
  4695. for (var j = 0; j < value.length; j++) {
  4696. var segment = encode(value[j], token);
  4697. if (validate && !matches[i].test(segment)) {
  4698. throw new TypeError("Expected all \"" + token.name + "\" to match \"" + token.pattern + "\", but got \"" + segment + "\"");
  4699. }
  4700. path += token.prefix + segment + token.suffix;
  4701. }
  4702. continue;
  4703. }
  4704. if (typeof value === "string" || typeof value === "number") {
  4705. var segment = encode(String(value), token);
  4706. if (validate && !matches[i].test(segment)) {
  4707. throw new TypeError("Expected \"" + token.name + "\" to match \"" + token.pattern + "\", but got \"" + segment + "\"");
  4708. }
  4709. path += token.prefix + segment + token.suffix;
  4710. continue;
  4711. }
  4712. if (optional)
  4713. { continue; }
  4714. var typeOfMessage = repeat ? "an array" : "a string";
  4715. throw new TypeError("Expected \"" + token.name + "\" to be " + typeOfMessage);
  4716. }
  4717. return path;
  4718. };
  4719. }
  4720. /**
  4721. * Escape a regular expression string.
  4722. */
  4723. function escapeString(str) {
  4724. return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
  4725. }
  4726. /**
  4727. * Get the flags for a regexp from the options.
  4728. */
  4729. function flags(options) {
  4730. return options && options.sensitive ? "" : "i";
  4731. }
  4732. /**
  4733. * Pull out keys from a regexp.
  4734. */
  4735. function regexpToRegexp(path, keys) {
  4736. if (!keys)
  4737. { return path; }
  4738. // Use a negative lookahead to match only capturing groups.
  4739. var groups = path.source.match(/\((?!\?)/g);
  4740. if (groups) {
  4741. for (var i = 0; i < groups.length; i++) {
  4742. keys.push({
  4743. name: i,
  4744. prefix: "",
  4745. suffix: "",
  4746. modifier: "",
  4747. pattern: ""
  4748. });
  4749. }
  4750. }
  4751. return path;
  4752. }
  4753. /**
  4754. * Transform an array into a regexp.
  4755. */
  4756. function arrayToRegexp(paths, keys, options) {
  4757. var parts = paths.map(function (path) { return pathToRegexp(path, keys, options).source; });
  4758. return new RegExp("(?:" + parts.join("|") + ")", flags(options));
  4759. }
  4760. /**
  4761. * Create a path regexp from string input.
  4762. */
  4763. function stringToRegexp(path, keys, options) {
  4764. return tokensToRegexp(parse(path, options), keys, options);
  4765. }
  4766. /**
  4767. * Expose a function for taking tokens and returning a RegExp.
  4768. */
  4769. function tokensToRegexp(tokens, keys, options) {
  4770. if (options === void 0) { options = {}; }
  4771. var _a = options.strict, strict = _a === void 0 ? false : _a, _b = options.start, start = _b === void 0 ? true : _b, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function (x) { return x; } : _d;
  4772. var endsWith = "[" + escapeString(options.endsWith || "") + "]|$";
  4773. var delimiter = "[" + escapeString(options.delimiter || "/#?") + "]";
  4774. var route = start ? "^" : "";
  4775. // Iterate over the tokens and create our regexp string.
  4776. for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
  4777. var token = tokens_1[_i];
  4778. if (typeof token === "string") {
  4779. route += escapeString(encode(token));
  4780. }
  4781. else {
  4782. var prefix = escapeString(encode(token.prefix));
  4783. var suffix = escapeString(encode(token.suffix));
  4784. if (token.pattern) {
  4785. if (keys)
  4786. { keys.push(token); }
  4787. if (prefix || suffix) {
  4788. if (token.modifier === "+" || token.modifier === "*") {
  4789. var mod = token.modifier === "*" ? "?" : "";
  4790. route += "(?:" + prefix + "((?:" + token.pattern + ")(?:" + suffix + prefix + "(?:" + token.pattern + "))*)" + suffix + ")" + mod;
  4791. }
  4792. else {
  4793. route += "(?:" + prefix + "(" + token.pattern + ")" + suffix + ")" + token.modifier;
  4794. }
  4795. }
  4796. else {
  4797. route += "(" + token.pattern + ")" + token.modifier;
  4798. }
  4799. }
  4800. else {
  4801. route += "(?:" + prefix + suffix + ")" + token.modifier;
  4802. }
  4803. }
  4804. }
  4805. if (end) {
  4806. if (!strict)
  4807. { route += delimiter + "?"; }
  4808. route += !options.endsWith ? "$" : "(?=" + endsWith + ")";
  4809. }
  4810. else {
  4811. var endToken = tokens[tokens.length - 1];
  4812. var isEndDelimited = typeof endToken === "string"
  4813. ? delimiter.indexOf(endToken[endToken.length - 1]) > -1
  4814. : // tslint:disable-next-line
  4815. endToken === undefined;
  4816. if (!strict) {
  4817. route += "(?:" + delimiter + "(?=" + endsWith + "))?";
  4818. }
  4819. if (!isEndDelimited) {
  4820. route += "(?=" + delimiter + "|" + endsWith + ")";
  4821. }
  4822. }
  4823. return new RegExp(route, flags(options));
  4824. }
  4825. /**
  4826. * Normalize the given path string, returning a regular expression.
  4827. *
  4828. * An empty array can be passed in for the keys, which will hold the
  4829. * placeholder key descriptions. For example, using `/user/:id`, `keys` will
  4830. * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
  4831. */
  4832. function pathToRegexp(path, keys, options) {
  4833. if (path instanceof RegExp)
  4834. { return regexpToRegexp(path, keys); }
  4835. if (Array.isArray(path))
  4836. { return arrayToRegexp(path, keys, options); }
  4837. return stringToRegexp(path, keys, options);
  4838. }
  4839. var History = {
  4840. queue: [],
  4841. clearQueue: function clearQueue() {
  4842. if (History.queue.length === 0) { return; }
  4843. var currentQueue = History.queue.shift();
  4844. currentQueue();
  4845. },
  4846. routerQueue: [],
  4847. clearRouterQueue: function clearRouterQueue() {
  4848. if (History.routerQueue.length === 0) { return; }
  4849. var currentQueue = History.routerQueue.pop();
  4850. var router = currentQueue.router;
  4851. var stateUrl = currentQueue.stateUrl;
  4852. var action = currentQueue.action;
  4853. var animate = router.params.animate;
  4854. if (router.params.pushStateAnimate === false) { animate = false; }
  4855. if (action === 'back') {
  4856. router.back({ animate: animate, pushState: false });
  4857. }
  4858. if (action === 'load') {
  4859. router.navigate(stateUrl, { animate: animate, pushState: false });
  4860. }
  4861. },
  4862. handle: function handle(e) {
  4863. if (History.blockPopstate) { return; }
  4864. var app = this;
  4865. // const mainView = app.views.main;
  4866. var state = e.state;
  4867. History.previousState = History.state;
  4868. History.state = state;
  4869. History.allowChange = true;
  4870. History.clearQueue();
  4871. state = History.state;
  4872. if (!state) { state = {}; }
  4873. app.views.forEach(function (view) {
  4874. var router = view.router;
  4875. var viewState = state[view.id];
  4876. if (!viewState && view.params.pushState) {
  4877. viewState = {
  4878. url: view.router.history[0],
  4879. };
  4880. }
  4881. if (!viewState) { return; }
  4882. var stateUrl = viewState.url || undefined;
  4883. var animate = router.params.animate;
  4884. if (router.params.pushStateAnimate === false) { animate = false; }
  4885. if (stateUrl !== router.url) {
  4886. if (router.history.indexOf(stateUrl) >= 0) {
  4887. // Go Back
  4888. if (router.allowPageChange) {
  4889. router.back({ animate: animate, pushState: false });
  4890. } else {
  4891. History.routerQueue.push({
  4892. action: 'back',
  4893. router: router,
  4894. });
  4895. }
  4896. } else if (router.allowPageChange) {
  4897. // Load page
  4898. router.navigate(stateUrl, { animate: animate, pushState: false });
  4899. } else {
  4900. History.routerQueue.unshift({
  4901. action: 'load',
  4902. stateUrl: stateUrl,
  4903. router: router,
  4904. });
  4905. }
  4906. }
  4907. });
  4908. },
  4909. initViewState: function initViewState(viewId, viewState) {
  4910. var obj;
  4911. var newState = Utils.extend({}, (History.state || {}), ( obj = {}, obj[viewId] = viewState, obj ));
  4912. History.state = newState;
  4913. win.history.replaceState(newState, '');
  4914. },
  4915. push: function push(viewId, viewState, url) {
  4916. var obj;
  4917. if (!History.allowChange) {
  4918. History.queue.push(function () {
  4919. History.push(viewId, viewState, url);
  4920. });
  4921. return;
  4922. }
  4923. History.previousState = History.state;
  4924. var newState = Utils.extend({}, (History.previousState || {}), ( obj = {}, obj[viewId] = viewState, obj ));
  4925. History.state = newState;
  4926. win.history.pushState(newState, '', url);
  4927. },
  4928. replace: function replace(viewId, viewState, url) {
  4929. var obj;
  4930. if (!History.allowChange) {
  4931. History.queue.push(function () {
  4932. History.replace(viewId, viewState, url);
  4933. });
  4934. return;
  4935. }
  4936. History.previousState = History.state;
  4937. var newState = Utils.extend({}, (History.previousState || {}), ( obj = {}, obj[viewId] = viewState, obj ));
  4938. History.state = newState;
  4939. win.history.replaceState(newState, '', url);
  4940. },
  4941. go: function go(index) {
  4942. History.allowChange = false;
  4943. win.history.go(index);
  4944. },
  4945. back: function back() {
  4946. History.allowChange = false;
  4947. win.history.back();
  4948. },
  4949. allowChange: true,
  4950. previousState: {},
  4951. state: win.history.state,
  4952. blockPopstate: true,
  4953. init: function init(app) {
  4954. $(win).on('load', function () {
  4955. setTimeout(function () {
  4956. History.blockPopstate = false;
  4957. }, 0);
  4958. });
  4959. if (doc.readyState && doc.readyState === 'complete') {
  4960. History.blockPopstate = false;
  4961. }
  4962. $(win).on('popstate', History.handle.bind(app));
  4963. },
  4964. };
  4965. function SwipeBack(r) {
  4966. var router = r;
  4967. var $el = router.$el;
  4968. var $navbarsEl = router.$navbarsEl;
  4969. var app = router.app;
  4970. var params = router.params;
  4971. var isTouched = false;
  4972. var isMoved = false;
  4973. var touchesStart = {};
  4974. var isScrolling;
  4975. var $currentPageEl = [];
  4976. var $previousPageEl = [];
  4977. var viewContainerWidth;
  4978. var touchesDiff;
  4979. var allowViewTouchMove = true;
  4980. var touchStartTime;
  4981. var $currentNavbarEl = [];
  4982. var $previousNavbarEl = [];
  4983. var dynamicNavbar;
  4984. var $pageShadowEl;
  4985. var $pageOpacityEl;
  4986. var animatableNavEls;
  4987. var paramsSwipeBackAnimateShadow = params[((app.theme) + "SwipeBackAnimateShadow")];
  4988. var paramsSwipeBackAnimateOpacity = params[((app.theme) + "SwipeBackAnimateOpacity")];
  4989. var paramsSwipeBackActiveArea = params[((app.theme) + "SwipeBackActiveArea")];
  4990. var paramsSwipeBackThreshold = params[((app.theme) + "SwipeBackThreshold")];
  4991. var transformOrigin = app.rtl ? 'right center' : 'left center';
  4992. var transformOriginTitleLarge = app.rtl
  4993. ? 'calc(100% - var(--f7-navbar-large-title-padding-left) - var(--f7-safe-area-left)) center'
  4994. : 'calc(var(--f7-navbar-large-title-padding-left) + var(--f7-safe-area-left)) center';
  4995. function animatableNavElements() {
  4996. var els = [];
  4997. var inverter = app.rtl ? -1 : 1;
  4998. var currentNavIsTransparent = $currentNavbarEl.hasClass('navbar-transparent') && !$currentNavbarEl.hasClass('navbar-large') && !$currentNavbarEl.hasClass('navbar-transparent-visible');
  4999. var currentNavIsLarge = $currentNavbarEl.hasClass('navbar-large');
  5000. var currentNavIsCollapsed = $currentNavbarEl.hasClass('navbar-large-collapsed');
  5001. var currentNavIsLargeTransparent = $currentNavbarEl.hasClass('navbar-large-transparent')
  5002. || (
  5003. $currentNavbarEl.hasClass('navbar-large')
  5004. && $currentNavbarEl.hasClass('navbar-transparent')
  5005. );
  5006. var previousNavIsTransparent = $previousNavbarEl.hasClass('navbar-transparent') && !$previousNavbarEl.hasClass('navbar-large') && !$previousNavbarEl.hasClass('navbar-transparent-visible');
  5007. var previousNavIsLarge = $previousNavbarEl.hasClass('navbar-large');
  5008. var previousNavIsCollapsed = $previousNavbarEl.hasClass('navbar-large-collapsed');
  5009. var previousNavIsLargeTransparent = $previousNavbarEl.hasClass('navbar-large-transparent')
  5010. || (
  5011. $previousNavbarEl.hasClass('navbar-large')
  5012. && $previousNavbarEl.hasClass('navbar-transparent')
  5013. );
  5014. var fromLarge = currentNavIsLarge && !currentNavIsCollapsed;
  5015. var toLarge = previousNavIsLarge && !previousNavIsCollapsed;
  5016. var $currentNavElements = $currentNavbarEl.find('.left, .title, .right, .subnavbar, .fading, .title-large, .navbar-bg');
  5017. var $previousNavElements = $previousNavbarEl.find('.left, .title, .right, .subnavbar, .fading, .title-large, .navbar-bg');
  5018. var activeNavBackIconText;
  5019. var previousNavBackIconText;
  5020. if (params.iosAnimateNavbarBackIcon) {
  5021. if ($currentNavbarEl.hasClass('sliding') || $currentNavbarEl.find('.navbar-inner.sliding').length) {
  5022. activeNavBackIconText = $currentNavbarEl.find('.left').find('.back .icon + span').eq(0);
  5023. } else {
  5024. activeNavBackIconText = $currentNavbarEl.find('.left.sliding').find('.back .icon + span').eq(0);
  5025. }
  5026. if ($previousNavbarEl.hasClass('sliding') || $previousNavbarEl.find('.navbar-inner.sliding').length) {
  5027. previousNavBackIconText = $previousNavbarEl.find('.left').find('.back .icon + span').eq(0);
  5028. } else {
  5029. previousNavBackIconText = $previousNavbarEl.find('.left.sliding').find('.back .icon + span').eq(0);
  5030. }
  5031. if (activeNavBackIconText.length) {
  5032. $previousNavElements.each(function (index, el) {
  5033. if (!$(el).hasClass('title')) { return; }
  5034. el.f7NavbarLeftOffset += activeNavBackIconText.prev('.icon')[0].offsetWidth;
  5035. });
  5036. }
  5037. }
  5038. $currentNavElements
  5039. .each(function (index, navEl) {
  5040. var $navEl = $(navEl);
  5041. var isSubnavbar = $navEl.hasClass('subnavbar');
  5042. var isLeft = $navEl.hasClass('left');
  5043. var isTitle = $navEl.hasClass('title');
  5044. var isBg = $navEl.hasClass('navbar-bg');
  5045. if ((isTitle || isBg) && currentNavIsTransparent) { return; }
  5046. if (!fromLarge && $navEl.hasClass('.title-large')) { return; }
  5047. var el = {
  5048. el: navEl,
  5049. };
  5050. if (fromLarge) {
  5051. if (isTitle) { return; }
  5052. if ($navEl.hasClass('title-large')) {
  5053. if (els.indexOf(el) < 0) { els.push(el); }
  5054. el.overflow = 'visible';
  5055. $navEl.find('.title-large-text').each(function (subIndex, subNavEl) {
  5056. els.push({
  5057. el: subNavEl,
  5058. transform: function (progress) { return ("translateX(" + (progress * 100 * inverter) + "%)"); },
  5059. });
  5060. });
  5061. return;
  5062. }
  5063. }
  5064. if (toLarge) {
  5065. if (!fromLarge) {
  5066. if ($navEl.hasClass('title-large')) {
  5067. if (els.indexOf(el) < 0) { els.push(el); }
  5068. el.opacity = 0;
  5069. }
  5070. }
  5071. if (isLeft) {
  5072. if (els.indexOf(el) < 0) { els.push(el); }
  5073. el.opacity = function (progress) { return (1 - (Math.pow( progress, 0.33 ))); };
  5074. $navEl.find('.back span').each(function (subIndex, subNavEl) {
  5075. els.push({
  5076. el: subNavEl,
  5077. 'transform-origin': transformOrigin,
  5078. transform: function (progress) { return ("translateX(calc(" + progress + " * (var(--f7-navbarTitleLargeOffset) - var(--f7-navbarLeftTextOffset)))) translateY(calc(" + progress + " * (var(--f7-navbar-large-title-height) - var(--f7-navbar-large-title-padding-vertical) / 2))) scale(" + (1 + (1 * progress)) + ")"); },
  5079. });
  5080. });
  5081. return;
  5082. }
  5083. }
  5084. if (isBg) {
  5085. if (els.indexOf(el) < 0) { els.push(el); }
  5086. if (!fromLarge && !toLarge) {
  5087. if (currentNavIsCollapsed) {
  5088. if (currentNavIsLargeTransparent) {
  5089. el.className = 'ios-swipeback-navbar-bg-large';
  5090. }
  5091. el.transform = function (progress) { return ("translateX(" + (100 * progress * inverter) + "%) translateY(calc(-1 * var(--f7-navbar-large-title-height)))"); };
  5092. } else {
  5093. el.transform = function (progress) { return ("translateX(" + (100 * progress * inverter) + "%)"); };
  5094. }
  5095. }
  5096. if (!fromLarge && toLarge) {
  5097. el.className = 'ios-swipeback-navbar-bg-large';
  5098. el.transform = function (progress) { return ("translateX(" + (100 * progress * inverter) + "%) translateY(calc(-1 * " + (1 - progress) + " * var(--f7-navbar-large-title-height)))"); };
  5099. }
  5100. if (fromLarge && toLarge) {
  5101. el.transform = function (progress) { return ("translateX(" + (100 * progress * inverter) + "%)"); };
  5102. }
  5103. if (fromLarge && !toLarge) {
  5104. el.transform = function (progress) { return ("translateX(" + (100 * progress * inverter) + "%) translateY(calc(-" + progress + " * var(--f7-navbar-large-title-height)))"); };
  5105. }
  5106. return;
  5107. }
  5108. if ($navEl.hasClass('title-large')) { return; }
  5109. var isSliding = $navEl.hasClass('sliding') || $navEl.parents('.navbar-inner.sliding').length;
  5110. if (els.indexOf(el) < 0) { els.push(el); }
  5111. if (!isSubnavbar || (isSubnavbar && !isSliding)) {
  5112. el.opacity = function (progress) { return (1 - (Math.pow( progress, 0.33 ))); };
  5113. }
  5114. if (isSliding) {
  5115. var transformTarget = el;
  5116. if (isLeft && activeNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
  5117. var textEl = { el: activeNavBackIconText[0] };
  5118. transformTarget = textEl;
  5119. els.push(textEl);
  5120. }
  5121. transformTarget.transform = function (progress) {
  5122. var activeNavTranslate = progress * transformTarget.el.f7NavbarRightOffset;
  5123. if (Device.pixelRatio === 1) { activeNavTranslate = Math.round(activeNavTranslate); }
  5124. if (isSubnavbar && currentNavIsLarge) {
  5125. return ("translate3d(" + activeNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
  5126. }
  5127. return ("translate3d(" + activeNavTranslate + "px,0,0)");
  5128. };
  5129. }
  5130. });
  5131. $previousNavElements
  5132. .each(function (index, navEl) {
  5133. var $navEl = $(navEl);
  5134. var isSubnavbar = $navEl.hasClass('subnavbar');
  5135. var isLeft = $navEl.hasClass('left');
  5136. var isTitle = $navEl.hasClass('title');
  5137. var isBg = $navEl.hasClass('navbar-bg');
  5138. if ((isTitle || isBg) && previousNavIsTransparent) { return; }
  5139. var el = {
  5140. el: navEl,
  5141. };
  5142. if (toLarge) {
  5143. if (isTitle) { return; }
  5144. if (els.indexOf(el) < 0) { els.push(el); }
  5145. if ($navEl.hasClass('title-large')) {
  5146. el.opacity = 1;
  5147. el.overflow = 'visible';
  5148. $navEl.find('.title-large-text').each(function (subIndex, subNavEl) {
  5149. els.push({
  5150. el: subNavEl,
  5151. 'transform-origin': transformOriginTitleLarge,
  5152. opacity: function (progress) { return (Math.pow( progress, 3 )); },
  5153. transform: function (progress) { return ("translateX(calc(" + (1 - progress) + " * (var(--f7-navbarLeftTextOffset) - var(--f7-navbarTitleLargeOffset)))) translateY(calc(" + (progress - 1) + " * var(--f7-navbar-large-title-height) + " + (1 - progress) + " * var(--f7-navbar-large-title-padding-vertical))) scale(" + (0.5 + progress * 0.5) + ")"); },
  5154. });
  5155. });
  5156. return;
  5157. }
  5158. }
  5159. if (isBg) {
  5160. if (els.indexOf(el) < 0) { els.push(el); }
  5161. if (!fromLarge && !toLarge) {
  5162. if (previousNavIsCollapsed) {
  5163. if (previousNavIsLargeTransparent) {
  5164. el.className = 'ios-swipeback-navbar-bg-large';
  5165. }
  5166. el.transform = function (progress) { return ("translateX(" + ((-100 + 100 * progress) * inverter) + "%) translateY(calc(-1 * var(--f7-navbar-large-title-height)))"); };
  5167. } else {
  5168. el.transform = function (progress) { return ("translateX(" + ((-100 + 100 * progress) * inverter) + "%)"); };
  5169. }
  5170. }
  5171. if (!fromLarge && toLarge) {
  5172. el.transform = function (progress) { return ("translateX(" + ((-100 + 100 * progress) * inverter) + "%) translateY(calc(-1 * " + (1 - progress) + " * var(--f7-navbar-large-title-height)))"); };
  5173. }
  5174. if (fromLarge && !toLarge) {
  5175. el.className = 'ios-swipeback-navbar-bg-large';
  5176. el.transform = function (progress) { return ("translateX(" + ((-100 + 100 * progress) * inverter) + "%) translateY(calc(-" + progress + " * var(--f7-navbar-large-title-height)))"); };
  5177. }
  5178. if (fromLarge && toLarge) {
  5179. el.transform = function (progress) { return ("translateX(" + ((-100 + 100 * progress) * inverter) + "%)"); };
  5180. }
  5181. return;
  5182. }
  5183. if ($navEl.hasClass('title-large')) { return; }
  5184. var isSliding = $navEl.hasClass('sliding') || $previousNavbarEl.children('.navbar-inner.sliding').length;
  5185. if (els.indexOf(el) < 0) { els.push(el); }
  5186. if (!isSubnavbar || (isSubnavbar && !isSliding)) {
  5187. el.opacity = function (progress) { return (Math.pow( progress, 3 )); };
  5188. }
  5189. if (isSliding) {
  5190. var transformTarget = el;
  5191. if (isLeft && previousNavBackIconText.length && params.iosAnimateNavbarBackIcon) {
  5192. var textEl = { el: previousNavBackIconText[0] };
  5193. transformTarget = textEl;
  5194. els.push(textEl);
  5195. }
  5196. transformTarget.transform = function (progress) {
  5197. var previousNavTranslate = transformTarget.el.f7NavbarLeftOffset * (1 - progress);
  5198. if (Device.pixelRatio === 1) { previousNavTranslate = Math.round(previousNavTranslate); }
  5199. if (isSubnavbar && previousNavIsLarge) {
  5200. return ("translate3d(" + previousNavTranslate + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)");
  5201. }
  5202. return ("translate3d(" + previousNavTranslate + "px,0,0)");
  5203. };
  5204. }
  5205. });
  5206. return els;
  5207. }
  5208. function setAnimatableNavElements(ref) {
  5209. if ( ref === void 0 ) ref = {};
  5210. var progress = ref.progress;
  5211. var reset = ref.reset;
  5212. var transition = ref.transition;
  5213. var reflow = ref.reflow;
  5214. var styles = ['overflow', 'transform', 'transform-origin', 'opacity'];
  5215. if (transition === true || transition === false) {
  5216. for (var i = 0; i < animatableNavEls.length; i += 1) {
  5217. var el = animatableNavEls[i];
  5218. if (el && el.el) {
  5219. if (transition === true) { el.el.classList.add('navbar-page-transitioning'); }
  5220. if (transition === false) { el.el.classList.remove('navbar-page-transitioning'); }
  5221. }
  5222. }
  5223. }
  5224. if (reflow && animatableNavEls.length && animatableNavEls[0] && animatableNavEls[0].el) {
  5225. // eslint-disable-next-line
  5226. animatableNavEls[0].el._clientLeft = animatableNavEls[0].el.clientLeft;
  5227. }
  5228. for (var i$1 = 0; i$1 < animatableNavEls.length; i$1 += 1) {
  5229. var el$1 = animatableNavEls[i$1];
  5230. if (el$1 && el$1.el) {
  5231. if (el$1.className && !el$1.classNameSet && !reset) {
  5232. el$1.el.classList.add(el$1.className);
  5233. el$1.classNameSet = true;
  5234. }
  5235. if (el$1.className && reset) {
  5236. el$1.el.classList.remove(el$1.className);
  5237. }
  5238. for (var j = 0; j < styles.length; j += 1) {
  5239. var styleProp = styles[j];
  5240. if (el$1[styleProp]) {
  5241. if (reset) {
  5242. el$1.el.style[styleProp] = '';
  5243. } else if (typeof el$1[styleProp] === 'function') {
  5244. el$1.el.style[styleProp] = el$1[styleProp](progress);
  5245. } else {
  5246. el$1.el.style[styleProp] = el$1[styleProp];
  5247. }
  5248. }
  5249. }
  5250. }
  5251. }
  5252. }
  5253. function handleTouchStart(e) {
  5254. var swipeBackEnabled = params[((app.theme) + "SwipeBack")];
  5255. if (!allowViewTouchMove || !swipeBackEnabled || isTouched || (app.swipeout && app.swipeout.el) || !router.allowPageChange) { return; }
  5256. if ($(e.target).closest('.range-slider, .calendar-months').length > 0) { return; }
  5257. if ($(e.target).closest('.page-master, .page-master-detail').length > 0 && params.masterDetailBreakpoint > 0 && app.width >= params.masterDetailBreakpoint) { return; }
  5258. isMoved = false;
  5259. isTouched = true;
  5260. isScrolling = undefined;
  5261. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  5262. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  5263. touchStartTime = Utils.now();
  5264. dynamicNavbar = router.dynamicNavbar;
  5265. }
  5266. function handleTouchMove(e) {
  5267. if (!isTouched) { return; }
  5268. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  5269. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  5270. if (typeof isScrolling === 'undefined') {
  5271. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x)) || (pageX < touchesStart.x && !app.rtl) || (pageX > touchesStart.x && app.rtl);
  5272. }
  5273. if (isScrolling || e.f7PreventSwipeBack || app.preventSwipeBack) {
  5274. isTouched = false;
  5275. return;
  5276. }
  5277. if (!isMoved) {
  5278. // Calc values during first move fired
  5279. var cancel = false;
  5280. var target = $(e.target);
  5281. var swipeout = target.closest('.swipeout');
  5282. if (swipeout.length > 0) {
  5283. if (!app.rtl && swipeout.find('.swipeout-actions-left').length > 0) { cancel = true; }
  5284. if (app.rtl && swipeout.find('.swipeout-actions-right').length > 0) { cancel = true; }
  5285. }
  5286. $currentPageEl = target.closest('.page');
  5287. if ($currentPageEl.hasClass('no-swipeback') || target.closest('.no-swipeback, .card-opened').length > 0) { cancel = true; }
  5288. $previousPageEl = $el.find('.page-previous:not(.stacked)');
  5289. if ($previousPageEl.length > 1) {
  5290. $previousPageEl = $previousPageEl.eq($previousPageEl.length - 1);
  5291. }
  5292. var notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
  5293. viewContainerWidth = $el.width();
  5294. if (app.rtl) {
  5295. notFromBorder = touchesStart.x < ($el.offset().left - $el[0].scrollLeft) + (viewContainerWidth - paramsSwipeBackActiveArea);
  5296. } else {
  5297. notFromBorder = touchesStart.x - $el.offset().left > paramsSwipeBackActiveArea;
  5298. }
  5299. if (notFromBorder) { cancel = true; }
  5300. if ($previousPageEl.length === 0 || $currentPageEl.length === 0) { cancel = true; }
  5301. if (cancel) {
  5302. isTouched = false;
  5303. return;
  5304. }
  5305. if (paramsSwipeBackAnimateShadow) {
  5306. $pageShadowEl = $currentPageEl.find('.page-shadow-effect');
  5307. if ($pageShadowEl.length === 0) {
  5308. $pageShadowEl = $('<div class="page-shadow-effect"></div>');
  5309. $currentPageEl.append($pageShadowEl);
  5310. }
  5311. }
  5312. if (paramsSwipeBackAnimateOpacity) {
  5313. $pageOpacityEl = $previousPageEl.find('.page-opacity-effect');
  5314. if ($pageOpacityEl.length === 0) {
  5315. $pageOpacityEl = $('<div class="page-opacity-effect"></div>');
  5316. $previousPageEl.append($pageOpacityEl);
  5317. }
  5318. }
  5319. if (dynamicNavbar) {
  5320. $currentNavbarEl = $navbarsEl.find('.navbar-current:not(.stacked)');
  5321. $previousNavbarEl = $navbarsEl.find('.navbar-previous:not(.stacked)');
  5322. if ($previousNavbarEl.length > 1) {
  5323. $previousNavbarEl = $previousNavbarEl.eq($previousNavbarEl.length - 1);
  5324. }
  5325. animatableNavEls = animatableNavElements();
  5326. }
  5327. // Close/Hide Any Picker
  5328. if ($('.sheet.modal-in').length > 0 && app.sheet) {
  5329. app.sheet.close($('.sheet.modal-in'));
  5330. }
  5331. }
  5332. e.f7PreventSwipePanel = true;
  5333. isMoved = true;
  5334. app.preventSwipePanelBySwipeBack = true;
  5335. e.preventDefault();
  5336. // RTL inverter
  5337. var inverter = app.rtl ? -1 : 1;
  5338. // Touches diff
  5339. touchesDiff = (pageX - touchesStart.x - paramsSwipeBackThreshold) * inverter;
  5340. if (touchesDiff < 0) { touchesDiff = 0; }
  5341. var percentage = Math.min(Math.max(touchesDiff / viewContainerWidth, 0), 1);
  5342. // Swipe Back Callback
  5343. var callbackData = {
  5344. percentage: percentage,
  5345. progress: percentage,
  5346. currentPageEl: $currentPageEl[0],
  5347. previousPageEl: $previousPageEl[0],
  5348. currentNavbarEl: $currentNavbarEl[0],
  5349. previousNavbarEl: $previousNavbarEl[0],
  5350. };
  5351. $el.trigger('swipeback:move', callbackData);
  5352. router.emit('swipebackMove', callbackData);
  5353. // Transform pages
  5354. var currentPageTranslate = touchesDiff * inverter;
  5355. var previousPageTranslate = ((touchesDiff / 5) - (viewContainerWidth / 5)) * inverter;
  5356. if (!app.rtl) {
  5357. currentPageTranslate = Math.min(currentPageTranslate, viewContainerWidth);
  5358. previousPageTranslate = Math.min(previousPageTranslate, 0);
  5359. } else {
  5360. currentPageTranslate = Math.max(currentPageTranslate, -viewContainerWidth);
  5361. previousPageTranslate = Math.max(previousPageTranslate, 0);
  5362. }
  5363. if (Device.pixelRatio === 1) {
  5364. currentPageTranslate = Math.round(currentPageTranslate);
  5365. previousPageTranslate = Math.round(previousPageTranslate);
  5366. }
  5367. router.swipeBackActive = true;
  5368. $([$currentPageEl[0], $previousPageEl[0]]).addClass('page-swipeback-active');
  5369. $currentPageEl.transform(("translate3d(" + currentPageTranslate + "px,0,0)"));
  5370. if (paramsSwipeBackAnimateShadow) { $pageShadowEl[0].style.opacity = 1 - (1 * percentage); }
  5371. if (app.theme === 'ios') {
  5372. $previousPageEl.transform(("translate3d(" + previousPageTranslate + "px,0,0)"));
  5373. }
  5374. if (paramsSwipeBackAnimateOpacity) { $pageOpacityEl[0].style.opacity = 1 - (1 * percentage); }
  5375. // Dynamic Navbars Animation
  5376. if (!dynamicNavbar) { return; }
  5377. setAnimatableNavElements({ progress: percentage });
  5378. }
  5379. function handleTouchEnd() {
  5380. app.preventSwipePanelBySwipeBack = false;
  5381. if (!isTouched || !isMoved) {
  5382. isTouched = false;
  5383. isMoved = false;
  5384. return;
  5385. }
  5386. isTouched = false;
  5387. isMoved = false;
  5388. router.swipeBackActive = false;
  5389. var $pages = $([$currentPageEl[0], $previousPageEl[0]]);
  5390. $pages.removeClass('page-swipeback-active');
  5391. if (touchesDiff === 0) {
  5392. $pages.transform('');
  5393. if ($pageShadowEl && $pageShadowEl.length > 0) { $pageShadowEl.remove(); }
  5394. if ($pageOpacityEl && $pageOpacityEl.length > 0) { $pageOpacityEl.remove(); }
  5395. if (dynamicNavbar) {
  5396. setAnimatableNavElements({ reset: true });
  5397. }
  5398. return;
  5399. }
  5400. var timeDiff = Utils.now() - touchStartTime;
  5401. var pageChanged = false;
  5402. // Swipe back to previous page
  5403. if (
  5404. (timeDiff < 300 && touchesDiff > 10)
  5405. || (timeDiff >= 300 && touchesDiff > viewContainerWidth / 2)
  5406. ) {
  5407. $currentPageEl.removeClass('page-current').addClass(("page-next" + (app.theme !== 'ios' ? ' page-next-on-right' : '')));
  5408. $previousPageEl.removeClass('page-previous').addClass('page-current').removeAttr('aria-hidden');
  5409. if ($pageShadowEl) { $pageShadowEl[0].style.opacity = ''; }
  5410. if ($pageOpacityEl) { $pageOpacityEl[0].style.opacity = ''; }
  5411. if (dynamicNavbar) {
  5412. router.setNavbarPosition($currentNavbarEl, 'next');
  5413. router.setNavbarPosition($previousNavbarEl, 'current', false);
  5414. }
  5415. pageChanged = true;
  5416. }
  5417. // Reset custom styles
  5418. // Add transitioning class for transition-duration
  5419. $pages.addClass('page-transitioning page-transitioning-swipeback');
  5420. if (!pageChanged) {
  5421. // eslint-disable-next-line
  5422. $currentPageEl[0]._clientLeft = $currentPageEl[0].clientLeft;
  5423. }
  5424. $pages.transform('');
  5425. if (dynamicNavbar) {
  5426. setAnimatableNavElements({ progress: pageChanged ? 1 : 0, transition: true, reflow: !pageChanged });
  5427. }
  5428. allowViewTouchMove = false;
  5429. router.allowPageChange = false;
  5430. // Swipe Back Callback
  5431. var callbackData = {
  5432. currentPageEl: $currentPageEl[0],
  5433. previousPageEl: $previousPageEl[0],
  5434. currentNavbarEl: $currentNavbarEl[0],
  5435. previousNavbarEl: $previousNavbarEl[0],
  5436. };
  5437. if (pageChanged) {
  5438. // Update Route
  5439. router.currentRoute = $previousPageEl[0].f7Page.route;
  5440. router.currentPage = $previousPageEl[0];
  5441. // Page before animation callback
  5442. router.pageCallback('beforeOut', $currentPageEl, $currentNavbarEl, 'current', 'next', { route: $currentPageEl[0].f7Page.route, swipeBack: true });
  5443. router.pageCallback('beforeIn', $previousPageEl, $previousNavbarEl, 'previous', 'current', { route: $previousPageEl[0].f7Page.route, swipeBack: true }, $currentPageEl[0]);
  5444. $el.trigger('swipeback:beforechange', callbackData);
  5445. router.emit('swipebackBeforeChange', callbackData);
  5446. } else {
  5447. $el.trigger('swipeback:beforereset', callbackData);
  5448. router.emit('swipebackBeforeReset', callbackData);
  5449. }
  5450. $currentPageEl.transitionEnd(function () {
  5451. $pages.removeClass('page-transitioning page-transitioning-swipeback');
  5452. if (dynamicNavbar) {
  5453. setAnimatableNavElements({ reset: true, transition: false });
  5454. }
  5455. allowViewTouchMove = true;
  5456. router.allowPageChange = true;
  5457. if (pageChanged) {
  5458. // Update History
  5459. if (router.history.length === 1) {
  5460. router.history.unshift(router.url);
  5461. }
  5462. router.history.pop();
  5463. router.saveHistory();
  5464. // Update push state
  5465. if (params.pushState) {
  5466. History.back();
  5467. }
  5468. // Page after animation callback
  5469. router.pageCallback('afterOut', $currentPageEl, $currentNavbarEl, 'current', 'next', { route: $currentPageEl[0].f7Page.route, swipeBack: true });
  5470. router.pageCallback('afterIn', $previousPageEl, $previousNavbarEl, 'previous', 'current', { route: $previousPageEl[0].f7Page.route, swipeBack: true });
  5471. // Remove Old Page
  5472. if (params.stackPages && router.initialPages.indexOf($currentPageEl[0]) >= 0) {
  5473. $currentPageEl.addClass('stacked');
  5474. if (dynamicNavbar) {
  5475. $currentNavbarEl.addClass('stacked');
  5476. }
  5477. } else {
  5478. router.pageCallback('beforeRemove', $currentPageEl, $currentNavbarEl, 'next', { swipeBack: true });
  5479. router.removePage($currentPageEl);
  5480. if (dynamicNavbar) {
  5481. router.removeNavbar($currentNavbarEl);
  5482. }
  5483. }
  5484. $el.trigger('swipeback:afterchange', callbackData);
  5485. router.emit('swipebackAfterChange', callbackData);
  5486. router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
  5487. if (params.preloadPreviousPage) {
  5488. router.back(router.history[router.history.length - 2], { preload: true });
  5489. }
  5490. } else {
  5491. $el.trigger('swipeback:afterreset', callbackData);
  5492. router.emit('swipebackAfterReset', callbackData);
  5493. }
  5494. if ($pageShadowEl && $pageShadowEl.length > 0) { $pageShadowEl.remove(); }
  5495. if ($pageOpacityEl && $pageOpacityEl.length > 0) { $pageOpacityEl.remove(); }
  5496. });
  5497. }
  5498. function attachEvents() {
  5499. var passiveListener = (app.touchEvents.start === 'touchstart' && Support.passiveListener) ? { passive: true, capture: false } : false;
  5500. $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  5501. app.on('touchmove:active', handleTouchMove);
  5502. app.on('touchend:passive', handleTouchEnd);
  5503. }
  5504. function detachEvents() {
  5505. var passiveListener = (app.touchEvents.start === 'touchstart' && Support.passiveListener) ? { passive: true, capture: false } : false;
  5506. $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  5507. app.off('touchmove:active', handleTouchMove);
  5508. app.off('touchend:passive', handleTouchEnd);
  5509. }
  5510. attachEvents();
  5511. router.on('routerDestroy', detachEvents);
  5512. }
  5513. function redirect (direction, route, options) {
  5514. var router = this;
  5515. var redirect = route.route.redirect;
  5516. if (options.initial && router.params.pushState) {
  5517. options.replaceState = true; // eslint-disable-line
  5518. options.history = true; // eslint-disable-line
  5519. }
  5520. function redirectResolve(redirectUrl, redirectOptions) {
  5521. if ( redirectOptions === void 0 ) redirectOptions = {};
  5522. router.allowPageChange = true;
  5523. router[direction](redirectUrl, Utils.extend({}, options, redirectOptions));
  5524. }
  5525. function redirectReject() {
  5526. router.allowPageChange = true;
  5527. }
  5528. if (typeof redirect === 'function') {
  5529. router.allowPageChange = false;
  5530. var redirectUrl = redirect.call(router, route, redirectResolve, redirectReject);
  5531. if (redirectUrl && typeof redirectUrl === 'string') {
  5532. router.allowPageChange = true;
  5533. return router[direction](redirectUrl, options);
  5534. }
  5535. return router;
  5536. }
  5537. return router[direction](redirect, options);
  5538. }
  5539. function processQueue(router, routerQueue, routeQueue, to, from, resolve, reject) {
  5540. var queue = [];
  5541. if (Array.isArray(routeQueue)) {
  5542. queue.push.apply(queue, routeQueue);
  5543. } else if (routeQueue && typeof routeQueue === 'function') {
  5544. queue.push(routeQueue);
  5545. }
  5546. if (routerQueue) {
  5547. if (Array.isArray(routerQueue)) {
  5548. queue.push.apply(queue, routerQueue);
  5549. } else {
  5550. queue.push(routerQueue);
  5551. }
  5552. }
  5553. function next() {
  5554. if (queue.length === 0) {
  5555. resolve();
  5556. return;
  5557. }
  5558. var queueItem = queue.shift();
  5559. queueItem.call(
  5560. router,
  5561. to,
  5562. from,
  5563. function () {
  5564. next();
  5565. },
  5566. function () {
  5567. reject();
  5568. }
  5569. );
  5570. }
  5571. next();
  5572. }
  5573. function processRouteQueue (to, from, resolve, reject) {
  5574. var router = this;
  5575. function enterNextRoute() {
  5576. if (to && to.route && (router.params.routesBeforeEnter || to.route.beforeEnter)) {
  5577. router.allowPageChange = false;
  5578. processQueue(
  5579. router,
  5580. router.params.routesBeforeEnter,
  5581. to.route.beforeEnter,
  5582. to,
  5583. from,
  5584. function () {
  5585. router.allowPageChange = true;
  5586. resolve();
  5587. },
  5588. function () {
  5589. reject();
  5590. }
  5591. );
  5592. } else {
  5593. resolve();
  5594. }
  5595. }
  5596. function leaveCurrentRoute() {
  5597. if (from && from.route && (router.params.routesBeforeLeave || from.route.beforeLeave)) {
  5598. router.allowPageChange = false;
  5599. processQueue(
  5600. router,
  5601. router.params.routesBeforeLeave,
  5602. from.route.beforeLeave,
  5603. to,
  5604. from,
  5605. function () {
  5606. router.allowPageChange = true;
  5607. enterNextRoute();
  5608. },
  5609. function () {
  5610. reject();
  5611. }
  5612. );
  5613. } else {
  5614. enterNextRoute();
  5615. }
  5616. }
  5617. leaveCurrentRoute();
  5618. }
  5619. function appRouterCheck (router, method) {
  5620. if (!router.view) {
  5621. 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 + "(...)"));
  5622. }
  5623. }
  5624. function asyncComponent (router, asyncComponent, resolve, reject) {
  5625. function resolvePromise(componentPromise) {
  5626. componentPromise
  5627. .then(function (c) {
  5628. // eslint-disable-next-line
  5629. resolve({ component: c.default || c._default || c });
  5630. })
  5631. .catch(function (err) {
  5632. reject();
  5633. throw new Error(err);
  5634. });
  5635. }
  5636. if (asyncComponent instanceof Promise) {
  5637. resolvePromise(asyncComponent);
  5638. return;
  5639. }
  5640. var asyncComponentResult = asyncComponent.call(router);
  5641. if (asyncComponentResult instanceof Promise) {
  5642. resolvePromise(asyncComponentResult);
  5643. } else {
  5644. resolve({ component: asyncComponentResult });
  5645. }
  5646. }
  5647. function refreshPage() {
  5648. var router = this;
  5649. appRouterCheck(router, 'refreshPage');
  5650. return router.navigate(router.currentRoute.url, {
  5651. ignoreCache: true,
  5652. reloadCurrent: true,
  5653. });
  5654. }
  5655. function forward(el, forwardOptions) {
  5656. if ( forwardOptions === void 0 ) forwardOptions = {};
  5657. var router = this;
  5658. var $el = $(el);
  5659. var app = router.app;
  5660. var view = router.view;
  5661. var options = Utils.extend(false, {
  5662. animate: router.params.animate,
  5663. pushState: true,
  5664. replaceState: false,
  5665. history: true,
  5666. reloadCurrent: router.params.reloadPages,
  5667. reloadPrevious: false,
  5668. reloadAll: false,
  5669. clearPreviousHistory: false,
  5670. reloadDetail: router.params.reloadDetail,
  5671. on: {},
  5672. }, forwardOptions);
  5673. var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
  5674. var isMaster = masterDetailEnabled && options.route && options.route.route && options.route.route.master === true;
  5675. var masterPageEl;
  5676. var otherDetailPageEl;
  5677. var currentRouteIsModal = router.currentRoute.modal;
  5678. var modalType;
  5679. if (!currentRouteIsModal) {
  5680. ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
  5681. if (router.currentRoute && router.currentRoute.route && router.currentRoute.route[modalLoadProp]) {
  5682. currentRouteIsModal = true;
  5683. modalType = modalLoadProp;
  5684. }
  5685. });
  5686. }
  5687. if (currentRouteIsModal) {
  5688. var modalToClose = router.currentRoute.modal
  5689. || router.currentRoute.route.modalInstance
  5690. || app[modalType].get();
  5691. var previousUrl = router.history[router.history.length - 2];
  5692. var previousRoute = router.findMatchingRoute(previousUrl);
  5693. if (!previousRoute && previousUrl) {
  5694. previousRoute = {
  5695. url: previousUrl,
  5696. path: previousUrl.split('?')[0],
  5697. query: Utils.parseUrlQuery(previousUrl),
  5698. route: {
  5699. path: previousUrl.split('?')[0],
  5700. url: previousUrl,
  5701. },
  5702. };
  5703. }
  5704. router.modalRemove(modalToClose);
  5705. }
  5706. var dynamicNavbar = router.dynamicNavbar;
  5707. var $viewEl = router.$el;
  5708. var $newPage = $el;
  5709. var reload = options.reloadPrevious || options.reloadCurrent || options.reloadAll;
  5710. var $oldPage;
  5711. var $navbarsEl;
  5712. var $newNavbarEl;
  5713. var $oldNavbarEl;
  5714. router.allowPageChange = false;
  5715. if ($newPage.length === 0) {
  5716. router.allowPageChange = true;
  5717. return router;
  5718. }
  5719. if ($newPage.length) {
  5720. // Remove theme elements
  5721. router.removeThemeElements($newPage);
  5722. }
  5723. if (dynamicNavbar) {
  5724. $newNavbarEl = $newPage.children('.navbar');
  5725. $navbarsEl = router.$navbarsEl;
  5726. if ($newNavbarEl.length === 0 && $newPage[0] && $newPage[0].f7Page) {
  5727. // Try from pageData
  5728. $newNavbarEl = $newPage[0].f7Page.$navbarEl;
  5729. }
  5730. }
  5731. // Save Keep Alive Cache
  5732. if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
  5733. options.route.route.keepAliveData = {
  5734. pageEl: $el[0],
  5735. };
  5736. }
  5737. // Pages In View
  5738. var $pagesInView = $viewEl
  5739. .children('.page:not(.stacked)')
  5740. .filter(function (index, pageInView) { return pageInView !== $newPage[0]; });
  5741. // Navbars In View
  5742. var $navbarsInView;
  5743. if (dynamicNavbar) {
  5744. $navbarsInView = $navbarsEl
  5745. .children('.navbar:not(.stacked)')
  5746. .filter(function (index, navbarInView) { return navbarInView !== $newNavbarEl[0]; });
  5747. }
  5748. // Exit when reload previous and only 1 page in view so nothing ro reload
  5749. if (options.reloadPrevious && $pagesInView.length < 2) {
  5750. router.allowPageChange = true;
  5751. return router;
  5752. }
  5753. // Find Detail' master page
  5754. var isDetail;
  5755. var reloadDetail;
  5756. var isDetailRoot;
  5757. if (masterDetailEnabled && !options.reloadAll) {
  5758. for (var i = 0; i < $pagesInView.length; i += 1) {
  5759. if (!masterPageEl
  5760. && $pagesInView[i].classList.contains('page-master')
  5761. ) {
  5762. masterPageEl = $pagesInView[i];
  5763. continue; // eslint-disable-line
  5764. }
  5765. }
  5766. isDetail = !isMaster && masterPageEl;
  5767. if (isDetail) {
  5768. // Find Other Detail
  5769. if (masterPageEl) {
  5770. for (var i$1 = 0; i$1 < $pagesInView.length; i$1 += 1) {
  5771. if ($pagesInView[i$1].classList.contains('page-master-detail')
  5772. ) {
  5773. otherDetailPageEl = $pagesInView[i$1];
  5774. continue; // eslint-disable-line
  5775. }
  5776. }
  5777. }
  5778. }
  5779. reloadDetail = isDetail && options.reloadDetail && app.width >= router.params.masterDetailBreakpoint && masterPageEl;
  5780. }
  5781. if (isDetail) {
  5782. isDetailRoot = !otherDetailPageEl || reloadDetail || options.reloadAll || options.reloadCurrent;
  5783. }
  5784. // New Page
  5785. var newPagePosition = 'next';
  5786. if (options.reloadCurrent || options.reloadAll || reloadDetail) {
  5787. newPagePosition = 'current';
  5788. } else if (options.reloadPrevious) {
  5789. newPagePosition = 'previous';
  5790. }
  5791. $newPage
  5792. .removeClass('page-previous page-current page-next')
  5793. .addClass(("page-" + newPagePosition + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '') + (isDetailRoot ? ' page-master-detail-root' : '')))
  5794. .removeClass('stacked')
  5795. .trigger('page:unstack')
  5796. .trigger('page:position', { position: newPagePosition });
  5797. router.emit('pageUnstack', $newPage[0]);
  5798. router.emit('pagePosition', $newPage[0], newPagePosition);
  5799. if (isMaster || isDetail) {
  5800. $newPage.trigger('page:role', { role: isMaster ? 'master' : 'detail', root: !!isDetailRoot });
  5801. router.emit('pageRole', $newPage[0], { role: isMaster ? 'master' : 'detail', detailRoot: !!isDetailRoot });
  5802. }
  5803. if (dynamicNavbar && $newNavbarEl.length) {
  5804. $newNavbarEl
  5805. .removeClass('navbar-previous navbar-current navbar-next')
  5806. .addClass(("navbar-" + newPagePosition + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '') + (isDetailRoot ? ' navbar-master-detail-root' : '')))
  5807. .removeClass('stacked');
  5808. $newNavbarEl.trigger('navbar:position', { position: newPagePosition });
  5809. router.emit('navbarPosition', $newNavbarEl[0], newPagePosition);
  5810. if (isMaster || isDetail) {
  5811. router.emit('navbarRole', $newNavbarEl[0], { role: isMaster ? 'master' : 'detail', detailRoot: !!isDetailRoot });
  5812. }
  5813. }
  5814. // Find Old Page
  5815. if (options.reloadCurrent || reloadDetail) {
  5816. $oldPage = $pagesInView.eq($pagesInView.length - 1);
  5817. if (dynamicNavbar) {
  5818. // $oldNavbarEl = $navbarsInView.eq($pagesInView.length - 1);
  5819. $oldNavbarEl = $(app.navbar.getElByPage($oldPage));
  5820. }
  5821. } else if (options.reloadPrevious) {
  5822. $oldPage = $pagesInView.eq($pagesInView.length - 2);
  5823. if (dynamicNavbar) {
  5824. // $oldNavbarEl = $navbarsInView.eq($pagesInView.length - 2);
  5825. $oldNavbarEl = $(app.navbar.getElByPage($oldPage));
  5826. }
  5827. } else if (options.reloadAll) {
  5828. $oldPage = $pagesInView.filter(function (index, pageEl) { return pageEl !== $newPage[0]; });
  5829. if (dynamicNavbar) {
  5830. $oldNavbarEl = $navbarsInView.filter(function (index, navbarEl) { return navbarEl !== $newNavbarEl[0]; });
  5831. }
  5832. } else {
  5833. var removedPageEls = [];
  5834. var removedNavbarEls = [];
  5835. if ($pagesInView.length > 1) {
  5836. var i$2 = 0;
  5837. for (i$2 = 0; i$2 < $pagesInView.length - 1; i$2 += 1) {
  5838. if (masterPageEl
  5839. && $pagesInView[i$2] === masterPageEl
  5840. ) {
  5841. $pagesInView.eq(i$2).addClass('page-master-stacked');
  5842. $pagesInView.eq(i$2).trigger('page:masterstack');
  5843. router.emit('pageMasterStack', $pagesInView[i$2]);
  5844. if (dynamicNavbar) {
  5845. $(app.navbar.getElByPage(masterPageEl)).addClass('navbar-master-stacked');
  5846. router.emit('navbarMasterStack', app.navbar.getElByPage(masterPageEl));
  5847. }
  5848. continue; // eslint-disable-line
  5849. }
  5850. var oldNavbarEl = app.navbar.getElByPage($pagesInView.eq(i$2));
  5851. if (router.params.stackPages) {
  5852. $pagesInView.eq(i$2).addClass('stacked');
  5853. $pagesInView.eq(i$2).trigger('page:stack');
  5854. router.emit('pageStack', $pagesInView[i$2]);
  5855. if (dynamicNavbar) {
  5856. $(oldNavbarEl).addClass('stacked');
  5857. }
  5858. } else {
  5859. // Page remove event
  5860. removedPageEls.push($pagesInView[i$2]);
  5861. router.pageCallback('beforeRemove', $pagesInView[i$2], $navbarsInView && $navbarsInView[i$2], 'previous', undefined, options);
  5862. router.removePage($pagesInView[i$2]);
  5863. if (dynamicNavbar && oldNavbarEl) {
  5864. removedNavbarEls.push(oldNavbarEl);
  5865. router.removeNavbar(oldNavbarEl);
  5866. }
  5867. }
  5868. }
  5869. }
  5870. $oldPage = $viewEl
  5871. .children('.page:not(.stacked)')
  5872. .filter(function (index, pageEl) { return pageEl !== $newPage[0] && removedPageEls.indexOf(pageEl) < 0; });
  5873. if (dynamicNavbar) {
  5874. $oldNavbarEl = $navbarsEl
  5875. .children('.navbar:not(.stacked)')
  5876. .filter(function (index, navbarEl) { return navbarEl !== $newNavbarEl[0] && removedNavbarEls.indexOf(removedNavbarEls) < 0; });
  5877. }
  5878. removedPageEls = [];
  5879. removedNavbarEls = [];
  5880. }
  5881. if (isDetail && !options.reloadAll) {
  5882. if ($oldPage.length > 1 || reloadDetail) {
  5883. $oldPage = $oldPage.filter(function (pageIndex, pageEl) { return !pageEl.classList.contains('page-master'); });
  5884. }
  5885. if ($oldNavbarEl && ($oldNavbarEl.length > 1 || reloadDetail)) {
  5886. $oldNavbarEl = $oldNavbarEl.filter(function (navbarIndex, navbarEl) { return !navbarEl.classList.contains('navbar-master'); });
  5887. }
  5888. }
  5889. // Push State
  5890. if (router.params.pushState && (options.pushState || options.replaceState) && !options.reloadPrevious) {
  5891. var pushStateRoot = router.params.pushStateRoot || '';
  5892. History[options.reloadCurrent || (reloadDetail && otherDetailPageEl) || options.reloadAll || options.replaceState ? 'replace' : 'push'](
  5893. view.id,
  5894. {
  5895. url: options.route.url,
  5896. },
  5897. pushStateRoot + router.params.pushStateSeparator + options.route.url
  5898. );
  5899. }
  5900. if (!options.reloadPrevious) {
  5901. // Current Page & Navbar
  5902. router.currentPageEl = $newPage[0];
  5903. if (dynamicNavbar && $newNavbarEl.length) {
  5904. router.currentNavbarEl = $newNavbarEl[0];
  5905. } else {
  5906. delete router.currentNavbarEl;
  5907. }
  5908. // Current Route
  5909. router.currentRoute = options.route;
  5910. }
  5911. // Update router history
  5912. var url = options.route.url;
  5913. if (options.history) {
  5914. if (((options.reloadCurrent || (reloadDetail && otherDetailPageEl)) && router.history.length) > 0 || options.replaceState) {
  5915. router.history[router.history.length - (options.reloadPrevious ? 2 : 1)] = url;
  5916. } else if (options.reloadPrevious) {
  5917. router.history[router.history.length - 2] = url;
  5918. } else if (options.reloadAll) {
  5919. router.history = [url];
  5920. } else {
  5921. router.history.push(url);
  5922. }
  5923. }
  5924. router.saveHistory();
  5925. // Insert new page and navbar
  5926. var newPageInDom = $newPage.parents(doc).length > 0;
  5927. var f7Component = $newPage[0].f7Component;
  5928. if (options.reloadPrevious) {
  5929. if (f7Component && !newPageInDom) {
  5930. f7Component.$mount(function (componentEl) {
  5931. $(componentEl).insertBefore($oldPage);
  5932. });
  5933. } else {
  5934. $newPage.insertBefore($oldPage);
  5935. }
  5936. if (dynamicNavbar && $newNavbarEl.length) {
  5937. if ($newNavbarEl.find('.title-large').length) {
  5938. $newNavbarEl.addClass('navbar-large');
  5939. }
  5940. if ($oldNavbarEl.length) {
  5941. $newNavbarEl.insertBefore($oldNavbarEl);
  5942. } else {
  5943. if (!router.$navbarsEl.parents(doc).length) {
  5944. router.$el.prepend(router.$navbarsEl);
  5945. }
  5946. $navbarsEl.append($newNavbarEl);
  5947. }
  5948. }
  5949. } else {
  5950. if ($oldPage.next('.page')[0] !== $newPage[0]) {
  5951. if (f7Component && !newPageInDom) {
  5952. f7Component.$mount(function (componentEl) {
  5953. $viewEl.append(componentEl);
  5954. });
  5955. } else {
  5956. $viewEl.append($newPage[0]);
  5957. }
  5958. }
  5959. if (dynamicNavbar && $newNavbarEl.length) {
  5960. if ($newNavbarEl.find('.title-large').length) {
  5961. $newNavbarEl.addClass('navbar-large');
  5962. }
  5963. if (!router.$navbarsEl.parents(doc).length) {
  5964. router.$el.prepend(router.$navbarsEl);
  5965. }
  5966. $navbarsEl.append($newNavbarEl[0]);
  5967. }
  5968. }
  5969. if (!newPageInDom) {
  5970. router.pageCallback('mounted', $newPage, $newNavbarEl, newPagePosition, (reload ? newPagePosition : 'current'), options, $oldPage);
  5971. } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
  5972. $newPage[0].f7PageMounted = true;
  5973. router.pageCallback('mounted', $newPage, $newNavbarEl, newPagePosition, (reload ? newPagePosition : 'current'), options, $oldPage);
  5974. }
  5975. // Remove old page
  5976. if ((options.reloadCurrent || reloadDetail) && $oldPage.length > 0) {
  5977. if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
  5978. $oldPage.addClass('stacked');
  5979. $oldPage.trigger('page:stack');
  5980. router.emit('pageStack', $oldPage[0]);
  5981. if (dynamicNavbar) {
  5982. $oldNavbarEl.addClass('stacked');
  5983. }
  5984. } else {
  5985. // Page remove event
  5986. router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
  5987. router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
  5988. router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'current', undefined, options);
  5989. router.removePage($oldPage);
  5990. if (dynamicNavbar && $oldNavbarEl && $oldNavbarEl.length) {
  5991. router.removeNavbar($oldNavbarEl);
  5992. }
  5993. }
  5994. } else if (options.reloadAll) {
  5995. $oldPage.each(function (index, pageEl) {
  5996. var $oldPageEl = $(pageEl);
  5997. var $oldNavbarElEl = $(app.navbar.getElByPage($oldPageEl));
  5998. if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
  5999. $oldPageEl.addClass('stacked');
  6000. $oldPageEl.trigger('page:stack');
  6001. router.emit('pageStack', $oldPageEl[0]);
  6002. if (dynamicNavbar) {
  6003. $oldNavbarElEl.addClass('stacked');
  6004. }
  6005. } else {
  6006. // Page remove event
  6007. if ($oldPageEl.hasClass('page-current')) {
  6008. router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
  6009. router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', undefined, options);
  6010. }
  6011. router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarEl && $oldNavbarEl.eq(index), 'previous', undefined, options);
  6012. router.removePage($oldPageEl);
  6013. if (dynamicNavbar && $oldNavbarElEl.length) {
  6014. router.removeNavbar($oldNavbarElEl);
  6015. }
  6016. }
  6017. });
  6018. } else if (options.reloadPrevious) {
  6019. if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
  6020. $oldPage.addClass('stacked');
  6021. $oldPage.trigger('page:stack');
  6022. router.emit('pageStack', $oldPage[0]);
  6023. if (dynamicNavbar) {
  6024. $oldNavbarEl.addClass('stacked');
  6025. }
  6026. } else {
  6027. // Page remove event
  6028. router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'previous', undefined, options);
  6029. router.removePage($oldPage);
  6030. if (dynamicNavbar && $oldNavbarEl && $oldNavbarEl.length) {
  6031. router.removeNavbar($oldNavbarEl);
  6032. }
  6033. }
  6034. }
  6035. // Load Tab
  6036. if (options.route.route.tab) {
  6037. router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
  6038. history: false,
  6039. pushState: false,
  6040. }));
  6041. }
  6042. // Check master detail
  6043. if (masterDetailEnabled) {
  6044. view.checkMasterDetailBreakpoint();
  6045. }
  6046. // Page init and before init events
  6047. router.pageCallback('init', $newPage, $newNavbarEl, newPagePosition, reload ? newPagePosition : 'current', options, $oldPage);
  6048. if (options.reloadCurrent || options.reloadAll || reloadDetail) {
  6049. router.allowPageChange = true;
  6050. router.pageCallback('beforeIn', $newPage, $newNavbarEl, newPagePosition, 'current', options);
  6051. $newPage.removeAttr('aria-hidden');
  6052. if (dynamicNavbar && $newNavbarEl) {
  6053. $newNavbarEl.removeAttr('aria-hidden');
  6054. }
  6055. router.pageCallback('afterIn', $newPage, $newNavbarEl, newPagePosition, 'current', options);
  6056. if (options.reloadCurrent && options.clearPreviousHistory) { router.clearPreviousHistory(); }
  6057. if (reloadDetail) {
  6058. router.setPagePosition($(masterPageEl), 'previous');
  6059. if (masterPageEl.f7Page && masterPageEl.f7Page.navbarEl) {
  6060. router.setNavbarPosition($(masterPageEl.f7Page.navbarEl), 'previous');
  6061. }
  6062. }
  6063. return router;
  6064. }
  6065. if (options.reloadPrevious) {
  6066. router.allowPageChange = true;
  6067. return router;
  6068. }
  6069. // Before animation event
  6070. router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', 'previous', options);
  6071. router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'next', 'current', options);
  6072. // Animation
  6073. function afterAnimation() {
  6074. router.setPagePosition($newPage, 'current', false);
  6075. router.setPagePosition($oldPage, 'previous', !$oldPage.hasClass('page-master'));
  6076. if (dynamicNavbar) {
  6077. router.setNavbarPosition($newNavbarEl, 'current', false);
  6078. router.setNavbarPosition($oldNavbarEl, 'previous', !$oldNavbarEl.hasClass('navbar-master'));
  6079. }
  6080. // After animation event
  6081. router.allowPageChange = true;
  6082. router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', 'previous', options);
  6083. router.pageCallback('afterIn', $newPage, $newNavbarEl, 'next', 'current', options);
  6084. var keepOldPage = (router.params.preloadPreviousPage || router.params[((app.theme) + "SwipeBack")]) && !isMaster;
  6085. if (!keepOldPage) {
  6086. if ($newPage.hasClass('smart-select-page') || $newPage.hasClass('photo-browser-page') || $newPage.hasClass('autocomplete-page') || $newPage.hasClass('color-picker-page')) {
  6087. keepOldPage = true;
  6088. }
  6089. }
  6090. if (!keepOldPage) {
  6091. if (router.params.stackPages) {
  6092. $oldPage.addClass('stacked');
  6093. $oldPage.trigger('page:stack');
  6094. router.emit('pageStack', $oldPage[0]);
  6095. if (dynamicNavbar) {
  6096. $oldNavbarEl.addClass('stacked');
  6097. }
  6098. } else if (!($newPage.attr('data-name') && $newPage.attr('data-name') === 'smart-select-page')) {
  6099. // Remove event
  6100. router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'previous', undefined, options);
  6101. router.removePage($oldPage);
  6102. if (dynamicNavbar && $oldNavbarEl.length) {
  6103. router.removeNavbar($oldNavbarEl);
  6104. }
  6105. }
  6106. }
  6107. if (options.clearPreviousHistory) { router.clearPreviousHistory(); }
  6108. router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
  6109. if (router.params.pushState) {
  6110. History.clearRouterQueue();
  6111. }
  6112. }
  6113. function setPositionClasses() {
  6114. router.setPagePosition($oldPage, 'current', false);
  6115. router.setPagePosition($newPage, 'next', false);
  6116. if (dynamicNavbar) {
  6117. router.setNavbarPosition($oldNavbarEl, 'current', false);
  6118. router.setNavbarPosition($newNavbarEl, 'next', false);
  6119. }
  6120. }
  6121. if (options.animate && !(isMaster && app.width >= router.params.masterDetailBreakpoint)) {
  6122. var delay = router.params[((router.app.theme) + "PageLoadDelay")];
  6123. var transition = router.params.transition;
  6124. if (options.transition) { transition = options.transition; }
  6125. if (!transition && router.currentRoute && router.currentRoute.route) {
  6126. transition = router.currentRoute.route.transition;
  6127. }
  6128. if (!transition && router.currentRoute && router.currentRoute.route.options) {
  6129. transition = router.currentRoute.route.options.transition;
  6130. }
  6131. if (transition) {
  6132. $newPage[0].f7PageTransition = transition;
  6133. }
  6134. if (delay) {
  6135. setTimeout(function () {
  6136. setPositionClasses();
  6137. router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'forward', transition, function () {
  6138. afterAnimation();
  6139. });
  6140. }, delay);
  6141. } else {
  6142. setPositionClasses();
  6143. router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'forward', transition, function () {
  6144. afterAnimation();
  6145. });
  6146. }
  6147. } else {
  6148. afterAnimation();
  6149. }
  6150. return router;
  6151. }
  6152. function load(loadParams, loadOptions, ignorePageChange) {
  6153. if ( loadParams === void 0 ) loadParams = {};
  6154. if ( loadOptions === void 0 ) loadOptions = {};
  6155. var router = this;
  6156. if (!router.allowPageChange && !ignorePageChange) { return router; }
  6157. var params = loadParams;
  6158. var options = loadOptions;
  6159. var url = params.url;
  6160. var content = params.content;
  6161. var el = params.el;
  6162. var pageName = params.pageName;
  6163. var template = params.template;
  6164. var templateUrl = params.templateUrl;
  6165. var component = params.component;
  6166. var componentUrl = params.componentUrl;
  6167. if (!options.reloadCurrent
  6168. && options.route
  6169. && options.route.route
  6170. && options.route.route.parentPath
  6171. && router.currentRoute.route
  6172. && router.currentRoute.route.parentPath === options.route.route.parentPath) {
  6173. // Do something nested
  6174. if (options.route.url === router.url) {
  6175. router.allowPageChange = true;
  6176. return false;
  6177. }
  6178. // Check for same params
  6179. var sameParams = Object.keys(options.route.params).length === Object.keys(router.currentRoute.params).length;
  6180. if (sameParams) {
  6181. // Check for equal params name
  6182. Object.keys(options.route.params).forEach(function (paramName) {
  6183. if (
  6184. !(paramName in router.currentRoute.params)
  6185. || (router.currentRoute.params[paramName] !== options.route.params[paramName])
  6186. ) {
  6187. sameParams = false;
  6188. }
  6189. });
  6190. }
  6191. if (sameParams) {
  6192. if (options.route.route.tab) {
  6193. return router.tabLoad(options.route.route.tab, options);
  6194. }
  6195. return false;
  6196. }
  6197. if (!sameParams
  6198. && options.route.route.tab
  6199. && router.currentRoute.route.tab
  6200. && router.currentRoute.parentPath === options.route.parentPath
  6201. ) {
  6202. return router.tabLoad(options.route.route.tab, options);
  6203. }
  6204. }
  6205. if (
  6206. options.route
  6207. && options.route.url
  6208. && router.url === options.route.url
  6209. && !(options.reloadCurrent || options.reloadPrevious)
  6210. && !router.params.allowDuplicateUrls
  6211. ) {
  6212. router.allowPageChange = true;
  6213. return false;
  6214. }
  6215. if (!options.route && url) {
  6216. options.route = router.parseRouteUrl(url);
  6217. Utils.extend(options.route, { route: { url: url, path: url } });
  6218. }
  6219. // Component Callbacks
  6220. function resolve(pageEl, newOptions) {
  6221. return router.forward(pageEl, Utils.extend(options, newOptions));
  6222. }
  6223. function reject() {
  6224. router.allowPageChange = true;
  6225. return router;
  6226. }
  6227. if (url || templateUrl || componentUrl || component) {
  6228. router.allowPageChange = false;
  6229. }
  6230. // Proceed
  6231. if (content) {
  6232. router.forward(router.getPageEl(content), options);
  6233. } else if (template || templateUrl) {
  6234. // Parse template and send page element
  6235. try {
  6236. router.pageTemplateLoader(template, templateUrl, options, resolve, reject);
  6237. } catch (err) {
  6238. router.allowPageChange = true;
  6239. throw err;
  6240. }
  6241. } else if (el) {
  6242. // Load page from specified HTMLElement or by page name in pages container
  6243. router.forward(router.getPageEl(el), options);
  6244. } else if (pageName) {
  6245. // Load page by page name in pages container
  6246. router.forward(router.$el.children((".page[data-name=\"" + pageName + "\"]")).eq(0), options);
  6247. } else if (component || componentUrl) {
  6248. // Load from component (F7/Vue/React/...)
  6249. try {
  6250. router.pageComponentLoader(router.el, component, componentUrl, options, resolve, reject);
  6251. } catch (err) {
  6252. router.allowPageChange = true;
  6253. throw err;
  6254. }
  6255. } else if (url) {
  6256. // Load using XHR
  6257. if (router.xhr) {
  6258. router.xhr.abort();
  6259. router.xhr = false;
  6260. }
  6261. router.xhrRequest(url, options)
  6262. .then(function (pageContent) {
  6263. router.forward(router.getPageEl(pageContent), options);
  6264. })
  6265. .catch(function () {
  6266. router.allowPageChange = true;
  6267. });
  6268. }
  6269. return router;
  6270. }
  6271. function navigate(navigateParams, navigateOptions) {
  6272. if ( navigateOptions === void 0 ) navigateOptions = {};
  6273. var router = this;
  6274. if (router.swipeBackActive) { return router; }
  6275. var url;
  6276. var createRoute;
  6277. var name;
  6278. var path;
  6279. var query;
  6280. var params;
  6281. var route;
  6282. if (typeof navigateParams === 'string') {
  6283. url = navigateParams;
  6284. } else {
  6285. url = navigateParams.url;
  6286. createRoute = navigateParams.route;
  6287. name = navigateParams.name;
  6288. path = navigateParams.path;
  6289. query = navigateParams.query;
  6290. params = navigateParams.params;
  6291. }
  6292. if (name || path) {
  6293. url = router.generateUrl({ path: path, name: name, params: params, query: query });
  6294. if (url) {
  6295. return router.navigate(url, navigateOptions);
  6296. }
  6297. return router;
  6298. }
  6299. var app = router.app;
  6300. appRouterCheck(router, 'navigate');
  6301. if (url === '#' || url === '') {
  6302. return router;
  6303. }
  6304. var navigateUrl = url.replace('./', '');
  6305. if (navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
  6306. var currentPath = router.currentRoute.parentPath || router.currentRoute.path;
  6307. navigateUrl = ((currentPath ? (currentPath + "/") : '/') + navigateUrl)
  6308. .replace('///', '/')
  6309. .replace('//', '/');
  6310. }
  6311. if (createRoute) {
  6312. route = Utils.extend(router.parseRouteUrl(navigateUrl), {
  6313. route: Utils.extend({}, createRoute),
  6314. });
  6315. } else {
  6316. route = router.findMatchingRoute(navigateUrl);
  6317. }
  6318. if (!route) {
  6319. return router;
  6320. }
  6321. if (route.route && route.route.viewName) {
  6322. var anotherViewName = route.route.viewName;
  6323. var anotherView = app.views[anotherViewName];
  6324. if (!anotherView) {
  6325. throw new Error(("Framework7: There is no View with \"" + anotherViewName + "\" name that was specified in this route"));
  6326. }
  6327. if (anotherView !== router.view) {
  6328. return anotherView.router.navigate(navigateParams, navigateOptions);
  6329. }
  6330. }
  6331. if (route.route.redirect) {
  6332. return redirect.call(router, 'navigate', route, navigateOptions);
  6333. }
  6334. var options = {};
  6335. if (route.route.options) {
  6336. Utils.extend(options, route.route.options, navigateOptions);
  6337. } else {
  6338. Utils.extend(options, navigateOptions);
  6339. }
  6340. options.route = route;
  6341. if (options && options.context) {
  6342. route.context = options.context;
  6343. options.route.context = options.context;
  6344. }
  6345. function resolve() {
  6346. var routerLoaded = false;
  6347. ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
  6348. if (route.route[modalLoadProp] && !routerLoaded) {
  6349. routerLoaded = true;
  6350. router.modalLoad(modalLoadProp, route, options);
  6351. }
  6352. });
  6353. if (route.route.keepAlive && route.route.keepAliveData) {
  6354. router.load({ el: route.route.keepAliveData.pageEl }, options, false);
  6355. routerLoaded = true;
  6356. }
  6357. ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp) {
  6358. var obj;
  6359. if (route.route[pageLoadProp] && !routerLoaded) {
  6360. routerLoaded = true;
  6361. router.load(( obj = {}, obj[pageLoadProp] = route.route[pageLoadProp], obj ), options, false);
  6362. }
  6363. });
  6364. if (routerLoaded) { return; }
  6365. // Async
  6366. function asyncResolve(resolveParams, resolveOptions) {
  6367. router.allowPageChange = false;
  6368. var resolvedAsModal = false;
  6369. if (resolveOptions && resolveOptions.context) {
  6370. if (!route.context) { route.context = resolveOptions.context; }
  6371. else { route.context = Utils.extend({}, route.context, resolveOptions.context); }
  6372. options.route.context = route.context;
  6373. }
  6374. ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
  6375. if (resolveParams[modalLoadProp]) {
  6376. resolvedAsModal = true;
  6377. var modalRoute = Utils.extend({}, route, { route: resolveParams });
  6378. router.allowPageChange = true;
  6379. router.modalLoad(modalLoadProp, modalRoute, Utils.extend(options, resolveOptions));
  6380. }
  6381. });
  6382. if (resolvedAsModal) { return; }
  6383. router.load(resolveParams, Utils.extend(options, resolveOptions), true);
  6384. }
  6385. function asyncReject() {
  6386. router.allowPageChange = true;
  6387. }
  6388. if (route.route.async) {
  6389. router.allowPageChange = false;
  6390. route.route.async.call(router, options.route, router.currentRoute, asyncResolve, asyncReject);
  6391. }
  6392. if (route.route.asyncComponent) {
  6393. asyncComponent(router, route.route.asyncComponent, asyncResolve, asyncReject);
  6394. }
  6395. }
  6396. function reject() {
  6397. router.allowPageChange = true;
  6398. }
  6399. if (router.params.masterDetailBreakpoint > 0 && route.route.masterRoute) {
  6400. // load detail route
  6401. var preloadMaster = true;
  6402. var masterLoaded = false;
  6403. if (router.currentRoute && router.currentRoute.route) {
  6404. if (
  6405. router.currentRoute.route.master
  6406. && (
  6407. router.currentRoute.route === route.route.masterRoute
  6408. || router.currentRoute.route.path === route.route.masterRoute.path
  6409. )
  6410. ) {
  6411. preloadMaster = false;
  6412. }
  6413. if (
  6414. router.currentRoute.route.masterRoute
  6415. && (router.currentRoute.route.masterRoute === route.route.masterRoute
  6416. || router.currentRoute.route.masterRoute.path === route.route.masterRoute.path
  6417. )
  6418. ) {
  6419. preloadMaster = false;
  6420. masterLoaded = true;
  6421. }
  6422. }
  6423. if (preloadMaster || (masterLoaded && navigateOptions.reloadAll)) {
  6424. router.navigate({ path: route.route.masterRoute.path, params: route.params || {} }, {
  6425. animate: false,
  6426. reloadAll: navigateOptions.reloadAll,
  6427. reloadCurrent: navigateOptions.reloadCurrent,
  6428. reloadPrevious: navigateOptions.reloadPrevious,
  6429. pushState: !navigateOptions.initial,
  6430. history: !navigateOptions.initial,
  6431. once: {
  6432. pageAfterIn: function pageAfterIn() {
  6433. router.navigate(navigateParams, Utils.extend({}, navigateOptions, {
  6434. animate: false,
  6435. reloadAll: false,
  6436. reloadCurrent: false,
  6437. reloadPrevious: false,
  6438. history: !navigateOptions.initial,
  6439. pushState: !navigateOptions.initial,
  6440. }));
  6441. },
  6442. },
  6443. });
  6444. return router;
  6445. }
  6446. }
  6447. processRouteQueue.call(
  6448. router,
  6449. route,
  6450. router.currentRoute,
  6451. function () {
  6452. if (route.route.modules) {
  6453. app
  6454. .loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules])
  6455. .then(function () {
  6456. resolve();
  6457. })
  6458. .catch(function () {
  6459. reject();
  6460. });
  6461. } else {
  6462. resolve();
  6463. }
  6464. },
  6465. function () {
  6466. reject();
  6467. }
  6468. );
  6469. // Return Router
  6470. return router;
  6471. }
  6472. function tabLoad(tabRoute, loadOptions) {
  6473. if ( loadOptions === void 0 ) loadOptions = {};
  6474. var router = this;
  6475. var options = Utils.extend({
  6476. animate: router.params.animate,
  6477. pushState: true,
  6478. history: true,
  6479. parentPageEl: null,
  6480. preload: false,
  6481. on: {},
  6482. }, loadOptions);
  6483. var currentRoute;
  6484. var previousRoute;
  6485. if (options.route) {
  6486. // Set Route
  6487. if (!options.preload && options.route !== router.currentRoute) {
  6488. previousRoute = router.previousRoute;
  6489. router.currentRoute = options.route;
  6490. }
  6491. if (options.preload) {
  6492. currentRoute = options.route;
  6493. previousRoute = router.currentRoute;
  6494. } else {
  6495. currentRoute = router.currentRoute;
  6496. if (!previousRoute) { previousRoute = router.previousRoute; }
  6497. }
  6498. // Update Browser History
  6499. if (router.params.pushState && options.pushState && !options.reloadPrevious) {
  6500. History.replace(
  6501. router.view.id,
  6502. {
  6503. url: options.route.url,
  6504. },
  6505. (router.params.pushStateRoot || '') + router.params.pushStateSeparator + options.route.url
  6506. );
  6507. }
  6508. // Update Router History
  6509. if (options.history) {
  6510. router.history[Math.max(router.history.length - 1, 0)] = options.route.url;
  6511. router.saveHistory();
  6512. }
  6513. }
  6514. // Show Tab
  6515. var $parentPageEl = $(options.parentPageEl || router.currentPageEl);
  6516. var tabEl;
  6517. if ($parentPageEl.length && $parentPageEl.find(("#" + (tabRoute.id))).length) {
  6518. tabEl = $parentPageEl.find(("#" + (tabRoute.id))).eq(0);
  6519. } else if (router.view.selector) {
  6520. tabEl = (router.view.selector) + " #" + (tabRoute.id);
  6521. } else {
  6522. tabEl = "#" + (tabRoute.id);
  6523. }
  6524. var tabShowResult = router.app.tab.show({
  6525. tabEl: tabEl,
  6526. animate: options.animate,
  6527. tabRoute: options.route,
  6528. });
  6529. var $newTabEl = tabShowResult.$newTabEl;
  6530. var $oldTabEl = tabShowResult.$oldTabEl;
  6531. var animated = tabShowResult.animated;
  6532. var onTabsChanged = tabShowResult.onTabsChanged;
  6533. if ($newTabEl && $newTabEl.parents('.page').length > 0 && options.route) {
  6534. var tabParentPageData = $newTabEl.parents('.page')[0].f7Page;
  6535. if (tabParentPageData && options.route) {
  6536. tabParentPageData.route = options.route;
  6537. }
  6538. }
  6539. // Tab Content Loaded
  6540. function onTabLoaded(contentEl) {
  6541. // Remove theme elements
  6542. router.removeThemeElements($newTabEl);
  6543. var tabEventTarget = $newTabEl;
  6544. if (typeof contentEl !== 'string') { tabEventTarget = $(contentEl); }
  6545. tabEventTarget.trigger('tab:init tab:mounted', tabRoute);
  6546. router.emit('tabInit tabMounted', $newTabEl[0], tabRoute);
  6547. if ($oldTabEl && $oldTabEl.length) {
  6548. if (animated) {
  6549. onTabsChanged(function () {
  6550. router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
  6551. if (router.params.unloadTabContent) {
  6552. router.tabRemove($oldTabEl, $newTabEl, tabRoute);
  6553. }
  6554. });
  6555. } else {
  6556. router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
  6557. if (router.params.unloadTabContent) {
  6558. router.tabRemove($oldTabEl, $newTabEl, tabRoute);
  6559. }
  6560. }
  6561. }
  6562. }
  6563. if ($newTabEl[0].f7RouterTabLoaded) {
  6564. if (!$oldTabEl || !$oldTabEl.length) { return router; }
  6565. if (animated) {
  6566. onTabsChanged(function () {
  6567. router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
  6568. });
  6569. } else {
  6570. router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
  6571. }
  6572. return router;
  6573. }
  6574. // Load Tab Content
  6575. function loadTab(loadTabParams, loadTabOptions) {
  6576. // Load Tab Props
  6577. var url = loadTabParams.url;
  6578. var content = loadTabParams.content;
  6579. var el = loadTabParams.el;
  6580. var template = loadTabParams.template;
  6581. var templateUrl = loadTabParams.templateUrl;
  6582. var component = loadTabParams.component;
  6583. var componentUrl = loadTabParams.componentUrl;
  6584. // Component/Template Callbacks
  6585. function resolve(contentEl) {
  6586. router.allowPageChange = true;
  6587. if (!contentEl) { return; }
  6588. if (typeof contentEl === 'string') {
  6589. $newTabEl.html(contentEl);
  6590. } else {
  6591. $newTabEl.html('');
  6592. if (contentEl.f7Component) {
  6593. contentEl.f7Component.$mount(function (componentEl) {
  6594. $newTabEl.append(componentEl);
  6595. });
  6596. } else {
  6597. $newTabEl.append(contentEl);
  6598. }
  6599. }
  6600. $newTabEl[0].f7RouterTabLoaded = true;
  6601. onTabLoaded(contentEl);
  6602. }
  6603. function reject() {
  6604. router.allowPageChange = true;
  6605. return router;
  6606. }
  6607. if (content) {
  6608. resolve(content);
  6609. } else if (template || templateUrl) {
  6610. try {
  6611. router.tabTemplateLoader(template, templateUrl, loadTabOptions, resolve, reject);
  6612. } catch (err) {
  6613. router.allowPageChange = true;
  6614. throw err;
  6615. }
  6616. } else if (el) {
  6617. resolve(el);
  6618. } else if (component || componentUrl) {
  6619. // Load from component (F7/Vue/React/...)
  6620. try {
  6621. router.tabComponentLoader($newTabEl[0], component, componentUrl, loadTabOptions, resolve, reject);
  6622. } catch (err) {
  6623. router.allowPageChange = true;
  6624. throw err;
  6625. }
  6626. } else if (url) {
  6627. // Load using XHR
  6628. if (router.xhr) {
  6629. router.xhr.abort();
  6630. router.xhr = false;
  6631. }
  6632. router.xhrRequest(url, loadTabOptions)
  6633. .then(function (tabContent) {
  6634. resolve(tabContent);
  6635. })
  6636. .catch(function () {
  6637. router.allowPageChange = true;
  6638. });
  6639. }
  6640. }
  6641. var hasContentLoadProp;
  6642. ('url content component el componentUrl template templateUrl').split(' ').forEach(function (tabLoadProp) {
  6643. var obj;
  6644. if (tabRoute[tabLoadProp]) {
  6645. hasContentLoadProp = true;
  6646. loadTab(( obj = {}, obj[tabLoadProp] = tabRoute[tabLoadProp], obj ), options);
  6647. }
  6648. });
  6649. // Async
  6650. function asyncResolve(resolveParams, resolveOptions) {
  6651. loadTab(resolveParams, Utils.extend(options, resolveOptions));
  6652. }
  6653. function asyncReject() {
  6654. router.allowPageChange = true;
  6655. }
  6656. if (tabRoute.async) {
  6657. tabRoute.async.call(router, currentRoute, previousRoute, asyncResolve, asyncReject);
  6658. } else if (tabRoute.asyncComponent) {
  6659. asyncComponent(router, tabRoute.asyncComponent, asyncResolve, asyncReject);
  6660. } else if (!hasContentLoadProp) {
  6661. router.allowPageChange = true;
  6662. }
  6663. return router;
  6664. }
  6665. function tabRemove($oldTabEl, $newTabEl, tabRoute) {
  6666. var router = this;
  6667. var hasTabComponentChild;
  6668. if ($oldTabEl[0]) {
  6669. $oldTabEl[0].f7RouterTabLoaded = false;
  6670. delete $oldTabEl[0].f7RouterTabLoaded;
  6671. }
  6672. $oldTabEl.children().each(function (index, tabChild) {
  6673. if (tabChild.f7Component) {
  6674. hasTabComponentChild = true;
  6675. $(tabChild).trigger('tab:beforeremove', tabRoute);
  6676. tabChild.f7Component.$destroy();
  6677. }
  6678. });
  6679. if (!hasTabComponentChild) {
  6680. $oldTabEl.trigger('tab:beforeremove', tabRoute);
  6681. }
  6682. router.emit('tabBeforeRemove', $oldTabEl[0], $newTabEl[0], tabRoute);
  6683. router.removeTabContent($oldTabEl[0], tabRoute);
  6684. }
  6685. function modalLoad(modalType, route, loadOptions) {
  6686. if ( loadOptions === void 0 ) loadOptions = {};
  6687. var router = this;
  6688. var app = router.app;
  6689. var isPanel = modalType === 'panel';
  6690. var modalOrPanel = isPanel ? 'panel' : 'modal';
  6691. var options = Utils.extend({
  6692. animate: router.params.animate,
  6693. pushState: true,
  6694. history: true,
  6695. on: {},
  6696. }, loadOptions);
  6697. var modalParams = Utils.extend({}, route.route[modalType]);
  6698. var modalRoute = route.route;
  6699. function onModalLoaded() {
  6700. // Create Modal
  6701. var modal = app[modalType].create(modalParams);
  6702. modalRoute.modalInstance = modal;
  6703. var hasEl = modal.el;
  6704. function closeOnSwipeBack() {
  6705. modal.close();
  6706. }
  6707. modal.on((modalOrPanel + "Open"), function () {
  6708. if (!hasEl) {
  6709. // Remove theme elements
  6710. router.removeThemeElements(modal.el);
  6711. // Emit events
  6712. modal.$el.trigger(((modalType.toLowerCase()) + ":init " + (modalType.toLowerCase()) + ":mounted"), route, modal);
  6713. router.emit(((!isPanel ? 'modalInit' : '') + " " + modalType + "Init " + modalType + "Mounted"), modal.el, route, modal);
  6714. }
  6715. router.once('swipeBackMove', closeOnSwipeBack);
  6716. });
  6717. modal.on((modalOrPanel + "Close"), function () {
  6718. router.off('swipeBackMove', closeOnSwipeBack);
  6719. if (!modal.closeByRouter) {
  6720. router.back();
  6721. }
  6722. });
  6723. modal.on((modalOrPanel + "Closed"), function () {
  6724. modal.$el.trigger(((modalType.toLowerCase()) + ":beforeremove"), route, modal);
  6725. modal.emit(("" + (!isPanel ? 'modalBeforeRemove ' : '') + modalType + "BeforeRemove"), modal.el, route, modal);
  6726. var modalComponent = modal.el.f7Component;
  6727. if (modalComponent) {
  6728. modalComponent.$destroy();
  6729. }
  6730. Utils.nextTick(function () {
  6731. if (modalComponent || modalParams.component) {
  6732. router.removeModal(modal.el);
  6733. }
  6734. modal.destroy();
  6735. delete modal.route;
  6736. delete modalRoute.modalInstance;
  6737. });
  6738. });
  6739. if (options.route) {
  6740. // Update Browser History
  6741. if (router.params.pushState && options.pushState) {
  6742. History.push(
  6743. router.view.id,
  6744. {
  6745. url: options.route.url,
  6746. modal: modalType,
  6747. },
  6748. (router.params.pushStateRoot || '') + router.params.pushStateSeparator + options.route.url
  6749. );
  6750. }
  6751. // Set Route
  6752. if (options.route !== router.currentRoute) {
  6753. modal.route = Utils.extend(options.route, { modal: modal });
  6754. router.currentRoute = modal.route;
  6755. }
  6756. // Update Router History
  6757. if (options.history) {
  6758. router.history.push(options.route.url);
  6759. router.saveHistory();
  6760. }
  6761. }
  6762. if (hasEl) {
  6763. // Remove theme elements
  6764. router.removeThemeElements(modal.el);
  6765. // Emit events
  6766. modal.$el.trigger(((modalType.toLowerCase()) + ":init " + (modalType.toLowerCase()) + ":mounted"), route, modal);
  6767. router.emit((modalOrPanel + "Init " + modalType + "Init " + modalType + "Mounted"), modal.el, route, modal);
  6768. }
  6769. // Open
  6770. modal.open();
  6771. }
  6772. // Load Modal Content
  6773. function loadModal(loadModalParams, loadModalOptions) {
  6774. // Load Modal Props
  6775. var url = loadModalParams.url;
  6776. var content = loadModalParams.content;
  6777. var template = loadModalParams.template;
  6778. var templateUrl = loadModalParams.templateUrl;
  6779. var component = loadModalParams.component;
  6780. var componentUrl = loadModalParams.componentUrl;
  6781. // Component/Template Callbacks
  6782. function resolve(contentEl) {
  6783. if (contentEl) {
  6784. if (typeof contentEl === 'string') {
  6785. modalParams.content = contentEl;
  6786. } else if (contentEl.f7Component) {
  6787. contentEl.f7Component.$mount(function (componentEl) {
  6788. modalParams.el = componentEl;
  6789. app.root.append(componentEl);
  6790. });
  6791. } else {
  6792. modalParams.el = contentEl;
  6793. }
  6794. onModalLoaded();
  6795. }
  6796. }
  6797. function reject() {
  6798. router.allowPageChange = true;
  6799. return router;
  6800. }
  6801. if (content) {
  6802. resolve(content);
  6803. } else if (template || templateUrl) {
  6804. try {
  6805. router.modalTemplateLoader(template, templateUrl, loadModalOptions, resolve, reject);
  6806. } catch (err) {
  6807. router.allowPageChange = true;
  6808. throw err;
  6809. }
  6810. } else if (component || componentUrl) {
  6811. // Load from component (F7/Vue/React/...)
  6812. try {
  6813. router.modalComponentLoader(app.root[0], component, componentUrl, loadModalOptions, resolve, reject);
  6814. } catch (err) {
  6815. router.allowPageChange = true;
  6816. throw err;
  6817. }
  6818. } else if (url) {
  6819. // Load using XHR
  6820. if (router.xhr) {
  6821. router.xhr.abort();
  6822. router.xhr = false;
  6823. }
  6824. router.xhrRequest(url, loadModalOptions)
  6825. .then(function (modalContent) {
  6826. modalParams.content = modalContent;
  6827. onModalLoaded();
  6828. })
  6829. .catch(function () {
  6830. router.allowPageChange = true;
  6831. });
  6832. } else {
  6833. onModalLoaded();
  6834. }
  6835. }
  6836. var foundLoadProp;
  6837. ('url content component el componentUrl template templateUrl').split(' ').forEach(function (modalLoadProp) {
  6838. var obj;
  6839. if (modalParams[modalLoadProp] && !foundLoadProp) {
  6840. foundLoadProp = true;
  6841. loadModal(( obj = {}, obj[modalLoadProp] = modalParams[modalLoadProp], obj ), options);
  6842. }
  6843. });
  6844. if (!foundLoadProp && modalType === 'actions') {
  6845. onModalLoaded();
  6846. }
  6847. // Async
  6848. function asyncResolve(resolveParams, resolveOptions) {
  6849. loadModal(resolveParams, Utils.extend(options, resolveOptions));
  6850. }
  6851. function asyncReject() {
  6852. router.allowPageChange = true;
  6853. }
  6854. if (modalParams.async) {
  6855. modalParams.async.call(router, options.route, router.currentRoute, asyncResolve, asyncReject);
  6856. }
  6857. if (modalParams.asyncComponent) {
  6858. asyncComponent(router, modalParams.asyncComponent, asyncResolve, asyncReject);
  6859. }
  6860. return router;
  6861. }
  6862. function modalRemove(modal) {
  6863. Utils.extend(modal, { closeByRouter: true });
  6864. modal.close();
  6865. }
  6866. function backward(el, backwardOptions) {
  6867. var router = this;
  6868. var $el = $(el);
  6869. var app = router.app;
  6870. var view = router.view;
  6871. var options = Utils.extend({
  6872. animate: router.params.animate,
  6873. pushState: true,
  6874. replaceState: false,
  6875. }, backwardOptions);
  6876. var masterDetailEnabled = router.params.masterDetailBreakpoint > 0;
  6877. var isMaster = masterDetailEnabled && options.route && options.route.route && options.route.route.master === true;
  6878. var masterPageEl;
  6879. var masterPageRemoved;
  6880. var dynamicNavbar = router.dynamicNavbar;
  6881. var $newPage = $el;
  6882. var $oldPage = router.$el.children('.page-current');
  6883. var currentIsMaster = masterDetailEnabled && $oldPage.hasClass('page-master');
  6884. if ($newPage.length) {
  6885. // Remove theme elements
  6886. router.removeThemeElements($newPage);
  6887. }
  6888. var $navbarsEl;
  6889. var $newNavbarEl;
  6890. var $oldNavbarEl;
  6891. if (dynamicNavbar) {
  6892. $newNavbarEl = $newPage.children('.navbar');
  6893. $navbarsEl = router.$navbarsEl;
  6894. if ($newNavbarEl.length === 0 && $newPage[0] && $newPage[0].f7Page) {
  6895. // Try from pageData
  6896. $newNavbarEl = $newPage[0].f7Page.$navbarEl;
  6897. }
  6898. $oldNavbarEl = $navbarsEl.find('.navbar-current');
  6899. }
  6900. router.allowPageChange = false;
  6901. if ($newPage.length === 0 || $oldPage.length === 0) {
  6902. router.allowPageChange = true;
  6903. return router;
  6904. }
  6905. // Remove theme elements
  6906. router.removeThemeElements($newPage);
  6907. // Save Keep Alive Cache
  6908. if (options.route && options.route.route && options.route.route.keepAlive && !options.route.route.keepAliveData) {
  6909. options.route.route.keepAliveData = {
  6910. pageEl: $el[0],
  6911. };
  6912. }
  6913. // Pages In View
  6914. var isDetail;
  6915. var isDetailRoot;
  6916. if (masterDetailEnabled) {
  6917. var $pagesInView = router.$el
  6918. .children('.page:not(.stacked)')
  6919. .filter(function (index, pageInView) { return pageInView !== $newPage[0]; });
  6920. // Find Detail' master page
  6921. for (var i = 0; i < $pagesInView.length; i += 1) {
  6922. if (!masterPageEl
  6923. && $pagesInView[i].classList.contains('page-master')
  6924. ) {
  6925. masterPageEl = $pagesInView[i];
  6926. continue; // eslint-disable-line
  6927. }
  6928. }
  6929. isDetail = !isMaster
  6930. && masterPageEl
  6931. && (router.history.indexOf(options.route.url) > router.history.indexOf(masterPageEl.f7Page.route.url));
  6932. if (!isDetail && !isMaster && masterPageEl && masterPageEl.f7Page && options.route.route.masterRoute) {
  6933. isDetail = options.route.route.masterRoute.path === masterPageEl.f7Page.route.route.path;
  6934. }
  6935. }
  6936. if (isDetail && masterPageEl && masterPageEl.f7Page) {
  6937. isDetailRoot = router.history.indexOf(options.route.url) - router.history.indexOf(masterPageEl.f7Page.route.url) === 1;
  6938. }
  6939. // New Page
  6940. $newPage
  6941. .addClass(("page-previous" + (isMaster ? ' page-master' : '') + (isDetail ? ' page-master-detail' : '') + (isDetailRoot ? ' page-master-detail-root' : '')))
  6942. .removeClass('stacked')
  6943. .removeAttr('aria-hidden')
  6944. .trigger('page:unstack')
  6945. .trigger('page:position', { position: 'previous' });
  6946. router.emit('pageUnstack', $newPage[0]);
  6947. router.emit('pagePosition', $newPage[0], 'previous');
  6948. if (isMaster || isDetail) {
  6949. $newPage.trigger('page:role', { role: isMaster ? 'master' : 'detail', root: !!isDetailRoot });
  6950. router.emit('pageRole', $newPage[0], { role: isMaster ? 'master' : 'detail', detailRoot: !!isDetailRoot });
  6951. }
  6952. if (dynamicNavbar && $newNavbarEl.length > 0) {
  6953. $newNavbarEl
  6954. .addClass(("navbar-previous" + (isMaster ? ' navbar-master' : '') + (isDetail ? ' navbar-master-detail' : '') + (isDetailRoot ? ' navbar-master-detail-root' : '')))
  6955. .removeClass('stacked')
  6956. .removeAttr('aria-hidden');
  6957. $newNavbarEl.trigger('navbar:position', { position: 'previous' });
  6958. router.emit('navbarPosition', $newNavbarEl[0], 'previous');
  6959. if (isMaster || isDetailRoot) {
  6960. router.emit('navbarRole', $newNavbarEl[0], { role: isMaster ? 'master' : 'detail', detailRoot: !!isDetailRoot });
  6961. }
  6962. }
  6963. // Remove previous page in case of "forced"
  6964. var backIndex;
  6965. if (options.force) {
  6966. if ($oldPage.prev('.page-previous:not(.stacked)').length > 0 || $oldPage.prev('.page-previous').length === 0) {
  6967. if (router.history.indexOf(options.route.url) >= 0) {
  6968. backIndex = router.history.length - router.history.indexOf(options.route.url) - 1;
  6969. router.history = router.history.slice(0, router.history.indexOf(options.route.url) + 2);
  6970. view.history = router.history;
  6971. } else if (router.history[[router.history.length - 2]]) {
  6972. router.history[router.history.length - 2] = options.route.url;
  6973. } else {
  6974. router.history.unshift(router.url);
  6975. }
  6976. if (backIndex && router.params.stackPages) {
  6977. $oldPage.prevAll('.page-previous').each(function (index, pageToRemove) {
  6978. var $pageToRemove = $(pageToRemove);
  6979. var $navbarToRemove;
  6980. if (dynamicNavbar) {
  6981. // $navbarToRemove = $oldNavbarEl.prevAll('.navbar-previous').eq(index);
  6982. $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
  6983. }
  6984. if ($pageToRemove[0] !== $newPage[0] && $pageToRemove.index() > $newPage.index()) {
  6985. if (router.initialPages.indexOf($pageToRemove[0]) >= 0) {
  6986. $pageToRemove.addClass('stacked');
  6987. $pageToRemove.trigger('page:stack');
  6988. router.emit('pageStack', $pageToRemove[0]);
  6989. if (dynamicNavbar) {
  6990. $navbarToRemove.addClass('stacked');
  6991. }
  6992. } else {
  6993. router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
  6994. if ($pageToRemove[0] === masterPageEl) {
  6995. masterPageRemoved = true;
  6996. }
  6997. router.removePage($pageToRemove);
  6998. if (dynamicNavbar && $navbarToRemove.length > 0) {
  6999. router.removeNavbar($navbarToRemove);
  7000. }
  7001. }
  7002. }
  7003. });
  7004. } else {
  7005. var $pageToRemove = $oldPage.prev('.page-previous:not(.stacked)');
  7006. var $navbarToRemove;
  7007. if (dynamicNavbar) {
  7008. // $navbarToRemove = $oldNavbarEl.prev('.navbar-inner:not(.stacked)');
  7009. $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
  7010. }
  7011. if (router.params.stackPages && router.initialPages.indexOf($pageToRemove[0]) >= 0) {
  7012. $pageToRemove.addClass('stacked');
  7013. $pageToRemove.trigger('page:stack');
  7014. router.emit('pageStack', $pageToRemove[0]);
  7015. $navbarToRemove.addClass('stacked');
  7016. } else if ($pageToRemove.length > 0) {
  7017. router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined, options);
  7018. if ($pageToRemove[0] === masterPageEl) {
  7019. masterPageRemoved = true;
  7020. }
  7021. router.removePage($pageToRemove);
  7022. if (dynamicNavbar && $navbarToRemove.length) {
  7023. router.removeNavbar($navbarToRemove);
  7024. }
  7025. }
  7026. }
  7027. }
  7028. }
  7029. // Insert new page
  7030. var newPageInDom = $newPage.parents(doc).length > 0;
  7031. var f7Component = $newPage[0].f7Component;
  7032. function insertPage() {
  7033. if ($newPage.next($oldPage).length === 0) {
  7034. if (!newPageInDom && f7Component) {
  7035. f7Component.$mount(function (componentEl) {
  7036. $(componentEl).insertBefore($oldPage);
  7037. });
  7038. } else {
  7039. $newPage.insertBefore($oldPage);
  7040. }
  7041. }
  7042. if (dynamicNavbar && $newNavbarEl.length) {
  7043. if ($newNavbarEl.find('.title-large').length) {
  7044. $newNavbarEl.addClass('navbar-large');
  7045. }
  7046. $newNavbarEl.insertBefore($oldNavbarEl);
  7047. if ($oldNavbarEl.length > 0) {
  7048. $newNavbarEl.insertBefore($oldNavbarEl);
  7049. } else {
  7050. if (!router.$navbarsEl.parents(doc).length) {
  7051. router.$el.prepend(router.$navbarsEl);
  7052. }
  7053. $navbarsEl.append($newNavbarEl);
  7054. }
  7055. }
  7056. if (!newPageInDom) {
  7057. router.pageCallback('mounted', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
  7058. } else if (options.route && options.route.route && options.route.route.keepAlive && !$newPage[0].f7PageMounted) {
  7059. $newPage[0].f7PageMounted = true;
  7060. router.pageCallback('mounted', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
  7061. }
  7062. }
  7063. if (options.preload) {
  7064. // Insert Page
  7065. insertPage();
  7066. // Tab route
  7067. if (options.route.route.tab) {
  7068. router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
  7069. history: false,
  7070. pushState: false,
  7071. preload: true,
  7072. }));
  7073. }
  7074. if (isMaster) {
  7075. $newPage
  7076. .removeClass('page-master-stacked')
  7077. .trigger('page:masterunstack');
  7078. router.emit('pageMasterUnstack', $newPage[0]);
  7079. if (dynamicNavbar) {
  7080. $(app.navbar.getElByPage($newPage)).removeClass('navbar-master-stacked');
  7081. router.emit('navbarMasterUnstack', app.navbar.getElByPage($newPage));
  7082. }
  7083. }
  7084. // Page init and before init events
  7085. router.pageCallback('init', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
  7086. var $previousPages = $newPage.prevAll('.page-previous:not(.stacked):not(.page-master)');
  7087. if ($previousPages.length > 0) {
  7088. $previousPages.each(function (index, pageToRemove) {
  7089. var $pageToRemove = $(pageToRemove);
  7090. var $navbarToRemove;
  7091. if (dynamicNavbar) {
  7092. // $navbarToRemove = $newNavbarEl.prevAll('.navbar-previous:not(.stacked)').eq(index);
  7093. $navbarToRemove = $(app.navbar.getElByPage($pageToRemove));
  7094. }
  7095. if (router.params.stackPages && router.initialPages.indexOf(pageToRemove) >= 0) {
  7096. $pageToRemove.addClass('stacked');
  7097. $pageToRemove.trigger('page:stack');
  7098. router.emit('pageStack', $pageToRemove[0]);
  7099. if (dynamicNavbar) {
  7100. $navbarToRemove.addClass('stacked');
  7101. }
  7102. } else {
  7103. router.pageCallback('beforeRemove', $pageToRemove, $navbarToRemove, 'previous', undefined);
  7104. router.removePage($pageToRemove);
  7105. if (dynamicNavbar && $navbarToRemove.length) {
  7106. router.removeNavbar($navbarToRemove);
  7107. }
  7108. }
  7109. });
  7110. }
  7111. router.allowPageChange = true;
  7112. return router;
  7113. }
  7114. // History State
  7115. if (!(Device.ie || Device.edge || (Device.firefox && !Device.ios))) {
  7116. if (router.params.pushState && options.pushState) {
  7117. if (options.replaceState) {
  7118. var pushStateRoot = router.params.pushStateRoot || '';
  7119. History.replace(
  7120. view.id,
  7121. {
  7122. url: options.route.url,
  7123. },
  7124. pushStateRoot + router.params.pushStateSeparator + options.route.url
  7125. );
  7126. } else if (backIndex) {
  7127. History.go(-backIndex);
  7128. } else {
  7129. History.back();
  7130. }
  7131. }
  7132. }
  7133. // Update History
  7134. if (options.replaceState) {
  7135. router.history[router.history.length - 1] = options.route.url;
  7136. } else {
  7137. if (router.history.length === 1) {
  7138. router.history.unshift(router.url);
  7139. }
  7140. router.history.pop();
  7141. }
  7142. router.saveHistory();
  7143. // Current Page & Navbar
  7144. router.currentPageEl = $newPage[0];
  7145. if (dynamicNavbar && $newNavbarEl.length) {
  7146. router.currentNavbarEl = $newNavbarEl[0];
  7147. } else {
  7148. delete router.currentNavbarEl;
  7149. }
  7150. // Current Route
  7151. router.currentRoute = options.route;
  7152. // History State
  7153. if (Device.ie || Device.edge || (Device.firefox && !Device.ios)) {
  7154. if (router.params.pushState && options.pushState) {
  7155. if (options.replaceState) {
  7156. var pushStateRoot$1 = router.params.pushStateRoot || '';
  7157. History.replace(
  7158. view.id,
  7159. {
  7160. url: options.route.url,
  7161. },
  7162. pushStateRoot$1 + router.params.pushStateSeparator + options.route.url
  7163. );
  7164. } else if (backIndex) {
  7165. History.go(-backIndex);
  7166. } else {
  7167. History.back();
  7168. }
  7169. }
  7170. }
  7171. // Insert Page
  7172. insertPage();
  7173. // Load Tab
  7174. if (options.route.route.tab) {
  7175. router.tabLoad(options.route.route.tab, Utils.extend({}, options, {
  7176. history: false,
  7177. pushState: false,
  7178. }));
  7179. }
  7180. // Check master detail
  7181. if (masterDetailEnabled && (currentIsMaster || masterPageRemoved)) {
  7182. view.checkMasterDetailBreakpoint(false);
  7183. }
  7184. // Page init and before init events
  7185. router.pageCallback('init', $newPage, $newNavbarEl, 'previous', 'current', options, $oldPage);
  7186. // Before animation callback
  7187. router.pageCallback('beforeOut', $oldPage, $oldNavbarEl, 'current', 'next', options);
  7188. router.pageCallback('beforeIn', $newPage, $newNavbarEl, 'previous', 'current', options);
  7189. // Animation
  7190. function afterAnimation() {
  7191. // Set classes
  7192. router.setPagePosition($newPage, 'current', false);
  7193. router.setPagePosition($oldPage, 'next', true);
  7194. if (dynamicNavbar) {
  7195. router.setNavbarPosition($newNavbarEl, 'current', false);
  7196. router.setNavbarPosition($oldNavbarEl, 'next', true);
  7197. }
  7198. // After animation event
  7199. router.pageCallback('afterOut', $oldPage, $oldNavbarEl, 'current', 'next', options);
  7200. router.pageCallback('afterIn', $newPage, $newNavbarEl, 'previous', 'current', options);
  7201. // Remove Old Page
  7202. if (router.params.stackPages && router.initialPages.indexOf($oldPage[0]) >= 0) {
  7203. $oldPage.addClass('stacked');
  7204. $oldPage.trigger('page:stack');
  7205. router.emit('pageStack', $oldPage[0]);
  7206. if (dynamicNavbar) {
  7207. $oldNavbarEl.addClass('stacked');
  7208. }
  7209. } else {
  7210. router.pageCallback('beforeRemove', $oldPage, $oldNavbarEl, 'next', undefined, options);
  7211. router.removePage($oldPage);
  7212. if (dynamicNavbar && $oldNavbarEl.length) {
  7213. router.removeNavbar($oldNavbarEl);
  7214. }
  7215. }
  7216. router.allowPageChange = true;
  7217. router.emit('routeChanged', router.currentRoute, router.previousRoute, router);
  7218. // Preload previous page
  7219. var preloadPreviousPage = router.params.preloadPreviousPage || router.params[((app.theme) + "SwipeBack")];
  7220. if (preloadPreviousPage && router.history[router.history.length - 2] && !isMaster) {
  7221. router.back(router.history[router.history.length - 2], { preload: true });
  7222. }
  7223. if (router.params.pushState) {
  7224. History.clearRouterQueue();
  7225. }
  7226. }
  7227. function setPositionClasses() {
  7228. router.setPagePosition($oldPage, 'current');
  7229. router.setPagePosition($newPage, 'previous', false);
  7230. if (dynamicNavbar) {
  7231. router.setNavbarPosition($oldNavbarEl, 'current');
  7232. router.setNavbarPosition($newNavbarEl, 'previous', false);
  7233. }
  7234. }
  7235. if (options.animate && !(currentIsMaster && app.width >= router.params.masterDetailBreakpoint)) {
  7236. var transition = router.params.transition;
  7237. if ($oldPage[0] && $oldPage[0].f7PageTransition) {
  7238. transition = $oldPage[0].f7PageTransition;
  7239. delete $oldPage[0].f7PageTransition;
  7240. }
  7241. if (options.transition) { transition = options.transition; }
  7242. if (!transition && router.previousRoute && router.previousRoute.route) {
  7243. transition = router.previousRoute.route.transition;
  7244. }
  7245. if (!transition && router.previousRoute && router.previousRoute.route && router.previousRoute.route.options) {
  7246. transition = router.previousRoute.route.options.transition;
  7247. }
  7248. setPositionClasses();
  7249. router.animate($oldPage, $newPage, $oldNavbarEl, $newNavbarEl, 'backward', transition, function () {
  7250. afterAnimation();
  7251. });
  7252. } else {
  7253. afterAnimation();
  7254. }
  7255. return router;
  7256. }
  7257. function loadBack(backParams, backOptions, ignorePageChange) {
  7258. var router = this;
  7259. if (!router.allowPageChange && !ignorePageChange) { return router; }
  7260. var params = backParams;
  7261. var options = backOptions;
  7262. var url = params.url;
  7263. var content = params.content;
  7264. var el = params.el;
  7265. var pageName = params.pageName;
  7266. var template = params.template;
  7267. var templateUrl = params.templateUrl;
  7268. var component = params.component;
  7269. var componentUrl = params.componentUrl;
  7270. if (
  7271. options.route.url
  7272. && router.url === options.route.url
  7273. && !(options.reloadCurrent || options.reloadPrevious)
  7274. && !router.params.allowDuplicateUrls
  7275. ) {
  7276. return false;
  7277. }
  7278. if (!options.route && url) {
  7279. options.route = router.parseRouteUrl(url);
  7280. }
  7281. // Component Callbacks
  7282. function resolve(pageEl, newOptions) {
  7283. return router.backward(pageEl, Utils.extend(options, newOptions));
  7284. }
  7285. function reject() {
  7286. router.allowPageChange = true;
  7287. return router;
  7288. }
  7289. if (url || templateUrl || componentUrl || component) {
  7290. router.allowPageChange = false;
  7291. }
  7292. // Proceed
  7293. if (content) {
  7294. router.backward(router.getPageEl(content), options);
  7295. } else if (template || templateUrl) {
  7296. // Parse template and send page element
  7297. try {
  7298. router.pageTemplateLoader(template, templateUrl, options, resolve, reject);
  7299. } catch (err) {
  7300. router.allowPageChange = true;
  7301. throw err;
  7302. }
  7303. } else if (el) {
  7304. // Load page from specified HTMLElement or by page name in pages container
  7305. router.backward(router.getPageEl(el), options);
  7306. } else if (pageName) {
  7307. // Load page by page name in pages container
  7308. router.backward(router.$el.children((".page[data-name=\"" + pageName + "\"]")).eq(0), options);
  7309. } else if (component || componentUrl) {
  7310. // Load from component (F7/Vue/React/...)
  7311. try {
  7312. router.pageComponentLoader(router.el, component, componentUrl, options, resolve, reject);
  7313. } catch (err) {
  7314. router.allowPageChange = true;
  7315. throw err;
  7316. }
  7317. } else if (url) {
  7318. // Load using XHR
  7319. if (router.xhr) {
  7320. router.xhr.abort();
  7321. router.xhr = false;
  7322. }
  7323. router.xhrRequest(url, options)
  7324. .then(function (pageContent) {
  7325. router.backward(router.getPageEl(pageContent), options);
  7326. })
  7327. .catch(function () {
  7328. router.allowPageChange = true;
  7329. });
  7330. }
  7331. return router;
  7332. }
  7333. function back() {
  7334. var args = [], len = arguments.length;
  7335. while ( len-- ) args[ len ] = arguments[ len ];
  7336. var router = this;
  7337. if (router.swipeBackActive) { return router; }
  7338. var navigateUrl;
  7339. var navigateOptions;
  7340. var route;
  7341. if (typeof args[0] === 'object') {
  7342. navigateOptions = args[0] || {};
  7343. } else {
  7344. navigateUrl = args[0];
  7345. navigateOptions = args[1] || {};
  7346. }
  7347. var name = navigateOptions.name;
  7348. var params = navigateOptions.params;
  7349. var query = navigateOptions.query;
  7350. if (name) {
  7351. navigateUrl = router.generateUrl({ name: name, params: params, query: query });
  7352. if (navigateUrl) {
  7353. return router.back(navigateUrl, Utils.extend({}, navigateOptions, {
  7354. name: null,
  7355. params: null,
  7356. query: null,
  7357. }));
  7358. }
  7359. return router;
  7360. }
  7361. var app = router.app;
  7362. appRouterCheck(router, 'back');
  7363. var currentRouteIsModal = router.currentRoute.modal;
  7364. var modalType;
  7365. if (!currentRouteIsModal) {
  7366. ('popup popover sheet loginScreen actions customModal panel').split(' ').forEach(function (modalLoadProp) {
  7367. if (router.currentRoute.route[modalLoadProp]) {
  7368. currentRouteIsModal = true;
  7369. modalType = modalLoadProp;
  7370. }
  7371. });
  7372. }
  7373. if (currentRouteIsModal) {
  7374. var modalToClose = router.currentRoute.modal
  7375. || router.currentRoute.route.modalInstance
  7376. || app[modalType].get();
  7377. var previousUrl = router.history[router.history.length - 2];
  7378. var previousRoute;
  7379. // check if previous route is modal too
  7380. if (modalToClose && modalToClose.$el) {
  7381. var prevOpenedModals = modalToClose.$el.prevAll('.modal-in');
  7382. if (prevOpenedModals.length && prevOpenedModals[0].f7Modal) {
  7383. var modalEl = prevOpenedModals[0];
  7384. // check if current router not inside of the modalEl
  7385. if (!router.$el.parents(modalEl).length) {
  7386. previousRoute = modalEl.f7Modal.route;
  7387. }
  7388. }
  7389. }
  7390. if (!previousRoute) {
  7391. previousRoute = router.findMatchingRoute(previousUrl);
  7392. }
  7393. if (!previousRoute && previousUrl) {
  7394. previousRoute = {
  7395. url: previousUrl,
  7396. path: previousUrl.split('?')[0],
  7397. query: Utils.parseUrlQuery(previousUrl),
  7398. route: {
  7399. path: previousUrl.split('?')[0],
  7400. url: previousUrl,
  7401. },
  7402. };
  7403. }
  7404. if (!navigateUrl || navigateUrl.replace(/[# ]/g, '').trim().length === 0) {
  7405. if (!previousRoute || !modalToClose) {
  7406. return router;
  7407. }
  7408. }
  7409. var forceOtherUrl = navigateOptions.force && previousRoute && navigateUrl;
  7410. if (previousRoute && modalToClose) {
  7411. var isBrokenPushState = Device.ie || Device.edge || (Device.firefox && !Device.ios);
  7412. var needHistoryBack = router.params.pushState && navigateOptions.pushState !== false;
  7413. var currentRouteWithoutPushState = router.currentRoute && router.currentRoute.route && router.currentRoute.route.options && router.currentRoute.route.options.pushState === false;
  7414. if (needHistoryBack && !isBrokenPushState && !currentRouteWithoutPushState) {
  7415. History.back();
  7416. }
  7417. router.currentRoute = previousRoute;
  7418. router.history.pop();
  7419. router.saveHistory();
  7420. if (needHistoryBack && isBrokenPushState && !currentRouteWithoutPushState) {
  7421. History.back();
  7422. }
  7423. router.modalRemove(modalToClose);
  7424. if (forceOtherUrl) {
  7425. router.navigate(navigateUrl, { reloadCurrent: true });
  7426. }
  7427. } else if (modalToClose) {
  7428. router.modalRemove(modalToClose);
  7429. if (navigateUrl) {
  7430. router.navigate(navigateUrl, { reloadCurrent: true });
  7431. }
  7432. }
  7433. return router;
  7434. }
  7435. var $previousPage = router.$el.children('.page-current').prevAll('.page-previous:not(.page-master)').eq(0);
  7436. var skipMaster;
  7437. if (router.params.masterDetailBreakpoint > 0) {
  7438. var classes = [];
  7439. router.$el.children('.page').each(function (index, pageEl) {
  7440. classes.push(pageEl.className);
  7441. });
  7442. var $previousMaster = router.$el.children('.page-current').prevAll('.page-master').eq(0);
  7443. if ($previousMaster.length) {
  7444. var expectedPreviousPageUrl = router.history[router.history.length - 2];
  7445. var expectedPreviousPageRoute = router.findMatchingRoute(expectedPreviousPageUrl);
  7446. if (expectedPreviousPageRoute && $previousMaster[0].f7Page && expectedPreviousPageRoute.route === $previousMaster[0].f7Page.route.route) {
  7447. $previousPage = $previousMaster;
  7448. if (!navigateOptions.preload) {
  7449. skipMaster = app.width >= router.params.masterDetailBreakpoint;
  7450. }
  7451. }
  7452. }
  7453. }
  7454. if (!navigateOptions.force && $previousPage.length && !skipMaster) {
  7455. if (router.params.pushState
  7456. && $previousPage[0].f7Page
  7457. && router.history[router.history.length - 2] !== $previousPage[0].f7Page.route.url
  7458. ) {
  7459. router.back(
  7460. router.history[router.history.length - 2],
  7461. Utils.extend(navigateOptions, { force: true })
  7462. );
  7463. return router;
  7464. }
  7465. var previousPageRoute = $previousPage[0].f7Page.route;
  7466. processRouteQueue.call(
  7467. router,
  7468. previousPageRoute,
  7469. router.currentRoute,
  7470. function () {
  7471. router.loadBack({ el: $previousPage }, Utils.extend(navigateOptions, {
  7472. route: previousPageRoute,
  7473. }));
  7474. },
  7475. function () {}
  7476. );
  7477. return router;
  7478. }
  7479. // Navigate URL
  7480. if (navigateUrl === '#') {
  7481. navigateUrl = undefined;
  7482. }
  7483. if (navigateUrl && navigateUrl[0] !== '/' && navigateUrl.indexOf('#') !== 0) {
  7484. navigateUrl = ((router.path || '/') + navigateUrl).replace('//', '/');
  7485. }
  7486. if (!navigateUrl && router.history.length > 1) {
  7487. navigateUrl = router.history[router.history.length - 2];
  7488. }
  7489. if (skipMaster && !navigateOptions.force && router.history[router.history.length - 3]) {
  7490. return router.back(router.history[router.history.length - 3], Utils.extend({}, navigateOptions || {}, {
  7491. force: true,
  7492. animate: false,
  7493. }));
  7494. }
  7495. if (skipMaster && !navigateOptions.force) {
  7496. return router;
  7497. }
  7498. // Find route to load
  7499. route = router.findMatchingRoute(navigateUrl);
  7500. if (!route) {
  7501. if (navigateUrl) {
  7502. route = {
  7503. url: navigateUrl,
  7504. path: navigateUrl.split('?')[0],
  7505. query: Utils.parseUrlQuery(navigateUrl),
  7506. route: {
  7507. path: navigateUrl.split('?')[0],
  7508. url: navigateUrl,
  7509. },
  7510. };
  7511. }
  7512. }
  7513. if (!route) {
  7514. return router;
  7515. }
  7516. if (route.route.redirect) {
  7517. return redirect.call(router, 'back', route, navigateOptions);
  7518. }
  7519. var options = {};
  7520. if (route.route.options) {
  7521. Utils.extend(options, route.route.options, navigateOptions);
  7522. } else {
  7523. Utils.extend(options, navigateOptions);
  7524. }
  7525. options.route = route;
  7526. if (options && options.context) {
  7527. route.context = options.context;
  7528. options.route.context = options.context;
  7529. }
  7530. var backForceLoaded;
  7531. if (options.force && router.params.stackPages) {
  7532. router.$el.children('.page-previous.stacked').each(function (index, pageEl) {
  7533. if (pageEl.f7Page && pageEl.f7Page.route && pageEl.f7Page.route.url === route.url) {
  7534. backForceLoaded = true;
  7535. router.loadBack({ el: pageEl }, options);
  7536. }
  7537. });
  7538. if (backForceLoaded) {
  7539. return router;
  7540. }
  7541. }
  7542. function resolve() {
  7543. var routerLoaded = false;
  7544. if (route.route.keepAlive && route.route.keepAliveData) {
  7545. router.loadBack({ el: route.route.keepAliveData.pageEl }, options);
  7546. routerLoaded = true;
  7547. }
  7548. ('url content component pageName el componentUrl template templateUrl').split(' ').forEach(function (pageLoadProp) {
  7549. var obj;
  7550. if (route.route[pageLoadProp] && !routerLoaded) {
  7551. routerLoaded = true;
  7552. router.loadBack(( obj = {}, obj[pageLoadProp] = route.route[pageLoadProp], obj ), options);
  7553. }
  7554. });
  7555. if (routerLoaded) { return; }
  7556. // Async
  7557. function asyncResolve(resolveParams, resolveOptions) {
  7558. router.allowPageChange = false;
  7559. if (resolveOptions && resolveOptions.context) {
  7560. if (!route.context) { route.context = resolveOptions.context; }
  7561. else { route.context = Utils.extend({}, route.context, resolveOptions.context); }
  7562. options.route.context = route.context;
  7563. }
  7564. router.loadBack(resolveParams, Utils.extend(options, resolveOptions), true);
  7565. }
  7566. function asyncReject() {
  7567. router.allowPageChange = true;
  7568. }
  7569. if (route.route.async) {
  7570. router.allowPageChange = false;
  7571. route.route.async.call(router, route, router.currentRoute, asyncResolve, asyncReject);
  7572. }
  7573. if (route.route.asyncComponent) {
  7574. asyncComponent(router, route.route.asyncComponent, asyncResolve, asyncReject);
  7575. }
  7576. }
  7577. function reject() {
  7578. router.allowPageChange = true;
  7579. }
  7580. if (options.preload) {
  7581. resolve();
  7582. } else {
  7583. processRouteQueue.call(
  7584. router,
  7585. route,
  7586. router.currentRoute,
  7587. function () {
  7588. if (route.route.modules) {
  7589. app
  7590. .loadModules(Array.isArray(route.route.modules) ? route.route.modules : [route.route.modules])
  7591. .then(function () {
  7592. resolve();
  7593. })
  7594. .catch(function () {
  7595. reject();
  7596. });
  7597. } else {
  7598. resolve();
  7599. }
  7600. },
  7601. function () {
  7602. reject();
  7603. }
  7604. );
  7605. }
  7606. // Return Router
  7607. return router;
  7608. }
  7609. function clearPreviousPages(router) {
  7610. appRouterCheck(router, 'clearPreviousPages');
  7611. var app = router.app;
  7612. var dynamicNavbar = router.dynamicNavbar;
  7613. var $pagesToRemove = router.$el
  7614. .children('.page')
  7615. .filter(function (index, pageInView) {
  7616. if (router.currentRoute && (router.currentRoute.modal || router.currentRoute.panel)) { return true; }
  7617. return pageInView !== router.currentPageEl;
  7618. });
  7619. $pagesToRemove.each(function (index, pageEl) {
  7620. var $oldPageEl = $(pageEl);
  7621. var $oldNavbarEl = $(app.navbar.getElByPage($oldPageEl));
  7622. if (router.params.stackPages && router.initialPages.indexOf($oldPageEl[0]) >= 0) {
  7623. $oldPageEl.addClass('stacked');
  7624. if (dynamicNavbar) {
  7625. $oldNavbarEl.addClass('stacked');
  7626. }
  7627. } else {
  7628. // Page remove event
  7629. router.pageCallback('beforeRemove', $oldPageEl, $oldNavbarEl, 'previous', undefined, {});
  7630. router.removePage($oldPageEl);
  7631. if (dynamicNavbar && $oldNavbarEl.length) {
  7632. router.removeNavbar($oldNavbarEl);
  7633. }
  7634. }
  7635. });
  7636. }
  7637. function clearPreviousHistory() {
  7638. var router = this;
  7639. appRouterCheck(router, 'clearPreviousHistory');
  7640. var url = router.history[router.history.length - 1];
  7641. clearPreviousPages(router);
  7642. router.history = [url];
  7643. router.view.history = [url];
  7644. router.saveHistory();
  7645. }
  7646. var Router = /*@__PURE__*/(function (Framework7Class) {
  7647. function Router(app, view) {
  7648. Framework7Class.call(this, {}, [typeof view === 'undefined' ? app : view]);
  7649. var router = this;
  7650. // Is App Router
  7651. router.isAppRouter = typeof view === 'undefined';
  7652. if (router.isAppRouter) {
  7653. // App Router
  7654. Utils.extend(false, router, {
  7655. app: app,
  7656. params: app.params.view,
  7657. routes: app.routes || [],
  7658. cache: app.cache,
  7659. });
  7660. } else {
  7661. // View Router
  7662. Utils.extend(false, router, {
  7663. app: app,
  7664. view: view,
  7665. viewId: view.id,
  7666. params: view.params,
  7667. routes: view.routes,
  7668. $el: view.$el,
  7669. el: view.el,
  7670. $navbarsEl: view.$navbarsEl,
  7671. navbarsEl: view.navbarsEl,
  7672. history: view.history,
  7673. scrollHistory: view.scrollHistory,
  7674. cache: app.cache,
  7675. dynamicNavbar: app.theme === 'ios' && view.params.iosDynamicNavbar,
  7676. initialPages: [],
  7677. initialNavbars: [],
  7678. });
  7679. }
  7680. // Install Modules
  7681. router.useModules();
  7682. // Temporary Dom
  7683. router.tempDom = doc.createElement('div');
  7684. // AllowPageChage
  7685. router.allowPageChange = true;
  7686. // Current Route
  7687. var currentRoute = {};
  7688. var previousRoute = {};
  7689. Object.defineProperty(router, 'currentRoute', {
  7690. enumerable: true,
  7691. configurable: true,
  7692. set: function set(newRoute) {
  7693. if ( newRoute === void 0 ) newRoute = {};
  7694. previousRoute = Utils.extend({}, currentRoute);
  7695. currentRoute = newRoute;
  7696. if (!currentRoute) { return; }
  7697. router.url = currentRoute.url;
  7698. router.emit('routeChange', newRoute, previousRoute, router);
  7699. },
  7700. get: function get() {
  7701. return currentRoute;
  7702. },
  7703. });
  7704. Object.defineProperty(router, 'previousRoute', {
  7705. enumerable: true,
  7706. configurable: true,
  7707. get: function get() {
  7708. return previousRoute;
  7709. },
  7710. set: function set(newRoute) {
  7711. previousRoute = newRoute;
  7712. },
  7713. });
  7714. return router;
  7715. }
  7716. if ( Framework7Class ) Router.__proto__ = Framework7Class;
  7717. Router.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  7718. Router.prototype.constructor = Router;
  7719. Router.prototype.animatableNavElements = function animatableNavElements ($newNavbarEl, $oldNavbarEl, toLarge, fromLarge, direction) {
  7720. var router = this;
  7721. var dynamicNavbar = router.dynamicNavbar;
  7722. var animateIcon = router.params.iosAnimateNavbarBackIcon;
  7723. var newNavEls;
  7724. var oldNavEls;
  7725. function animatableNavEl($el, $navbarInner) {
  7726. var isSliding = $el.hasClass('sliding') || $navbarInner.hasClass('sliding');
  7727. var isSubnavbar = $el.hasClass('subnavbar');
  7728. var needsOpacityTransition = isSliding ? !isSubnavbar : true;
  7729. var $iconEl = $el.find('.back .icon');
  7730. var isIconLabel;
  7731. if (isSliding && animateIcon && $el.hasClass('left') && $iconEl.length > 0 && $iconEl.next('span').length) {
  7732. $el = $iconEl.next('span'); // eslint-disable-line
  7733. isIconLabel = true;
  7734. }
  7735. return {
  7736. $el: $el,
  7737. isIconLabel: isIconLabel,
  7738. leftOffset: $el[0].f7NavbarLeftOffset,
  7739. rightOffset: $el[0].f7NavbarRightOffset,
  7740. isSliding: isSliding,
  7741. isSubnavbar: isSubnavbar,
  7742. needsOpacityTransition: needsOpacityTransition,
  7743. };
  7744. }
  7745. if (dynamicNavbar) {
  7746. newNavEls = [];
  7747. oldNavEls = [];
  7748. $newNavbarEl.children('.navbar-inner').children('.left, .right, .title, .subnavbar').each(function (index, navEl) {
  7749. var $navEl = $(navEl);
  7750. if ($navEl.hasClass('left') && fromLarge && direction === 'forward') { return; }
  7751. if ($navEl.hasClass('title') && toLarge) { return; }
  7752. newNavEls.push(animatableNavEl($navEl, $newNavbarEl.children('.navbar-inner')));
  7753. });
  7754. if (!($oldNavbarEl.hasClass('navbar-master') && router.params.masterDetailBreakpoint > 0 && router.app.width >= router.params.masterDetailBreakpoint)) {
  7755. $oldNavbarEl.children('.navbar-inner').children('.left, .right, .title, .subnavbar').each(function (index, navEl) {
  7756. var $navEl = $(navEl);
  7757. if ($navEl.hasClass('left') && toLarge && !fromLarge && direction === 'forward') { return; }
  7758. if ($navEl.hasClass('left') && toLarge && direction === 'backward') { return; }
  7759. if ($navEl.hasClass('title') && fromLarge) {
  7760. return;
  7761. }
  7762. oldNavEls.push(animatableNavEl($navEl, $oldNavbarEl.children('.navbar-inner')));
  7763. });
  7764. }
  7765. [oldNavEls, newNavEls].forEach(function (navEls) {
  7766. navEls.forEach(function (navEl) {
  7767. var n = navEl;
  7768. var isSliding = navEl.isSliding;
  7769. var $el = navEl.$el;
  7770. var otherEls = navEls === oldNavEls ? newNavEls : oldNavEls;
  7771. if (!(isSliding && $el.hasClass('title') && otherEls)) { return; }
  7772. otherEls.forEach(function (otherNavEl) {
  7773. if (otherNavEl.isIconLabel) {
  7774. var iconTextEl = otherNavEl.$el[0];
  7775. n.leftOffset += iconTextEl ? (iconTextEl.offsetLeft || 0) : 0;
  7776. }
  7777. });
  7778. });
  7779. });
  7780. }
  7781. return { newNavEls: newNavEls, oldNavEls: oldNavEls };
  7782. };
  7783. Router.prototype.animate = function animate ($oldPageEl, $newPageEl, $oldNavbarEl, $newNavbarEl, direction, transition, callback) {
  7784. var router = this;
  7785. if (router.params.animateCustom) {
  7786. router.params.animateCustom.apply(router, [$oldPageEl, $newPageEl, $oldNavbarEl, $newNavbarEl, direction, callback]);
  7787. return;
  7788. }
  7789. var dynamicNavbar = router.dynamicNavbar;
  7790. var ios = router.app.theme === 'ios';
  7791. if (transition) {
  7792. var routerCustomTransitionClass = "router-transition-custom router-transition-" + transition + "-" + direction;
  7793. // Animate
  7794. var onCustomTransitionDone = function () {
  7795. router.$el.removeClass(routerCustomTransitionClass);
  7796. if (dynamicNavbar && router.$navbarsEl.length) {
  7797. if ($newNavbarEl) {
  7798. router.$navbarsEl.prepend($newNavbarEl);
  7799. }
  7800. if ($oldNavbarEl) {
  7801. router.$navbarsEl.prepend($oldNavbarEl);
  7802. }
  7803. }
  7804. if (callback) { callback(); }
  7805. };
  7806. (direction === 'forward' ? $newPageEl : $oldPageEl).animationEnd(onCustomTransitionDone);
  7807. if (dynamicNavbar) {
  7808. if ($newNavbarEl && $newPageEl) {
  7809. router.setNavbarPosition($newNavbarEl, '');
  7810. $newNavbarEl.removeClass('navbar-next navbar-previous navbar-current');
  7811. $newPageEl.prepend($newNavbarEl);
  7812. }
  7813. if ($oldNavbarEl && $oldPageEl) {
  7814. router.setNavbarPosition($oldNavbarEl, '');
  7815. $oldNavbarEl.removeClass('navbar-next navbar-previous navbar-current');
  7816. $oldPageEl.prepend($oldNavbarEl);
  7817. }
  7818. }
  7819. router.$el.addClass(routerCustomTransitionClass);
  7820. return;
  7821. }
  7822. // Router Animation class
  7823. var routerTransitionClass = "router-transition-" + direction + " router-transition";
  7824. var newNavEls;
  7825. var oldNavEls;
  7826. var fromLarge;
  7827. var toLarge;
  7828. var oldIsLarge;
  7829. var newIsLarge;
  7830. if (ios && dynamicNavbar) {
  7831. var betweenMasterAndDetail = router.params.masterDetailBreakpoint > 0 && router.app.width >= router.params.masterDetailBreakpoint
  7832. && (
  7833. ($oldNavbarEl.hasClass('navbar-master') && $newNavbarEl.hasClass('navbar-master-detail'))
  7834. || ($oldNavbarEl.hasClass('navbar-master-detail') && $newNavbarEl.hasClass('navbar-master'))
  7835. );
  7836. if (!betweenMasterAndDetail) {
  7837. oldIsLarge = $oldNavbarEl && $oldNavbarEl.hasClass('navbar-large');
  7838. newIsLarge = $newNavbarEl && $newNavbarEl.hasClass('navbar-large');
  7839. fromLarge = oldIsLarge && !$oldNavbarEl.hasClass('navbar-large-collapsed');
  7840. toLarge = newIsLarge && !$newNavbarEl.hasClass('navbar-large-collapsed');
  7841. }
  7842. var navEls = router.animatableNavElements($newNavbarEl, $oldNavbarEl, toLarge, fromLarge, direction);
  7843. newNavEls = navEls.newNavEls;
  7844. oldNavEls = navEls.oldNavEls;
  7845. }
  7846. function animateNavbars(progress) {
  7847. if (!(ios && dynamicNavbar)) { return; }
  7848. if (progress === 1) {
  7849. if (toLarge) {
  7850. $newNavbarEl.addClass('router-navbar-transition-to-large');
  7851. $oldNavbarEl.addClass('router-navbar-transition-to-large');
  7852. }
  7853. if (fromLarge) {
  7854. $newNavbarEl.addClass('router-navbar-transition-from-large');
  7855. $oldNavbarEl.addClass('router-navbar-transition-from-large');
  7856. }
  7857. }
  7858. newNavEls.forEach(function (navEl) {
  7859. var $el = navEl.$el;
  7860. var offset = direction === 'forward' ? navEl.rightOffset : navEl.leftOffset;
  7861. if (navEl.isSliding) {
  7862. if (navEl.isSubnavbar && newIsLarge) {
  7863. $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');
  7864. } else {
  7865. $el.transform(("translate3d(" + (offset * (1 - progress)) + "px,0,0)"));
  7866. }
  7867. }
  7868. });
  7869. oldNavEls.forEach(function (navEl) {
  7870. var $el = navEl.$el;
  7871. var offset = direction === 'forward' ? navEl.leftOffset : navEl.rightOffset;
  7872. if (navEl.isSliding) {
  7873. if (navEl.isSubnavbar && oldIsLarge) {
  7874. $el.transform(("translate3d(" + (offset * (progress)) + "px, calc(-1 * var(--f7-navbar-large-collapse-progress) * var(--f7-navbar-large-title-height)), 0)"));
  7875. } else {
  7876. $el.transform(("translate3d(" + (offset * (progress)) + "px,0,0)"));
  7877. }
  7878. }
  7879. });
  7880. }
  7881. // AnimationEnd Callback
  7882. function onDone() {
  7883. if (router.dynamicNavbar) {
  7884. if ($newNavbarEl) {
  7885. $newNavbarEl.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
  7886. $newNavbarEl.addClass('navbar-no-title-large-transition');
  7887. Utils.nextFrame(function () {
  7888. $newNavbarEl.removeClass('navbar-no-title-large-transition');
  7889. });
  7890. }
  7891. if ($oldNavbarEl) {
  7892. $oldNavbarEl.removeClass('router-navbar-transition-to-large router-navbar-transition-from-large');
  7893. }
  7894. if ($newNavbarEl.hasClass('sliding') || $newNavbarEl.children('.navbar-inner.sliding').length) {
  7895. $newNavbarEl.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
  7896. } else {
  7897. $newNavbarEl.find('.sliding').transform('');
  7898. }
  7899. if ($oldNavbarEl.hasClass('sliding') || $oldNavbarEl.children('.navbar-inner.sliding').length) {
  7900. $oldNavbarEl.find('.title, .left, .right, .left .icon, .subnavbar').transform('');
  7901. } else {
  7902. $oldNavbarEl.find('.sliding').transform('');
  7903. }
  7904. }
  7905. router.$el.removeClass(routerTransitionClass);
  7906. if (callback) { callback(); }
  7907. }
  7908. (direction === 'forward' ? $newPageEl : $oldPageEl).animationEnd(function () {
  7909. onDone();
  7910. });
  7911. // Animate
  7912. if (dynamicNavbar) {
  7913. // Prepare Navbars
  7914. animateNavbars(0);
  7915. Utils.nextFrame(function () {
  7916. // Add class, start animation
  7917. animateNavbars(1);
  7918. router.$el.addClass(routerTransitionClass);
  7919. });
  7920. } else {
  7921. // Add class, start animation
  7922. router.$el.addClass(routerTransitionClass);
  7923. }
  7924. };
  7925. Router.prototype.removeModal = function removeModal (modalEl) {
  7926. var router = this;
  7927. router.removeEl(modalEl);
  7928. };
  7929. // eslint-disable-next-line
  7930. Router.prototype.removeTabContent = function removeTabContent (tabEl) {
  7931. var $tabEl = $(tabEl);
  7932. $tabEl.html('');
  7933. };
  7934. Router.prototype.removeNavbar = function removeNavbar (el) {
  7935. var router = this;
  7936. router.removeEl(el);
  7937. };
  7938. Router.prototype.removePage = function removePage (el) {
  7939. var $el = $(el);
  7940. var f7Page = $el && $el[0] && $el[0].f7Page;
  7941. var router = this;
  7942. if (f7Page && f7Page.route && f7Page.route.route && f7Page.route.route.keepAlive) {
  7943. $el.remove();
  7944. return;
  7945. }
  7946. router.removeEl(el);
  7947. };
  7948. Router.prototype.removeEl = function removeEl (el) {
  7949. if (!el) { return; }
  7950. var router = this;
  7951. var $el = $(el);
  7952. if ($el.length === 0) { return; }
  7953. $el.find('.tab').each(function (tabIndex, tabEl) {
  7954. $(tabEl).children().each(function (index, tabChild) {
  7955. if (tabChild.f7Component) {
  7956. $(tabChild).trigger('tab:beforeremove');
  7957. tabChild.f7Component.$destroy();
  7958. }
  7959. });
  7960. });
  7961. if ($el[0].f7Component && $el[0].f7Component.$destroy) {
  7962. $el[0].f7Component.$destroy();
  7963. }
  7964. if (!router.params.removeElements) {
  7965. return;
  7966. }
  7967. if (router.params.removeElementsWithTimeout) {
  7968. setTimeout(function () {
  7969. $el.remove();
  7970. }, router.params.removeElementsTimeout);
  7971. } else {
  7972. $el.remove();
  7973. }
  7974. };
  7975. Router.prototype.getPageEl = function getPageEl (content) {
  7976. var router = this;
  7977. if (typeof content === 'string') {
  7978. router.tempDom.innerHTML = content;
  7979. } else {
  7980. if ($(content).hasClass('page')) {
  7981. return content;
  7982. }
  7983. router.tempDom.innerHTML = '';
  7984. $(router.tempDom).append(content);
  7985. }
  7986. return router.findElement('.page', router.tempDom);
  7987. };
  7988. Router.prototype.findElement = function findElement (stringSelector, container, notStacked) {
  7989. var router = this;
  7990. var view = router.view;
  7991. var app = router.app;
  7992. // Modals Selector
  7993. var modalsSelector = '.popup, .dialog, .popover, .actions-modal, .sheet-modal, .login-screen, .page';
  7994. var $container = $(container);
  7995. var selector = stringSelector;
  7996. if (notStacked) { selector += ':not(.stacked)'; }
  7997. var found = $container
  7998. .find(selector)
  7999. .filter(function (index, el) { return $(el).parents(modalsSelector).length === 0; });
  8000. if (found.length > 1) {
  8001. if (typeof view.selector === 'string') {
  8002. // Search in related view
  8003. found = $container.find(((view.selector) + " " + selector));
  8004. }
  8005. if (found.length > 1) {
  8006. // Search in main view
  8007. found = $container.find(("." + (app.params.viewMainClass) + " " + selector));
  8008. }
  8009. }
  8010. if (found.length === 1) { return found; }
  8011. // Try to find not stacked
  8012. if (!notStacked) { found = router.findElement(selector, $container, true); }
  8013. if (found && found.length === 1) { return found; }
  8014. if (found && found.length > 1) { return $(found[0]); }
  8015. return undefined;
  8016. };
  8017. Router.prototype.flattenRoutes = function flattenRoutes (routes) {
  8018. if ( routes === void 0 ) routes = this.routes;
  8019. var router = this;
  8020. var flattenedRoutes = [];
  8021. routes.forEach(function (route) {
  8022. var hasTabRoutes = false;
  8023. if ('tabs' in route && route.tabs) {
  8024. var mergedPathsRoutes = route.tabs.map(function (tabRoute) {
  8025. var tRoute = Utils.extend({}, route, {
  8026. path: (((route.path) + "/" + (tabRoute.path))).replace('///', '/').replace('//', '/'),
  8027. parentPath: route.path,
  8028. tab: tabRoute,
  8029. });
  8030. delete tRoute.tabs;
  8031. delete tRoute.routes;
  8032. return tRoute;
  8033. });
  8034. hasTabRoutes = true;
  8035. flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes));
  8036. }
  8037. if ('detailRoutes' in route) {
  8038. var mergedPathsRoutes$1 = route.detailRoutes.map(function (detailRoute) {
  8039. var dRoute = Utils.extend({}, detailRoute);
  8040. dRoute.masterRoute = route;
  8041. dRoute.masterRoutePath = route.path;
  8042. return dRoute;
  8043. });
  8044. flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(mergedPathsRoutes$1));
  8045. }
  8046. if ('routes' in route) {
  8047. var mergedPathsRoutes$2 = route.routes.map(function (childRoute) {
  8048. var cRoute = Utils.extend({}, childRoute);
  8049. cRoute.path = (((route.path) + "/" + (cRoute.path))).replace('///', '/').replace('//', '/');
  8050. return cRoute;
  8051. });
  8052. if (hasTabRoutes) {
  8053. flattenedRoutes = flattenedRoutes.concat(router.flattenRoutes(mergedPathsRoutes$2));
  8054. } else {
  8055. flattenedRoutes = flattenedRoutes.concat(route, router.flattenRoutes(mergedPathsRoutes$2));
  8056. }
  8057. }
  8058. if (!('routes' in route) && !('tabs' in route && route.tabs) && !('detailRoutes' in route)) {
  8059. flattenedRoutes.push(route);
  8060. }
  8061. });
  8062. return flattenedRoutes;
  8063. };
  8064. // eslint-disable-next-line
  8065. Router.prototype.parseRouteUrl = function parseRouteUrl (url) {
  8066. if (!url) { return {}; }
  8067. var query = Utils.parseUrlQuery(url);
  8068. var hash = url.split('#')[1];
  8069. var params = {};
  8070. var path = url.split('#')[0].split('?')[0];
  8071. return {
  8072. query: query,
  8073. hash: hash,
  8074. params: params,
  8075. url: url,
  8076. path: path,
  8077. };
  8078. };
  8079. Router.prototype.generateUrl = function generateUrl (parameters) {
  8080. if ( parameters === void 0 ) parameters = {};
  8081. if (typeof parameters === 'string') {
  8082. return parameters;
  8083. }
  8084. var name = parameters.name;
  8085. var path = parameters.path;
  8086. var params = parameters.params;
  8087. var query = parameters.query;
  8088. if (!name && !path) {
  8089. throw new Error('Framework7: "name" or "path" parameter is required');
  8090. }
  8091. var router = this;
  8092. var route = name
  8093. ? router.findRouteByKey('name', name)
  8094. : router.findRouteByKey('path', path);
  8095. if (!route) {
  8096. if (name) {
  8097. throw new Error(("Framework7: route with name \"" + name + "\" not found"));
  8098. } else {
  8099. throw new Error(("Framework7: route with path \"" + path + "\" not found"));
  8100. }
  8101. }
  8102. var url = router.constructRouteUrl(route, { params: params, query: query });
  8103. if (!url) {
  8104. throw new Error(("Framework7: can't construct URL for route with name \"" + name + "\""));
  8105. }
  8106. return url;
  8107. };
  8108. // eslint-disable-next-line
  8109. Router.prototype.constructRouteUrl = function constructRouteUrl (route, ref) {
  8110. if ( ref === void 0 ) ref = {};
  8111. var params = ref.params;
  8112. var query = ref.query;
  8113. var path = route.path;
  8114. var toUrl = compile(path);
  8115. var url;
  8116. try {
  8117. url = toUrl(params || {});
  8118. } catch (error) {
  8119. throw new Error(("Framework7: error constructing route URL from passed params:\nRoute: " + path + "\n" + (error.toString())));
  8120. }
  8121. if (query) {
  8122. if (typeof query === 'string') { url += "?" + query; }
  8123. else { url += "?" + (Utils.serializeObject(query)); }
  8124. }
  8125. return url;
  8126. };
  8127. Router.prototype.findTabRoute = function findTabRoute (tabEl) {
  8128. var router = this;
  8129. var $tabEl = $(tabEl);
  8130. var parentPath = router.currentRoute.route.parentPath;
  8131. var tabId = $tabEl.attr('id');
  8132. var flattenedRoutes = router.flattenRoutes(router.routes);
  8133. var foundTabRoute;
  8134. flattenedRoutes.forEach(function (route) {
  8135. if (
  8136. route.parentPath === parentPath
  8137. && route.tab
  8138. && route.tab.id === tabId
  8139. ) {
  8140. foundTabRoute = route;
  8141. }
  8142. });
  8143. return foundTabRoute;
  8144. };
  8145. Router.prototype.findRouteByKey = function findRouteByKey (key, value) {
  8146. var router = this;
  8147. var routes = router.routes;
  8148. var flattenedRoutes = router.flattenRoutes(routes);
  8149. var matchingRoute;
  8150. flattenedRoutes.forEach(function (route) {
  8151. if (matchingRoute) { return; }
  8152. if (route[key] === value) {
  8153. matchingRoute = route;
  8154. }
  8155. });
  8156. return matchingRoute;
  8157. };
  8158. Router.prototype.findMatchingRoute = function findMatchingRoute (url) {
  8159. if (!url) { return undefined; }
  8160. var router = this;
  8161. var routes = router.routes;
  8162. var flattenedRoutes = router.flattenRoutes(routes);
  8163. var ref = router.parseRouteUrl(url);
  8164. var path = ref.path;
  8165. var query = ref.query;
  8166. var hash = ref.hash;
  8167. var params = ref.params;
  8168. var matchingRoute;
  8169. flattenedRoutes.forEach(function (route) {
  8170. if (matchingRoute) { return; }
  8171. var keys = [];
  8172. var pathsToMatch = [route.path];
  8173. if (route.alias) {
  8174. if (typeof route.alias === 'string') { pathsToMatch.push(route.alias); }
  8175. else if (Array.isArray(route.alias)) {
  8176. route.alias.forEach(function (aliasPath) {
  8177. pathsToMatch.push(aliasPath);
  8178. });
  8179. }
  8180. }
  8181. var matched;
  8182. pathsToMatch.forEach(function (pathToMatch) {
  8183. if (matched) { return; }
  8184. matched = pathToRegexp(pathToMatch, keys).exec(path);
  8185. });
  8186. if (matched) {
  8187. keys.forEach(function (keyObj, index) {
  8188. if (typeof keyObj.name === 'number') { return; }
  8189. var paramValue = matched[index + 1];
  8190. if (typeof paramValue === 'undefined' || paramValue === null) {
  8191. params[keyObj.name] = paramValue;
  8192. } else {
  8193. params[keyObj.name] = decodeURIComponent(paramValue);
  8194. }
  8195. });
  8196. var parentPath;
  8197. if (route.parentPath) {
  8198. parentPath = path.split('/').slice(0, route.parentPath.split('/').length - 1).join('/');
  8199. }
  8200. matchingRoute = {
  8201. query: query,
  8202. hash: hash,
  8203. params: params,
  8204. url: url,
  8205. path: path,
  8206. parentPath: parentPath,
  8207. route: route,
  8208. name: route.name,
  8209. };
  8210. }
  8211. });
  8212. return matchingRoute;
  8213. };
  8214. // eslint-disable-next-line
  8215. Router.prototype.replaceRequestUrlParams = function replaceRequestUrlParams (url, options) {
  8216. if ( url === void 0 ) url = '';
  8217. if ( options === void 0 ) options = {};
  8218. var compiledUrl = url;
  8219. if (typeof compiledUrl === 'string'
  8220. && compiledUrl.indexOf('{{') >= 0
  8221. && options
  8222. && options.route
  8223. && options.route.params
  8224. && Object.keys(options.route.params).length
  8225. ) {
  8226. Object.keys(options.route.params).forEach(function (paramName) {
  8227. var regExp = new RegExp(("{{" + paramName + "}}"), 'g');
  8228. compiledUrl = compiledUrl.replace(regExp, options.route.params[paramName] || '');
  8229. });
  8230. }
  8231. return compiledUrl;
  8232. };
  8233. Router.prototype.removeFromXhrCache = function removeFromXhrCache (url) {
  8234. var router = this;
  8235. var xhrCache = router.cache.xhr;
  8236. var index = false;
  8237. for (var i = 0; i < xhrCache.length; i += 1) {
  8238. if (xhrCache[i].url === url) { index = i; }
  8239. }
  8240. if (index !== false) { xhrCache.splice(index, 1); }
  8241. };
  8242. Router.prototype.xhrRequest = function xhrRequest (requestUrl, options) {
  8243. var router = this;
  8244. var params = router.params;
  8245. var ignoreCache = options.ignoreCache;
  8246. var url = requestUrl;
  8247. var hasQuery = url.indexOf('?') >= 0;
  8248. if (params.passRouteQueryToRequest
  8249. && options
  8250. && options.route
  8251. && options.route.query
  8252. && Object.keys(options.route.query).length
  8253. ) {
  8254. url += "" + (hasQuery ? '&' : '?') + (Utils.serializeObject(options.route.query));
  8255. hasQuery = true;
  8256. }
  8257. if (params.passRouteParamsToRequest
  8258. && options
  8259. && options.route
  8260. && options.route.params
  8261. && Object.keys(options.route.params).length
  8262. ) {
  8263. url += "" + (hasQuery ? '&' : '?') + (Utils.serializeObject(options.route.params));
  8264. hasQuery = true;
  8265. }
  8266. if (url.indexOf('{{') >= 0) {
  8267. url = router.replaceRequestUrlParams(url, options);
  8268. }
  8269. // should we ignore get params or not
  8270. if (params.xhrCacheIgnoreGetParameters && url.indexOf('?') >= 0) {
  8271. url = url.split('?')[0];
  8272. }
  8273. return new Promise(function (resolve, reject) {
  8274. if (params.xhrCache && !ignoreCache && url.indexOf('nocache') < 0 && params.xhrCacheIgnore.indexOf(url) < 0) {
  8275. for (var i = 0; i < router.cache.xhr.length; i += 1) {
  8276. var cachedUrl = router.cache.xhr[i];
  8277. if (cachedUrl.url === url) {
  8278. // Check expiration
  8279. if (Utils.now() - cachedUrl.time < params.xhrCacheDuration) {
  8280. // Load from cache
  8281. resolve(cachedUrl.content);
  8282. return;
  8283. }
  8284. }
  8285. }
  8286. }
  8287. router.xhr = router.app.request({
  8288. url: url,
  8289. method: 'GET',
  8290. beforeSend: function beforeSend(xhr) {
  8291. router.emit('routerAjaxStart', xhr, options);
  8292. },
  8293. complete: function complete(xhr, status) {
  8294. router.emit('routerAjaxComplete', xhr);
  8295. if ((status !== 'error' && status !== 'timeout' && (xhr.status >= 200 && xhr.status < 300)) || xhr.status === 0) {
  8296. if (params.xhrCache && xhr.responseText !== '') {
  8297. router.removeFromXhrCache(url);
  8298. router.cache.xhr.push({
  8299. url: url,
  8300. time: Utils.now(),
  8301. content: xhr.responseText,
  8302. });
  8303. }
  8304. router.emit('routerAjaxSuccess', xhr, options);
  8305. resolve(xhr.responseText);
  8306. } else {
  8307. router.emit('routerAjaxError', xhr, options);
  8308. reject(xhr);
  8309. }
  8310. },
  8311. error: function error(xhr) {
  8312. router.emit('routerAjaxError', xhr, options);
  8313. reject(xhr);
  8314. },
  8315. });
  8316. });
  8317. };
  8318. Router.prototype.setNavbarPosition = function setNavbarPosition ($el, position, ariaHidden) {
  8319. var router = this;
  8320. $el.removeClass('navbar-previous navbar-current navbar-next');
  8321. if (position) {
  8322. $el.addClass(("navbar-" + position));
  8323. }
  8324. if (ariaHidden === false) {
  8325. $el.removeAttr('aria-hidden');
  8326. } else if (ariaHidden === true) {
  8327. $el.attr('aria-hidden', 'true');
  8328. }
  8329. $el.trigger('navbar:position', { position: position });
  8330. router.emit('navbarPosition', $el[0], position);
  8331. };
  8332. Router.prototype.setPagePosition = function setPagePosition ($el, position, ariaHidden) {
  8333. var router = this;
  8334. $el.removeClass('page-previous page-current page-next');
  8335. $el.addClass(("page-" + position));
  8336. if (ariaHidden === false) {
  8337. $el.removeAttr('aria-hidden');
  8338. } else if (ariaHidden === true) {
  8339. $el.attr('aria-hidden', 'true');
  8340. }
  8341. $el.trigger('page:position', { position: position });
  8342. router.emit('pagePosition', $el[0], position);
  8343. };
  8344. // Remove theme elements
  8345. Router.prototype.removeThemeElements = function removeThemeElements (el) {
  8346. var router = this;
  8347. var theme = router.app.theme;
  8348. var toRemove;
  8349. if (theme === 'ios') {
  8350. toRemove = '.md-only, .aurora-only, .if-md, .if-aurora, .if-not-ios, .not-ios';
  8351. } else if (theme === 'md') {
  8352. toRemove = '.ios-only, .aurora-only, .if-ios, .if-aurora, .if-not-md, .not-md';
  8353. } else if (theme === 'aurora') {
  8354. toRemove = '.ios-only, .md-only, .if-ios, .if-md, .if-not-aurora, .not-aurora';
  8355. }
  8356. $(el).find(toRemove).remove();
  8357. };
  8358. Router.prototype.getPageData = function getPageData (pageEl, navbarEl, from, to, route, pageFromEl) {
  8359. if ( route === void 0 ) route = {};
  8360. var router = this;
  8361. var $pageEl = $(pageEl).eq(0);
  8362. var $navbarEl = $(navbarEl).eq(0);
  8363. var currentPage = $pageEl[0].f7Page || {};
  8364. var direction;
  8365. var pageFrom;
  8366. if ((from === 'next' && to === 'current') || (from === 'current' && to === 'previous')) { direction = 'forward'; }
  8367. if ((from === 'current' && to === 'next') || (from === 'previous' && to === 'current')) { direction = 'backward'; }
  8368. if (currentPage && !currentPage.fromPage) {
  8369. var $pageFromEl = $(pageFromEl);
  8370. if ($pageFromEl.length) {
  8371. pageFrom = $pageFromEl[0].f7Page;
  8372. }
  8373. }
  8374. pageFrom = currentPage.pageFrom || pageFrom;
  8375. if (pageFrom && pageFrom.pageFrom) {
  8376. pageFrom.pageFrom = null;
  8377. }
  8378. var page = {
  8379. app: router.app,
  8380. view: router.view,
  8381. router: router,
  8382. $el: $pageEl,
  8383. el: $pageEl[0],
  8384. $pageEl: $pageEl,
  8385. pageEl: $pageEl[0],
  8386. $navbarEl: $navbarEl,
  8387. navbarEl: $navbarEl[0],
  8388. name: $pageEl.attr('data-name'),
  8389. position: from,
  8390. from: from,
  8391. to: to,
  8392. direction: direction,
  8393. route: currentPage.route ? currentPage.route : route,
  8394. pageFrom: pageFrom,
  8395. };
  8396. $pageEl[0].f7Page = page;
  8397. return page;
  8398. };
  8399. // Callbacks
  8400. Router.prototype.pageCallback = function pageCallback (callback, pageEl, navbarEl, from, to, options, pageFromEl) {
  8401. if ( options === void 0 ) options = {};
  8402. if (!pageEl) { return; }
  8403. var router = this;
  8404. var $pageEl = $(pageEl);
  8405. if (!$pageEl.length) { return; }
  8406. var $navbarEl = $(navbarEl);
  8407. var route = options.route;
  8408. var restoreScrollTopOnBack = router.params.restoreScrollTopOnBack
  8409. && !(
  8410. router.params.masterDetailBreakpoint > 0
  8411. && $pageEl.hasClass('page-master')
  8412. && router.app.width >= router.params.masterDetailBreakpoint
  8413. );
  8414. var keepAlive = $pageEl[0].f7Page && $pageEl[0].f7Page.route && $pageEl[0].f7Page.route.route && $pageEl[0].f7Page.route.route.keepAlive;
  8415. if (callback === 'beforeRemove' && keepAlive) {
  8416. callback = 'beforeUnmount'; // eslint-disable-line
  8417. }
  8418. var camelName = "page" + (callback[0].toUpperCase() + callback.slice(1, callback.length));
  8419. var colonName = "page:" + (callback.toLowerCase());
  8420. var page = {};
  8421. if (callback === 'beforeRemove' && $pageEl[0].f7Page) {
  8422. page = Utils.extend($pageEl[0].f7Page, { from: from, to: to, position: from });
  8423. } else {
  8424. page = router.getPageData($pageEl[0], $navbarEl[0], from, to, route, pageFromEl);
  8425. }
  8426. page.swipeBack = !!options.swipeBack;
  8427. var ref = options.route ? options.route.route : {};
  8428. var on = ref.on; if ( on === void 0 ) on = {};
  8429. var once = ref.once; if ( once === void 0 ) once = {};
  8430. if (options.on) {
  8431. Utils.extend(on, options.on);
  8432. }
  8433. if (options.once) {
  8434. Utils.extend(once, options.once);
  8435. }
  8436. function attachEvents() {
  8437. if ($pageEl[0].f7RouteEventsAttached) { return; }
  8438. $pageEl[0].f7RouteEventsAttached = true;
  8439. if (on && Object.keys(on).length > 0) {
  8440. $pageEl[0].f7RouteEventsOn = on;
  8441. Object.keys(on).forEach(function (eventName) {
  8442. on[eventName] = on[eventName].bind(router);
  8443. $pageEl.on(Utils.eventNameToColonCase(eventName), on[eventName]);
  8444. });
  8445. }
  8446. if (once && Object.keys(once).length > 0) {
  8447. $pageEl[0].f7RouteEventsOnce = once;
  8448. Object.keys(once).forEach(function (eventName) {
  8449. once[eventName] = once[eventName].bind(router);
  8450. $pageEl.once(Utils.eventNameToColonCase(eventName), once[eventName]);
  8451. });
  8452. }
  8453. }
  8454. function detachEvents() {
  8455. if (!$pageEl[0].f7RouteEventsAttached) { return; }
  8456. if ($pageEl[0].f7RouteEventsOn) {
  8457. Object.keys($pageEl[0].f7RouteEventsOn).forEach(function (eventName) {
  8458. $pageEl.off(Utils.eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOn[eventName]);
  8459. });
  8460. }
  8461. if ($pageEl[0].f7RouteEventsOnce) {
  8462. Object.keys($pageEl[0].f7RouteEventsOnce).forEach(function (eventName) {
  8463. $pageEl.off(Utils.eventNameToColonCase(eventName), $pageEl[0].f7RouteEventsOnce[eventName]);
  8464. });
  8465. }
  8466. $pageEl[0].f7RouteEventsAttached = null;
  8467. $pageEl[0].f7RouteEventsOn = null;
  8468. $pageEl[0].f7RouteEventsOnce = null;
  8469. delete $pageEl[0].f7RouteEventsAttached;
  8470. delete $pageEl[0].f7RouteEventsOn;
  8471. delete $pageEl[0].f7RouteEventsOnce;
  8472. }
  8473. if (callback === 'mounted') {
  8474. attachEvents();
  8475. }
  8476. if (callback === 'init') {
  8477. if (restoreScrollTopOnBack && (from === 'previous' || !from) && to === 'current' && router.scrollHistory[page.route.url] && !$pageEl.hasClass('no-restore-scroll')) {
  8478. var $pageContent = $pageEl.find('.page-content');
  8479. if ($pageContent.length > 0) {
  8480. // eslint-disable-next-line
  8481. $pageContent = $pageContent.filter(function (pageContentIndex, pageContentEl) {
  8482. return (
  8483. $(pageContentEl).parents('.tab:not(.tab-active)').length === 0
  8484. && !$(pageContentEl).is('.tab:not(.tab-active)')
  8485. );
  8486. });
  8487. }
  8488. $pageContent.scrollTop(router.scrollHistory[page.route.url]);
  8489. }
  8490. attachEvents();
  8491. if ($pageEl[0].f7PageInitialized) {
  8492. $pageEl.trigger('page:reinit', page);
  8493. router.emit('pageReinit', page);
  8494. return;
  8495. }
  8496. $pageEl[0].f7PageInitialized = true;
  8497. }
  8498. if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'previous') {
  8499. // Save scroll position
  8500. var $pageContent$1 = $pageEl.find('.page-content');
  8501. if ($pageContent$1.length > 0) {
  8502. // eslint-disable-next-line
  8503. $pageContent$1 = $pageContent$1.filter(function (pageContentIndex, pageContentEl) {
  8504. return (
  8505. $(pageContentEl).parents('.tab:not(.tab-active)').length === 0
  8506. && !$(pageContentEl).is('.tab:not(.tab-active)')
  8507. );
  8508. });
  8509. }
  8510. router.scrollHistory[page.route.url] = $pageContent$1.scrollTop();
  8511. }
  8512. if (restoreScrollTopOnBack && callback === 'beforeOut' && from === 'current' && to === 'next') {
  8513. // Delete scroll position
  8514. delete router.scrollHistory[page.route.url];
  8515. }
  8516. $pageEl.trigger(colonName, page);
  8517. router.emit(camelName, page);
  8518. if (callback === 'beforeRemove' || callback === 'beforeUnmount') {
  8519. detachEvents();
  8520. if (!keepAlive) {
  8521. if ($pageEl[0].f7Page && $pageEl[0].f7Page.navbarEl) {
  8522. delete $pageEl[0].f7Page.navbarEl.f7Page;
  8523. }
  8524. $pageEl[0].f7Page = null;
  8525. }
  8526. }
  8527. };
  8528. Router.prototype.saveHistory = function saveHistory () {
  8529. var router = this;
  8530. router.view.history = router.history;
  8531. if (router.params.pushState) {
  8532. win.localStorage[("f7router-" + (router.view.id) + "-history")] = JSON.stringify(router.history);
  8533. }
  8534. };
  8535. Router.prototype.restoreHistory = function restoreHistory () {
  8536. var router = this;
  8537. if (router.params.pushState && win.localStorage[("f7router-" + (router.view.id) + "-history")]) {
  8538. router.history = JSON.parse(win.localStorage[("f7router-" + (router.view.id) + "-history")]);
  8539. router.view.history = router.history;
  8540. }
  8541. };
  8542. Router.prototype.clearHistory = function clearHistory () {
  8543. var router = this;
  8544. router.history = [];
  8545. if (router.view) { router.view.history = []; }
  8546. router.saveHistory();
  8547. };
  8548. Router.prototype.updateCurrentUrl = function updateCurrentUrl (newUrl) {
  8549. var router = this;
  8550. appRouterCheck(router, 'updateCurrentUrl');
  8551. // Update history
  8552. if (router.history.length) {
  8553. router.history[router.history.length - 1] = newUrl;
  8554. } else {
  8555. router.history.push(newUrl);
  8556. }
  8557. // Update current route params
  8558. var ref = router.parseRouteUrl(newUrl);
  8559. var query = ref.query;
  8560. var hash = ref.hash;
  8561. var params = ref.params;
  8562. var url = ref.url;
  8563. var path = ref.path;
  8564. if (router.currentRoute) {
  8565. Utils.extend(router.currentRoute, {
  8566. query: query,
  8567. hash: hash,
  8568. params: params,
  8569. url: url,
  8570. path: path,
  8571. });
  8572. }
  8573. if (router.params.pushState) {
  8574. var pushStateRoot = router.params.pushStateRoot || '';
  8575. History.replace(
  8576. router.view.id,
  8577. {
  8578. url: newUrl,
  8579. },
  8580. pushStateRoot + router.params.pushStateSeparator + newUrl
  8581. );
  8582. }
  8583. // Save History
  8584. router.saveHistory();
  8585. router.emit('routeUrlUpdate', router.currentRoute, router);
  8586. };
  8587. Router.prototype.init = function init () {
  8588. var router = this;
  8589. var app = router.app;
  8590. var view = router.view;
  8591. // Init Swipeback
  8592. if (
  8593. (view && router.params.iosSwipeBack && app.theme === 'ios')
  8594. || (view && router.params.mdSwipeBack && app.theme === 'md')
  8595. || (view && router.params.auroraSwipeBack && app.theme === 'aurora')
  8596. ) {
  8597. SwipeBack(router);
  8598. }
  8599. var initUrl = router.params.url;
  8600. var documentUrl = doc.location.href.split(doc.location.origin)[1];
  8601. var historyRestored;
  8602. var ref = router.params;
  8603. var pushState = ref.pushState;
  8604. var pushStateOnLoad = ref.pushStateOnLoad;
  8605. var pushStateSeparator = ref.pushStateSeparator;
  8606. var pushStateAnimateOnLoad = ref.pushStateAnimateOnLoad;
  8607. var ref$1 = router.params;
  8608. var pushStateRoot = ref$1.pushStateRoot;
  8609. if (win.cordova && pushState && !pushStateSeparator && !pushStateRoot && doc.location.pathname.indexOf('index.html')) {
  8610. // eslint-disable-next-line
  8611. console.warn('Framework7: wrong or not complete pushState configuration, trying to guess pushStateRoot');
  8612. pushStateRoot = doc.location.pathname.split('index.html')[0];
  8613. }
  8614. if (!pushState || !pushStateOnLoad) {
  8615. if (!initUrl) {
  8616. initUrl = documentUrl;
  8617. }
  8618. if (doc.location.search && initUrl.indexOf('?') < 0) {
  8619. initUrl += doc.location.search;
  8620. }
  8621. if (doc.location.hash && initUrl.indexOf('#') < 0) {
  8622. initUrl += doc.location.hash;
  8623. }
  8624. } else {
  8625. if (pushStateRoot && documentUrl.indexOf(pushStateRoot) >= 0) {
  8626. documentUrl = documentUrl.split(pushStateRoot)[1];
  8627. if (documentUrl === '') { documentUrl = '/'; }
  8628. }
  8629. if (pushStateSeparator.length > 0 && documentUrl.indexOf(pushStateSeparator) >= 0) {
  8630. initUrl = documentUrl.split(pushStateSeparator)[1];
  8631. } else {
  8632. initUrl = documentUrl;
  8633. }
  8634. router.restoreHistory();
  8635. if (router.history.indexOf(initUrl) >= 0) {
  8636. router.history = router.history.slice(0, router.history.indexOf(initUrl) + 1);
  8637. } else if (router.params.url === initUrl) {
  8638. router.history = [initUrl];
  8639. } else if (History.state && History.state[view.id] && History.state[view.id].url === router.history[router.history.length - 1]) {
  8640. initUrl = router.history[router.history.length - 1];
  8641. } else {
  8642. router.history = [documentUrl.split(pushStateSeparator)[0] || '/', initUrl];
  8643. }
  8644. if (router.history.length > 1) {
  8645. historyRestored = true;
  8646. } else {
  8647. router.history = [];
  8648. }
  8649. router.saveHistory();
  8650. }
  8651. var currentRoute;
  8652. if (router.history.length > 1) {
  8653. // Will load page
  8654. currentRoute = router.findMatchingRoute(router.history[0]);
  8655. if (!currentRoute) {
  8656. currentRoute = Utils.extend(router.parseRouteUrl(router.history[0]), {
  8657. route: {
  8658. url: router.history[0],
  8659. path: router.history[0].split('?')[0],
  8660. },
  8661. });
  8662. }
  8663. } else {
  8664. // Don't load page
  8665. currentRoute = router.findMatchingRoute(initUrl);
  8666. if (!currentRoute) {
  8667. currentRoute = Utils.extend(router.parseRouteUrl(initUrl), {
  8668. route: {
  8669. url: initUrl,
  8670. path: initUrl.split('?')[0],
  8671. },
  8672. });
  8673. }
  8674. }
  8675. if (router.params.stackPages) {
  8676. router.$el.children('.page').each(function (index, pageEl) {
  8677. var $pageEl = $(pageEl);
  8678. router.initialPages.push($pageEl[0]);
  8679. if (router.dynamicNavbar && $pageEl.children('.navbar').length > 0) {
  8680. router.initialNavbars.push($pageEl.children('.navbar')[0]);
  8681. }
  8682. });
  8683. }
  8684. if (router.$el.children('.page:not(.stacked)').length === 0 && initUrl && router.params.loadInitialPage) {
  8685. // No pages presented in DOM, reload new page
  8686. router.navigate(initUrl, {
  8687. initial: true,
  8688. reloadCurrent: true,
  8689. pushState: false,
  8690. });
  8691. } else if (router.$el.children('.page:not(.stacked)').length) {
  8692. // Init current DOM page
  8693. var hasTabRoute;
  8694. router.currentRoute = currentRoute;
  8695. router.$el.children('.page:not(.stacked)').each(function (index, pageEl) {
  8696. var $pageEl = $(pageEl);
  8697. var $navbarEl;
  8698. router.setPagePosition($pageEl, 'current');
  8699. if (router.dynamicNavbar) {
  8700. $navbarEl = $pageEl.children('.navbar');
  8701. if ($navbarEl.length > 0) {
  8702. if (!router.$navbarsEl.parents(doc).length) {
  8703. router.$el.prepend(router.$navbarsEl);
  8704. }
  8705. router.setNavbarPosition($navbarEl, 'current');
  8706. router.$navbarsEl.append($navbarEl);
  8707. if ($navbarEl.children('.title-large').length) {
  8708. $navbarEl.addClass('navbar-large');
  8709. }
  8710. $pageEl.children('.navbar').remove();
  8711. } else {
  8712. router.$navbarsEl.addClass('navbar-hidden');
  8713. if ($navbarEl.children('.title-large').length) {
  8714. router.$navbarsEl.addClass('navbar-hidden navbar-large-hidden');
  8715. }
  8716. }
  8717. }
  8718. if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.master && router.params.masterDetailBreakpoint > 0) {
  8719. $pageEl.addClass('page-master');
  8720. $pageEl.trigger('page:role', { role: 'master' });
  8721. if ($navbarEl && $navbarEl.length) {
  8722. $navbarEl.addClass('navbar-master');
  8723. }
  8724. view.checkMasterDetailBreakpoint();
  8725. }
  8726. var initOptions = {
  8727. route: router.currentRoute,
  8728. };
  8729. if (router.currentRoute && router.currentRoute.route && router.currentRoute.route.options) {
  8730. Utils.extend(initOptions, router.currentRoute.route.options);
  8731. }
  8732. router.currentPageEl = $pageEl[0];
  8733. if (router.dynamicNavbar && $navbarEl.length) {
  8734. router.currentNavbarEl = $navbarEl[0];
  8735. }
  8736. router.removeThemeElements($pageEl);
  8737. if (router.dynamicNavbar && $navbarEl.length) {
  8738. router.removeThemeElements($navbarEl);
  8739. }
  8740. if (initOptions.route.route.tab) {
  8741. hasTabRoute = true;
  8742. router.tabLoad(initOptions.route.route.tab, Utils.extend({}, initOptions));
  8743. }
  8744. router.pageCallback('init', $pageEl, $navbarEl, 'current', undefined, initOptions);
  8745. });
  8746. if (historyRestored) {
  8747. router.navigate(initUrl, {
  8748. initial: true,
  8749. pushState: false,
  8750. history: false,
  8751. animate: pushStateAnimateOnLoad,
  8752. once: {
  8753. pageAfterIn: function pageAfterIn() {
  8754. var preloadPreviousPage = router.params.preloadPreviousPage || router.params[((app.theme) + "SwipeBack")];
  8755. if (preloadPreviousPage && router.history.length > 2) {
  8756. router.back({ preload: true });
  8757. }
  8758. },
  8759. },
  8760. });
  8761. }
  8762. if (!historyRestored && !hasTabRoute) {
  8763. router.history.push(initUrl);
  8764. router.saveHistory();
  8765. }
  8766. }
  8767. if (initUrl && pushState && pushStateOnLoad && (!History.state || !History.state[view.id])) {
  8768. History.initViewState(view.id, {
  8769. url: initUrl,
  8770. });
  8771. }
  8772. router.emit('local::init routerInit', router);
  8773. };
  8774. Router.prototype.destroy = function destroy () {
  8775. var router = this;
  8776. router.emit('local::destroy routerDestroy', router);
  8777. // Delete props & methods
  8778. Object.keys(router).forEach(function (routerProp) {
  8779. router[routerProp] = null;
  8780. delete router[routerProp];
  8781. });
  8782. router = null;
  8783. };
  8784. return Router;
  8785. }(Framework7Class));
  8786. // Load
  8787. Router.prototype.forward = forward;
  8788. Router.prototype.load = load;
  8789. Router.prototype.navigate = navigate;
  8790. Router.prototype.refreshPage = refreshPage;
  8791. // Tab
  8792. Router.prototype.tabLoad = tabLoad;
  8793. Router.prototype.tabRemove = tabRemove;
  8794. // Modal
  8795. Router.prototype.modalLoad = modalLoad;
  8796. Router.prototype.modalRemove = modalRemove;
  8797. // Back
  8798. Router.prototype.backward = backward;
  8799. Router.prototype.loadBack = loadBack;
  8800. Router.prototype.back = back;
  8801. // Clear history
  8802. Router.prototype.clearPreviousHistory = clearPreviousHistory;
  8803. var RouterModule = {
  8804. name: 'router',
  8805. static: {
  8806. Router: Router,
  8807. },
  8808. instance: {
  8809. cache: {
  8810. xhr: [],
  8811. templates: [],
  8812. components: [],
  8813. },
  8814. },
  8815. create: function create() {
  8816. var instance = this;
  8817. if (instance.app) {
  8818. // View Router
  8819. if (instance.params.router) {
  8820. instance.router = new Router(instance.app, instance);
  8821. }
  8822. } else {
  8823. // App Router
  8824. instance.router = new Router(instance);
  8825. }
  8826. },
  8827. };
  8828. function resizableView(view) {
  8829. var app = view.app;
  8830. if (view.resizableInitialized) { return; }
  8831. Utils.extend(view, {
  8832. resizable: true,
  8833. resizableWidth: null,
  8834. resizableInitialized: true,
  8835. });
  8836. var $htmlEl = $('html');
  8837. var $el = view.$el;
  8838. if (!$el) { return; }
  8839. var $resizeHandlerEl;
  8840. var isTouched;
  8841. var isMoved;
  8842. var touchesStart = {};
  8843. var touchesDiff;
  8844. var width;
  8845. var minWidth;
  8846. var maxWidth;
  8847. function transformCSSWidth(v) {
  8848. if (!v) { return null; }
  8849. if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {
  8850. return parseInt(v, 10) / 100 * app.width;
  8851. }
  8852. var newV = parseInt(v, 10);
  8853. if (Number.isNaN(newV)) { return null; }
  8854. return newV;
  8855. }
  8856. function isResizable() {
  8857. return view.resizable && $el.hasClass('view-resizable') && $el.hasClass('view-master-detail');
  8858. }
  8859. function handleTouchStart(e) {
  8860. if (!isResizable()) { return; }
  8861. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  8862. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  8863. isMoved = false;
  8864. isTouched = true;
  8865. var $pageMasterEl = $el.children('.page-master');
  8866. minWidth = transformCSSWidth($pageMasterEl.css('min-width'));
  8867. maxWidth = transformCSSWidth($pageMasterEl.css('max-width'));
  8868. }
  8869. function handleTouchMove(e) {
  8870. if (!isTouched) { return; }
  8871. e.f7PreventSwipePanel = true;
  8872. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  8873. if (!isMoved) {
  8874. width = $resizeHandlerEl[0].offsetLeft + $resizeHandlerEl[0].offsetWidth;
  8875. $el.addClass('view-resizing');
  8876. $htmlEl.css('cursor', 'col-resize');
  8877. }
  8878. isMoved = true;
  8879. e.preventDefault();
  8880. touchesDiff = (pageX - touchesStart.x);
  8881. var newWidth = width + touchesDiff;
  8882. if (minWidth && !Number.isNaN(minWidth)) {
  8883. newWidth = Math.max(newWidth, minWidth);
  8884. }
  8885. if (maxWidth && !Number.isNaN(maxWidth)) {
  8886. newWidth = Math.min(newWidth, maxWidth);
  8887. }
  8888. newWidth = Math.min(Math.max(newWidth, 0), app.width);
  8889. view.resizableWidth = newWidth;
  8890. $htmlEl[0].style.setProperty('--f7-page-master-width', (newWidth + "px"));
  8891. $el.trigger('view:resize', newWidth);
  8892. view.emit('local::resize viewResize', view, newWidth);
  8893. }
  8894. function handleTouchEnd() {
  8895. $('html').css('cursor', '');
  8896. if (!isTouched || !isMoved) {
  8897. isTouched = false;
  8898. isMoved = false;
  8899. return;
  8900. }
  8901. isTouched = false;
  8902. isMoved = false;
  8903. $htmlEl[0].style.setProperty('--f7-page-master-width', ((view.resizableWidth) + "px"));
  8904. $el.removeClass('view-resizing');
  8905. }
  8906. function handleResize() {
  8907. if (!view.resizableWidth) { return; }
  8908. minWidth = transformCSSWidth($resizeHandlerEl.css('min-width'));
  8909. maxWidth = transformCSSWidth($resizeHandlerEl.css('max-width'));
  8910. if (minWidth && !Number.isNaN(minWidth) && view.resizableWidth < minWidth) {
  8911. view.resizableWidth = Math.max(view.resizableWidth, minWidth);
  8912. }
  8913. if (maxWidth && !Number.isNaN(maxWidth) && view.resizableWidth > maxWidth) {
  8914. view.resizableWidth = Math.min(view.resizableWidth, maxWidth);
  8915. }
  8916. view.resizableWidth = Math.min(Math.max(view.resizableWidth, 0), app.width);
  8917. $htmlEl[0].style.setProperty('--f7-page-master-width', ((view.resizableWidth) + "px"));
  8918. }
  8919. $resizeHandlerEl = view.$el.children('.view-resize-handler');
  8920. if (!$resizeHandlerEl.length) {
  8921. view.$el.append('<div class="view-resize-handler"></div>');
  8922. $resizeHandlerEl = view.$el.children('.view-resize-handler');
  8923. }
  8924. view.$resizeHandlerEl = $resizeHandlerEl;
  8925. $el.addClass('view-resizable');
  8926. // Add Events
  8927. var passive = Support.passiveListener ? { passive: true } : false;
  8928. view.$el.on(app.touchEvents.start, '.view-resize-handler', handleTouchStart, passive);
  8929. app.on('touchmove:active', handleTouchMove);
  8930. app.on('touchend:passive', handleTouchEnd);
  8931. app.on('resize', handleResize);
  8932. view.on('beforeOpen', handleResize);
  8933. view.once('viewDestroy', function () {
  8934. $el.removeClass('view-resizable');
  8935. view.$resizeHandlerEl.remove();
  8936. view.$el.off(app.touchEvents.start, '.view-resize-handler', handleTouchStart, passive);
  8937. app.off('touchmove:active', handleTouchMove);
  8938. app.off('touchend:passive', handleTouchEnd);
  8939. app.off('resize', handleResize);
  8940. view.off('beforeOpen', handleResize);
  8941. });
  8942. }
  8943. var View = /*@__PURE__*/(function (Framework7Class) {
  8944. function View(appInstance, el, viewParams) {
  8945. if ( viewParams === void 0 ) viewParams = {};
  8946. Framework7Class.call(this, viewParams, [appInstance]);
  8947. var app = appInstance;
  8948. var $el = $(el);
  8949. var view = this;
  8950. var defaults = {
  8951. routes: [],
  8952. routesAdd: [],
  8953. };
  8954. if ($el.length === 0) {
  8955. var message = 'Framework7: can\'t create a View instance because ';
  8956. message += (typeof el === 'string')
  8957. ? ("the selector \"" + el + "\" didn't match any element")
  8958. : 'el must be an HTMLElement or Dom7 object';
  8959. throw new Error(message);
  8960. }
  8961. // Default View params
  8962. view.params = Utils.extend(defaults, app.params.view, viewParams);
  8963. // Routes
  8964. if (view.params.routes.length > 0) {
  8965. view.routes = view.params.routes;
  8966. } else {
  8967. view.routes = [].concat(app.routes, view.params.routesAdd);
  8968. }
  8969. // Selector
  8970. var selector;
  8971. if (typeof el === 'string') { selector = el; }
  8972. else {
  8973. // Supposed to be HTMLElement or Dom7
  8974. selector = ($el.attr('id') ? ("#" + ($el.attr('id'))) : '') + ($el.attr('class') ? ("." + ($el.attr('class').replace(/ /g, '.').replace('.active', ''))) : '');
  8975. }
  8976. // DynamicNavbar
  8977. var $navbarsEl;
  8978. if (app.theme === 'ios' && view.params.iosDynamicNavbar) {
  8979. $navbarsEl = $el.children('.navbars').eq(0);
  8980. if ($navbarsEl.length === 0) {
  8981. $navbarsEl = $('<div class="navbars"></div>');
  8982. }
  8983. }
  8984. // View Props
  8985. Utils.extend(false, view, {
  8986. app: app,
  8987. $el: $el,
  8988. el: $el[0],
  8989. name: view.params.name,
  8990. main: view.params.main || $el.hasClass('view-main'),
  8991. $navbarsEl: $navbarsEl,
  8992. navbarsEl: $navbarsEl ? $navbarsEl[0] : undefined,
  8993. selector: selector,
  8994. history: [],
  8995. scrollHistory: {},
  8996. });
  8997. // Save in DOM
  8998. $el[0].f7View = view;
  8999. // Install Modules
  9000. view.useModules();
  9001. // Add to app
  9002. app.views.push(view);
  9003. if (view.main) {
  9004. app.views.main = view;
  9005. }
  9006. if (view.name) {
  9007. app.views[view.name] = view;
  9008. }
  9009. // Index
  9010. view.index = app.views.indexOf(view);
  9011. // View ID
  9012. var viewId;
  9013. if (view.name) {
  9014. viewId = "view_" + (view.name);
  9015. } else if (view.main) {
  9016. viewId = 'view_main';
  9017. } else {
  9018. viewId = "view_" + (view.index);
  9019. }
  9020. view.id = viewId;
  9021. // Init View
  9022. if (app.initialized) {
  9023. view.init();
  9024. } else {
  9025. app.on('init', function () {
  9026. view.init();
  9027. });
  9028. }
  9029. return view;
  9030. }
  9031. if ( Framework7Class ) View.__proto__ = Framework7Class;
  9032. View.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  9033. View.prototype.constructor = View;
  9034. View.prototype.destroy = function destroy () {
  9035. var view = this;
  9036. var app = view.app;
  9037. view.$el.trigger('view:beforedestroy');
  9038. view.emit('local::beforeDestroy viewBeforeDestroy', view);
  9039. app.off('resize', view.checkMasterDetailBreakpoint);
  9040. if (view.main) {
  9041. app.views.main = null;
  9042. delete app.views.main;
  9043. } else if (view.name) {
  9044. app.views[view.name] = null;
  9045. delete app.views[view.name];
  9046. }
  9047. view.$el[0].f7View = null;
  9048. delete view.$el[0].f7View;
  9049. app.views.splice(app.views.indexOf(view), 1);
  9050. // Destroy Router
  9051. if (view.params.router && view.router) {
  9052. view.router.destroy();
  9053. }
  9054. view.emit('local::destroy viewDestroy', view);
  9055. // Delete props & methods
  9056. Object.keys(view).forEach(function (viewProp) {
  9057. view[viewProp] = null;
  9058. delete view[viewProp];
  9059. });
  9060. view = null;
  9061. };
  9062. View.prototype.checkMasterDetailBreakpoint = function checkMasterDetailBreakpoint (force) {
  9063. var view = this;
  9064. var app = view.app;
  9065. var wasMasterDetail = view.$el.hasClass('view-master-detail');
  9066. var isMasterDetail = app.width >= view.params.masterDetailBreakpoint && view.$el.children('.page-master').length;
  9067. if ((typeof force === 'undefined' && isMasterDetail) || force === true) {
  9068. view.$el.addClass('view-master-detail');
  9069. if (!wasMasterDetail) {
  9070. view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint', view);
  9071. view.$el.trigger('view:masterDetailBreakpoint');
  9072. }
  9073. } else {
  9074. view.$el.removeClass('view-master-detail');
  9075. if (wasMasterDetail) {
  9076. view.emit('local::masterDetailBreakpoint viewMasterDetailBreakpoint', view);
  9077. view.$el.trigger('view:masterDetailBreakpoint');
  9078. }
  9079. }
  9080. };
  9081. View.prototype.initMasterDetail = function initMasterDetail () {
  9082. var view = this;
  9083. var app = view.app;
  9084. view.checkMasterDetailBreakpoint = view.checkMasterDetailBreakpoint.bind(view);
  9085. view.checkMasterDetailBreakpoint();
  9086. if (view.params.masterDetailResizable) {
  9087. resizableView(view);
  9088. }
  9089. app.on('resize', view.checkMasterDetailBreakpoint);
  9090. };
  9091. View.prototype.init = function init () {
  9092. var view = this;
  9093. if (view.params.router) {
  9094. if (view.params.masterDetailBreakpoint > 0) {
  9095. view.initMasterDetail();
  9096. }
  9097. view.router.init();
  9098. view.$el.trigger('view:init');
  9099. view.emit('local::init viewInit', view);
  9100. }
  9101. };
  9102. return View;
  9103. }(Framework7Class));
  9104. // Use Router
  9105. View.use(RouterModule);
  9106. function initClicks(app) {
  9107. function handleClicks(e) {
  9108. var $clickedEl = $(e.target);
  9109. var $clickedLinkEl = $clickedEl.closest('a');
  9110. var isLink = $clickedLinkEl.length > 0;
  9111. var url = isLink && $clickedLinkEl.attr('href');
  9112. // const isTabLink = isLink && $clickedLinkEl.hasClass('tab-link') && ($clickedLinkEl.attr('data-tab') || (url && url.indexOf('#') === 0));
  9113. // Check if link is external
  9114. if (isLink) {
  9115. // eslint-disable-next-line
  9116. if ($clickedLinkEl.is(app.params.clicks.externalLinks) || (url && url.indexOf('javascript:') >= 0)) {
  9117. var target = $clickedLinkEl.attr('target');
  9118. if (
  9119. url
  9120. && win.cordova
  9121. && win.cordova.InAppBrowser
  9122. && (target === '_system' || target === '_blank')
  9123. ) {
  9124. e.preventDefault();
  9125. win.cordova.InAppBrowser.open(url, target);
  9126. }
  9127. return;
  9128. }
  9129. }
  9130. // Modules Clicks
  9131. Object.keys(app.modules).forEach(function (moduleName) {
  9132. var moduleClicks = app.modules[moduleName].clicks;
  9133. if (!moduleClicks) { return; }
  9134. if (e.preventF7Router) { return; }
  9135. Object.keys(moduleClicks).forEach(function (clickSelector) {
  9136. var matchingClickedElement = $clickedEl.closest(clickSelector).eq(0);
  9137. if (matchingClickedElement.length > 0) {
  9138. moduleClicks[clickSelector].call(app, matchingClickedElement, matchingClickedElement.dataset(), e);
  9139. }
  9140. });
  9141. });
  9142. // Load Page
  9143. var clickedLinkData = {};
  9144. if (isLink) {
  9145. e.preventDefault();
  9146. clickedLinkData = $clickedLinkEl.dataset();
  9147. }
  9148. // Prevent Router
  9149. if (e.preventF7Router) { return; }
  9150. if ($clickedLinkEl.hasClass('prevent-router') || $clickedLinkEl.hasClass('router-prevent')) { return; }
  9151. var validUrl = url && url.length > 0 && url[0] !== '#';
  9152. if (validUrl || $clickedLinkEl.hasClass('back')) {
  9153. var view;
  9154. if (clickedLinkData.view && clickedLinkData.view === 'current') {
  9155. view = app.views.current;
  9156. } else if (clickedLinkData.view) {
  9157. view = $(clickedLinkData.view)[0].f7View;
  9158. } else {
  9159. view = $clickedEl.parents('.view')[0] && $clickedEl.parents('.view')[0].f7View;
  9160. if (!$clickedLinkEl.hasClass('back') && view && view.params.linksView) {
  9161. if (typeof view.params.linksView === 'string') { view = $(view.params.linksView)[0].f7View; }
  9162. else if (view.params.linksView instanceof View) { view = view.params.linksView; }
  9163. }
  9164. }
  9165. if (!view) {
  9166. if (app.views.main) { view = app.views.main; }
  9167. }
  9168. if (!view || !view.router) { return; }
  9169. if (clickedLinkData.context && typeof clickedLinkData.context === 'string') {
  9170. try {
  9171. clickedLinkData.context = JSON.parse(clickedLinkData.context);
  9172. } catch (err) {
  9173. // something wrong there
  9174. }
  9175. }
  9176. if ($clickedLinkEl[0].f7RouteProps) {
  9177. clickedLinkData.props = $clickedLinkEl[0].f7RouteProps;
  9178. }
  9179. if ($clickedLinkEl.hasClass('back')) { view.router.back(url, clickedLinkData); }
  9180. else { view.router.navigate(url, clickedLinkData); }
  9181. }
  9182. }
  9183. app.on('click', handleClicks);
  9184. }
  9185. var ClicksModule = {
  9186. name: 'clicks',
  9187. params: {
  9188. clicks: {
  9189. // External Links
  9190. externalLinks: '.external',
  9191. },
  9192. },
  9193. on: {
  9194. init: function init() {
  9195. var app = this;
  9196. initClicks(app);
  9197. },
  9198. },
  9199. };
  9200. var RouterTemplateLoaderModule = {
  9201. name: 'routerTemplateLoader',
  9202. proto: {
  9203. templateLoader: function templateLoader(template, templateUrl, options, resolve, reject) {
  9204. var router = this;
  9205. function compile(t) {
  9206. var compiledHtml;
  9207. var context;
  9208. try {
  9209. context = options.context || {};
  9210. if (typeof context === 'function') { context = context.call(router); }
  9211. else if (typeof context === 'string') {
  9212. try {
  9213. context = JSON.parse(context);
  9214. } catch (err) {
  9215. reject();
  9216. throw (err);
  9217. }
  9218. }
  9219. if (typeof t === 'function') {
  9220. compiledHtml = t(context);
  9221. } else {
  9222. compiledHtml = Template7.compile(t)(Utils.extend({}, context || {}, {
  9223. $app: router.app,
  9224. $root: Utils.extend({}, router.app.data, router.app.methods),
  9225. $route: options.route,
  9226. $f7route: options.route,
  9227. $router: router,
  9228. $f7router: router,
  9229. $theme: {
  9230. ios: router.app.theme === 'ios',
  9231. md: router.app.theme === 'md',
  9232. aurora: router.app.theme === 'aurora',
  9233. },
  9234. }));
  9235. }
  9236. } catch (err) {
  9237. reject();
  9238. throw (err);
  9239. }
  9240. resolve(compiledHtml, { context: context });
  9241. }
  9242. if (templateUrl) {
  9243. // Load via XHR
  9244. if (router.xhr) {
  9245. router.xhr.abort();
  9246. router.xhr = false;
  9247. }
  9248. router
  9249. .xhrRequest(templateUrl, options)
  9250. .then(function (templateContent) {
  9251. compile(templateContent);
  9252. })
  9253. .catch(function () {
  9254. reject();
  9255. });
  9256. } else {
  9257. compile(template);
  9258. }
  9259. },
  9260. modalTemplateLoader: function modalTemplateLoader(template, templateUrl, options, resolve, reject) {
  9261. var router = this;
  9262. return router.templateLoader(template, templateUrl, options, function (html) {
  9263. resolve(html);
  9264. }, reject);
  9265. },
  9266. tabTemplateLoader: function tabTemplateLoader(template, templateUrl, options, resolve, reject) {
  9267. var router = this;
  9268. return router.templateLoader(template, templateUrl, options, function (html) {
  9269. resolve(html);
  9270. }, reject);
  9271. },
  9272. pageTemplateLoader: function pageTemplateLoader(template, templateUrl, options, resolve, reject) {
  9273. var router = this;
  9274. return router.templateLoader(template, templateUrl, options, function (html, newOptions) {
  9275. if ( newOptions === void 0 ) newOptions = {};
  9276. resolve(router.getPageEl(html), newOptions);
  9277. }, reject);
  9278. },
  9279. },
  9280. };
  9281. var RouterComponentLoaderModule = {
  9282. name: 'routerComponentLoader',
  9283. proto: {
  9284. componentLoader: function componentLoader(component, componentUrl, options, resolve, reject) {
  9285. if ( options === void 0 ) options = {};
  9286. var router = this;
  9287. var app = router.app;
  9288. var url = typeof component === 'string' ? component : componentUrl;
  9289. var compiledUrl = router.replaceRequestUrlParams(url, options);
  9290. function compile(componentOptions) {
  9291. var context = options.context || {};
  9292. if (typeof context === 'function') { context = context.call(router); }
  9293. else if (typeof context === 'string') {
  9294. try {
  9295. context = JSON.parse(context);
  9296. } catch (err) {
  9297. reject(err);
  9298. throw (err);
  9299. }
  9300. }
  9301. var extendContext = Utils.merge(
  9302. {},
  9303. context,
  9304. {
  9305. $route: options.route,
  9306. $f7route: options.route,
  9307. $router: router,
  9308. $f7router: router,
  9309. $theme: {
  9310. ios: app.theme === 'ios',
  9311. md: app.theme === 'md',
  9312. aurora: app.theme === 'aurora',
  9313. },
  9314. }
  9315. );
  9316. if (options.componentOptions && options.componentOptions.el) {
  9317. componentOptions.el = options.componentOptions.el;
  9318. }
  9319. if (options.componentOptions && options.componentOptions.root) {
  9320. componentOptions.root = options.componentOptions.root;
  9321. }
  9322. app.component.create(componentOptions, extendContext)
  9323. .then(function (createdComponent) {
  9324. resolve(createdComponent.el);
  9325. })
  9326. .catch(function (err) {
  9327. reject(err);
  9328. throw new Error(err);
  9329. });
  9330. }
  9331. var cachedComponent;
  9332. if (compiledUrl && router.params.componentCache) {
  9333. router.cache.components.forEach(function (cached) {
  9334. if (cached.url === compiledUrl) { cachedComponent = cached.component; }
  9335. });
  9336. }
  9337. if (compiledUrl && cachedComponent) {
  9338. compile(cachedComponent);
  9339. } else if (compiledUrl && !cachedComponent) {
  9340. // Load via XHR
  9341. if (router.xhr) {
  9342. router.xhr.abort();
  9343. router.xhr = false;
  9344. }
  9345. router
  9346. .xhrRequest(url, options)
  9347. .then(function (loadedComponent) {
  9348. var parsedComponent = app.component.parse(loadedComponent);
  9349. if (router.params.componentCache) {
  9350. router.cache.components.push({
  9351. url: compiledUrl,
  9352. component: parsedComponent,
  9353. });
  9354. }
  9355. compile(parsedComponent);
  9356. })
  9357. .catch(function (err) {
  9358. reject();
  9359. throw (err);
  9360. });
  9361. } else {
  9362. compile(component);
  9363. }
  9364. },
  9365. modalComponentLoader: function modalComponentLoader(rootEl, component, componentUrl, options, resolve, reject) {
  9366. var router = this;
  9367. router.componentLoader(component, componentUrl, options, function (el) {
  9368. resolve(el);
  9369. }, reject);
  9370. },
  9371. tabComponentLoader: function tabComponentLoader(tabEl, component, componentUrl, options, resolve, reject) {
  9372. var router = this;
  9373. router.componentLoader(component, componentUrl, options, function (el) {
  9374. resolve(el);
  9375. }, reject);
  9376. },
  9377. pageComponentLoader: function pageComponentLoader(routerEl, component, componentUrl, options, resolve, reject) {
  9378. var router = this;
  9379. router.componentLoader(component, componentUrl, options, function (el, newOptions) {
  9380. if ( newOptions === void 0 ) newOptions = {};
  9381. resolve(el, newOptions);
  9382. }, reject);
  9383. },
  9384. },
  9385. };
  9386. function vnode(sel, data, children, text, elm) {
  9387. var key = data === undefined ? undefined : data.key;
  9388. return { sel: sel, data: data, children: children,
  9389. text: text, elm: elm, key: key };
  9390. }
  9391. var array = Array.isArray;
  9392. function primitive(s) {
  9393. return typeof s === 'string' || typeof s === 'number';
  9394. }
  9395. function addNS(data, children, sel) {
  9396. data.ns = 'http://www.w3.org/2000/svg';
  9397. if (sel !== 'foreignObject' && children !== undefined) {
  9398. for (var i = 0; i < children.length; ++i) {
  9399. var childData = children[i].data;
  9400. if (childData !== undefined) {
  9401. addNS(childData, children[i].children, children[i].sel);
  9402. }
  9403. }
  9404. }
  9405. }
  9406. function h(sel, b, c) {
  9407. var data = {}, children, text, i;
  9408. if (c !== undefined) {
  9409. data = b;
  9410. if (array(c)) {
  9411. children = c;
  9412. }
  9413. else if (primitive(c)) {
  9414. text = c;
  9415. }
  9416. else if (c && c.sel) {
  9417. children = [c];
  9418. }
  9419. }
  9420. else if (b !== undefined) {
  9421. if (array(b)) {
  9422. children = b;
  9423. }
  9424. else if (primitive(b)) {
  9425. text = b;
  9426. }
  9427. else if (b && b.sel) {
  9428. children = [b];
  9429. }
  9430. else {
  9431. data = b;
  9432. }
  9433. }
  9434. if (array(children)) {
  9435. for (i = 0; i < children.length; ++i) {
  9436. if (primitive(children[i]))
  9437. { children[i] = vnode(undefined, undefined, undefined, children[i], undefined); }
  9438. }
  9439. }
  9440. if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&
  9441. (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
  9442. addNS(data, children, sel);
  9443. }
  9444. return vnode(sel, data, children, text, undefined);
  9445. }
  9446. var customComponents = {};
  9447. /* eslint no-use-before-define: "off" */
  9448. var selfClosing = 'area base br col command embed hr img input keygen link menuitem meta param source track wbr'.split(' ');
  9449. var propsAttrs = 'hidden checked disabled readonly selected autofocus autoplay required multiple value indeterminate'.split(' ');
  9450. var booleanProps = 'hidden checked disabled readonly selected autofocus autoplay required multiple readOnly indeterminate'.split(' ');
  9451. var tempDomDIV = doc.createElement('div');
  9452. var tempDomTBODY;
  9453. var tempDomTROW;
  9454. function toCamelCase$1(name) {
  9455. return name
  9456. .split('-')
  9457. .map(function (word, index) {
  9458. if (index === 0) { return word.toLowerCase(); }
  9459. return word[0].toUpperCase() + word.substr(1);
  9460. })
  9461. .join('');
  9462. }
  9463. function contextFromAttrs() {
  9464. var args = [], len = arguments.length;
  9465. while ( len-- ) args[ len ] = arguments[ len ];
  9466. var context = {};
  9467. args.forEach(function (obj) {
  9468. if ( obj === void 0 ) obj = {};
  9469. Object.keys(obj).forEach(function (key) {
  9470. context[toCamelCase$1(key)] = obj[key];
  9471. });
  9472. });
  9473. return context;
  9474. }
  9475. function createCustomComponent(ref) {
  9476. var app = ref.app;
  9477. var vnode = ref.vnode;
  9478. var tagName = ref.tagName;
  9479. var data = ref.data;
  9480. app.component.create(
  9481. Object.assign({ el: vnode.elm }, customComponents[tagName]),
  9482. {
  9483. $props: contextFromAttrs(data.attrs || {}, data.props || {}),
  9484. },
  9485. vnode.children
  9486. ).then(function (c) {
  9487. if (vnode.data && vnode.data.on && c && c.$el) {
  9488. Object.keys(vnode.data.on).forEach(function (eventName) {
  9489. c.$el.on(eventName, vnode.data.on[eventName]);
  9490. });
  9491. }
  9492. // eslint-disable-next-line
  9493. vnode.elm.__component__ = c;
  9494. });
  9495. }
  9496. function updateCustomComponent(vnode) {
  9497. // eslint-disable-next-line
  9498. var component = vnode && vnode.elm && vnode.elm.__component__;
  9499. if (!component) { return; }
  9500. var newProps = contextFromAttrs(vnode.data.attrs || {}, vnode.data.props || {});
  9501. component.$children = vnode.children;
  9502. Object.assign(component.$props, newProps);
  9503. component.$update();
  9504. }
  9505. function destroyCustomComponent(vnode) {
  9506. // eslint-disable-next-line
  9507. var component = vnode && vnode.elm && vnode.elm.__component__;
  9508. if (component) {
  9509. var el = component.el;
  9510. var $el = component.$el;
  9511. if (vnode.data && vnode.data.on && $el) {
  9512. Object.keys(vnode.data.on).forEach(function (eventName) {
  9513. $el.off(eventName, vnode.data.on[eventName]);
  9514. });
  9515. }
  9516. if (component.$destroy) { component.$destroy(); }
  9517. if (el && el.parentNode) { el.parentNode.removeChild(el); }
  9518. delete vnode.elm.__component__; // eslint-disable-line
  9519. }
  9520. }
  9521. function getHooks(data, app, initial, isRoot, tagName) {
  9522. var hooks = {};
  9523. var insert = [];
  9524. var destroy = [];
  9525. var update = [];
  9526. var postpatch = [];
  9527. var isFakeElement = false;
  9528. if (data && data.attrs && data.attrs.component) {
  9529. // eslint-disable-next-line
  9530. tagName = data.attrs.component;
  9531. delete data.attrs.component;
  9532. isFakeElement = true;
  9533. }
  9534. var isCustomComponent = tagName && tagName.indexOf('-') > 0 && customComponents[tagName];
  9535. if (isCustomComponent) {
  9536. insert.push(function (vnode) {
  9537. if (vnode.sel !== tagName && !isFakeElement) { return; }
  9538. createCustomComponent({ app: app, vnode: vnode, tagName: tagName, data: data });
  9539. });
  9540. destroy.push(function (vnode) {
  9541. destroyCustomComponent(vnode);
  9542. });
  9543. update.push(function (oldVnode, vnode) {
  9544. updateCustomComponent(vnode);
  9545. });
  9546. }
  9547. if (!isCustomComponent) {
  9548. if (!data || !data.attrs || !data.attrs.class) { return hooks; }
  9549. var classNames = data.attrs.class;
  9550. classNames.split(' ').forEach(function (className) {
  9551. if (!initial) {
  9552. insert.push.apply(insert, app.getVnodeHooks('insert', className));
  9553. }
  9554. destroy.push.apply(destroy, app.getVnodeHooks('destroy', className));
  9555. update.push.apply(update, app.getVnodeHooks('update', className));
  9556. postpatch.push.apply(postpatch, app.getVnodeHooks('postpatch', className));
  9557. });
  9558. }
  9559. if (isRoot && !initial) {
  9560. postpatch.push(function (oldVnode, vnode) {
  9561. var vn = vnode || oldVnode;
  9562. if (!vn) { return; }
  9563. if (vn.data && vn.data.context && vn.data.context.$options.updated) {
  9564. vn.data.context.$hook('updated');
  9565. }
  9566. });
  9567. }
  9568. if (insert.length === 0 && destroy.length === 0 && update.length === 0 && postpatch.length === 0) {
  9569. return hooks;
  9570. }
  9571. if (insert.length) {
  9572. hooks.insert = function (vnode) {
  9573. insert.forEach(function (f) { return f(vnode); });
  9574. };
  9575. }
  9576. if (destroy.length) {
  9577. hooks.destroy = function (vnode) {
  9578. destroy.forEach(function (f) { return f(vnode); });
  9579. };
  9580. }
  9581. if (update.length) {
  9582. hooks.update = function (oldVnode, vnode) {
  9583. update.forEach(function (f) { return f(oldVnode, vnode); });
  9584. };
  9585. }
  9586. if (postpatch.length) {
  9587. hooks.postpatch = function (oldVnode, vnode) {
  9588. postpatch.forEach(function (f) { return f(oldVnode, vnode); });
  9589. };
  9590. }
  9591. return hooks;
  9592. }
  9593. function getEventHandler(handlerString, context, ref) {
  9594. if ( ref === void 0 ) ref = {};
  9595. var stop = ref.stop;
  9596. var prevent = ref.prevent;
  9597. var once = ref.once;
  9598. var fired = false;
  9599. var methodName;
  9600. var method;
  9601. var needMethodBind = true;
  9602. if (handlerString.indexOf('(') < 0) {
  9603. methodName = handlerString;
  9604. } else {
  9605. methodName = handlerString.split('(')[0];
  9606. }
  9607. if (methodName.indexOf('.') >= 0) {
  9608. methodName.split('.').forEach(function (path, pathIndex) {
  9609. if (pathIndex === 0 && path === 'this') { return; }
  9610. if (pathIndex === 0 && path === 'window') {
  9611. // eslint-disable-next-line
  9612. method = win;
  9613. needMethodBind = false;
  9614. return;
  9615. }
  9616. if (!method) { method = context; }
  9617. if (method[path]) { method = method[path]; }
  9618. else {
  9619. throw new Error(("Framework7: Component doesn't have method \"" + (methodName.split('.').slice(0, pathIndex + 1).join('.')) + "\""));
  9620. }
  9621. });
  9622. } else {
  9623. if (!context[methodName]) {
  9624. throw new Error(("Framework7: Component doesn't have method \"" + methodName + "\""));
  9625. }
  9626. method = context[methodName];
  9627. }
  9628. if (needMethodBind) {
  9629. method = method.bind(context);
  9630. }
  9631. function handler() {
  9632. var args = [], len = arguments.length;
  9633. while ( len-- ) args[ len ] = arguments[ len ];
  9634. var e = args[0];
  9635. var customArgs = [];
  9636. if (once && fired) { return; }
  9637. if (stop) { e.stopPropagation(); }
  9638. if (prevent) { e.preventDefault(); }
  9639. fired = true;
  9640. if (handlerString.indexOf('(') < 0) {
  9641. customArgs = args;
  9642. } else {
  9643. var handlerArguments = handlerString
  9644. .split('(')[1]
  9645. .split(')')[0]
  9646. .replace(/'[^']*'|"[^"]*"/g, function (a) { return a.replace(/,/g, '<_comma_>'); })
  9647. .split(',')
  9648. .map(function (a) { return a.replace(/<_comma_>/g, ','); });
  9649. handlerArguments.forEach(function (argument) {
  9650. var arg = argument.trim();
  9651. // eslint-disable-next-line
  9652. if (!isNaN(arg)) { arg = parseFloat(arg); }
  9653. else if (arg === 'true') { arg = true; }
  9654. else if (arg === 'false') { arg = false; }
  9655. else if (arg === 'null') { arg = null; }
  9656. else if (arg === 'undefined') { arg = undefined; }
  9657. else if (arg[0] === '"') { arg = arg.replace(/"/g, ''); }
  9658. else if (arg[0] === '\'') { arg = arg.replace(/'/g, ''); }
  9659. else if (arg.indexOf('.') > 0) {
  9660. var deepArg;
  9661. arg.split('.').forEach(function (path) {
  9662. if (!deepArg) { deepArg = context; }
  9663. deepArg = deepArg[path];
  9664. });
  9665. arg = deepArg;
  9666. } else {
  9667. arg = context[arg];
  9668. }
  9669. customArgs.push(arg);
  9670. });
  9671. }
  9672. method.apply(void 0, customArgs);
  9673. }
  9674. return handler;
  9675. }
  9676. function getData(el, context, app, initial, isRoot, tagName) {
  9677. var data = { context: context };
  9678. var attributes = el.attributes;
  9679. Array.prototype.forEach.call(attributes, function (attr) {
  9680. var attrName = attr.name;
  9681. var attrValue = attr.value;
  9682. if (propsAttrs.indexOf(attrName) >= 0) {
  9683. // Props
  9684. if (!data.props) { data.props = {}; }
  9685. if (attrName === 'readonly') {
  9686. attrName = 'readOnly';
  9687. }
  9688. if (tagName === 'option' && attrName === 'value') {
  9689. if (!data.attrs) { data.attrs = {}; }
  9690. data.attrs.value = attrValue;
  9691. }
  9692. if (booleanProps.indexOf(attrName) >= 0) {
  9693. // eslint-disable-next-line
  9694. data.props[attrName] = attrValue === false ? false : true;
  9695. } else {
  9696. data.props[attrName] = attrValue;
  9697. }
  9698. } else if (attrName === 'key') {
  9699. // Key
  9700. data.key = attrValue;
  9701. } else if (attrName.indexOf('@') === 0) {
  9702. // Events
  9703. if (!data.on) { data.on = {}; }
  9704. var eventName = attrName.substr(1);
  9705. var stop = false;
  9706. var prevent = false;
  9707. var once = false;
  9708. if (eventName.indexOf('.') >= 0) {
  9709. eventName.split('.').forEach(function (eventNamePart, eventNameIndex) {
  9710. if (eventNameIndex === 0) { eventName = eventNamePart; }
  9711. else {
  9712. if (eventNamePart === 'stop') { stop = true; }
  9713. if (eventNamePart === 'prevent') { prevent = true; }
  9714. if (eventNamePart === 'once') { once = true; }
  9715. }
  9716. });
  9717. }
  9718. data.on[eventName] = getEventHandler(attrValue, context, { stop: stop, prevent: prevent, once: once });
  9719. } else if (attrName === 'style') {
  9720. // Style
  9721. if (attrValue.indexOf('{') >= 0 && attrValue.indexOf('}') >= 0) {
  9722. try {
  9723. data.style = JSON.parse(attrValue);
  9724. } catch (e) {
  9725. if (!data.attrs) { data.attrs = {}; }
  9726. data.attrs.style = attrValue;
  9727. }
  9728. } else {
  9729. if (!data.attrs) { data.attrs = {}; }
  9730. data.attrs.style = attrValue;
  9731. }
  9732. } else {
  9733. // Rest of attribures
  9734. if (!data.attrs) { data.attrs = {}; }
  9735. data.attrs[attrName] = attrValue;
  9736. // ID -> Key
  9737. if (attrName === 'id' && !data.key && !isRoot) {
  9738. data.key = attrValue;
  9739. }
  9740. }
  9741. });
  9742. if (isRoot && context && context.$id && context.$style && context.$styleScoped) {
  9743. if (!data.attrs) { data.attrs = {}; }
  9744. data.attrs[("data-f7-" + (context.$id))] = '';
  9745. }
  9746. var hooks = getHooks(data, app, initial, isRoot, tagName);
  9747. hooks.prepatch = function (oldVnode, vnode) {
  9748. if (!oldVnode || !vnode) { return; }
  9749. if (oldVnode && oldVnode.data && oldVnode.data.props) {
  9750. Object.keys(oldVnode.data.props).forEach(function (key) {
  9751. if (booleanProps.indexOf(key) < 0) { return; }
  9752. if (!vnode.data) { vnode.data = {}; }
  9753. if (!vnode.data.props) { vnode.data.props = {}; }
  9754. if (oldVnode.data.props[key] === true && !(key in vnode.data.props)) {
  9755. vnode.data.props[key] = false;
  9756. }
  9757. });
  9758. }
  9759. };
  9760. if (hooks) {
  9761. data.hook = hooks;
  9762. }
  9763. return data;
  9764. }
  9765. function getChildren(el, context, app, initial) {
  9766. var children = [];
  9767. var nodes = el.childNodes;
  9768. for (var i = 0; i < nodes.length; i += 1) {
  9769. var childNode = nodes[i];
  9770. var child = elementToVNode(childNode, context, app, initial);
  9771. if (Array.isArray(child)) {
  9772. children.push.apply(children, child);
  9773. } else if (child) {
  9774. children.push(child);
  9775. }
  9776. }
  9777. return children;
  9778. }
  9779. function getSlots(slotEl, context, app, initial) {
  9780. var slotName = slotEl.getAttribute('name') || 'default';
  9781. var slots = (context.$children || [])
  9782. .filter(function (childEl) {
  9783. var childSlotName = 'default';
  9784. if (childEl.data) {
  9785. childSlotName = (childEl.data.attrs && childEl.data.attrs.slot) || 'default';
  9786. }
  9787. return childSlotName === slotName;
  9788. });
  9789. if (slots.length === 0) {
  9790. return getChildren(slotEl, context, app, initial);
  9791. }
  9792. return slots;
  9793. }
  9794. function elementToVNode(el, context, app, initial, isRoot) {
  9795. if (el.nodeType === 3) {
  9796. // text
  9797. return el.textContent;
  9798. }
  9799. if (el.nodeType !== 1) { return null; }
  9800. // element (statement adds inline SVG compatibility)
  9801. var tagName = (el instanceof win.SVGElement) ? el.nodeName : el.nodeName.toLowerCase();
  9802. if (tagName === 'slot') {
  9803. return getSlots(el, context, app, initial);
  9804. }
  9805. return h(
  9806. tagName,
  9807. getData(el, context, app, initial, isRoot, tagName),
  9808. selfClosing.indexOf(tagName) >= 0 ? [] : getChildren(el, context, app, initial)
  9809. );
  9810. }
  9811. function vdom (html, context, initial) {
  9812. if ( html === void 0 ) html = '';
  9813. // Save to temp dom
  9814. var htmlTrim = html.trim();
  9815. var tempDom = tempDomDIV;
  9816. if (htmlTrim.indexOf('<tr') === 0) {
  9817. if (!tempDomTBODY) { tempDomTBODY = doc.createElement('tbody'); }
  9818. tempDom = tempDomTBODY;
  9819. }
  9820. if (htmlTrim.indexOf('<td') === 0 || htmlTrim.indexOf('<th') === 0) {
  9821. if (!tempDomTROW) { tempDomTROW = doc.createElement('tr'); }
  9822. tempDom = tempDomTROW;
  9823. }
  9824. tempDom.innerHTML = htmlTrim;
  9825. // Parse DOM
  9826. var rootEl;
  9827. for (var i = 0; i < tempDom.childNodes.length; i += 1) {
  9828. if (!rootEl && tempDom.childNodes[i].nodeType === 1) {
  9829. rootEl = tempDom.childNodes[i];
  9830. }
  9831. }
  9832. var result = elementToVNode(rootEl, context, context.$app, initial, true);
  9833. // Clean
  9834. tempDom.innerHTML = '';
  9835. return result;
  9836. }
  9837. function createElement(tagName) {
  9838. return document.createElement(tagName);
  9839. }
  9840. function createElementNS(namespaceURI, qualifiedName) {
  9841. return document.createElementNS(namespaceURI, qualifiedName);
  9842. }
  9843. function createTextNode(text) {
  9844. return document.createTextNode(text);
  9845. }
  9846. function createComment(text) {
  9847. return document.createComment(text);
  9848. }
  9849. function insertBefore$1(parentNode, newNode, referenceNode) {
  9850. if (referenceNode && referenceNode.parentNode !== parentNode) {
  9851. if (referenceNode.__component__) { referenceNode = referenceNode.__component__.el; }
  9852. }
  9853. parentNode.insertBefore(newNode, referenceNode);
  9854. }
  9855. function removeChild(node, child) {
  9856. if (!node) { return; }
  9857. node.removeChild(child);
  9858. }
  9859. function appendChild(node, child) {
  9860. node.appendChild(child);
  9861. }
  9862. function parentNode(node) {
  9863. return node.parentNode;
  9864. }
  9865. function nextSibling(node) {
  9866. return node.nextSibling;
  9867. }
  9868. function tagName(elm) {
  9869. return elm.tagName;
  9870. }
  9871. function setTextContent(node, text) {
  9872. node.textContent = text;
  9873. }
  9874. function getTextContent(node) {
  9875. return node.textContent;
  9876. }
  9877. function isElement(node) {
  9878. return node.nodeType === 1;
  9879. }
  9880. function isText(node) {
  9881. return node.nodeType === 3;
  9882. }
  9883. function isComment(node) {
  9884. return node.nodeType === 8;
  9885. }
  9886. var htmlDomApi = {
  9887. createElement: createElement,
  9888. createElementNS: createElementNS,
  9889. createTextNode: createTextNode,
  9890. createComment: createComment,
  9891. insertBefore: insertBefore$1,
  9892. removeChild: removeChild,
  9893. appendChild: appendChild,
  9894. parentNode: parentNode,
  9895. nextSibling: nextSibling,
  9896. tagName: tagName,
  9897. setTextContent: setTextContent,
  9898. getTextContent: getTextContent,
  9899. isElement: isElement,
  9900. isText: isText,
  9901. isComment: isComment,
  9902. };
  9903. function isUndef(s) { return s === undefined; }
  9904. function isDef(s) { return s !== undefined; }
  9905. var emptyNode = vnode('', {}, [], undefined, undefined);
  9906. function sameVnode(vnode1, vnode2) {
  9907. return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
  9908. }
  9909. function isVnode(vnode) {
  9910. return vnode.sel !== undefined;
  9911. }
  9912. function createKeyToOldIdx(children, beginIdx, endIdx) {
  9913. var i, map = {}, key, ch;
  9914. for (i = beginIdx; i <= endIdx; ++i) {
  9915. ch = children[i];
  9916. if (ch != null) {
  9917. key = ch.key;
  9918. if (key !== undefined)
  9919. { map[key] = i; }
  9920. }
  9921. }
  9922. return map;
  9923. }
  9924. var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
  9925. function init(modules, domApi) {
  9926. var i, j, cbs = {};
  9927. var api = domApi !== undefined ? domApi : htmlDomApi;
  9928. for (i = 0; i < hooks.length; ++i) {
  9929. cbs[hooks[i]] = [];
  9930. for (j = 0; j < modules.length; ++j) {
  9931. var hook = modules[j][hooks[i]];
  9932. if (hook !== undefined) {
  9933. cbs[hooks[i]].push(hook);
  9934. }
  9935. }
  9936. }
  9937. function emptyNodeAt(elm) {
  9938. var id = elm.id ? '#' + elm.id : '';
  9939. var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
  9940. return vnode(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
  9941. }
  9942. function createRmCb(childElm, listeners) {
  9943. return function rmCb() {
  9944. if (--listeners === 0) {
  9945. var parent_1 = api.parentNode(childElm);
  9946. api.removeChild(parent_1, childElm);
  9947. }
  9948. };
  9949. }
  9950. function createElm(vnode, insertedVnodeQueue) {
  9951. var i, data = vnode.data;
  9952. if (data !== undefined) {
  9953. if (isDef(i = data.hook) && isDef(i = i.init)) {
  9954. i(vnode);
  9955. data = vnode.data;
  9956. }
  9957. }
  9958. var children = vnode.children, sel = vnode.sel;
  9959. if (sel === '!') {
  9960. if (isUndef(vnode.text)) {
  9961. vnode.text = '';
  9962. }
  9963. vnode.elm = api.createComment(vnode.text);
  9964. }
  9965. else if (sel !== undefined) {
  9966. // Parse selector
  9967. var hashIdx = sel.indexOf('#');
  9968. var dotIdx = sel.indexOf('.', hashIdx);
  9969. var hash = hashIdx > 0 ? hashIdx : sel.length;
  9970. var dot = dotIdx > 0 ? dotIdx : sel.length;
  9971. var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
  9972. var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
  9973. : api.createElement(tag);
  9974. if (hash < dot)
  9975. { elm.setAttribute('id', sel.slice(hash + 1, dot)); }
  9976. if (dotIdx > 0)
  9977. { elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' ')); }
  9978. for (i = 0; i < cbs.create.length; ++i)
  9979. { cbs.create[i](emptyNode, vnode); }
  9980. if (array(children)) {
  9981. for (i = 0; i < children.length; ++i) {
  9982. var ch = children[i];
  9983. if (ch != null) {
  9984. api.appendChild(elm, createElm(ch, insertedVnodeQueue));
  9985. }
  9986. }
  9987. }
  9988. else if (primitive(vnode.text)) {
  9989. api.appendChild(elm, api.createTextNode(vnode.text));
  9990. }
  9991. i = vnode.data.hook; // Reuse variable
  9992. if (isDef(i)) {
  9993. if (i.create)
  9994. { i.create(emptyNode, vnode); }
  9995. if (i.insert)
  9996. { insertedVnodeQueue.push(vnode); }
  9997. }
  9998. }
  9999. else {
  10000. vnode.elm = api.createTextNode(vnode.text);
  10001. }
  10002. return vnode.elm;
  10003. }
  10004. function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
  10005. for (; startIdx <= endIdx; ++startIdx) {
  10006. var ch = vnodes[startIdx];
  10007. if (ch != null) {
  10008. api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
  10009. }
  10010. }
  10011. }
  10012. function invokeDestroyHook(vnode) {
  10013. var i, j, data = vnode.data;
  10014. if (data !== undefined) {
  10015. if (isDef(i = data.hook) && isDef(i = i.destroy))
  10016. { i(vnode); }
  10017. for (i = 0; i < cbs.destroy.length; ++i)
  10018. { cbs.destroy[i](vnode); }
  10019. if (vnode.children !== undefined) {
  10020. for (j = 0; j < vnode.children.length; ++j) {
  10021. i = vnode.children[j];
  10022. if (i != null && typeof i !== "string") {
  10023. invokeDestroyHook(i);
  10024. }
  10025. }
  10026. }
  10027. }
  10028. }
  10029. function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
  10030. for (; startIdx <= endIdx; ++startIdx) {
  10031. var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];
  10032. if (ch != null) {
  10033. if (isDef(ch.sel)) {
  10034. invokeDestroyHook(ch);
  10035. listeners = cbs.remove.length + 1;
  10036. rm = createRmCb(ch.elm, listeners);
  10037. for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)
  10038. { cbs.remove[i_1](ch, rm); }
  10039. if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
  10040. i_1(ch, rm);
  10041. }
  10042. else {
  10043. rm();
  10044. }
  10045. }
  10046. else {
  10047. api.removeChild(parentElm, ch.elm);
  10048. }
  10049. }
  10050. }
  10051. }
  10052. function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
  10053. var oldStartIdx = 0, newStartIdx = 0;
  10054. var oldEndIdx = oldCh.length - 1;
  10055. var oldStartVnode = oldCh[0];
  10056. var oldEndVnode = oldCh[oldEndIdx];
  10057. var newEndIdx = newCh.length - 1;
  10058. var newStartVnode = newCh[0];
  10059. var newEndVnode = newCh[newEndIdx];
  10060. var oldKeyToIdx;
  10061. var idxInOld;
  10062. var elmToMove;
  10063. var before;
  10064. while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
  10065. if (oldStartVnode == null) {
  10066. oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
  10067. }
  10068. else if (oldEndVnode == null) {
  10069. oldEndVnode = oldCh[--oldEndIdx];
  10070. }
  10071. else if (newStartVnode == null) {
  10072. newStartVnode = newCh[++newStartIdx];
  10073. }
  10074. else if (newEndVnode == null) {
  10075. newEndVnode = newCh[--newEndIdx];
  10076. }
  10077. else if (sameVnode(oldStartVnode, newStartVnode)) {
  10078. patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
  10079. oldStartVnode = oldCh[++oldStartIdx];
  10080. newStartVnode = newCh[++newStartIdx];
  10081. }
  10082. else if (sameVnode(oldEndVnode, newEndVnode)) {
  10083. patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
  10084. oldEndVnode = oldCh[--oldEndIdx];
  10085. newEndVnode = newCh[--newEndIdx];
  10086. }
  10087. else if (sameVnode(oldStartVnode, newEndVnode)) {
  10088. patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
  10089. api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
  10090. oldStartVnode = oldCh[++oldStartIdx];
  10091. newEndVnode = newCh[--newEndIdx];
  10092. }
  10093. else if (sameVnode(oldEndVnode, newStartVnode)) {
  10094. patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
  10095. api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
  10096. oldEndVnode = oldCh[--oldEndIdx];
  10097. newStartVnode = newCh[++newStartIdx];
  10098. }
  10099. else {
  10100. if (oldKeyToIdx === undefined) {
  10101. oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
  10102. }
  10103. idxInOld = oldKeyToIdx[newStartVnode.key];
  10104. if (isUndef(idxInOld)) {
  10105. api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
  10106. newStartVnode = newCh[++newStartIdx];
  10107. }
  10108. else {
  10109. elmToMove = oldCh[idxInOld];
  10110. if (elmToMove.sel !== newStartVnode.sel) {
  10111. api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
  10112. }
  10113. else {
  10114. patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
  10115. oldCh[idxInOld] = undefined;
  10116. api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
  10117. }
  10118. newStartVnode = newCh[++newStartIdx];
  10119. }
  10120. }
  10121. }
  10122. if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
  10123. if (oldStartIdx > oldEndIdx) {
  10124. before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
  10125. addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
  10126. }
  10127. else {
  10128. removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
  10129. }
  10130. }
  10131. }
  10132. function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
  10133. var i, hook;
  10134. if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
  10135. i(oldVnode, vnode);
  10136. }
  10137. var elm = vnode.elm = oldVnode.elm;
  10138. var oldCh = oldVnode.children;
  10139. var ch = vnode.children;
  10140. if (oldVnode === vnode)
  10141. { return; }
  10142. if (vnode.data !== undefined) {
  10143. for (i = 0; i < cbs.update.length; ++i)
  10144. { cbs.update[i](oldVnode, vnode); }
  10145. i = vnode.data.hook;
  10146. if (isDef(i) && isDef(i = i.update))
  10147. { i(oldVnode, vnode); }
  10148. }
  10149. if (isUndef(vnode.text)) {
  10150. if (isDef(oldCh) && isDef(ch)) {
  10151. if (oldCh !== ch)
  10152. { updateChildren(elm, oldCh, ch, insertedVnodeQueue); }
  10153. }
  10154. else if (isDef(ch)) {
  10155. if (isDef(oldVnode.text))
  10156. { api.setTextContent(elm, ''); }
  10157. addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
  10158. }
  10159. else if (isDef(oldCh)) {
  10160. removeVnodes(elm, oldCh, 0, oldCh.length - 1);
  10161. }
  10162. else if (isDef(oldVnode.text)) {
  10163. api.setTextContent(elm, '');
  10164. }
  10165. }
  10166. else if (oldVnode.text !== vnode.text) {
  10167. api.setTextContent(elm, vnode.text);
  10168. }
  10169. if (isDef(hook) && isDef(i = hook.postpatch)) {
  10170. i(oldVnode, vnode);
  10171. }
  10172. }
  10173. return function patch(oldVnode, vnode) {
  10174. var i, elm, parent;
  10175. var insertedVnodeQueue = [];
  10176. for (i = 0; i < cbs.pre.length; ++i)
  10177. { cbs.pre[i](); }
  10178. if (!isVnode(oldVnode)) {
  10179. oldVnode = emptyNodeAt(oldVnode);
  10180. }
  10181. if (sameVnode(oldVnode, vnode)) {
  10182. patchVnode(oldVnode, vnode, insertedVnodeQueue);
  10183. }
  10184. else {
  10185. elm = oldVnode.elm;
  10186. parent = api.parentNode(elm);
  10187. createElm(vnode, insertedVnodeQueue);
  10188. if (parent !== null) {
  10189. api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
  10190. removeVnodes(parent, [oldVnode], 0, 0);
  10191. }
  10192. }
  10193. for (i = 0; i < insertedVnodeQueue.length; ++i) {
  10194. insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
  10195. }
  10196. for (i = 0; i < cbs.post.length; ++i)
  10197. { cbs.post[i](); }
  10198. return vnode;
  10199. };
  10200. }
  10201. var xlinkNS = 'http://www.w3.org/1999/xlink';
  10202. var xmlNS = 'http://www.w3.org/XML/1998/namespace';
  10203. var colonChar = 58;
  10204. var xChar = 120;
  10205. function updateAttrs(oldVnode, vnode) {
  10206. var key, elm = vnode.elm, oldAttrs = oldVnode.data.attrs, attrs = vnode.data.attrs;
  10207. if (!oldAttrs && !attrs)
  10208. { return; }
  10209. if (oldAttrs === attrs)
  10210. { return; }
  10211. oldAttrs = oldAttrs || {};
  10212. attrs = attrs || {};
  10213. // update modified attributes, add new attributes
  10214. for (key in attrs) {
  10215. var cur = attrs[key];
  10216. var old = oldAttrs[key];
  10217. if (old !== cur) {
  10218. if (cur === true) {
  10219. elm.setAttribute(key, "");
  10220. }
  10221. else if (cur === false) {
  10222. elm.removeAttribute(key);
  10223. }
  10224. else {
  10225. if (key.charCodeAt(0) !== xChar) {
  10226. elm.setAttribute(key, cur);
  10227. }
  10228. else if (key.charCodeAt(3) === colonChar) {
  10229. // Assume xml namespace
  10230. elm.setAttributeNS(xmlNS, key, cur);
  10231. }
  10232. else if (key.charCodeAt(5) === colonChar) {
  10233. // Assume xlink namespace
  10234. elm.setAttributeNS(xlinkNS, key, cur);
  10235. }
  10236. else {
  10237. elm.setAttribute(key, cur);
  10238. }
  10239. }
  10240. }
  10241. }
  10242. // remove removed attributes
  10243. // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
  10244. // the other option is to remove all attributes with value == undefined
  10245. for (key in oldAttrs) {
  10246. if (!(key in attrs)) {
  10247. elm.removeAttribute(key);
  10248. }
  10249. }
  10250. }
  10251. var attributesModule = { create: updateAttrs, update: updateAttrs };
  10252. function updateProps(oldVnode, vnode) {
  10253. var key, cur, old, elm = vnode.elm, oldProps = oldVnode.data.props, props = vnode.data.props;
  10254. if (!oldProps && !props)
  10255. { return; }
  10256. if (oldProps === props)
  10257. { return; }
  10258. oldProps = oldProps || {};
  10259. props = props || {};
  10260. for (key in oldProps) {
  10261. if (!props[key]) {
  10262. delete elm[key];
  10263. }
  10264. }
  10265. for (key in props) {
  10266. cur = props[key];
  10267. old = oldProps[key];
  10268. if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
  10269. elm[key] = cur;
  10270. }
  10271. }
  10272. }
  10273. var propsModule = { create: updateProps, update: updateProps };
  10274. var raf = (typeof window !== 'undefined' && window.requestAnimationFrame) || setTimeout;
  10275. var nextFrame = function (fn) { raf(function () { raf(fn); }); };
  10276. function setNextFrame(obj, prop, val) {
  10277. nextFrame(function () { obj[prop] = val; });
  10278. }
  10279. function updateStyle(oldVnode, vnode) {
  10280. var cur, name, elm = vnode.elm, oldStyle = oldVnode.data.style, style = vnode.data.style;
  10281. if (!oldStyle && !style)
  10282. { return; }
  10283. if (oldStyle === style)
  10284. { return; }
  10285. oldStyle = oldStyle || {};
  10286. style = style || {};
  10287. var oldHasDel = 'delayed' in oldStyle;
  10288. for (name in oldStyle) {
  10289. if (!style[name]) {
  10290. if (name[0] === '-' && name[1] === '-') {
  10291. elm.style.removeProperty(name);
  10292. }
  10293. else {
  10294. elm.style[name] = '';
  10295. }
  10296. }
  10297. }
  10298. for (name in style) {
  10299. cur = style[name];
  10300. if (name === 'delayed' && style.delayed) {
  10301. for (var name2 in style.delayed) {
  10302. cur = style.delayed[name2];
  10303. if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
  10304. setNextFrame(elm.style, name2, cur);
  10305. }
  10306. }
  10307. }
  10308. else if (name !== 'remove' && cur !== oldStyle[name]) {
  10309. if (name[0] === '-' && name[1] === '-') {
  10310. elm.style.setProperty(name, cur);
  10311. }
  10312. else {
  10313. elm.style[name] = cur;
  10314. }
  10315. }
  10316. }
  10317. }
  10318. function applyDestroyStyle(vnode) {
  10319. var style, name, elm = vnode.elm, s = vnode.data.style;
  10320. if (!s || !(style = s.destroy))
  10321. { return; }
  10322. for (name in style) {
  10323. elm.style[name] = style[name];
  10324. }
  10325. }
  10326. function applyRemoveStyle(vnode, rm) {
  10327. var s = vnode.data.style;
  10328. if (!s || !s.remove) {
  10329. rm();
  10330. return;
  10331. }
  10332. var name, elm = vnode.elm, i = 0, compStyle, style = s.remove, amount = 0, applied = [];
  10333. for (name in style) {
  10334. applied.push(name);
  10335. elm.style[name] = style[name];
  10336. }
  10337. compStyle = getComputedStyle(elm);
  10338. var props = compStyle['transition-property'].split(', ');
  10339. for (; i < props.length; ++i) {
  10340. if (applied.indexOf(props[i]) !== -1)
  10341. { amount++; }
  10342. }
  10343. elm.addEventListener('transitionend', function (ev) {
  10344. if (ev.target === elm)
  10345. { --amount; }
  10346. if (amount === 0)
  10347. { rm(); }
  10348. });
  10349. }
  10350. var styleModule = {
  10351. create: updateStyle,
  10352. update: updateStyle,
  10353. destroy: applyDestroyStyle,
  10354. remove: applyRemoveStyle
  10355. };
  10356. function invokeHandler(handler, event, args) {
  10357. if (typeof handler === 'function') {
  10358. // call function handler
  10359. handler.apply(void 0, [ event ].concat( args ));
  10360. }
  10361. }
  10362. function handleEvent(event, args, vnode) {
  10363. var name = event.type;
  10364. var on = vnode.data.on;
  10365. // call event handler(s) if exists
  10366. if (on && on[name]) {
  10367. invokeHandler(on[name], event, args);
  10368. }
  10369. }
  10370. function createListener() {
  10371. return function handler(event) {
  10372. var args = [], len = arguments.length - 1;
  10373. while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
  10374. handleEvent(event, args, handler.vnode);
  10375. };
  10376. }
  10377. function updateEvents(oldVnode, vnode) {
  10378. var oldOn = oldVnode.data.on;
  10379. var oldListener = oldVnode.listener;
  10380. var oldElm = oldVnode.elm;
  10381. var on = vnode && vnode.data.on;
  10382. var elm = (vnode && vnode.elm);
  10383. // optimization for reused immutable handlers
  10384. if (oldOn === on) {
  10385. return;
  10386. }
  10387. // remove existing listeners which no longer used
  10388. if (oldOn && oldListener) {
  10389. // if element changed or deleted we remove all existing listeners unconditionally
  10390. if (!on) {
  10391. Object.keys(oldOn).forEach(function (name) {
  10392. $(oldElm).off(name, oldListener);
  10393. });
  10394. } else {
  10395. Object.keys(oldOn).forEach(function (name) {
  10396. if (!on[name]) {
  10397. $(oldElm).off(name, oldListener);
  10398. }
  10399. });
  10400. }
  10401. }
  10402. // add new listeners which has not already attached
  10403. if (on) {
  10404. // reuse existing listener or create new
  10405. var listener = oldVnode.listener || createListener();
  10406. vnode.listener = listener;
  10407. // update vnode for listener
  10408. listener.vnode = vnode;
  10409. // if element changed or added we add all needed listeners unconditionally
  10410. if (!oldOn) {
  10411. Object.keys(on).forEach(function (name) {
  10412. $(elm).on(name, listener);
  10413. });
  10414. } else {
  10415. Object.keys(on).forEach(function (name) {
  10416. if (!oldOn[name]) {
  10417. $(elm).on(name, listener);
  10418. }
  10419. });
  10420. }
  10421. }
  10422. }
  10423. var eventListenersModule = {
  10424. create: updateEvents,
  10425. update: updateEvents,
  10426. destroy: updateEvents,
  10427. };
  10428. /* eslint import/no-named-as-default: off */
  10429. var patch = init([
  10430. attributesModule,
  10431. propsModule,
  10432. styleModule,
  10433. eventListenersModule ]);
  10434. var componentMixins = {};
  10435. /* eslint no-underscore-dangle: "off" */
  10436. var Component = function Component(app, options, extendContext, children) {
  10437. if ( options === void 0 ) options = {};
  10438. if ( extendContext === void 0 ) extendContext = {};
  10439. var id = Utils.id();
  10440. var self = this;
  10441. Utils.merge(
  10442. self,
  10443. { $props: {} },
  10444. extendContext,
  10445. {
  10446. $: $,
  10447. $$: $,
  10448. $dom7: $,
  10449. $app: app,
  10450. $f7: app,
  10451. $options: Utils.extend({ id: id }, options),
  10452. $id: options.isClassComponent ? self.constructor.id : (options.id || id),
  10453. $mixins: options.isClassComponent ? self.constructor.mixins : options.mixins,
  10454. $children: children || [],
  10455. $isRootComponent: !!options.root,
  10456. }
  10457. );
  10458. var $options = self.$options;
  10459. if (self.$mixins && self.$mixins.length) {
  10460. for (var i = self.$mixins.length - 1; i >= 0; i -= 1) {
  10461. var mixin = self.$mixins[i];
  10462. if (typeof mixin === 'string') {
  10463. if (componentMixins[mixin]) { self.$mixins[i] = componentMixins[mixin]; }
  10464. else { self.$mixins.splice(i, 1); }
  10465. }
  10466. }
  10467. }
  10468. Object.defineProperty(self, '$slots', {
  10469. enumerable: true,
  10470. configurable: true,
  10471. get: function get() {
  10472. var slots = {};
  10473. self.$children.forEach(function (childVNode) {
  10474. var childSlotName = 'default';
  10475. if (childVNode.data) {
  10476. childSlotName = (childVNode.data.attrs && childVNode.data.attrs.slot) || 'default';
  10477. }
  10478. if (!slots[childSlotName]) { slots[childSlotName] = []; }
  10479. slots[childSlotName].push(childVNode);
  10480. });
  10481. return slots;
  10482. },
  10483. });
  10484. // Root data and methods
  10485. Object.defineProperty(self, '$root', {
  10486. enumerable: true,
  10487. configurable: true,
  10488. get: function get() {
  10489. if (self.$isRootComponent) {
  10490. return self;
  10491. }
  10492. if (app.rootComponent) {
  10493. if (!self.$onRootUpdated) {
  10494. self.$onRootUpdated = function () { return self.$update(); };
  10495. app.on('rootComponentUpdated', self.$onRootUpdated);
  10496. }
  10497. return app.rootComponent;
  10498. }
  10499. var root = Utils.merge({}, app.data, app.methods);
  10500. if (win && win.Proxy) {
  10501. root = new win.Proxy(root, {
  10502. set: function set(target, name, val) {
  10503. app.data[name] = val;
  10504. },
  10505. deleteProperty: function deleteProperty(target, name) {
  10506. delete app.data[name];
  10507. delete app.methods[name];
  10508. },
  10509. has: function has(target, name) {
  10510. return (name in app.data || name in app.methods);
  10511. },
  10512. });
  10513. }
  10514. return root;
  10515. },
  10516. set: function set() {},
  10517. });
  10518. // Bind render
  10519. if ($options.render) { $options.render = $options.render.bind(self); }
  10520. // Bind methods
  10521. var methods = {};
  10522. if (self.$mixins && self.$mixins.length) {
  10523. self.$mixins.forEach(function (mixin) {
  10524. if (mixin.methods) { Object.assign(methods, mixin.methods); }
  10525. });
  10526. }
  10527. if ($options.methods) {
  10528. Object.assign(methods, $options.methods);
  10529. }
  10530. Object.keys(methods).forEach(function (methodName) {
  10531. self[methodName] = methods[methodName].bind(self);
  10532. });
  10533. // Bind Events
  10534. if ($options.on) {
  10535. Object.keys($options.on).forEach(function (eventName) {
  10536. $options.on[eventName] = $options.on[eventName].bind(self);
  10537. });
  10538. }
  10539. if ($options.once) {
  10540. Object.keys($options.once).forEach(function (eventName) {
  10541. $options.once[eventName] = $options.once[eventName].bind(self);
  10542. });
  10543. }
  10544. self.$style = $options.isClassComponent ? self.constructor.style : $options.style;
  10545. self.$styleScoped = $options.isClassComponent ? self.constructor.styleScoped : $options.styleScoped;
  10546. self.__updateQueue = [];
  10547. return new Promise(function (resolve, reject) {
  10548. self.$hook('data', true)
  10549. .then(function (datas) {
  10550. var data = {};
  10551. datas.forEach(function (dt) {
  10552. Object.assign(data, dt || {});
  10553. });
  10554. Utils.extend(self, data);
  10555. self.$hook('beforeCreate');
  10556. var html = self.$render();
  10557. if (self.$options.el) {
  10558. html = html.trim();
  10559. self.$vnode = vdom(html, self, true);
  10560. if (self.$style) {
  10561. self.$styleEl = doc.createElement('style');
  10562. self.$styleEl.innerHTML = self.$style;
  10563. }
  10564. self.el = self.$options.el;
  10565. patch(self.el, self.$vnode);
  10566. self.el = self.$vnode.elm;
  10567. self.$el = $(self.el);
  10568. self.$attachEvents();
  10569. self.el.f7Component = self;
  10570. self.$hook('created');
  10571. self.$mount();
  10572. resolve(self);
  10573. return;
  10574. }
  10575. // Make Dom
  10576. if (html && typeof html === 'string') {
  10577. html = html.trim();
  10578. self.$vnode = vdom(html, self, true);
  10579. self.el = doc.createElement(self.$vnode.sel || 'div');
  10580. patch(self.el, self.$vnode);
  10581. self.$el = $(self.el);
  10582. } else if (html) {
  10583. self.el = html;
  10584. self.$el = $(self.el);
  10585. }
  10586. if (self.$style) {
  10587. self.$styleEl = doc.createElement('style');
  10588. self.$styleEl.innerHTML = self.$style;
  10589. }
  10590. self.$attachEvents();
  10591. if (self.el) {
  10592. self.el.f7Component = self;
  10593. }
  10594. self.$hook('created');
  10595. resolve(self);
  10596. })
  10597. .catch(function (err) {
  10598. reject(err);
  10599. });
  10600. });
  10601. };
  10602. Component.prototype.$attachEvents = function $attachEvents () {
  10603. var self = this;
  10604. var $options = self.$options;
  10605. var $el = self.$el;
  10606. if (self.$mixins && self.$mixins.length) {
  10607. self.$detachEventsHandlers = {};
  10608. self.$mixins.forEach(function (mixin) {
  10609. if (mixin.on) {
  10610. Object.keys(mixin.on).forEach(function (eventName) {
  10611. var handler = mixin.on[eventName].bind(self);
  10612. if (!self.$detachEventsHandlers[eventName]) { self.$detachEventsHandlers[eventName] = []; }
  10613. self.$detachEventsHandlers[eventName].push(handler);
  10614. $el.on(Utils.eventNameToColonCase(eventName), handler);
  10615. });
  10616. }
  10617. if (mixin.once) {
  10618. Object.keys(mixin.once).forEach(function (eventName) {
  10619. var handler = mixin.once[eventName].bind(self);
  10620. if (!self.$detachEventsHandlers[eventName]) { self.$detachEventsHandlers[eventName] = []; }
  10621. self.$detachEventsHandlers[eventName].push(handler);
  10622. $el.once(Utils.eventNameToColonCase(eventName), handler);
  10623. });
  10624. }
  10625. });
  10626. }
  10627. if ($options.on) {
  10628. Object.keys($options.on).forEach(function (eventName) {
  10629. $el.on(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
  10630. });
  10631. }
  10632. if ($options.once) {
  10633. Object.keys($options.once).forEach(function (eventName) {
  10634. $el.once(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
  10635. });
  10636. }
  10637. };
  10638. Component.prototype.$detachEvents = function $detachEvents () {
  10639. var self = this;
  10640. var $options = self.$options;
  10641. var $el = self.$el;
  10642. if ($options.on) {
  10643. Object.keys($options.on).forEach(function (eventName) {
  10644. $el.off(Utils.eventNameToColonCase(eventName), $options.on[eventName]);
  10645. });
  10646. }
  10647. if ($options.once) {
  10648. Object.keys($options.once).forEach(function (eventName) {
  10649. $el.off(Utils.eventNameToColonCase(eventName), $options.once[eventName]);
  10650. });
  10651. }
  10652. if (!self.$detachEventsHandlers) { return; }
  10653. Object.keys(self.$detachEventsHandlers).forEach(function (eventName) {
  10654. var handlers = self.$detachEventsHandlers[eventName];
  10655. handlers.forEach(function (handler) {
  10656. $el.off(Utils.eventNameToColonCase(eventName), handler);
  10657. });
  10658. self.$detachEventsHandlers[eventName] = [];
  10659. delete self.$detachEventsHandlers[eventName];
  10660. });
  10661. self.$detachEventsHandlers = null;
  10662. delete self.$detachEventsHandlers;
  10663. };
  10664. Component.prototype.$render = function $render () {
  10665. var self = this;
  10666. var $options = self.$options;
  10667. var html = '';
  10668. if ($options.render) {
  10669. html = $options.render();
  10670. } else if (self.render) {
  10671. html = self.render.call(self);
  10672. } else if ($options.template) {
  10673. if (typeof $options.template === 'string') {
  10674. html = Template7.compile($options.template)(self);
  10675. } else {
  10676. // Supposed to be function
  10677. html = $options.template(self);
  10678. }
  10679. }
  10680. return html;
  10681. };
  10682. Component.prototype.$startUpdateQueue = function $startUpdateQueue () {
  10683. var self = this;
  10684. if (self.__requestAnimationFrameId) { return; }
  10685. function update() {
  10686. var html = self.$render();
  10687. // Make Dom
  10688. if (html && typeof html === 'string') {
  10689. html = html.trim();
  10690. var newVNode = vdom(html, self, false);
  10691. self.$vnode = patch(self.$vnode, newVNode);
  10692. }
  10693. }
  10694. self.__requestAnimationFrameId = win.requestAnimationFrame(function () {
  10695. if (self.__updateIsPending) { update(); }
  10696. var resolvers = [].concat( self.__updateQueue );
  10697. self.__updateQueue = [];
  10698. self.__updateIsPending = false;
  10699. win.cancelAnimationFrame(self.__requestAnimationFrameId);
  10700. delete self.__requestAnimationFrameId;
  10701. delete self.__updateIsPending;
  10702. resolvers.forEach(function (resolver) { return resolver(); });
  10703. resolvers = [];
  10704. });
  10705. };
  10706. Component.prototype.$tick = function $tick (callback) {
  10707. var self = this;
  10708. return new Promise(function (resolve) {
  10709. function resolver() {
  10710. resolve();
  10711. if (callback) { callback(); }
  10712. }
  10713. self.__updateQueue.push(resolver);
  10714. self.$startUpdateQueue();
  10715. });
  10716. };
  10717. Component.prototype.$update = function $update (callback) {
  10718. var self = this;
  10719. return new Promise(function (resolve) {
  10720. function resolver() {
  10721. resolve();
  10722. if (callback) { callback(); }
  10723. if (self.$isRootComponent) {
  10724. self.$f7.emit('rootComponentUpdated');
  10725. }
  10726. }
  10727. self.__updateIsPending = true;
  10728. self.__updateQueue.push(resolver);
  10729. self.$startUpdateQueue();
  10730. });
  10731. };
  10732. Component.prototype.$setState = function $setState (mergeState, callback) {
  10733. if ( mergeState === void 0 ) mergeState = {};
  10734. var self = this;
  10735. Utils.merge(self, mergeState);
  10736. return self.$update(callback);
  10737. };
  10738. Component.prototype.$f7ready = function $f7ready (callback) {
  10739. var this$1 = this;
  10740. if (this.$f7.initialized) {
  10741. callback(this.$f7);
  10742. return;
  10743. }
  10744. this.$f7.once('init', function () {
  10745. callback(this$1.$f7);
  10746. });
  10747. };
  10748. Component.prototype.$mount = function $mount (mountMethod) {
  10749. var self = this;
  10750. self.$hook('beforeMount');
  10751. if (self.$styleEl) { $('head').append(self.$styleEl); }
  10752. if (mountMethod) { mountMethod(self.el); }
  10753. self.$hook('mounted');
  10754. };
  10755. Component.prototype.$destroy = function $destroy () {
  10756. var self = this;
  10757. self.$hook('beforeDestroy');
  10758. if (self.$styleEl) { $(self.$styleEl).remove(); }
  10759. if (self.$onRootUpdated) {
  10760. self.$f7.off('rootComponentUpdated', self.$onRootUpdated);
  10761. delete self.$onRootUpdated;
  10762. }
  10763. self.$detachEvents();
  10764. self.$hook('destroyed');
  10765. // Delete component instance
  10766. if (self.el && self.el.f7Component) {
  10767. self.el.f7Component = null;
  10768. delete self.el.f7Component;
  10769. }
  10770. // Patch with empty node
  10771. if (self.$vnode) {
  10772. self.$vnode = patch(self.$vnode, { sel: self.$vnode.sel, data: {} });
  10773. }
  10774. // Clear update queue
  10775. win.cancelAnimationFrame(self.__requestAnimationFrameId);
  10776. // Delete all props
  10777. Utils.deleteProps(self);
  10778. };
  10779. Component.prototype.$hook = function $hook (name, async) {
  10780. var self = this;
  10781. if (async) {
  10782. var promises = [];
  10783. if (self.$mixins && self.$mixins.length) {
  10784. self.$mixins.forEach(function (mixin) {
  10785. if (mixin[name]) { promises.push(mixin[name].call(self)); }
  10786. });
  10787. }
  10788. if (self[name] && typeof self[name] === 'function') {
  10789. promises.push(self[name].call(self));
  10790. }
  10791. if (self.$options[name]) {
  10792. promises.push(self.$options[name].call(self));
  10793. }
  10794. return Promise.all(promises);
  10795. }
  10796. if (self.$mixins && self.$mixins.length) {
  10797. self.$mixins.forEach(function (mixin) {
  10798. if (mixin[name] && typeof mixin[name] === 'function') {
  10799. mixin[name].call(self);
  10800. }
  10801. });
  10802. }
  10803. if (self.$options[name]) { return self.$options[name].call(self); }
  10804. if (self[name]) { return self[name].call(self); }
  10805. return undefined;
  10806. };
  10807. function parseComponent(componentString) {
  10808. var id = Utils.id();
  10809. var callbackCreateName = "f7_component_create_callback_" + id;
  10810. var callbackRenderName = "f7_component_render_callback_" + id;
  10811. // Template
  10812. var template;
  10813. var hasTemplate = componentString.match(/<template([ ]?)([a-z0-9-]*)>/);
  10814. var templateType = hasTemplate[2] || 't7';
  10815. if (hasTemplate) {
  10816. template = componentString
  10817. .split(/<template[ ]?[a-z0-9-]*>/)
  10818. .filter(function (item, index) { return index > 0; })
  10819. .join('<template>')
  10820. .split('</template>')
  10821. .filter(function (item, index, arr) { return index < arr.length - 1; })
  10822. .join('</template>')
  10823. .replace(/{{#raw}}([ \n]*)<template/g, '{{#raw}}<template')
  10824. .replace(/\/template>([ \n]*){{\/raw}}/g, '/template>{{/raw}}')
  10825. .replace(/([ \n])<template/g, '$1{{#raw}}<template')
  10826. .replace(/\/template>([ \n])/g, '/template>{{/raw}}$1');
  10827. }
  10828. // Parse Styles
  10829. var style = null;
  10830. var styleScoped = false;
  10831. if (componentString.indexOf('<style>') >= 0) {
  10832. style = componentString.split('<style>')[1].split('</style>')[0];
  10833. } else if (componentString.indexOf('<style scoped>') >= 0) {
  10834. styleScoped = true;
  10835. style = componentString.split('<style scoped>')[1].split('</style>')[0];
  10836. style = style
  10837. .replace(/{{this}}/g, ("[data-f7-" + id + "]"))
  10838. .replace(/[\n]?([^{^}]*){/gi, function (string, rules) {
  10839. if (rules.indexOf('"') >= 0 || rules.indexOf("'") >= 0) { return string; }
  10840. // eslint-disable-next-line
  10841. rules = rules
  10842. .split(',')
  10843. .map(function (rule) {
  10844. if (rule.indexOf('@') >= 0) { return rule; }
  10845. if (rule.indexOf(("[data-f7-" + id + "]")) >= 0) { return rule; }
  10846. return ("[data-f7-" + id + "] " + (rule.trim()));
  10847. })
  10848. .join(', ');
  10849. return ("\n" + rules + " {");
  10850. });
  10851. }
  10852. // Parse Script
  10853. var scriptContent;
  10854. var scriptEl;
  10855. if (componentString.indexOf('<script>') >= 0) {
  10856. var scripts = componentString.split('<script>');
  10857. scriptContent = scripts[scripts.length - 1].split('</script>')[0].trim();
  10858. } else {
  10859. scriptContent = 'return {}';
  10860. }
  10861. if (!scriptContent || !scriptContent.trim()) { scriptContent = 'return {}'; }
  10862. scriptContent = "window." + callbackCreateName + " = function () {" + scriptContent + "}";
  10863. // Insert Script El
  10864. scriptEl = doc.createElement('script');
  10865. scriptEl.innerHTML = scriptContent;
  10866. $('head').append(scriptEl);
  10867. var component = win[callbackCreateName]();
  10868. var isClassComponent = typeof component === 'function';
  10869. // Remove Script El
  10870. $(scriptEl).remove();
  10871. win[callbackCreateName] = null;
  10872. delete win[callbackCreateName];
  10873. // Assign Template
  10874. if (!component.template && !component.render) {
  10875. component.template = template;
  10876. component.templateType = templateType;
  10877. }
  10878. if (component.template) {
  10879. if (component.templateType === 't7') {
  10880. if (isClassComponent) {
  10881. var templateFunction = Template7.compile(component.template);
  10882. component.prototype.render = function render() {
  10883. return templateFunction(this);
  10884. };
  10885. } else {
  10886. component.template = Template7.compile(component.template);
  10887. }
  10888. }
  10889. if (component.templateType === 'es') {
  10890. var renderContent = "window." + callbackRenderName + " = function () {\n return function render() {\n return `" + (component.template) + "`;\n }\n }";
  10891. scriptEl = doc.createElement('script');
  10892. scriptEl.innerHTML = renderContent;
  10893. $('head').append(scriptEl);
  10894. if (isClassComponent) {
  10895. component.prototype.render = component.template;
  10896. } else {
  10897. component.render = win[callbackRenderName]();
  10898. }
  10899. // Remove Script El
  10900. $(scriptEl).remove();
  10901. win[callbackRenderName] = null;
  10902. delete win[callbackRenderName];
  10903. }
  10904. }
  10905. if (isClassComponent) {
  10906. delete component.template;
  10907. delete component.templateType;
  10908. }
  10909. // Assign Style
  10910. if (style) {
  10911. component.style = style;
  10912. component.styleScoped = styleScoped;
  10913. }
  10914. // Component ID
  10915. component.id = id;
  10916. return component;
  10917. }
  10918. function registerComponentMixin(name, mixin) {
  10919. componentMixins[name] = mixin;
  10920. }
  10921. function registerComponent(tagName, component) {
  10922. customComponents[tagName] = component;
  10923. }
  10924. var ComponentModule = {
  10925. name: 'component',
  10926. static: {
  10927. Component: Component,
  10928. registerComponentMixin: registerComponentMixin,
  10929. registerComponent: registerComponent,
  10930. },
  10931. create: function create() {
  10932. var app = this;
  10933. app.component = {
  10934. registerComponentMixin: registerComponentMixin,
  10935. registerComponent: registerComponent,
  10936. parse: function parse(componentString) {
  10937. return parseComponent(componentString);
  10938. },
  10939. create: function create(options, context, children) {
  10940. if (typeof options === 'function') {
  10941. var root = options.root;
  10942. var el = options.el;
  10943. // eslint-disable-next-line
  10944. return new options(app, { isClassComponent: true, root: root, el: el }, context, children);
  10945. }
  10946. return new Component(app, options, context, children);
  10947. },
  10948. };
  10949. },
  10950. };
  10951. var HistoryModule = {
  10952. name: 'history',
  10953. static: {
  10954. history: History,
  10955. },
  10956. on: {
  10957. init: function init() {
  10958. History.init(this);
  10959. },
  10960. },
  10961. };
  10962. var SW = {
  10963. registrations: [],
  10964. register: function register(path, scope) {
  10965. var app = this;
  10966. if (!('serviceWorker' in win.navigator) || !app.serviceWorker.container) {
  10967. return new Promise(function (resolve, reject) {
  10968. reject(new Error('Service worker is not supported'));
  10969. });
  10970. }
  10971. return new Promise(function (resolve, reject) {
  10972. app.serviceWorker.container.register(path, (scope ? { scope: scope } : {}))
  10973. .then(function (reg) {
  10974. SW.registrations.push(reg);
  10975. app.emit('serviceWorkerRegisterSuccess', reg);
  10976. resolve(reg);
  10977. }).catch(function (error) {
  10978. app.emit('serviceWorkerRegisterError', error);
  10979. reject(error);
  10980. });
  10981. });
  10982. },
  10983. unregister: function unregister(registration) {
  10984. var app = this;
  10985. if (!('serviceWorker' in win.navigator) || !app.serviceWorker.container) {
  10986. return new Promise(function (resolve, reject) {
  10987. reject(new Error('Service worker is not supported'));
  10988. });
  10989. }
  10990. var registrations;
  10991. if (!registration) { registrations = SW.registrations; }
  10992. else if (Array.isArray(registration)) { registrations = registration; }
  10993. else { registrations = [registration]; }
  10994. return Promise.all(registrations.map(function (reg) { return new Promise(function (resolve, reject) {
  10995. reg.unregister()
  10996. .then(function () {
  10997. if (SW.registrations.indexOf(reg) >= 0) {
  10998. SW.registrations.splice(SW.registrations.indexOf(reg), 1);
  10999. }
  11000. app.emit('serviceWorkerUnregisterSuccess', reg);
  11001. resolve();
  11002. })
  11003. .catch(function (error) {
  11004. app.emit('serviceWorkerUnregisterError', reg, error);
  11005. reject(error);
  11006. });
  11007. }); }));
  11008. },
  11009. };
  11010. var ServiceWorkerModule = {
  11011. name: 'sw',
  11012. params: {
  11013. serviceWorker: {
  11014. path: undefined,
  11015. scope: undefined,
  11016. },
  11017. },
  11018. create: function create() {
  11019. var app = this;
  11020. Utils.extend(app, {
  11021. serviceWorker: {
  11022. container: ('serviceWorker' in win.navigator) ? win.navigator.serviceWorker : undefined,
  11023. registrations: SW.registrations,
  11024. register: SW.register.bind(app),
  11025. unregister: SW.unregister.bind(app),
  11026. },
  11027. });
  11028. },
  11029. on: {
  11030. init: function init() {
  11031. if (!('serviceWorker' in win.navigator)) { return; }
  11032. var app = this;
  11033. if (!app.serviceWorker.container) { return; }
  11034. var paths = app.params.serviceWorker.path;
  11035. var scope = app.params.serviceWorker.scope;
  11036. if (!paths || (Array.isArray(paths) && !paths.length)) { return; }
  11037. var toRegister = Array.isArray(paths) ? paths : [paths];
  11038. toRegister.forEach(function (path) {
  11039. app.serviceWorker.register(path, scope);
  11040. });
  11041. },
  11042. },
  11043. };
  11044. var Statusbar = {
  11045. hide: function hide() {
  11046. if (Device.cordova && win.StatusBar) {
  11047. win.StatusBar.hide();
  11048. }
  11049. },
  11050. show: function show() {
  11051. if (Device.cordova && win.StatusBar) {
  11052. win.StatusBar.show();
  11053. }
  11054. },
  11055. onClick: function onClick() {
  11056. var app = this;
  11057. var pageContent;
  11058. if ($('.popup.modal-in').length > 0) {
  11059. // Check for opened popup
  11060. pageContent = $('.popup.modal-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  11061. } else if ($('.panel.panel-in').length > 0) {
  11062. // Check for opened panel
  11063. pageContent = $('.panel.panel-in').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  11064. } else if ($('.views > .view.tab-active').length > 0) {
  11065. // View in tab bar app layout
  11066. pageContent = $('.views > .view.tab-active').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  11067. } else if ($('.views').length > 0) {
  11068. pageContent = $('.views').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  11069. } else {
  11070. pageContent = app.root.children('.view').find('.page:not(.page-previous):not(.page-next):not(.cached)').find('.page-content');
  11071. }
  11072. if (pageContent && pageContent.length > 0) {
  11073. // Check for tab
  11074. if (pageContent.hasClass('tab')) {
  11075. pageContent = pageContent.parent('.tabs').children('.page-content.tab-active');
  11076. }
  11077. if (pageContent.length > 0) { pageContent.scrollTop(0, 300); }
  11078. }
  11079. },
  11080. setTextColor: function setTextColor(color) {
  11081. if (Device.cordova && win.StatusBar) {
  11082. if (color === 'white') {
  11083. win.StatusBar.styleLightContent();
  11084. } else {
  11085. win.StatusBar.styleDefault();
  11086. }
  11087. }
  11088. },
  11089. setBackgroundColor: function setBackgroundColor(color) {
  11090. if (Device.cordova && win.StatusBar) {
  11091. win.StatusBar.backgroundColorByHexString(color);
  11092. }
  11093. },
  11094. isVisible: function isVisible() {
  11095. if (Device.cordova && win.StatusBar) {
  11096. return win.StatusBar.isVisible;
  11097. }
  11098. return false;
  11099. },
  11100. overlaysWebView: function overlaysWebView(overlays) {
  11101. if ( overlays === void 0 ) overlays = true;
  11102. if (Device.cordova && win.StatusBar) {
  11103. win.StatusBar.overlaysWebView(overlays);
  11104. }
  11105. },
  11106. init: function init() {
  11107. var app = this;
  11108. var params = app.params.statusbar;
  11109. if (!params.enabled) { return; }
  11110. if (Device.cordova && win.StatusBar) {
  11111. if (params.scrollTopOnClick) {
  11112. $(win).on('statusTap', Statusbar.onClick.bind(app));
  11113. }
  11114. if (Device.ios) {
  11115. if (params.iosOverlaysWebView) {
  11116. win.StatusBar.overlaysWebView(true);
  11117. } else {
  11118. win.StatusBar.overlaysWebView(false);
  11119. }
  11120. if (params.iosTextColor === 'white') {
  11121. win.StatusBar.styleLightContent();
  11122. } else {
  11123. win.StatusBar.styleDefault();
  11124. }
  11125. }
  11126. if (Device.android) {
  11127. if (params.androidOverlaysWebView) {
  11128. win.StatusBar.overlaysWebView(true);
  11129. } else {
  11130. win.StatusBar.overlaysWebView(false);
  11131. }
  11132. if (params.androidTextColor === 'white') {
  11133. win.StatusBar.styleLightContent();
  11134. } else {
  11135. win.StatusBar.styleDefault();
  11136. }
  11137. }
  11138. }
  11139. if (params.iosBackgroundColor && Device.ios) {
  11140. Statusbar.setBackgroundColor(params.iosBackgroundColor);
  11141. }
  11142. if (params.androidBackgroundColor && Device.android) {
  11143. Statusbar.setBackgroundColor(params.androidBackgroundColor);
  11144. }
  11145. },
  11146. };
  11147. var Statusbar$1 = {
  11148. name: 'statusbar',
  11149. params: {
  11150. statusbar: {
  11151. enabled: true,
  11152. scrollTopOnClick: true,
  11153. iosOverlaysWebView: true,
  11154. iosTextColor: 'black',
  11155. iosBackgroundColor: null,
  11156. androidOverlaysWebView: false,
  11157. androidTextColor: 'black',
  11158. androidBackgroundColor: null,
  11159. },
  11160. },
  11161. create: function create() {
  11162. var app = this;
  11163. Utils.extend(app, {
  11164. statusbar: {
  11165. hide: Statusbar.hide,
  11166. show: Statusbar.show,
  11167. overlaysWebView: Statusbar.overlaysWebView,
  11168. setTextColor: Statusbar.setTextColor,
  11169. setBackgroundColor: Statusbar.setBackgroundColor,
  11170. isVisible: Statusbar.isVisible,
  11171. init: Statusbar.init.bind(app),
  11172. },
  11173. });
  11174. },
  11175. on: {
  11176. init: function init() {
  11177. var app = this;
  11178. Statusbar.init.call(app);
  11179. },
  11180. },
  11181. };
  11182. function getCurrentView(app) {
  11183. var $popoverView = $('.popover.modal-in .view');
  11184. var $popupView = $('.popup.modal-in .view');
  11185. var $panelView = $('.panel.panel-in .view');
  11186. var $viewsEl = $('.views');
  11187. if ($viewsEl.length === 0) { $viewsEl = app.root; }
  11188. // Find active view as tab
  11189. var $viewEl = $viewsEl.children('.view');
  11190. if ($viewEl.length === 0) {
  11191. $viewEl = $viewsEl.children('.tabs').children('.view');
  11192. }
  11193. // Propably in tabs or split view
  11194. if ($viewEl.length > 1) {
  11195. if ($viewEl.hasClass('tab')) {
  11196. // Tabs
  11197. $viewEl = $viewsEl.children('.view.tab-active');
  11198. if ($viewEl.length === 0) {
  11199. $viewEl = $viewsEl.children('.tabs').children('.view.tab-active');
  11200. }
  11201. }
  11202. }
  11203. if ($popoverView.length > 0 && $popoverView[0].f7View) { return $popoverView[0].f7View; }
  11204. if ($popupView.length > 0 && $popupView[0].f7View) { return $popupView[0].f7View; }
  11205. if ($panelView.length > 0 && $panelView[0].f7View) { return $panelView[0].f7View; }
  11206. if ($viewEl.length > 0) {
  11207. if ($viewEl.length === 1 && $viewEl[0].f7View) { return $viewEl[0].f7View; }
  11208. if ($viewEl.length > 1) {
  11209. return app.views.main;
  11210. }
  11211. }
  11212. return undefined;
  11213. }
  11214. var View$1 = {
  11215. name: 'view',
  11216. params: {
  11217. view: {
  11218. name: undefined,
  11219. main: false,
  11220. router: true,
  11221. linksView: null,
  11222. stackPages: false,
  11223. xhrCache: true,
  11224. xhrCacheIgnore: [],
  11225. xhrCacheIgnoreGetParameters: false,
  11226. xhrCacheDuration: 1000 * 60 * 10, // Ten minutes
  11227. componentCache: true,
  11228. preloadPreviousPage: true,
  11229. allowDuplicateUrls: false,
  11230. reloadPages: false,
  11231. reloadDetail: false,
  11232. masterDetailBreakpoint: 0,
  11233. masterDetailResizable: false,
  11234. removeElements: true,
  11235. removeElementsWithTimeout: false,
  11236. removeElementsTimeout: 0,
  11237. restoreScrollTopOnBack: true,
  11238. unloadTabContent: true,
  11239. passRouteQueryToRequest: true,
  11240. passRouteParamsToRequest: false,
  11241. loadInitialPage: true,
  11242. // Swipe Back
  11243. iosSwipeBack: true,
  11244. iosSwipeBackAnimateShadow: true,
  11245. iosSwipeBackAnimateOpacity: true,
  11246. iosSwipeBackActiveArea: 30,
  11247. iosSwipeBackThreshold: 0,
  11248. mdSwipeBack: false,
  11249. mdSwipeBackAnimateShadow: true,
  11250. mdSwipeBackAnimateOpacity: false,
  11251. mdSwipeBackActiveArea: 30,
  11252. mdSwipeBackThreshold: 0,
  11253. auroraSwipeBack: false,
  11254. auroraSwipeBackAnimateShadow: false,
  11255. auroraSwipeBackAnimateOpacity: true,
  11256. auroraSwipeBackActiveArea: 30,
  11257. auroraSwipeBackThreshold: 0,
  11258. // Push State
  11259. pushState: false,
  11260. pushStateRoot: undefined,
  11261. pushStateAnimate: true,
  11262. pushStateAnimateOnLoad: false,
  11263. pushStateSeparator: '#!',
  11264. pushStateOnLoad: true,
  11265. // Animate Pages
  11266. animate: true,
  11267. // iOS Dynamic Navbar
  11268. iosDynamicNavbar: true,
  11269. // Animate iOS Navbar Back Icon
  11270. iosAnimateNavbarBackIcon: true,
  11271. // Delays
  11272. iosPageLoadDelay: 0,
  11273. mdPageLoadDelay: 0,
  11274. auroraPageLoadDelay: 0,
  11275. // Routes hooks
  11276. routesBeforeEnter: null,
  11277. routesBeforeLeave: null,
  11278. },
  11279. },
  11280. static: {
  11281. View: View,
  11282. },
  11283. create: function create() {
  11284. var app = this;
  11285. Utils.extend(app, {
  11286. views: Utils.extend([], {
  11287. create: function create(el, params) {
  11288. return new View(app, el, params);
  11289. },
  11290. get: function get(viewEl) {
  11291. var $viewEl = $(viewEl);
  11292. if ($viewEl.length && $viewEl[0].f7View) { return $viewEl[0].f7View; }
  11293. return undefined;
  11294. },
  11295. }),
  11296. });
  11297. Object.defineProperty(app.views, 'current', {
  11298. enumerable: true,
  11299. configurable: true,
  11300. get: function get() {
  11301. return getCurrentView(app);
  11302. },
  11303. });
  11304. // Alias
  11305. app.view = app.views;
  11306. },
  11307. on: {
  11308. init: function init() {
  11309. var app = this;
  11310. $('.view-init').each(function (index, viewEl) {
  11311. if (viewEl.f7View) { return; }
  11312. var viewParams = $(viewEl).dataset();
  11313. app.views.create(viewEl, viewParams);
  11314. });
  11315. },
  11316. 'modalOpen panelOpen': function onOpen(instance) {
  11317. var app = this;
  11318. instance.$el.find('.view-init').each(function (index, viewEl) {
  11319. if (viewEl.f7View) { return; }
  11320. var viewParams = $(viewEl).dataset();
  11321. app.views.create(viewEl, viewParams);
  11322. });
  11323. },
  11324. 'modalBeforeDestroy panelBeforeDestroy': function onClose(instance) {
  11325. if (!instance || !instance.$el) { return; }
  11326. instance.$el.find('.view-init').each(function (index, viewEl) {
  11327. var view = viewEl.f7View;
  11328. if (!view) { return; }
  11329. view.destroy();
  11330. });
  11331. },
  11332. },
  11333. vnode: {
  11334. 'view-init': {
  11335. insert: function insert(vnode) {
  11336. var app = this;
  11337. var viewEl = vnode.elm;
  11338. if (viewEl.f7View) { return; }
  11339. var viewParams = $(viewEl).dataset();
  11340. app.views.create(viewEl, viewParams);
  11341. },
  11342. destroy: function destroy(vnode) {
  11343. var viewEl = vnode.elm;
  11344. var view = viewEl.f7View;
  11345. if (!view) { return; }
  11346. view.destroy();
  11347. },
  11348. },
  11349. },
  11350. };
  11351. var Navbar = {
  11352. size: function size(el) {
  11353. var app = this;
  11354. var $el = $(el);
  11355. if ($el.hasClass('navbars')) {
  11356. $el = $el.children('.navbar').each(function (index, navbarEl) {
  11357. app.navbar.size(navbarEl);
  11358. });
  11359. return;
  11360. }
  11361. var $innerEl = $el.children('.navbar-inner');
  11362. if (!$innerEl.length) { return; }
  11363. var needCenterTitle = (
  11364. $innerEl.hasClass('navbar-inner-centered-title')
  11365. || app.params.navbar[((app.theme) + "CenterTitle")]
  11366. );
  11367. var needLeftTitle = app.theme === 'ios' && !app.params.navbar[((app.theme) + "CenterTitle")];
  11368. if (!needCenterTitle && !needLeftTitle) { return; }
  11369. if (
  11370. $el.hasClass('stacked')
  11371. || $el.parents('.stacked').length > 0
  11372. || $el.parents('.tab:not(.tab-active)').length > 0
  11373. || $el.parents('.popup:not(.modal-in)').length > 0
  11374. ) {
  11375. return;
  11376. }
  11377. if (app.theme !== 'ios' && app.params.navbar[((app.theme) + "CenterTitle")]) {
  11378. $innerEl.addClass('navbar-inner-centered-title');
  11379. }
  11380. if (app.theme === 'ios' && !app.params.navbar.iosCenterTitle) {
  11381. $innerEl.addClass('navbar-inner-left-title');
  11382. }
  11383. var $viewEl = $el.parents('.view').eq(0);
  11384. var left = app.rtl ? $innerEl.children('.right') : $innerEl.children('.left');
  11385. var right = app.rtl ? $innerEl.children('.left') : $innerEl.children('.right');
  11386. var title = $innerEl.children('.title');
  11387. var subnavbar = $innerEl.children('.subnavbar');
  11388. var noLeft = left.length === 0;
  11389. var noRight = right.length === 0;
  11390. var leftWidth = noLeft ? 0 : left.outerWidth(true);
  11391. var rightWidth = noRight ? 0 : right.outerWidth(true);
  11392. var titleWidth = title.outerWidth(true);
  11393. var navbarStyles = $innerEl.styles();
  11394. var navbarWidth = $innerEl[0].offsetWidth;
  11395. var navbarInnerWidth = navbarWidth - parseInt(navbarStyles.paddingLeft, 10) - parseInt(navbarStyles.paddingRight, 10);
  11396. var isPrevious = $el.hasClass('navbar-previous');
  11397. var sliding = $innerEl.hasClass('sliding');
  11398. var router;
  11399. var dynamicNavbar;
  11400. if ($viewEl.length > 0 && $viewEl[0].f7View) {
  11401. router = $viewEl[0].f7View.router;
  11402. dynamicNavbar = router && router.dynamicNavbar;
  11403. }
  11404. var currLeft;
  11405. var diff;
  11406. if (noRight) {
  11407. currLeft = navbarInnerWidth - titleWidth;
  11408. }
  11409. if (noLeft) {
  11410. currLeft = 0;
  11411. }
  11412. if (!noLeft && !noRight) {
  11413. currLeft = ((navbarInnerWidth - rightWidth - titleWidth) + leftWidth) / 2;
  11414. }
  11415. var requiredLeft = (navbarInnerWidth - titleWidth) / 2;
  11416. if (navbarInnerWidth - leftWidth - rightWidth > titleWidth) {
  11417. if (requiredLeft < leftWidth) {
  11418. requiredLeft = leftWidth;
  11419. }
  11420. if (requiredLeft + titleWidth > navbarInnerWidth - rightWidth) {
  11421. requiredLeft = navbarInnerWidth - rightWidth - titleWidth;
  11422. }
  11423. diff = requiredLeft - currLeft;
  11424. } else {
  11425. diff = 0;
  11426. }
  11427. // RTL inverter
  11428. var inverter = app.rtl ? -1 : 1;
  11429. if (dynamicNavbar && app.theme === 'ios') {
  11430. if (title.hasClass('sliding') || (title.length > 0 && sliding)) {
  11431. var titleLeftOffset = -(currLeft + diff) * inverter;
  11432. var titleRightOffset = (navbarInnerWidth - currLeft - diff - titleWidth) * inverter;
  11433. if (isPrevious) {
  11434. if (router && router.params.iosAnimateNavbarBackIcon) {
  11435. var activeNavbarBackLink = $el.parent().find('.navbar-current').children('.left.sliding').find('.back .icon ~ span');
  11436. if (activeNavbarBackLink.length > 0) {
  11437. titleLeftOffset += activeNavbarBackLink[0].offsetLeft;
  11438. }
  11439. }
  11440. }
  11441. title[0].f7NavbarLeftOffset = titleLeftOffset;
  11442. title[0].f7NavbarRightOffset = titleRightOffset;
  11443. }
  11444. if (!noLeft && (left.hasClass('sliding') || sliding)) {
  11445. if (app.rtl) {
  11446. left[0].f7NavbarLeftOffset = (-(navbarInnerWidth - left[0].offsetWidth) / 2) * inverter;
  11447. left[0].f7NavbarRightOffset = leftWidth * inverter;
  11448. } else {
  11449. left[0].f7NavbarLeftOffset = -leftWidth;
  11450. left[0].f7NavbarRightOffset = ((navbarInnerWidth - left[0].offsetWidth) / 2);
  11451. if (router && router.params.iosAnimateNavbarBackIcon && left.find('.back .icon').length > 0) {
  11452. if (left.find('.back .icon ~ span').length) {
  11453. var leftOffset = left[0].f7NavbarLeftOffset;
  11454. var rightOffset = left[0].f7NavbarRightOffset;
  11455. left[0].f7NavbarLeftOffset = 0;
  11456. left[0].f7NavbarRightOffset = 0;
  11457. left.find('.back .icon ~ span')[0].f7NavbarLeftOffset = leftOffset;
  11458. left.find('.back .icon ~ span')[0].f7NavbarRightOffset = rightOffset - left.find('.back .icon')[0].offsetWidth;
  11459. }
  11460. }
  11461. }
  11462. }
  11463. if (!noRight && (right.hasClass('sliding') || sliding)) {
  11464. if (app.rtl) {
  11465. right[0].f7NavbarLeftOffset = -rightWidth * inverter;
  11466. right[0].f7NavbarRightOffset = ((navbarInnerWidth - right[0].offsetWidth) / 2) * inverter;
  11467. } else {
  11468. right[0].f7NavbarLeftOffset = -(navbarInnerWidth - right[0].offsetWidth) / 2;
  11469. right[0].f7NavbarRightOffset = rightWidth;
  11470. }
  11471. }
  11472. if (subnavbar.length && (subnavbar.hasClass('sliding') || sliding)) {
  11473. subnavbar[0].f7NavbarLeftOffset = app.rtl ? subnavbar[0].offsetWidth : -subnavbar[0].offsetWidth;
  11474. subnavbar[0].f7NavbarRightOffset = -subnavbar[0].f7NavbarLeftOffset;
  11475. }
  11476. }
  11477. // Center title
  11478. if (needCenterTitle) {
  11479. var titleLeft = diff;
  11480. if (app.rtl && noLeft && noRight && title.length > 0) { titleLeft = -titleLeft; }
  11481. title.css({ left: (titleLeft + "px") });
  11482. }
  11483. },
  11484. hide: function hide(el, animate, hideStatusbar) {
  11485. if ( animate === void 0 ) animate = true;
  11486. if ( hideStatusbar === void 0 ) hideStatusbar = false;
  11487. var app = this;
  11488. var $el = $(el);
  11489. var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length;
  11490. if (isDynamic) { $el = $el.parents('.navbars'); }
  11491. if (!$el.length) { return; }
  11492. if ($el.hasClass('navbar-hidden')) { return; }
  11493. var className = "navbar-hidden" + (animate ? ' navbar-transitioning' : '');
  11494. var currentIsLarge = isDynamic
  11495. ? $el.find('.navbar-current .title-large').length
  11496. : $el.find('.title-large').length;
  11497. if (currentIsLarge) {
  11498. className += ' navbar-large-hidden';
  11499. }
  11500. if (hideStatusbar) {
  11501. className += ' navbar-hidden-statusbar';
  11502. }
  11503. $el.transitionEnd(function () {
  11504. $el.removeClass('navbar-transitioning');
  11505. });
  11506. $el.addClass(className);
  11507. if (isDynamic) {
  11508. $el.children('.navbar').each(function (index, subEl) {
  11509. $(subEl).trigger('navbar:hide');
  11510. app.emit('navbarHide', subEl);
  11511. });
  11512. } else {
  11513. $el.trigger('navbar:hide');
  11514. app.emit('navbarHide', $el[0]);
  11515. }
  11516. },
  11517. show: function show(el, animate) {
  11518. if ( el === void 0 ) el = '.navbar-hidden';
  11519. if ( animate === void 0 ) animate = true;
  11520. var app = this;
  11521. var $el = $(el);
  11522. var isDynamic = $el.hasClass('navbar') && $el.parent('.navbars').length;
  11523. if (isDynamic) { $el = $el.parents('.navbars'); }
  11524. if (!$el.length) { return; }
  11525. if (!$el.hasClass('navbar-hidden')) { return; }
  11526. if (animate) {
  11527. $el.addClass('navbar-transitioning');
  11528. $el.transitionEnd(function () {
  11529. $el.removeClass('navbar-transitioning');
  11530. });
  11531. }
  11532. $el.removeClass('navbar-hidden navbar-large-hidden navbar-hidden-statusbar');
  11533. if (isDynamic) {
  11534. $el.children('.navbar').each(function (index, subEl) {
  11535. $(subEl).trigger('navbar:show');
  11536. app.emit('navbarShow', subEl);
  11537. });
  11538. } else {
  11539. $el.trigger('navbar:show');
  11540. app.emit('navbarShow', $el[0]);
  11541. }
  11542. },
  11543. getElByPage: function getElByPage(page) {
  11544. var $pageEl;
  11545. var $navbarEl;
  11546. var pageData;
  11547. if (page.$navbarEl || page.$el) {
  11548. pageData = page;
  11549. $pageEl = page.$el;
  11550. } else {
  11551. $pageEl = $(page);
  11552. if ($pageEl.length > 0) { pageData = $pageEl[0].f7Page; }
  11553. }
  11554. if (pageData && pageData.$navbarEl && pageData.$navbarEl.length > 0) {
  11555. $navbarEl = pageData.$navbarEl;
  11556. } else if ($pageEl) {
  11557. $navbarEl = $pageEl.children('.navbar');
  11558. }
  11559. if (!$navbarEl || ($navbarEl && $navbarEl.length === 0)) { return undefined; }
  11560. return $navbarEl[0];
  11561. },
  11562. getPageByEl: function getPageByEl(navbarEl) {
  11563. var $navbarEl = $(navbarEl);
  11564. if ($navbarEl.parents('.page').length) {
  11565. return $navbarEl.parents('.page')[0];
  11566. }
  11567. var pageEl;
  11568. $navbarEl.parents('.view').find('.page').each(function (index, el) {
  11569. if (el && el.f7Page && el.f7Page.navbarEl && $navbarEl[0] === el.f7Page.navbarEl) {
  11570. pageEl = el;
  11571. }
  11572. });
  11573. return pageEl;
  11574. },
  11575. collapseLargeTitle: function collapseLargeTitle(navbarEl) {
  11576. var app = this;
  11577. var $navbarEl = $(navbarEl);
  11578. if ($navbarEl.hasClass('navbars')) {
  11579. $navbarEl = $navbarEl.find('.navbar');
  11580. if ($navbarEl.length > 1) {
  11581. $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
  11582. }
  11583. if ($navbarEl.length > 1 || !$navbarEl.length) {
  11584. return;
  11585. }
  11586. }
  11587. var $pageEl = $(app.navbar.getPageByEl($navbarEl));
  11588. $navbarEl.addClass('navbar-large-collapsed');
  11589. $pageEl.eq(0).addClass('page-with-navbar-large-collapsed').trigger('page:navbarlargecollapsed');
  11590. app.emit('pageNavbarLargeCollapsed', $pageEl[0]);
  11591. $navbarEl.trigger('navbar:collapse');
  11592. app.emit('navbarCollapse', $navbarEl[0]);
  11593. },
  11594. expandLargeTitle: function expandLargeTitle(navbarEl) {
  11595. var app = this;
  11596. var $navbarEl = $(navbarEl);
  11597. if ($navbarEl.hasClass('navbars')) {
  11598. $navbarEl = $navbarEl.find('.navbar-large');
  11599. if ($navbarEl.length > 1) {
  11600. $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
  11601. }
  11602. if ($navbarEl.length > 1 || !$navbarEl.length) {
  11603. return;
  11604. }
  11605. }
  11606. var $pageEl = $(app.navbar.getPageByEl($navbarEl));
  11607. $navbarEl.removeClass('navbar-large-collapsed');
  11608. $pageEl.eq(0).removeClass('page-with-navbar-large-collapsed').trigger('page:navbarlargeexpanded');
  11609. app.emit('pageNavbarLargeExpanded', $pageEl[0]);
  11610. $navbarEl.trigger('navbar:expand');
  11611. app.emit('navbarExpand', $navbarEl[0]);
  11612. },
  11613. toggleLargeTitle: function toggleLargeTitle(navbarEl) {
  11614. var app = this;
  11615. var $navbarEl = $(navbarEl);
  11616. if ($navbarEl.hasClass('navbars')) {
  11617. $navbarEl = $navbarEl.find('.navbar-large');
  11618. if ($navbarEl.length > 1) {
  11619. $navbarEl = $(navbarEl).find('.navbar-large.navbar-current');
  11620. }
  11621. if ($navbarEl.length > 1 || !$navbarEl.length) {
  11622. return;
  11623. }
  11624. }
  11625. if ($navbarEl.hasClass('navbar-large-collapsed')) {
  11626. app.navbar.expandLargeTitle($navbarEl);
  11627. } else {
  11628. app.navbar.collapseLargeTitle($navbarEl);
  11629. }
  11630. },
  11631. initNavbarOnScroll: function initNavbarOnScroll(pageEl, navbarEl, needHide, needCollapse, needTransparent) {
  11632. var app = this;
  11633. var $pageEl = $(pageEl);
  11634. var $navbarEl = $(navbarEl);
  11635. var $titleLargeEl = $navbarEl.find('.title-large');
  11636. var isLarge = $titleLargeEl.length || $navbarEl.hasClass('.navbar-large');
  11637. var navbarHideHeight = 44;
  11638. var snapPageScrollToLargeTitle = app.params.navbar.snapPageScrollToLargeTitle;
  11639. var snapPageScrollToTransparentNavbar = app.params.navbar.snapPageScrollToTransparentNavbar;
  11640. var previousScrollTop;
  11641. var currentScrollTop;
  11642. var scrollHeight;
  11643. var offsetHeight;
  11644. var reachEnd;
  11645. var action;
  11646. var navbarHidden;
  11647. var navbarCollapsed;
  11648. var navbarTitleLargeHeight;
  11649. var navbarOffsetHeight;
  11650. if (needCollapse || (needHide && isLarge)) {
  11651. navbarTitleLargeHeight = $navbarEl.css('--f7-navbar-large-title-height');
  11652. if (navbarTitleLargeHeight && navbarTitleLargeHeight.indexOf('px') >= 0) {
  11653. navbarTitleLargeHeight = parseInt(navbarTitleLargeHeight, 10);
  11654. if (Number.isNaN(navbarTitleLargeHeight) && $titleLargeEl.length) {
  11655. navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
  11656. } else if (Number.isNaN(navbarTitleLargeHeight)) {
  11657. if (app.theme === 'ios') { navbarTitleLargeHeight = 52; }
  11658. else if (app.theme === 'md') { navbarTitleLargeHeight = 48; }
  11659. else if (app.theme === 'aurora') { navbarTitleLargeHeight = 38; }
  11660. }
  11661. } else if ($titleLargeEl.length) {
  11662. navbarTitleLargeHeight = $titleLargeEl[0].offsetHeight;
  11663. } else { // eslint-disable-next-line
  11664. if (app.theme === 'ios') { navbarTitleLargeHeight = 52; }
  11665. else if (app.theme === 'md') { navbarTitleLargeHeight = 48; }
  11666. else if (app.theme === 'aurora') { navbarTitleLargeHeight = 38; }
  11667. }
  11668. }
  11669. if (needHide && isLarge) {
  11670. navbarHideHeight += navbarTitleLargeHeight;
  11671. }
  11672. var scrollChanged;
  11673. var scrollContent;
  11674. var scrollTimeoutId;
  11675. var touchEndTimeoutId;
  11676. var touchSnapTimeout = 70;
  11677. var desktopSnapTimeout = 300;
  11678. function snapLargeNavbar() {
  11679. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  11680. if (inSearchbarExpanded) { return; }
  11681. if (!scrollContent || currentScrollTop < 0) { return; }
  11682. if (currentScrollTop >= navbarTitleLargeHeight / 2 && currentScrollTop < navbarTitleLargeHeight) {
  11683. $(scrollContent).scrollTop(navbarTitleLargeHeight, 100);
  11684. } else if (currentScrollTop < navbarTitleLargeHeight) {
  11685. $(scrollContent).scrollTop(0, 200);
  11686. }
  11687. }
  11688. function snapTransparentNavbar() {
  11689. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  11690. if (inSearchbarExpanded) { return; }
  11691. if (!scrollContent || currentScrollTop < 0) { return; }
  11692. if (currentScrollTop >= navbarOffsetHeight / 2 && currentScrollTop < navbarOffsetHeight) {
  11693. $(scrollContent).scrollTop(navbarOffsetHeight, 100);
  11694. } else if (currentScrollTop < navbarOffsetHeight) {
  11695. $(scrollContent).scrollTop(0, 200);
  11696. }
  11697. }
  11698. function handleNavbarTransparent() {
  11699. var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
  11700. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  11701. if (inSearchbarExpanded || isHidden) { return; }
  11702. if (!navbarOffsetHeight) {
  11703. navbarOffsetHeight = navbarEl.offsetHeight;
  11704. }
  11705. var opacity = currentScrollTop / navbarOffsetHeight;
  11706. var notTransparent = $navbarEl.hasClass('navbar-transparent-visible');
  11707. opacity = Math.max(Math.min(opacity, 1), 0);
  11708. if ((notTransparent && opacity === 1) || (!notTransparent && opacity === 0)) {
  11709. $navbarEl.find('.navbar-bg, .title').css('opacity', '');
  11710. return;
  11711. }
  11712. if (notTransparent && opacity === 0) {
  11713. $navbarEl.trigger('navbar:transparenthide');
  11714. app.emit('navbarTransparentHide', $navbarEl[0]);
  11715. $navbarEl.removeClass('navbar-transparent-visible');
  11716. $navbarEl.find('.navbar-bg, .title').css('opacity', '');
  11717. return;
  11718. }
  11719. if (!notTransparent && opacity === 1) {
  11720. $navbarEl.trigger('navbar:transparentshow');
  11721. app.emit('navbarTransparentShow', $navbarEl[0]);
  11722. $navbarEl.addClass('navbar-transparent-visible');
  11723. $navbarEl.find('.navbar-bg, .title').css('opacity', '');
  11724. return;
  11725. }
  11726. $navbarEl.find('.navbar-bg, .title').css('opacity', opacity);
  11727. if (snapPageScrollToTransparentNavbar) {
  11728. if (!Support.touch) {
  11729. clearTimeout(scrollTimeoutId);
  11730. scrollTimeoutId = setTimeout(function () {
  11731. snapTransparentNavbar();
  11732. }, desktopSnapTimeout);
  11733. } else if (touchEndTimeoutId) {
  11734. clearTimeout(touchEndTimeoutId);
  11735. touchEndTimeoutId = null;
  11736. touchEndTimeoutId = setTimeout(function () {
  11737. snapTransparentNavbar();
  11738. clearTimeout(touchEndTimeoutId);
  11739. touchEndTimeoutId = null;
  11740. }, touchSnapTimeout);
  11741. }
  11742. }
  11743. }
  11744. var previousCollapseProgress = null;
  11745. var collapseProgress = null;
  11746. function handleLargeNavbarCollapse() {
  11747. var isHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
  11748. if (isHidden) { return; }
  11749. var isLargeTransparent = $navbarEl.hasClass('navbar-large-transparent')
  11750. || (
  11751. $navbarEl.hasClass('navbar-large')
  11752. && $navbarEl.hasClass('navbar-transparent')
  11753. );
  11754. previousCollapseProgress = collapseProgress;
  11755. collapseProgress = Math.min(Math.max((currentScrollTop / navbarTitleLargeHeight), 0), 1);
  11756. var previousCollapseWasInMiddle = previousCollapseProgress > 0 && previousCollapseProgress < 1;
  11757. var inSearchbarExpanded = $navbarEl.hasClass('with-searchbar-expandable-enabled');
  11758. if (inSearchbarExpanded) { return; }
  11759. navbarCollapsed = $navbarEl.hasClass('navbar-large-collapsed');
  11760. if (collapseProgress === 0 && navbarCollapsed) {
  11761. app.navbar.expandLargeTitle($navbarEl[0]);
  11762. } else if (collapseProgress === 1 && !navbarCollapsed) {
  11763. app.navbar.collapseLargeTitle($navbarEl[0]);
  11764. }
  11765. if (
  11766. (collapseProgress === 0 && navbarCollapsed)
  11767. || (collapseProgress === 0 && previousCollapseWasInMiddle)
  11768. || (collapseProgress === 1 && !navbarCollapsed)
  11769. || (collapseProgress === 1 && previousCollapseWasInMiddle)
  11770. ) {
  11771. if (app.theme === 'md') {
  11772. $navbarEl.find('.navbar-inner').css('overflow', '');
  11773. }
  11774. $navbarEl.find('.title').css('opacity', '');
  11775. $navbarEl.find('.title-large-text, .subnavbar').css('transform', '');
  11776. if (isLargeTransparent) {
  11777. $navbarEl.find('.navbar-bg').css('opacity', '');
  11778. } else {
  11779. $navbarEl.find('.navbar-bg').css('transform', '');
  11780. }
  11781. } else if (collapseProgress > 0 && collapseProgress < 1) {
  11782. if (app.theme === 'md') {
  11783. $navbarEl.find('.navbar-inner').css('overflow', 'visible');
  11784. }
  11785. $navbarEl.find('.title').css('opacity', collapseProgress);
  11786. $navbarEl.find('.title-large-text, .subnavbar').css('transform', ("translate3d(0px, " + (-1 * collapseProgress * navbarTitleLargeHeight) + "px, 0)"));
  11787. if (isLargeTransparent) {
  11788. $navbarEl.find('.navbar-bg').css('opacity', collapseProgress);
  11789. } else {
  11790. $navbarEl.find('.navbar-bg').css('transform', ("translate3d(0px, " + (-1 * collapseProgress * navbarTitleLargeHeight) + "px, 0)"));
  11791. }
  11792. }
  11793. if (snapPageScrollToLargeTitle) {
  11794. if (!Support.touch) {
  11795. clearTimeout(scrollTimeoutId);
  11796. scrollTimeoutId = setTimeout(function () {
  11797. snapLargeNavbar();
  11798. }, desktopSnapTimeout);
  11799. } else if (touchEndTimeoutId) {
  11800. clearTimeout(touchEndTimeoutId);
  11801. touchEndTimeoutId = null;
  11802. touchEndTimeoutId = setTimeout(function () {
  11803. snapLargeNavbar();
  11804. clearTimeout(touchEndTimeoutId);
  11805. touchEndTimeoutId = null;
  11806. }, touchSnapTimeout);
  11807. }
  11808. }
  11809. }
  11810. function handleTitleHideShow() {
  11811. if ($pageEl.hasClass('page-with-card-opened')) { return; }
  11812. scrollHeight = scrollContent.scrollHeight;
  11813. offsetHeight = scrollContent.offsetHeight;
  11814. reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
  11815. navbarHidden = $navbarEl.hasClass('navbar-hidden') || $navbarEl.parent('.navbars').hasClass('navbar-hidden');
  11816. if (reachEnd) {
  11817. if (app.params.navbar.showOnPageScrollEnd) {
  11818. action = 'show';
  11819. }
  11820. } else if (previousScrollTop > currentScrollTop) {
  11821. if (app.params.navbar.showOnPageScrollTop || currentScrollTop <= navbarHideHeight) {
  11822. action = 'show';
  11823. } else {
  11824. action = 'hide';
  11825. }
  11826. } else if (currentScrollTop > navbarHideHeight) {
  11827. action = 'hide';
  11828. } else {
  11829. action = 'show';
  11830. }
  11831. if (action === 'show' && navbarHidden) {
  11832. app.navbar.show($navbarEl);
  11833. navbarHidden = false;
  11834. } else if (action === 'hide' && !navbarHidden) {
  11835. app.navbar.hide($navbarEl);
  11836. navbarHidden = true;
  11837. }
  11838. previousScrollTop = currentScrollTop;
  11839. }
  11840. function handleScroll(e) {
  11841. scrollContent = this;
  11842. if (e && e.target && e.target !== scrollContent) {
  11843. return;
  11844. }
  11845. currentScrollTop = scrollContent.scrollTop;
  11846. scrollChanged = currentScrollTop;
  11847. if (needCollapse) {
  11848. handleLargeNavbarCollapse();
  11849. } else if (needTransparent) {
  11850. handleNavbarTransparent();
  11851. }
  11852. if ($pageEl.hasClass('page-previous')) { return; }
  11853. if (needHide) {
  11854. handleTitleHideShow();
  11855. }
  11856. }
  11857. function handeTouchStart() {
  11858. scrollChanged = false;
  11859. }
  11860. function handleTouchEnd() {
  11861. clearTimeout(touchEndTimeoutId);
  11862. touchEndTimeoutId = null;
  11863. touchEndTimeoutId = setTimeout(function () {
  11864. if (scrollChanged !== false) {
  11865. if (needTransparent && !needCollapse) {
  11866. snapTransparentNavbar();
  11867. } else {
  11868. snapLargeNavbar();
  11869. }
  11870. clearTimeout(touchEndTimeoutId);
  11871. touchEndTimeoutId = null;
  11872. }
  11873. }, touchSnapTimeout);
  11874. }
  11875. $pageEl.on('scroll', '.page-content', handleScroll, true);
  11876. if (Support.touch && ((needCollapse && snapPageScrollToLargeTitle) || (needTransparent && snapPageScrollToTransparentNavbar))) {
  11877. app.on('touchstart:passive', handeTouchStart);
  11878. app.on('touchend:passive', handleTouchEnd);
  11879. }
  11880. if (needCollapse) {
  11881. $pageEl.find('.page-content').each(function (pageContentIndex, pageContentEl) {
  11882. if (pageContentEl.scrollTop > 0) { handleScroll.call(pageContentEl); }
  11883. });
  11884. } else if (needTransparent) {
  11885. $pageEl.find('.page-content').each(function (pageContentIndex, pageContentEl) {
  11886. if (pageContentEl.scrollTop > 0) { handleScroll.call(pageContentEl); }
  11887. });
  11888. }
  11889. $pageEl[0].f7DetachNavbarScrollHandlers = function f7DetachNavbarScrollHandlers() {
  11890. delete $pageEl[0].f7DetachNavbarScrollHandlers;
  11891. $pageEl.off('scroll', '.page-content', handleScroll, true);
  11892. if (Support.touch && ((needCollapse && snapPageScrollToLargeTitle) || (needTransparent && snapPageScrollToTransparentNavbar))) {
  11893. app.off('touchstart:passive', handeTouchStart);
  11894. app.off('touchend:passive', handleTouchEnd);
  11895. }
  11896. };
  11897. },
  11898. };
  11899. var Navbar$1 = {
  11900. name: 'navbar',
  11901. create: function create() {
  11902. var app = this;
  11903. Utils.extend(app, {
  11904. navbar: {
  11905. size: Navbar.size.bind(app),
  11906. hide: Navbar.hide.bind(app),
  11907. show: Navbar.show.bind(app),
  11908. getElByPage: Navbar.getElByPage.bind(app),
  11909. getPageByEl: Navbar.getPageByEl.bind(app),
  11910. collapseLargeTitle: Navbar.collapseLargeTitle.bind(app),
  11911. expandLargeTitle: Navbar.expandLargeTitle.bind(app),
  11912. toggleLargeTitle: Navbar.toggleLargeTitle.bind(app),
  11913. initNavbarOnScroll: Navbar.initNavbarOnScroll.bind(app),
  11914. },
  11915. });
  11916. },
  11917. params: {
  11918. navbar: {
  11919. scrollTopOnTitleClick: true,
  11920. iosCenterTitle: true,
  11921. mdCenterTitle: false,
  11922. auroraCenterTitle: true,
  11923. hideOnPageScroll: false,
  11924. showOnPageScrollEnd: true,
  11925. showOnPageScrollTop: true,
  11926. collapseLargeTitleOnScroll: true,
  11927. snapPageScrollToLargeTitle: true,
  11928. snapPageScrollToTransparentNavbar: true,
  11929. },
  11930. },
  11931. on: {
  11932. 'panelBreakpoint panelCollapsedBreakpoint panelResize viewResize resize viewMasterDetailBreakpoint': function onPanelResize() {
  11933. var app = this;
  11934. $('.navbar').each(function (index, navbarEl) {
  11935. app.navbar.size(navbarEl);
  11936. });
  11937. },
  11938. pageBeforeRemove: function pageBeforeRemove(page) {
  11939. if (page.$el[0].f7DetachNavbarScrollHandlers) {
  11940. page.$el[0].f7DetachNavbarScrollHandlers();
  11941. }
  11942. },
  11943. pageBeforeIn: function pageBeforeIn(page) {
  11944. var app = this;
  11945. if (app.theme !== 'ios') { return; }
  11946. var $navbarsEl;
  11947. var view = page.$el.parents('.view')[0].f7View;
  11948. var navbarEl = app.navbar.getElByPage(page);
  11949. if (!navbarEl) {
  11950. $navbarsEl = page.$el.parents('.view').children('.navbars');
  11951. } else {
  11952. $navbarsEl = $(navbarEl).parents('.navbars');
  11953. }
  11954. if (page.$el.hasClass('no-navbar') || (view.router.dynamicNavbar && !navbarEl)) {
  11955. var animate = !!(page.pageFrom && page.router.history.length > 0);
  11956. app.navbar.hide($navbarsEl, animate);
  11957. } else {
  11958. app.navbar.show($navbarsEl);
  11959. }
  11960. },
  11961. pageReinit: function pageReinit(page) {
  11962. var app = this;
  11963. var $navbarEl = $(app.navbar.getElByPage(page));
  11964. if (!$navbarEl || $navbarEl.length === 0) { return; }
  11965. app.navbar.size($navbarEl);
  11966. },
  11967. pageInit: function pageInit(page) {
  11968. var app = this;
  11969. var $navbarEl = $(app.navbar.getElByPage(page));
  11970. if (!$navbarEl || $navbarEl.length === 0) { return; }
  11971. // Size
  11972. app.navbar.size($navbarEl);
  11973. // Need Collapse On Scroll
  11974. var needCollapseOnScrollHandler;
  11975. if ($navbarEl.find('.title-large').length > 0) {
  11976. $navbarEl.addClass('navbar-large');
  11977. }
  11978. if ($navbarEl.hasClass('navbar-large')) {
  11979. if (app.params.navbar.collapseLargeTitleOnScroll) { needCollapseOnScrollHandler = true; }
  11980. page.$el.addClass('page-with-navbar-large');
  11981. }
  11982. // Need transparent on scroll
  11983. var needTransparentOnScroll;
  11984. if (!needCollapseOnScrollHandler && $navbarEl.hasClass('navbar-transparent')) {
  11985. needTransparentOnScroll = true;
  11986. }
  11987. // Need Hide On Scroll
  11988. var needHideOnScrollHandler;
  11989. if (
  11990. app.params.navbar.hideOnPageScroll
  11991. || page.$el.find('.hide-navbar-on-scroll').length
  11992. || page.$el.hasClass('hide-navbar-on-scroll')
  11993. || page.$el.find('.hide-bars-on-scroll').length
  11994. || page.$el.hasClass('hide-bars-on-scroll')
  11995. ) {
  11996. if (
  11997. page.$el.find('.keep-navbar-on-scroll').length
  11998. || page.$el.hasClass('keep-navbar-on-scroll')
  11999. || page.$el.find('.keep-bars-on-scroll').length
  12000. || page.$el.hasClass('keep-bars-on-scroll')
  12001. ) {
  12002. needHideOnScrollHandler = false;
  12003. } else {
  12004. needHideOnScrollHandler = true;
  12005. }
  12006. }
  12007. if (needCollapseOnScrollHandler || needHideOnScrollHandler || needTransparentOnScroll) {
  12008. app.navbar.initNavbarOnScroll(page.el, $navbarEl[0], needHideOnScrollHandler, needCollapseOnScrollHandler, needTransparentOnScroll);
  12009. }
  12010. },
  12011. 'panelOpen panelSwipeOpen modalOpen': function onPanelModalOpen(instance) {
  12012. var app = this;
  12013. instance.$el.find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
  12014. app.navbar.size(navbarEl);
  12015. });
  12016. },
  12017. tabShow: function tabShow(tabEl) {
  12018. var app = this;
  12019. $(tabEl).find('.navbar:not(.navbar-previous):not(.stacked)').each(function (index, navbarEl) {
  12020. app.navbar.size(navbarEl);
  12021. });
  12022. },
  12023. },
  12024. clicks: {
  12025. '.navbar .title': function onTitleClick($clickedEl) {
  12026. var app = this;
  12027. if (!app.params.navbar.scrollTopOnTitleClick) { return; }
  12028. if ($clickedEl.closest('a').length > 0) {
  12029. return;
  12030. }
  12031. var $pageContentEl;
  12032. // Find active page
  12033. var $navbarEl = $clickedEl.parents('.navbar');
  12034. var $navbarsEl = $navbarEl.parents('.navbars');
  12035. // Static Layout
  12036. $pageContentEl = $navbarEl.parents('.page-content');
  12037. if ($pageContentEl.length === 0) {
  12038. // Fixed Layout
  12039. if ($navbarEl.parents('.page').length > 0) {
  12040. $pageContentEl = $navbarEl.parents('.page').find('.page-content');
  12041. }
  12042. // Through Layout iOS
  12043. if ($pageContentEl.length === 0 && $navbarsEl.length) {
  12044. if ($navbarsEl.nextAll('.page-current:not(.stacked)').length > 0) {
  12045. $pageContentEl = $navbarsEl.nextAll('.page-current:not(.stacked)').find('.page-content');
  12046. }
  12047. }
  12048. // Through Layout
  12049. if ($pageContentEl.length === 0) {
  12050. if ($navbarEl.nextAll('.page-current:not(.stacked)').length > 0) {
  12051. $pageContentEl = $navbarEl.nextAll('.page-current:not(.stacked)').find('.page-content');
  12052. }
  12053. }
  12054. }
  12055. if ($pageContentEl && $pageContentEl.length > 0) {
  12056. // Check for tab
  12057. if ($pageContentEl.hasClass('tab')) {
  12058. $pageContentEl = $pageContentEl.parent('.tabs').children('.page-content.tab-active');
  12059. }
  12060. if ($pageContentEl.length > 0) { $pageContentEl.scrollTop(0, 300); }
  12061. }
  12062. },
  12063. },
  12064. vnode: {
  12065. navbar: {
  12066. postpatch: function postpatch(vnode) {
  12067. var app = this;
  12068. app.navbar.size(vnode.elm);
  12069. },
  12070. },
  12071. },
  12072. };
  12073. var Toolbar = {
  12074. setHighlight: function setHighlight(tabbarEl) {
  12075. var app = this;
  12076. if (app.theme !== 'md') { return; }
  12077. var $tabbarEl = $(tabbarEl);
  12078. if ($tabbarEl.length === 0 || !($tabbarEl.hasClass('tabbar') || $tabbarEl.hasClass('tabbar-labels'))) { return; }
  12079. var $highlightEl = $tabbarEl.find('.tab-link-highlight');
  12080. var tabLinksCount = $tabbarEl.find('.tab-link').length;
  12081. if (tabLinksCount === 0) {
  12082. $highlightEl.remove();
  12083. return;
  12084. }
  12085. if ($highlightEl.length === 0) {
  12086. $tabbarEl.children('.toolbar-inner').append('<span class="tab-link-highlight"></span>');
  12087. $highlightEl = $tabbarEl.find('.tab-link-highlight');
  12088. } else if ($highlightEl.next().length) {
  12089. $tabbarEl.children('.toolbar-inner').append($highlightEl);
  12090. }
  12091. var $activeLink = $tabbarEl.find('.tab-link-active');
  12092. var highlightWidth;
  12093. var highlightTranslate;
  12094. if ($tabbarEl.hasClass('tabbar-scrollable') && $activeLink && $activeLink[0]) {
  12095. highlightWidth = ($activeLink[0].offsetWidth) + "px";
  12096. highlightTranslate = ($activeLink[0].offsetLeft) + "px";
  12097. } else {
  12098. var activeIndex = $activeLink.index();
  12099. highlightWidth = (100 / tabLinksCount) + "%";
  12100. highlightTranslate = ((app.rtl ? -activeIndex : activeIndex) * 100) + "%";
  12101. }
  12102. Utils.nextFrame(function () {
  12103. $highlightEl
  12104. .css('width', highlightWidth)
  12105. .transform(("translate3d(" + highlightTranslate + ",0,0)"));
  12106. });
  12107. },
  12108. init: function init(tabbarEl) {
  12109. var app = this;
  12110. app.toolbar.setHighlight(tabbarEl);
  12111. },
  12112. hide: function hide(el, animate) {
  12113. if ( animate === void 0 ) animate = true;
  12114. var app = this;
  12115. var $el = $(el);
  12116. if ($el.hasClass('toolbar-hidden')) { return; }
  12117. var className = "toolbar-hidden" + (animate ? ' toolbar-transitioning' : '');
  12118. $el.transitionEnd(function () {
  12119. $el.removeClass('toolbar-transitioning');
  12120. });
  12121. $el.addClass(className);
  12122. $el.trigger('toolbar:hide');
  12123. app.emit('toolbarHide', $el[0]);
  12124. },
  12125. show: function show(el, animate) {
  12126. if ( animate === void 0 ) animate = true;
  12127. var app = this;
  12128. var $el = $(el);
  12129. if (!$el.hasClass('toolbar-hidden')) { return; }
  12130. if (animate) {
  12131. $el.addClass('toolbar-transitioning');
  12132. $el.transitionEnd(function () {
  12133. $el.removeClass('toolbar-transitioning');
  12134. });
  12135. }
  12136. $el.removeClass('toolbar-hidden');
  12137. $el.trigger('toolbar:show');
  12138. app.emit('toolbarShow', $el[0]);
  12139. },
  12140. initToolbarOnScroll: function initToolbarOnScroll(pageEl) {
  12141. var app = this;
  12142. var $pageEl = $(pageEl);
  12143. var $toolbarEl = $pageEl.parents('.view').children('.toolbar');
  12144. if ($toolbarEl.length === 0) {
  12145. $toolbarEl = $pageEl.find('.toolbar');
  12146. }
  12147. if ($toolbarEl.length === 0) {
  12148. $toolbarEl = $pageEl.parents('.views').children('.tabbar, .tabbar-labels');
  12149. }
  12150. if ($toolbarEl.length === 0) {
  12151. return;
  12152. }
  12153. var previousScrollTop;
  12154. var currentScrollTop;
  12155. var scrollHeight;
  12156. var offsetHeight;
  12157. var reachEnd;
  12158. var action;
  12159. var toolbarHidden;
  12160. function handleScroll(e) {
  12161. if ($pageEl.hasClass('page-with-card-opened')) { return; }
  12162. if ($pageEl.hasClass('page-previous')) { return; }
  12163. var scrollContent = this;
  12164. if (e && e.target && e.target !== scrollContent) {
  12165. return;
  12166. }
  12167. currentScrollTop = scrollContent.scrollTop;
  12168. scrollHeight = scrollContent.scrollHeight;
  12169. offsetHeight = scrollContent.offsetHeight;
  12170. reachEnd = currentScrollTop + offsetHeight >= scrollHeight;
  12171. toolbarHidden = $toolbarEl.hasClass('toolbar-hidden');
  12172. if (reachEnd) {
  12173. if (app.params.toolbar.showOnPageScrollEnd) {
  12174. action = 'show';
  12175. }
  12176. } else if (previousScrollTop > currentScrollTop) {
  12177. if (app.params.toolbar.showOnPageScrollTop || currentScrollTop <= 44) {
  12178. action = 'show';
  12179. } else {
  12180. action = 'hide';
  12181. }
  12182. } else if (currentScrollTop > 44) {
  12183. action = 'hide';
  12184. } else {
  12185. action = 'show';
  12186. }
  12187. if (action === 'show' && toolbarHidden) {
  12188. app.toolbar.show($toolbarEl);
  12189. toolbarHidden = false;
  12190. } else if (action === 'hide' && !toolbarHidden) {
  12191. app.toolbar.hide($toolbarEl);
  12192. toolbarHidden = true;
  12193. }
  12194. previousScrollTop = currentScrollTop;
  12195. }
  12196. $pageEl.on('scroll', '.page-content', handleScroll, true);
  12197. $pageEl[0].f7ScrollToolbarHandler = handleScroll;
  12198. },
  12199. };
  12200. var Toolbar$1 = {
  12201. name: 'toolbar',
  12202. create: function create() {
  12203. var app = this;
  12204. Utils.extend(app, {
  12205. toolbar: {
  12206. hide: Toolbar.hide.bind(app),
  12207. show: Toolbar.show.bind(app),
  12208. setHighlight: Toolbar.setHighlight.bind(app),
  12209. initToolbarOnScroll: Toolbar.initToolbarOnScroll.bind(app),
  12210. init: Toolbar.init.bind(app),
  12211. },
  12212. });
  12213. },
  12214. params: {
  12215. toolbar: {
  12216. hideOnPageScroll: false,
  12217. showOnPageScrollEnd: true,
  12218. showOnPageScrollTop: true,
  12219. },
  12220. },
  12221. on: {
  12222. pageBeforeRemove: function pageBeforeRemove(page) {
  12223. if (page.$el[0].f7ScrollToolbarHandler) {
  12224. page.$el.off('scroll', '.page-content', page.$el[0].f7ScrollToolbarHandler, true);
  12225. }
  12226. },
  12227. pageBeforeIn: function pageBeforeIn(page) {
  12228. var app = this;
  12229. var $toolbarEl = page.$el.parents('.view').children('.toolbar');
  12230. if ($toolbarEl.length === 0) {
  12231. $toolbarEl = page.$el.parents('.views').children('.tabbar, .tabbar-labels');
  12232. }
  12233. if ($toolbarEl.length === 0) {
  12234. $toolbarEl = page.$el.find('.toolbar');
  12235. }
  12236. if ($toolbarEl.length === 0) {
  12237. return;
  12238. }
  12239. if (page.$el.hasClass('no-toolbar')) {
  12240. app.toolbar.hide($toolbarEl);
  12241. } else {
  12242. app.toolbar.show($toolbarEl);
  12243. }
  12244. },
  12245. pageInit: function pageInit(page) {
  12246. var app = this;
  12247. page.$el.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
  12248. app.toolbar.init(tabbarEl);
  12249. });
  12250. if (
  12251. app.params.toolbar.hideOnPageScroll
  12252. || page.$el.find('.hide-toolbar-on-scroll').length
  12253. || page.$el.hasClass('hide-toolbar-on-scroll')
  12254. || page.$el.find('.hide-bars-on-scroll').length
  12255. || page.$el.hasClass('hide-bars-on-scroll')
  12256. ) {
  12257. if (
  12258. page.$el.find('.keep-toolbar-on-scroll').length
  12259. || page.$el.hasClass('keep-toolbar-on-scroll')
  12260. || page.$el.find('.keep-bars-on-scroll').length
  12261. || page.$el.hasClass('keep-bars-on-scroll')
  12262. ) {
  12263. return;
  12264. }
  12265. app.toolbar.initToolbarOnScroll(page.el);
  12266. }
  12267. },
  12268. init: function init() {
  12269. var app = this;
  12270. app.root.find('.tabbar, .tabbar-labels').each(function (index, tabbarEl) {
  12271. app.toolbar.init(tabbarEl);
  12272. });
  12273. },
  12274. },
  12275. vnode: {
  12276. tabbar: {
  12277. insert: function insert(vnode) {
  12278. var app = this;
  12279. app.toolbar.init(vnode.elm);
  12280. },
  12281. },
  12282. },
  12283. };
  12284. var Subnavbar = {
  12285. name: 'subnavbar',
  12286. on: {
  12287. pageInit: function pageInit(page) {
  12288. if (page.$navbarEl && page.$navbarEl.length && page.$navbarEl.find('.subnavbar').length) {
  12289. page.$el.addClass('page-with-subnavbar');
  12290. }
  12291. if (page.$el.find('.subnavbar').length) {
  12292. page.$el.addClass('page-with-subnavbar');
  12293. }
  12294. },
  12295. },
  12296. };
  12297. var TouchRipple = function TouchRipple($el, x, y) {
  12298. var ripple = this;
  12299. if (!$el) { return undefined; }
  12300. var box = $el[0].getBoundingClientRect();
  12301. var center = {
  12302. x: x - box.left,
  12303. y: y - box.top,
  12304. };
  12305. var width = box.width;
  12306. var height = box.height;
  12307. var diameter = Math.max((Math.pow( ((Math.pow( height, 2 )) + (Math.pow( width, 2 ))), 0.5 )), 48);
  12308. 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>"));
  12309. $el.prepend(ripple.$rippleWaveEl);
  12310. ripple.rippleTransform = "translate3d(" + (-center.x + (width / 2)) + "px, " + (-center.y + (height / 2)) + "px, 0) scale(1)";
  12311. Utils.nextFrame(function () {
  12312. if (!ripple || !ripple.$rippleWaveEl) { return; }
  12313. ripple.$rippleWaveEl.transform(ripple.rippleTransform);
  12314. });
  12315. return ripple;
  12316. };
  12317. TouchRipple.prototype.destroy = function destroy () {
  12318. var ripple = this;
  12319. if (ripple.$rippleWaveEl) {
  12320. ripple.$rippleWaveEl.remove();
  12321. }
  12322. Object.keys(ripple).forEach(function (key) {
  12323. ripple[key] = null;
  12324. delete ripple[key];
  12325. });
  12326. ripple = null;
  12327. };
  12328. TouchRipple.prototype.remove = function remove () {
  12329. var ripple = this;
  12330. if (ripple.removing) { return; }
  12331. var $rippleWaveEl = this.$rippleWaveEl;
  12332. var rippleTransform = this.rippleTransform;
  12333. var removeTimeout = Utils.nextTick(function () {
  12334. ripple.destroy();
  12335. }, 400);
  12336. ripple.removing = true;
  12337. $rippleWaveEl
  12338. .addClass('ripple-wave-fill')
  12339. .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'))
  12340. .transitionEnd(function () {
  12341. clearTimeout(removeTimeout);
  12342. Utils.nextFrame(function () {
  12343. $rippleWaveEl
  12344. .addClass('ripple-wave-out')
  12345. .transform(rippleTransform.replace('scale(1)', 'scale(1.01)'));
  12346. removeTimeout = Utils.nextTick(function () {
  12347. ripple.destroy();
  12348. }, 700);
  12349. $rippleWaveEl.transitionEnd(function () {
  12350. clearTimeout(removeTimeout);
  12351. ripple.destroy();
  12352. });
  12353. });
  12354. });
  12355. };
  12356. var TouchRipple$1 = {
  12357. name: 'touch-ripple',
  12358. static: {
  12359. TouchRipple: TouchRipple,
  12360. },
  12361. create: function create() {
  12362. var app = this;
  12363. app.touchRipple = {
  12364. create: function create() {
  12365. var args = [], len = arguments.length;
  12366. while ( len-- ) args[ len ] = arguments[ len ];
  12367. return new (Function.prototype.bind.apply( TouchRipple, [ null ].concat( args) ));
  12368. },
  12369. };
  12370. },
  12371. };
  12372. var openedModals = [];
  12373. var dialogsQueue = [];
  12374. function clearDialogsQueue() {
  12375. if (dialogsQueue.length === 0) { return; }
  12376. var dialog = dialogsQueue.shift();
  12377. dialog.open();
  12378. }
  12379. var Modal = /*@__PURE__*/(function (Framework7Class) {
  12380. function Modal(app, params) {
  12381. Framework7Class.call(this, params, [app]);
  12382. var modal = this;
  12383. var defaults = {};
  12384. // Extend defaults with modules params
  12385. modal.useModulesParams(defaults);
  12386. modal.params = Utils.extend(defaults, params);
  12387. modal.opened = false;
  12388. // Install Modules
  12389. modal.useModules();
  12390. return this;
  12391. }
  12392. if ( Framework7Class ) Modal.__proto__ = Framework7Class;
  12393. Modal.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  12394. Modal.prototype.constructor = Modal;
  12395. Modal.prototype.onOpen = function onOpen () {
  12396. var modal = this;
  12397. modal.opened = true;
  12398. openedModals.push(modal);
  12399. $('html').addClass(("with-modal-" + (modal.type.toLowerCase())));
  12400. modal.$el.trigger(("modal:open " + (modal.type.toLowerCase()) + ":open"));
  12401. modal.emit(("local::open modalOpen " + (modal.type) + "Open"), modal);
  12402. };
  12403. Modal.prototype.onOpened = function onOpened () {
  12404. var modal = this;
  12405. modal.$el.trigger(("modal:opened " + (modal.type.toLowerCase()) + ":opened"));
  12406. modal.emit(("local::opened modalOpened " + (modal.type) + "Opened"), modal);
  12407. };
  12408. Modal.prototype.onClose = function onClose () {
  12409. var modal = this;
  12410. modal.opened = false;
  12411. if (!modal.type || !modal.$el) { return; }
  12412. openedModals.splice(openedModals.indexOf(modal), 1);
  12413. $('html').removeClass(("with-modal-" + (modal.type.toLowerCase())));
  12414. modal.$el.trigger(("modal:close " + (modal.type.toLowerCase()) + ":close"));
  12415. modal.emit(("local::close modalClose " + (modal.type) + "Close"), modal);
  12416. };
  12417. Modal.prototype.onClosed = function onClosed () {
  12418. var modal = this;
  12419. if (!modal.type || !modal.$el) { return; }
  12420. modal.$el.removeClass('modal-out');
  12421. modal.$el.hide();
  12422. modal.$el.trigger(("modal:closed " + (modal.type.toLowerCase()) + ":closed"));
  12423. modal.emit(("local::closed modalClosed " + (modal.type) + "Closed"), modal);
  12424. };
  12425. Modal.prototype.open = function open (animateModal) {
  12426. var modal = this;
  12427. var app = modal.app;
  12428. var $el = modal.$el;
  12429. var $backdropEl = modal.$backdropEl;
  12430. var type = modal.type;
  12431. var animate = true;
  12432. if (typeof animateModal !== 'undefined') { animate = animateModal; }
  12433. else if (typeof modal.params.animate !== 'undefined') {
  12434. animate = modal.params.animate;
  12435. }
  12436. if (!$el || $el.hasClass('modal-in')) {
  12437. return modal;
  12438. }
  12439. if (type === 'dialog' && app.params.modal.queueDialogs) {
  12440. var pushToQueue;
  12441. if ($('.dialog.modal-in').length > 0) {
  12442. pushToQueue = true;
  12443. } else if (openedModals.length > 0) {
  12444. openedModals.forEach(function (openedModal) {
  12445. if (openedModal.type === 'dialog') { pushToQueue = true; }
  12446. });
  12447. }
  12448. if (pushToQueue) {
  12449. dialogsQueue.push(modal);
  12450. return modal;
  12451. }
  12452. }
  12453. var $modalParentEl = $el.parent();
  12454. var wasInDom = $el.parents(doc).length > 0;
  12455. if (app.params.modal.moveToRoot && !$modalParentEl.is(app.root)) {
  12456. app.root.append($el);
  12457. modal.once((type + "Closed"), function () {
  12458. if (wasInDom) {
  12459. $modalParentEl.append($el);
  12460. } else {
  12461. $el.remove();
  12462. }
  12463. });
  12464. }
  12465. // Show Modal
  12466. $el.show();
  12467. /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
  12468. modal._clientLeft = $el[0].clientLeft;
  12469. // Modal
  12470. function transitionEnd() {
  12471. if ($el.hasClass('modal-out')) {
  12472. modal.onClosed();
  12473. } else if ($el.hasClass('modal-in')) {
  12474. modal.onOpened();
  12475. }
  12476. }
  12477. if (animate) {
  12478. if ($backdropEl) {
  12479. $backdropEl.removeClass('not-animated');
  12480. $backdropEl.addClass('backdrop-in');
  12481. }
  12482. $el
  12483. .animationEnd(function () {
  12484. transitionEnd();
  12485. });
  12486. $el
  12487. .transitionEnd(function () {
  12488. transitionEnd();
  12489. });
  12490. $el
  12491. .removeClass('modal-out not-animated')
  12492. .addClass('modal-in');
  12493. modal.onOpen();
  12494. } else {
  12495. if ($backdropEl) {
  12496. $backdropEl.addClass('backdrop-in not-animated');
  12497. }
  12498. $el.removeClass('modal-out').addClass('modal-in not-animated');
  12499. modal.onOpen();
  12500. modal.onOpened();
  12501. }
  12502. return modal;
  12503. };
  12504. Modal.prototype.close = function close (animateModal) {
  12505. var modal = this;
  12506. var $el = modal.$el;
  12507. var $backdropEl = modal.$backdropEl;
  12508. var animate = true;
  12509. if (typeof animateModal !== 'undefined') { animate = animateModal; }
  12510. else if (typeof modal.params.animate !== 'undefined') {
  12511. animate = modal.params.animate;
  12512. }
  12513. if (!$el || !$el.hasClass('modal-in')) {
  12514. if (dialogsQueue.indexOf(modal) >= 0) {
  12515. dialogsQueue.splice(dialogsQueue.indexOf(modal), 1);
  12516. }
  12517. return modal;
  12518. }
  12519. // backdrop
  12520. if ($backdropEl) {
  12521. var needToHideBackdrop = true;
  12522. if (modal.type === 'popup') {
  12523. modal.$el.prevAll('.popup.modal-in').each(function (index, popupEl) {
  12524. var popupInstance = popupEl.f7Modal;
  12525. if (!popupInstance) { return; }
  12526. if (
  12527. popupInstance.params.closeByBackdropClick
  12528. && popupInstance.params.backdrop
  12529. && popupInstance.backdropEl === modal.backdropEl
  12530. ) {
  12531. needToHideBackdrop = false;
  12532. }
  12533. });
  12534. }
  12535. if (needToHideBackdrop) {
  12536. $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
  12537. $backdropEl.removeClass('backdrop-in');
  12538. }
  12539. }
  12540. // Modal
  12541. $el[animate ? 'removeClass' : 'addClass']('not-animated');
  12542. function transitionEnd() {
  12543. if ($el.hasClass('modal-out')) {
  12544. modal.onClosed();
  12545. } else if ($el.hasClass('modal-in')) {
  12546. modal.onOpened();
  12547. }
  12548. }
  12549. if (animate) {
  12550. $el
  12551. .animationEnd(function () {
  12552. transitionEnd();
  12553. });
  12554. $el
  12555. .transitionEnd(function () {
  12556. transitionEnd();
  12557. });
  12558. $el
  12559. .removeClass('modal-in')
  12560. .addClass('modal-out');
  12561. // Emit close
  12562. modal.onClose();
  12563. } else {
  12564. $el
  12565. .addClass('not-animated')
  12566. .removeClass('modal-in')
  12567. .addClass('modal-out');
  12568. // Emit close
  12569. modal.onClose();
  12570. modal.onClosed();
  12571. }
  12572. if (modal.type === 'dialog') {
  12573. clearDialogsQueue();
  12574. }
  12575. return modal;
  12576. };
  12577. Modal.prototype.destroy = function destroy () {
  12578. var modal = this;
  12579. if (modal.destroyed) { return; }
  12580. modal.emit(("local::beforeDestroy modalBeforeDestroy " + (modal.type) + "BeforeDestroy"), modal);
  12581. if (modal.$el) {
  12582. modal.$el.trigger(("modal:beforedestroy " + (modal.type.toLowerCase()) + ":beforedestroy"));
  12583. if (modal.$el.length && modal.$el[0].f7Modal) {
  12584. delete modal.$el[0].f7Modal;
  12585. }
  12586. }
  12587. Utils.deleteProps(modal);
  12588. modal.destroyed = true;
  12589. };
  12590. return Modal;
  12591. }(Framework7Class));
  12592. var CustomModal = /*@__PURE__*/(function (Modal) {
  12593. function CustomModal(app, params) {
  12594. var extendedParams = Utils.extend({
  12595. backdrop: true,
  12596. closeByBackdropClick: true,
  12597. on: {},
  12598. }, params);
  12599. // Extends with open/close Modal methods;
  12600. Modal.call(this, app, extendedParams);
  12601. var customModal = this;
  12602. customModal.params = extendedParams;
  12603. // Find Element
  12604. var $el;
  12605. if (!customModal.params.el) {
  12606. $el = $(customModal.params.content);
  12607. } else {
  12608. $el = $(customModal.params.el);
  12609. }
  12610. if ($el && $el.length > 0 && $el[0].f7Modal) {
  12611. return $el[0].f7Modal;
  12612. }
  12613. if ($el.length === 0) {
  12614. return customModal.destroy();
  12615. }
  12616. var $backdropEl;
  12617. if (customModal.params.backdrop) {
  12618. $backdropEl = app.root.children('.custom-modal-backdrop');
  12619. if ($backdropEl.length === 0) {
  12620. $backdropEl = $('<div class="custom-modal-backdrop"></div>');
  12621. app.root.append($backdropEl);
  12622. }
  12623. }
  12624. function handleClick(e) {
  12625. if (!customModal || customModal.destroyed) { return; }
  12626. if ($backdropEl && e.target === $backdropEl[0]) {
  12627. customModal.close();
  12628. }
  12629. }
  12630. customModal.on('customModalOpened', function () {
  12631. if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
  12632. app.on('click', handleClick);
  12633. }
  12634. });
  12635. customModal.on('customModalClose', function () {
  12636. if (customModal.params.closeByBackdropClick && customModal.params.backdrop) {
  12637. app.off('click', handleClick);
  12638. }
  12639. });
  12640. Utils.extend(customModal, {
  12641. app: app,
  12642. $el: $el,
  12643. el: $el[0],
  12644. $backdropEl: $backdropEl,
  12645. backdropEl: $backdropEl && $backdropEl[0],
  12646. type: 'customModal',
  12647. });
  12648. $el[0].f7Modal = customModal;
  12649. return customModal;
  12650. }
  12651. if ( Modal ) CustomModal.__proto__ = Modal;
  12652. CustomModal.prototype = Object.create( Modal && Modal.prototype );
  12653. CustomModal.prototype.constructor = CustomModal;
  12654. return CustomModal;
  12655. }(Modal));
  12656. var Modal$1 = {
  12657. name: 'modal',
  12658. static: {
  12659. Modal: Modal,
  12660. CustomModal: CustomModal,
  12661. },
  12662. create: function create() {
  12663. var app = this;
  12664. app.customModal = {
  12665. create: function create(params) {
  12666. return new CustomModal(app, params);
  12667. },
  12668. };
  12669. },
  12670. params: {
  12671. modal: {
  12672. moveToRoot: true,
  12673. queueDialogs: true,
  12674. },
  12675. },
  12676. };
  12677. {
  12678. if (typeof window !== 'undefined') {
  12679. // Template7
  12680. if (!window.Template7) { window.Template7 = Template7; }
  12681. // Dom7
  12682. if (!window.Dom7) { window.Dom7 = $; }
  12683. }
  12684. }
  12685. // Install Core Modules & Components
  12686. Router.use([ //NO_LITE
  12687. RouterTemplateLoaderModule, //NO_LITE
  12688. RouterComponentLoaderModule ]); //NO_LITE
  12689. Framework7.use([
  12690. DeviceModule,
  12691. SupportModule,
  12692. UtilsModule,
  12693. ResizeModule,
  12694. RequestModule,
  12695. TouchModule,
  12696. ClicksModule,
  12697. RouterModule,
  12698. HistoryModule,
  12699. ComponentModule, //NO_LITE
  12700. ServiceWorkerModule,
  12701. Statusbar$1,
  12702. View$1,
  12703. Navbar$1,
  12704. Toolbar$1,
  12705. Subnavbar,
  12706. TouchRipple$1,
  12707. Modal$1 ]);
  12708. return Framework7;
  12709. })));