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

42791 строка
1.5 MiB

  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. var Appbar = {
  12678. name: 'appbar',
  12679. };
  12680. var Dialog = /*@__PURE__*/(function (Modal) {
  12681. function Dialog(app, params) {
  12682. var extendedParams = Utils.extend({
  12683. title: app.params.dialog.title,
  12684. text: undefined,
  12685. content: '',
  12686. buttons: [],
  12687. verticalButtons: false,
  12688. onClick: undefined,
  12689. cssClass: undefined,
  12690. destroyOnClose: false,
  12691. on: {},
  12692. }, params);
  12693. if (typeof extendedParams.closeByBackdropClick === 'undefined') {
  12694. extendedParams.closeByBackdropClick = app.params.dialog.closeByBackdropClick;
  12695. }
  12696. if (typeof extendedParams.backdrop === 'undefined') {
  12697. extendedParams.backdrop = app.params.dialog.backdrop;
  12698. }
  12699. // Extends with open/close Modal methods;
  12700. Modal.call(this, app, extendedParams);
  12701. var dialog = this;
  12702. var title = extendedParams.title;
  12703. var text = extendedParams.text;
  12704. var content = extendedParams.content;
  12705. var buttons = extendedParams.buttons;
  12706. var verticalButtons = extendedParams.verticalButtons;
  12707. var cssClass = extendedParams.cssClass;
  12708. var backdrop = extendedParams.backdrop;
  12709. dialog.params = extendedParams;
  12710. // Find Element
  12711. var $el;
  12712. if (!dialog.params.el) {
  12713. var dialogClasses = ['dialog'];
  12714. if (buttons.length === 0) { dialogClasses.push('dialog-no-buttons'); }
  12715. if (buttons.length > 0) { dialogClasses.push(("dialog-buttons-" + (buttons.length))); }
  12716. if (verticalButtons) { dialogClasses.push('dialog-buttons-vertical'); }
  12717. if (cssClass) { dialogClasses.push(cssClass); }
  12718. var buttonsHTML = '';
  12719. if (buttons.length > 0) {
  12720. buttonsHTML = "\n <div class=\"dialog-buttons\">\n " + (buttons.map(function (button) { return ("\n <span class=\"dialog-button" + (button.bold ? ' dialog-button-bold' : '') + (button.color ? (" color-" + (button.color)) : '') + (button.cssClass ? (" " + (button.cssClass)) : '') + "\">" + (button.text) + "</span>\n "); }).join('')) + "\n </div>\n ";
  12721. }
  12722. var dialogHtml = "\n <div class=\"" + (dialogClasses.join(' ')) + "\">\n <div class=\"dialog-inner\">\n " + (title ? ("<div class=\"dialog-title\">" + title + "</div>") : '') + "\n " + (text ? ("<div class=\"dialog-text\">" + text + "</div>") : '') + "\n " + content + "\n </div>\n " + buttonsHTML + "\n </div>\n ";
  12723. $el = $(dialogHtml);
  12724. } else {
  12725. $el = $(dialog.params.el);
  12726. }
  12727. if ($el && $el.length > 0 && $el[0].f7Modal) {
  12728. return $el[0].f7Modal;
  12729. }
  12730. if ($el.length === 0) {
  12731. return dialog.destroy();
  12732. }
  12733. var $backdropEl;
  12734. if (backdrop) {
  12735. $backdropEl = app.root.children('.dialog-backdrop');
  12736. if ($backdropEl.length === 0) {
  12737. $backdropEl = $('<div class="dialog-backdrop"></div>');
  12738. app.root.append($backdropEl);
  12739. }
  12740. }
  12741. // Assign events
  12742. function buttonOnClick(e) {
  12743. var buttonEl = this;
  12744. var index = $(buttonEl).index();
  12745. var button = buttons[index];
  12746. if (button.onClick) { button.onClick(dialog, e); }
  12747. if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
  12748. if (button.close !== false) { dialog.close(); }
  12749. }
  12750. var addKeyboardHander;
  12751. function onKeyDown(e) {
  12752. var keyCode = e.keyCode;
  12753. buttons.forEach(function (button, index) {
  12754. if (button.keyCodes && button.keyCodes.indexOf(keyCode) >= 0) {
  12755. if (doc.activeElement) { doc.activeElement.blur(); }
  12756. if (button.onClick) { button.onClick(dialog, e); }
  12757. if (dialog.params.onClick) { dialog.params.onClick(dialog, index); }
  12758. if (button.close !== false) { dialog.close(); }
  12759. }
  12760. });
  12761. }
  12762. if (buttons && buttons.length > 0) {
  12763. dialog.on('open', function () {
  12764. $el.find('.dialog-button').each(function (index, buttonEl) {
  12765. var button = buttons[index];
  12766. if (button.keyCodes) { addKeyboardHander = true; }
  12767. $(buttonEl).on('click', buttonOnClick);
  12768. });
  12769. if (
  12770. addKeyboardHander
  12771. && !app.device.ios
  12772. && !app.device.android
  12773. && !app.device.cordova
  12774. ) {
  12775. $(doc).on('keydown', onKeyDown);
  12776. }
  12777. });
  12778. dialog.on('close', function () {
  12779. $el.find('.dialog-button').each(function (index, buttonEl) {
  12780. $(buttonEl).off('click', buttonOnClick);
  12781. });
  12782. if (
  12783. addKeyboardHander
  12784. && !app.device.ios
  12785. && !app.device.android
  12786. && !app.device.cordova
  12787. ) {
  12788. $(doc).off('keydown', onKeyDown);
  12789. }
  12790. addKeyboardHander = false;
  12791. });
  12792. }
  12793. Utils.extend(dialog, {
  12794. app: app,
  12795. $el: $el,
  12796. el: $el[0],
  12797. $backdropEl: $backdropEl,
  12798. backdropEl: $backdropEl && $backdropEl[0],
  12799. type: 'dialog',
  12800. setProgress: function setProgress(progress, duration) {
  12801. app.progressbar.set($el.find('.progressbar'), progress, duration);
  12802. return dialog;
  12803. },
  12804. setText: function setText(newText) {
  12805. var $textEl = $el.find('.dialog-text');
  12806. if ($textEl.length === 0) {
  12807. $textEl = $('<div class="dialog-text"></div>');
  12808. if (typeof title !== 'undefined') {
  12809. $textEl.insertAfter($el.find('.dialog-title'));
  12810. } else {
  12811. $el.find('.dialog-inner').prepend($textEl);
  12812. }
  12813. }
  12814. $textEl.html(newText);
  12815. dialog.params.text = newText;
  12816. return dialog;
  12817. },
  12818. setTitle: function setTitle(newTitle) {
  12819. var $titleEl = $el.find('.dialog-title');
  12820. if ($titleEl.length === 0) {
  12821. $titleEl = $('<div class="dialog-title"></div>');
  12822. $el.find('.dialog-inner').prepend($titleEl);
  12823. }
  12824. $titleEl.html(newTitle);
  12825. dialog.params.title = newTitle;
  12826. return dialog;
  12827. },
  12828. });
  12829. function handleClick(e) {
  12830. var target = e.target;
  12831. var $target = $(target);
  12832. if ($target.closest(dialog.el).length === 0) {
  12833. if (
  12834. dialog.params.closeByBackdropClick
  12835. && dialog.backdropEl
  12836. && dialog.backdropEl === target
  12837. ) {
  12838. dialog.close();
  12839. }
  12840. }
  12841. }
  12842. dialog.on('opened', function () {
  12843. if (dialog.params.closeByBackdropClick) {
  12844. app.on('click', handleClick);
  12845. }
  12846. });
  12847. dialog.on('close', function () {
  12848. if (dialog.params.closeByBackdropClick) {
  12849. app.off('click', handleClick);
  12850. }
  12851. });
  12852. $el[0].f7Modal = dialog;
  12853. if (dialog.params.destroyOnClose) {
  12854. dialog.once('closed', function () {
  12855. setTimeout(function () {
  12856. dialog.destroy();
  12857. }, 0);
  12858. });
  12859. }
  12860. return dialog;
  12861. }
  12862. if ( Modal ) Dialog.__proto__ = Modal;
  12863. Dialog.prototype = Object.create( Modal && Modal.prototype );
  12864. Dialog.prototype.constructor = Dialog;
  12865. return Dialog;
  12866. }(Modal));
  12867. var Dialog$1 = {
  12868. name: 'dialog',
  12869. params: {
  12870. dialog: {
  12871. title: undefined,
  12872. buttonOk: 'OK',
  12873. buttonCancel: 'Cancel',
  12874. usernamePlaceholder: 'Username',
  12875. passwordPlaceholder: 'Password',
  12876. preloaderTitle: 'Loading... ',
  12877. progressTitle: 'Loading... ',
  12878. backdrop: true,
  12879. closeByBackdropClick: false,
  12880. destroyPredefinedDialogs: true,
  12881. keyboardActions: true,
  12882. autoFocus: true,
  12883. },
  12884. },
  12885. static: {
  12886. Dialog: Dialog,
  12887. },
  12888. create: function create() {
  12889. var app = this;
  12890. function defaultDialogTitle() {
  12891. return app.params.dialog.title || app.name;
  12892. }
  12893. var destroyOnClose = app.params.dialog.destroyPredefinedDialogs;
  12894. var keyboardActions = app.params.dialog.keyboardActions;
  12895. var autoFocus = app.params.dialog.autoFocus;
  12896. var autoFocusHandler = (autoFocus ? {
  12897. on: {
  12898. opened: function opened(dialog) {
  12899. dialog.$el.find('input').eq(0).focus();
  12900. },
  12901. },
  12902. } : {});
  12903. app.dialog = Utils.extend(
  12904. ModalMethods({
  12905. app: app,
  12906. constructor: Dialog,
  12907. defaultSelector: '.dialog.modal-in',
  12908. }),
  12909. {
  12910. // Shortcuts
  12911. alert: function alert() {
  12912. var assign;
  12913. var args = [], len = arguments.length;
  12914. while ( len-- ) args[ len ] = arguments[ len ];
  12915. var text = args[0];
  12916. var title = args[1];
  12917. var callbackOk = args[2];
  12918. if (args.length === 2 && typeof args[1] === 'function') {
  12919. (assign = args, text = assign[0], callbackOk = assign[1], title = assign[2]);
  12920. }
  12921. return new Dialog(app, {
  12922. title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  12923. text: text,
  12924. buttons: [{
  12925. text: app.params.dialog.buttonOk,
  12926. bold: true,
  12927. onClick: callbackOk,
  12928. keyCodes: keyboardActions ? [13, 27] : null,
  12929. }],
  12930. destroyOnClose: destroyOnClose,
  12931. }).open();
  12932. },
  12933. prompt: function prompt() {
  12934. var assign;
  12935. var args = [], len = arguments.length;
  12936. while ( len-- ) args[ len ] = arguments[ len ];
  12937. var text = args[0];
  12938. var title = args[1];
  12939. var callbackOk = args[2];
  12940. var callbackCancel = args[3];
  12941. var defaultValue = args[4];
  12942. if (typeof args[1] === 'function') {
  12943. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], defaultValue = assign[3], title = assign[4]);
  12944. }
  12945. defaultValue = typeof defaultValue === 'undefined' || defaultValue === null ? '' : defaultValue;
  12946. return new Dialog(app, Object.assign({}, {title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  12947. text: text,
  12948. content: ("<div class=\"dialog-input-field input\"><input type=\"text\" class=\"dialog-input\" value=\"" + defaultValue + "\"></div>"),
  12949. buttons: [
  12950. {
  12951. text: app.params.dialog.buttonCancel,
  12952. keyCodes: keyboardActions ? [27] : null,
  12953. color: app.theme === 'aurora' ? 'gray' : null,
  12954. },
  12955. {
  12956. text: app.params.dialog.buttonOk,
  12957. bold: true,
  12958. keyCodes: keyboardActions ? [13] : null,
  12959. } ],
  12960. onClick: function onClick(dialog, index) {
  12961. var inputValue = dialog.$el.find('.dialog-input').val();
  12962. if (index === 0 && callbackCancel) { callbackCancel(inputValue); }
  12963. if (index === 1 && callbackOk) { callbackOk(inputValue); }
  12964. },
  12965. destroyOnClose: destroyOnClose},
  12966. autoFocusHandler)).open();
  12967. },
  12968. confirm: function confirm() {
  12969. var assign;
  12970. var args = [], len = arguments.length;
  12971. while ( len-- ) args[ len ] = arguments[ len ];
  12972. var text = args[0];
  12973. var title = args[1];
  12974. var callbackOk = args[2];
  12975. var callbackCancel = args[3];
  12976. if (typeof args[1] === 'function') {
  12977. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
  12978. }
  12979. return new Dialog(app, {
  12980. title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  12981. text: text,
  12982. buttons: [
  12983. {
  12984. text: app.params.dialog.buttonCancel,
  12985. onClick: callbackCancel,
  12986. keyCodes: keyboardActions ? [27] : null,
  12987. color: app.theme === 'aurora' ? 'gray' : null,
  12988. },
  12989. {
  12990. text: app.params.dialog.buttonOk,
  12991. bold: true,
  12992. onClick: callbackOk,
  12993. keyCodes: keyboardActions ? [13] : null,
  12994. } ],
  12995. destroyOnClose: destroyOnClose,
  12996. }).open();
  12997. },
  12998. login: function login() {
  12999. var assign;
  13000. var args = [], len = arguments.length;
  13001. while ( len-- ) args[ len ] = arguments[ len ];
  13002. var text = args[0];
  13003. var title = args[1];
  13004. var callbackOk = args[2];
  13005. var callbackCancel = args[3];
  13006. if (typeof args[1] === 'function') {
  13007. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
  13008. }
  13009. return new Dialog(app, Object.assign({}, {title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  13010. text: text,
  13011. content: ("\n <div class=\"dialog-input-field dialog-input-double input\">\n <input type=\"text\" name=\"dialog-username\" placeholder=\"" + (app.params.dialog.usernamePlaceholder) + "\" class=\"dialog-input\">\n </div>\n <div class=\"dialog-input-field dialog-input-double input\">\n <input type=\"password\" name=\"dialog-password\" placeholder=\"" + (app.params.dialog.passwordPlaceholder) + "\" class=\"dialog-input\">\n </div>"),
  13012. buttons: [
  13013. {
  13014. text: app.params.dialog.buttonCancel,
  13015. keyCodes: keyboardActions ? [27] : null,
  13016. color: app.theme === 'aurora' ? 'gray' : null,
  13017. },
  13018. {
  13019. text: app.params.dialog.buttonOk,
  13020. bold: true,
  13021. keyCodes: keyboardActions ? [13] : null,
  13022. } ],
  13023. onClick: function onClick(dialog, index) {
  13024. var username = dialog.$el.find('[name="dialog-username"]').val();
  13025. var password = dialog.$el.find('[name="dialog-password"]').val();
  13026. if (index === 0 && callbackCancel) { callbackCancel(username, password); }
  13027. if (index === 1 && callbackOk) { callbackOk(username, password); }
  13028. },
  13029. destroyOnClose: destroyOnClose},
  13030. autoFocusHandler)).open();
  13031. },
  13032. password: function password() {
  13033. var assign;
  13034. var args = [], len = arguments.length;
  13035. while ( len-- ) args[ len ] = arguments[ len ];
  13036. var text = args[0];
  13037. var title = args[1];
  13038. var callbackOk = args[2];
  13039. var callbackCancel = args[3];
  13040. if (typeof args[1] === 'function') {
  13041. (assign = args, text = assign[0], callbackOk = assign[1], callbackCancel = assign[2], title = assign[3]);
  13042. }
  13043. return new Dialog(app, Object.assign({}, {title: typeof title === 'undefined' ? defaultDialogTitle() : title,
  13044. text: text,
  13045. content: ("\n <div class=\"dialog-input-field input\">\n <input type=\"password\" name=\"dialog-password\" placeholder=\"" + (app.params.dialog.passwordPlaceholder) + "\" class=\"dialog-input\">\n </div>"),
  13046. buttons: [
  13047. {
  13048. text: app.params.dialog.buttonCancel,
  13049. keyCodes: keyboardActions ? [27] : null,
  13050. color: app.theme === 'aurora' ? 'gray' : null,
  13051. },
  13052. {
  13053. text: app.params.dialog.buttonOk,
  13054. bold: true,
  13055. keyCodes: keyboardActions ? [13] : null,
  13056. } ],
  13057. onClick: function onClick(dialog, index) {
  13058. var password = dialog.$el.find('[name="dialog-password"]').val();
  13059. if (index === 0 && callbackCancel) { callbackCancel(password); }
  13060. if (index === 1 && callbackOk) { callbackOk(password); }
  13061. },
  13062. destroyOnClose: destroyOnClose},
  13063. autoFocusHandler)).open();
  13064. },
  13065. preloader: function preloader(title, color) {
  13066. var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
  13067. return new Dialog(app, {
  13068. title: typeof title === 'undefined' || title === null ? app.params.dialog.preloaderTitle : title,
  13069. content: ("<div class=\"preloader" + (color ? (" color-" + color) : '') + "\">" + preloaderInner + "</div>"),
  13070. cssClass: 'dialog-preloader',
  13071. destroyOnClose: destroyOnClose,
  13072. }).open();
  13073. },
  13074. progress: function progress() {
  13075. var assign, assign$1, assign$2;
  13076. var args = [], len = arguments.length;
  13077. while ( len-- ) args[ len ] = arguments[ len ];
  13078. var title = args[0];
  13079. var progress = args[1];
  13080. var color = args[2];
  13081. if (args.length === 2) {
  13082. if (typeof args[0] === 'number') {
  13083. (assign = args, progress = assign[0], color = assign[1], title = assign[2]);
  13084. } else if (typeof args[0] === 'string' && typeof args[1] === 'string') {
  13085. (assign$1 = args, title = assign$1[0], color = assign$1[1], progress = assign$1[2]);
  13086. }
  13087. } else if (args.length === 1) {
  13088. if (typeof args[0] === 'number') {
  13089. (assign$2 = args, progress = assign$2[0], title = assign$2[1], color = assign$2[2]);
  13090. }
  13091. }
  13092. var infinite = typeof progress === 'undefined';
  13093. var dialog = new Dialog(app, {
  13094. title: typeof title === 'undefined' ? app.params.dialog.progressTitle : title,
  13095. cssClass: 'dialog-progress',
  13096. content: ("\n <div class=\"progressbar" + (infinite ? '-infinite' : '') + (color ? (" color-" + color) : '') + "\">\n " + (!infinite ? '<span></span>' : '') + "\n </div>\n "),
  13097. destroyOnClose: destroyOnClose,
  13098. });
  13099. if (!infinite) { dialog.setProgress(progress); }
  13100. return dialog.open();
  13101. },
  13102. }
  13103. );
  13104. },
  13105. };
  13106. var Popup = /*@__PURE__*/(function (Modal) {
  13107. function Popup(app, params) {
  13108. var extendedParams = Utils.extend(
  13109. { on: {} },
  13110. app.params.popup,
  13111. params
  13112. );
  13113. // Extends with open/close Modal methods;
  13114. Modal.call(this, app, extendedParams);
  13115. var popup = this;
  13116. popup.params = extendedParams;
  13117. // Find Element
  13118. var $el;
  13119. if (!popup.params.el) {
  13120. $el = $(popup.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  13121. } else {
  13122. $el = $(popup.params.el).eq(0);
  13123. }
  13124. if ($el && $el.length > 0 && $el[0].f7Modal) {
  13125. return $el[0].f7Modal;
  13126. }
  13127. if ($el.length === 0) {
  13128. return popup.destroy();
  13129. }
  13130. var $backdropEl;
  13131. if (popup.params.backdrop && popup.params.backdropEl) {
  13132. $backdropEl = $(popup.params.backdropEl);
  13133. } else if (popup.params.backdrop) {
  13134. $backdropEl = app.root.children('.popup-backdrop');
  13135. if ($backdropEl.length === 0) {
  13136. $backdropEl = $('<div class="popup-backdrop"></div>');
  13137. app.root.append($backdropEl);
  13138. }
  13139. }
  13140. Utils.extend(popup, {
  13141. app: app,
  13142. push: $el.hasClass('popup-push') || popup.params.push,
  13143. $el: $el,
  13144. el: $el[0],
  13145. $backdropEl: $backdropEl,
  13146. backdropEl: $backdropEl && $backdropEl[0],
  13147. type: 'popup',
  13148. $htmlEl: $('html'),
  13149. });
  13150. if (popup.params.push) {
  13151. $el.addClass('popup-push');
  13152. }
  13153. function handleClick(e) {
  13154. var target = e.target;
  13155. var $target = $(target);
  13156. var keyboardOpened = !app.device.desktop && app.device.cordova && ((win.Keyboard && win.Keyboard.isVisible) || (win.cordova.plugins && win.cordova.plugins.Keyboard && win.cordova.plugins.Keyboard.isVisible));
  13157. if (keyboardOpened) { return; }
  13158. if ($target.closest(popup.el).length === 0) {
  13159. if (
  13160. popup.params
  13161. && popup.params.closeByBackdropClick
  13162. && popup.params.backdrop
  13163. && popup.backdropEl
  13164. && popup.backdropEl === target
  13165. ) {
  13166. var needToClose = true;
  13167. popup.$el.nextAll('.popup.modal-in').each(function (index, popupEl) {
  13168. var popupInstance = popupEl.f7Modal;
  13169. if (!popupInstance) { return; }
  13170. if (
  13171. popupInstance.params.closeByBackdropClick
  13172. && popupInstance.params.backdrop
  13173. && popupInstance.backdropEl === popup.backdropEl
  13174. ) {
  13175. needToClose = false;
  13176. }
  13177. });
  13178. if (needToClose) {
  13179. popup.close();
  13180. }
  13181. }
  13182. }
  13183. }
  13184. function onKeyDown(e) {
  13185. var keyCode = e.keyCode;
  13186. if (keyCode === 27 && popup.params.closeOnEscape) {
  13187. popup.close();
  13188. }
  13189. }
  13190. var pushOffset;
  13191. var isPush;
  13192. function pushViewScale(offset) {
  13193. return (app.height - offset * 2) / app.height;
  13194. }
  13195. var allowSwipeToClose = true;
  13196. var isTouched = false;
  13197. var startTouch;
  13198. var currentTouch;
  13199. var isScrolling;
  13200. var touchStartTime;
  13201. var touchesDiff;
  13202. var isMoved = false;
  13203. var pageContentEl;
  13204. var pageContentScrollTop;
  13205. var pageContentOffsetHeight;
  13206. var pageContentScrollHeight;
  13207. var popupHeight;
  13208. var $pushEl;
  13209. function handleTouchStart(e) {
  13210. if (isTouched || !allowSwipeToClose || !popup.params.swipeToClose) { return; }
  13211. if (popup.params.swipeHandler && $(e.target).closest(popup.params.swipeHandler).length === 0) {
  13212. return;
  13213. }
  13214. isTouched = true;
  13215. isMoved = false;
  13216. startTouch = {
  13217. x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
  13218. y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY,
  13219. };
  13220. touchStartTime = Utils.now();
  13221. isScrolling = undefined;
  13222. if (!popup.params.swipeHandler && e.type === 'touchstart') {
  13223. pageContentEl = $(e.target).closest('.page-content')[0];
  13224. }
  13225. }
  13226. function handleTouchMove(e) {
  13227. if (!isTouched) { return; }
  13228. currentTouch = {
  13229. x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
  13230. y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY,
  13231. };
  13232. if (typeof isScrolling === 'undefined') {
  13233. isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
  13234. }
  13235. if (isScrolling) {
  13236. isTouched = false;
  13237. isMoved = false;
  13238. return;
  13239. }
  13240. touchesDiff = startTouch.y - currentTouch.y;
  13241. if (isPush && pushOffset && touchesDiff > 0) {
  13242. touchesDiff = 0;
  13243. }
  13244. var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
  13245. $el.transition(0);
  13246. if (typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose) {
  13247. $el.transform('');
  13248. $el.transition('');
  13249. return;
  13250. }
  13251. if (!isMoved) {
  13252. if (isPush && pushOffset) {
  13253. popupHeight = $el[0].offsetHeight;
  13254. $pushEl = $el.prevAll('.popup.modal-in').eq(0);
  13255. if ($pushEl.length === 0) {
  13256. $pushEl = app.root.children('.view, .views');
  13257. }
  13258. }
  13259. if (pageContentEl) {
  13260. pageContentScrollTop = pageContentEl.scrollTop;
  13261. pageContentScrollHeight = pageContentEl.scrollHeight;
  13262. pageContentOffsetHeight = pageContentEl.offsetHeight;
  13263. if (
  13264. !(pageContentScrollHeight === pageContentOffsetHeight)
  13265. && !(direction === 'to-bottom' && pageContentScrollTop === 0)
  13266. && !(direction === 'to-top' && pageContentScrollTop === (pageContentScrollHeight - pageContentOffsetHeight))
  13267. ) {
  13268. $el.transform('');
  13269. $el.transition('');
  13270. isTouched = false;
  13271. isMoved = false;
  13272. return;
  13273. }
  13274. }
  13275. isMoved = true;
  13276. popup.emit('local::swipeStart popupSwipeStart', popup);
  13277. popup.$el.trigger('popup:swipestart');
  13278. } else {
  13279. popup.emit('local::swipeMove popupSwipeMove', popup);
  13280. popup.$el.trigger('popup:swipemove');
  13281. }
  13282. e.preventDefault();
  13283. if (isPush && pushOffset) {
  13284. var pushProgress = 1 - Math.abs(touchesDiff / popupHeight);
  13285. var scale = 1 - (1 - pushViewScale(pushOffset)) * pushProgress;
  13286. if ($pushEl.hasClass('popup')) {
  13287. if ($pushEl.hasClass('popup-push')) {
  13288. $pushEl.transition(0).transform(
  13289. ("translate3d(0, calc(-1 * " + pushProgress + " * (var(--f7-popup-push-offset) + 10px)) , 0px) scale(" + scale + ")")
  13290. );
  13291. } else {
  13292. $pushEl.transition(0).transform(
  13293. ("translate3d(0, 0px , 0px) scale(" + scale + ")")
  13294. );
  13295. }
  13296. } else {
  13297. $pushEl.transition(0).transform(("translate3d(0,0,0) scale(" + scale + ")"));
  13298. }
  13299. }
  13300. $el.transition(0).transform(("translate3d(0," + (-touchesDiff) + "px,0)"));
  13301. }
  13302. function handleTouchEnd() {
  13303. isTouched = false;
  13304. if (!isMoved) {
  13305. return;
  13306. }
  13307. popup.emit('local::swipeEnd popupSwipeEnd', popup);
  13308. popup.$el.trigger('popup:swipeend');
  13309. isMoved = false;
  13310. allowSwipeToClose = false;
  13311. $el.transition('');
  13312. if (isPush && pushOffset) {
  13313. $pushEl.transition('').transform('');
  13314. }
  13315. var direction = touchesDiff <= 0 ? 'to-bottom' : 'to-top';
  13316. if ((typeof popup.params.swipeToClose === 'string' && direction !== popup.params.swipeToClose)) {
  13317. $el.transform('');
  13318. allowSwipeToClose = true;
  13319. return;
  13320. }
  13321. var diff = Math.abs(touchesDiff);
  13322. var timeDiff = (new Date()).getTime() - touchStartTime;
  13323. if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {
  13324. Utils.nextTick(function () {
  13325. if (direction === 'to-bottom') {
  13326. $el.addClass('swipe-close-to-bottom');
  13327. } else {
  13328. $el.addClass('swipe-close-to-top');
  13329. }
  13330. $el.transform('');
  13331. popup.emit('local::swipeclose popupSwipeClose', popup);
  13332. popup.$el.trigger('popup:swipeclose');
  13333. popup.close();
  13334. allowSwipeToClose = true;
  13335. });
  13336. return;
  13337. }
  13338. allowSwipeToClose = true;
  13339. $el.transform('');
  13340. }
  13341. var passive = Support.passiveListener ? { passive: true } : false;
  13342. if (popup.params.swipeToClose) {
  13343. $el.on(app.touchEvents.start, handleTouchStart, passive);
  13344. app.on('touchmove', handleTouchMove);
  13345. app.on('touchend:passive', handleTouchEnd);
  13346. popup.once('popupDestroy', function () {
  13347. $el.off(app.touchEvents.start, handleTouchStart, passive);
  13348. app.off('touchmove', handleTouchMove);
  13349. app.off('touchend:passive', handleTouchEnd);
  13350. });
  13351. }
  13352. var hasPreviousPushPopup;
  13353. popup.on('open', function () {
  13354. hasPreviousPushPopup = false;
  13355. if (popup.params.closeOnEscape) {
  13356. $(doc).on('keydown', onKeyDown);
  13357. }
  13358. $el.prevAll('.popup.modal-in').addClass('popup-behind');
  13359. if (popup.push) {
  13360. isPush = popup.push && (
  13361. (app.width < 630 || app.height < 630)
  13362. || $el.hasClass('popup-tablet-fullscreen')
  13363. );
  13364. }
  13365. if (isPush) {
  13366. pushOffset = parseInt($el.css('--f7-popup-push-offset'), 10);
  13367. if (Number.isNaN(pushOffset)) { pushOffset = 0; }
  13368. if (pushOffset) {
  13369. $el.addClass('popup-push');
  13370. popup.$htmlEl.addClass('with-modal-popup-push');
  13371. popup.$htmlEl[0].style.setProperty('--f7-popup-push-scale', pushViewScale(pushOffset));
  13372. }
  13373. }
  13374. });
  13375. popup.on('opened', function () {
  13376. $el.removeClass('swipe-close-to-bottom swipe-close-to-top');
  13377. if (popup.params.closeByBackdropClick) {
  13378. app.on('click', handleClick);
  13379. }
  13380. });
  13381. popup.on('close', function () {
  13382. hasPreviousPushPopup = popup.$el.prevAll('.popup-push.modal-in').length > 0;
  13383. if (popup.params.closeOnEscape) {
  13384. $(doc).off('keydown', onKeyDown);
  13385. }
  13386. if (popup.params.closeByBackdropClick) {
  13387. app.off('click', handleClick);
  13388. }
  13389. $el.prevAll('.popup.modal-in').eq(0).removeClass('popup-behind');
  13390. if (isPush && pushOffset && !hasPreviousPushPopup) {
  13391. popup.$htmlEl.removeClass('with-modal-popup-push');
  13392. popup.$htmlEl.addClass('with-modal-popup-push-closing');
  13393. }
  13394. });
  13395. popup.on('closed', function () {
  13396. if (isPush && pushOffset && !hasPreviousPushPopup) {
  13397. popup.$htmlEl.removeClass('with-modal-popup-push-closing');
  13398. popup.$htmlEl[0].style.removeProperty('--f7-popup-push-scale');
  13399. }
  13400. });
  13401. $el[0].f7Modal = popup;
  13402. return popup;
  13403. }
  13404. if ( Modal ) Popup.__proto__ = Modal;
  13405. Popup.prototype = Object.create( Modal && Modal.prototype );
  13406. Popup.prototype.constructor = Popup;
  13407. return Popup;
  13408. }(Modal));
  13409. var Popup$1 = {
  13410. name: 'popup',
  13411. params: {
  13412. popup: {
  13413. backdrop: true,
  13414. backdropEl: undefined,
  13415. closeByBackdropClick: true,
  13416. closeOnEscape: false,
  13417. swipeToClose: false,
  13418. swipeHandler: null,
  13419. push: false,
  13420. },
  13421. },
  13422. static: {
  13423. Popup: Popup,
  13424. },
  13425. create: function create() {
  13426. var app = this;
  13427. app.popup = ModalMethods({
  13428. app: app,
  13429. constructor: Popup,
  13430. defaultSelector: '.popup.modal-in',
  13431. parentSelector: '.popup',
  13432. });
  13433. },
  13434. clicks: {
  13435. '.popup-open': function openPopup($clickedEl, data) {
  13436. if ( data === void 0 ) data = {};
  13437. var app = this;
  13438. app.popup.open(data.popup, data.animate, $clickedEl);
  13439. },
  13440. '.popup-close': function closePopup($clickedEl, data) {
  13441. if ( data === void 0 ) data = {};
  13442. var app = this;
  13443. app.popup.close(data.popup, data.animate, $clickedEl);
  13444. },
  13445. },
  13446. };
  13447. var LoginScreen = /*@__PURE__*/(function (Modal) {
  13448. function LoginScreen(app, params) {
  13449. var extendedParams = Utils.extend({
  13450. on: {},
  13451. }, params);
  13452. // Extends with open/close Modal methods;
  13453. Modal.call(this, app, extendedParams);
  13454. var loginScreen = this;
  13455. loginScreen.params = extendedParams;
  13456. // Find Element
  13457. var $el;
  13458. if (!loginScreen.params.el) {
  13459. $el = $(loginScreen.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  13460. } else {
  13461. $el = $(loginScreen.params.el).eq(0);
  13462. }
  13463. if ($el && $el.length > 0 && $el[0].f7Modal) {
  13464. return $el[0].f7Modal;
  13465. }
  13466. if ($el.length === 0) {
  13467. return loginScreen.destroy();
  13468. }
  13469. Utils.extend(loginScreen, {
  13470. app: app,
  13471. $el: $el,
  13472. el: $el[0],
  13473. type: 'loginScreen',
  13474. });
  13475. $el[0].f7Modal = loginScreen;
  13476. return loginScreen;
  13477. }
  13478. if ( Modal ) LoginScreen.__proto__ = Modal;
  13479. LoginScreen.prototype = Object.create( Modal && Modal.prototype );
  13480. LoginScreen.prototype.constructor = LoginScreen;
  13481. return LoginScreen;
  13482. }(Modal));
  13483. var LoginScreen$1 = {
  13484. name: 'loginScreen',
  13485. static: {
  13486. LoginScreen: LoginScreen,
  13487. },
  13488. create: function create() {
  13489. var app = this;
  13490. app.loginScreen = ModalMethods({
  13491. app: app,
  13492. constructor: LoginScreen,
  13493. defaultSelector: '.login-screen.modal-in',
  13494. });
  13495. },
  13496. clicks: {
  13497. '.login-screen-open': function openLoginScreen($clickedEl, data) {
  13498. if ( data === void 0 ) data = {};
  13499. var app = this;
  13500. app.loginScreen.open(data.loginScreen, data.animate, $clickedEl);
  13501. },
  13502. '.login-screen-close': function closeLoginScreen($clickedEl, data) {
  13503. if ( data === void 0 ) data = {};
  13504. var app = this;
  13505. app.loginScreen.close(data.loginScreen, data.animate, $clickedEl);
  13506. },
  13507. },
  13508. };
  13509. var Popover = /*@__PURE__*/(function (Modal) {
  13510. function Popover(app, params) {
  13511. var extendedParams = Utils.extend(
  13512. { on: {} },
  13513. app.params.popover,
  13514. params
  13515. );
  13516. // Extends with open/close Modal methods;
  13517. Modal.call(this, app, extendedParams);
  13518. var popover = this;
  13519. popover.params = extendedParams;
  13520. // Find Element
  13521. var $el;
  13522. if (!popover.params.el) {
  13523. $el = $(popover.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  13524. } else {
  13525. $el = $(popover.params.el).eq(0);
  13526. }
  13527. if ($el && $el.length > 0 && $el[0].f7Modal) {
  13528. return $el[0].f7Modal;
  13529. }
  13530. // Find Target
  13531. var $targetEl = $(popover.params.targetEl).eq(0);
  13532. if ($el.length === 0) {
  13533. return popover.destroy();
  13534. }
  13535. // Backdrop
  13536. var $backdropEl;
  13537. if (popover.params.backdrop && popover.params.backdropEl) {
  13538. $backdropEl = $(popover.params.backdropEl);
  13539. } else if (popover.params.backdrop) {
  13540. $backdropEl = app.root.children('.popover-backdrop');
  13541. if ($backdropEl.length === 0) {
  13542. $backdropEl = $('<div class="popover-backdrop"></div>');
  13543. app.root.append($backdropEl);
  13544. }
  13545. }
  13546. // Find Angle
  13547. var $angleEl;
  13548. if ($el.find('.popover-angle').length === 0) {
  13549. $angleEl = $('<div class="popover-angle"></div>');
  13550. $el.prepend($angleEl);
  13551. } else {
  13552. $angleEl = $el.find('.popover-angle');
  13553. }
  13554. // Open
  13555. var originalOpen = popover.open;
  13556. Utils.extend(popover, {
  13557. app: app,
  13558. $el: $el,
  13559. el: $el[0],
  13560. $targetEl: $targetEl,
  13561. targetEl: $targetEl[0],
  13562. $angleEl: $angleEl,
  13563. angleEl: $angleEl[0],
  13564. $backdropEl: $backdropEl,
  13565. backdropEl: $backdropEl && $backdropEl[0],
  13566. type: 'popover',
  13567. open: function open() {
  13568. var assign;
  13569. var args = [], len = arguments.length;
  13570. while ( len-- ) args[ len ] = arguments[ len ];
  13571. var targetEl = args[0];
  13572. var animate = args[1];
  13573. if (typeof args[0] === 'boolean') { (assign = args, animate = assign[0], targetEl = assign[1]); }
  13574. if (targetEl) {
  13575. popover.$targetEl = $(targetEl);
  13576. popover.targetEl = popover.$targetEl[0];
  13577. }
  13578. return originalOpen.call(popover, animate);
  13579. },
  13580. });
  13581. function handleResize() {
  13582. popover.resize();
  13583. }
  13584. popover.on('popoverOpen', function () {
  13585. popover.resize();
  13586. app.on('resize', handleResize);
  13587. $(win).on('keyboardDidShow keyboardDidHide', handleResize);
  13588. popover.on('popoverClose popoverBeforeDestroy', function () {
  13589. app.off('resize', handleResize);
  13590. $(win).off('keyboardDidShow keyboardDidHide', handleResize);
  13591. });
  13592. });
  13593. function handleClick(e) {
  13594. var target = e.target;
  13595. var $target = $(target);
  13596. var keyboardOpened = !app.device.desktop && app.device.cordova && ((win.Keyboard && win.Keyboard.isVisible) || (win.cordova.plugins && win.cordova.plugins.Keyboard && win.cordova.plugins.Keyboard.isVisible));
  13597. if (keyboardOpened) { return; }
  13598. if ($target.closest(popover.el).length === 0) {
  13599. if (
  13600. popover.params.closeByBackdropClick
  13601. && popover.params.backdrop
  13602. && popover.backdropEl
  13603. && popover.backdropEl === target
  13604. ) {
  13605. popover.close();
  13606. } else if (popover.params.closeByOutsideClick) {
  13607. popover.close();
  13608. }
  13609. }
  13610. }
  13611. function onKeyDown(e) {
  13612. var keyCode = e.keyCode;
  13613. if (keyCode === 27 && popover.params.closeOnEscape) {
  13614. popover.close();
  13615. }
  13616. }
  13617. if (popover.params.closeOnEscape) {
  13618. popover.on('popoverOpen', function () {
  13619. $(doc).on('keydown', onKeyDown);
  13620. });
  13621. popover.on('popoverClose', function () {
  13622. $(doc).off('keydown', onKeyDown);
  13623. });
  13624. }
  13625. popover.on('popoverOpened', function () {
  13626. if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
  13627. app.on('click', handleClick);
  13628. }
  13629. });
  13630. popover.on('popoverClose', function () {
  13631. if (popover.params.closeByOutsideClick || popover.params.closeByBackdropClick) {
  13632. app.off('click', handleClick);
  13633. }
  13634. });
  13635. $el[0].f7Modal = popover;
  13636. return popover;
  13637. }
  13638. if ( Modal ) Popover.__proto__ = Modal;
  13639. Popover.prototype = Object.create( Modal && Modal.prototype );
  13640. Popover.prototype.constructor = Popover;
  13641. Popover.prototype.resize = function resize () {
  13642. var popover = this;
  13643. var app = popover.app;
  13644. var $el = popover.$el;
  13645. var $targetEl = popover.$targetEl;
  13646. var $angleEl = popover.$angleEl;
  13647. var ref = popover.params;
  13648. var targetX = ref.targetX;
  13649. var targetY = ref.targetY;
  13650. $el.css({ left: '', top: '' });
  13651. var ref$1 = [$el.width(), $el.height()];
  13652. var width = ref$1[0];
  13653. var height = ref$1[1];
  13654. var angleSize = 0;
  13655. var angleLeft;
  13656. var angleTop;
  13657. if (app.theme === 'ios' || app.theme === 'aurora') {
  13658. $angleEl.removeClass('on-left on-right on-top on-bottom').css({ left: '', top: '' });
  13659. angleSize = $angleEl.width() / 2;
  13660. } else {
  13661. $el.removeClass('popover-on-left popover-on-right popover-on-top popover-on-bottom popover-on-middle').css({ left: '', top: '' });
  13662. }
  13663. var targetWidth;
  13664. var targetHeight;
  13665. var targetOffsetLeft;
  13666. var targetOffsetTop;
  13667. var safeAreaTop = parseInt($('html').css('--f7-safe-area-top'), 10);
  13668. if (Number.isNaN(safeAreaTop)) { safeAreaTop = 0; }
  13669. if ($targetEl && $targetEl.length > 0) {
  13670. targetWidth = $targetEl.outerWidth();
  13671. targetHeight = $targetEl.outerHeight();
  13672. var targetOffset = $targetEl.offset();
  13673. targetOffsetLeft = targetOffset.left - app.left;
  13674. targetOffsetTop = targetOffset.top - app.top;
  13675. var targetParentPage = $targetEl.parents('.page');
  13676. if (targetParentPage.length > 0) {
  13677. targetOffsetTop -= targetParentPage[0].scrollTop;
  13678. }
  13679. } else if (typeof targetX !== 'undefined' && targetY !== 'undefined') {
  13680. targetOffsetLeft = targetX;
  13681. targetOffsetTop = targetY;
  13682. targetWidth = popover.params.targetWidth || 0;
  13683. targetHeight = popover.params.targetHeight || 0;
  13684. }
  13685. var ref$2 = [0, 0, 0];
  13686. var left = ref$2[0];
  13687. var top = ref$2[1];
  13688. var diff = ref$2[2];
  13689. // Top Position
  13690. var position = app.theme === 'md' ? 'bottom' : 'top';
  13691. if (app.theme === 'md') {
  13692. if (height < app.height - targetOffsetTop - targetHeight) {
  13693. // On bottom
  13694. position = 'bottom';
  13695. top = targetOffsetTop + targetHeight;
  13696. } else if (height < targetOffsetTop - safeAreaTop) {
  13697. // On top
  13698. top = targetOffsetTop - height;
  13699. position = 'top';
  13700. } else {
  13701. // On middle
  13702. position = 'middle';
  13703. top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
  13704. }
  13705. top = Math.max(8, Math.min(top, app.height - height - 8));
  13706. // Horizontal Position
  13707. var hPosition;
  13708. if (targetOffsetLeft < app.width / 2) {
  13709. hPosition = 'right';
  13710. left = position === 'middle'
  13711. ? targetOffsetLeft + targetWidth
  13712. : targetOffsetLeft;
  13713. } else {
  13714. hPosition = 'left';
  13715. left = position === 'middle'
  13716. ? targetOffsetLeft - width
  13717. : (targetOffsetLeft + targetWidth) - width;
  13718. }
  13719. left = Math.max(8, Math.min(left, app.width - width - 8));
  13720. $el.addClass(("popover-on-" + position + " popover-on-" + hPosition));
  13721. } else {
  13722. // ios and aurora
  13723. if ((height + angleSize) < targetOffsetTop - safeAreaTop) {
  13724. // On top
  13725. top = targetOffsetTop - height - angleSize;
  13726. } else if ((height + angleSize) < app.height - targetOffsetTop - targetHeight) {
  13727. // On bottom
  13728. position = 'bottom';
  13729. top = targetOffsetTop + targetHeight + angleSize;
  13730. } else {
  13731. // On middle
  13732. position = 'middle';
  13733. top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
  13734. diff = top;
  13735. top = Math.max(5, Math.min(top, app.height - height - 5));
  13736. diff -= top;
  13737. }
  13738. // Horizontal Position
  13739. if (position === 'top' || position === 'bottom') {
  13740. left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
  13741. diff = left;
  13742. left = Math.max(5, Math.min(left, app.width - width - 5));
  13743. if (position === 'top') {
  13744. $angleEl.addClass('on-bottom');
  13745. }
  13746. if (position === 'bottom') {
  13747. $angleEl.addClass('on-top');
  13748. }
  13749. diff -= left;
  13750. angleLeft = ((width / 2) - angleSize) + diff;
  13751. angleLeft = Math.max(Math.min(angleLeft, width - (angleSize * 2) - 13), 13);
  13752. $angleEl.css({ left: (angleLeft + "px") });
  13753. } else if (position === 'middle') {
  13754. left = targetOffsetLeft - width - angleSize;
  13755. $angleEl.addClass('on-right');
  13756. if (left < 5 || (left + width > app.width)) {
  13757. if (left < 5) { left = targetOffsetLeft + targetWidth + angleSize; }
  13758. if (left + width > app.width) { left = app.width - width - 5; }
  13759. $angleEl.removeClass('on-right').addClass('on-left');
  13760. }
  13761. angleTop = ((height / 2) - angleSize) + diff;
  13762. angleTop = Math.max(Math.min(angleTop, height - (angleSize * 2) - 13), 13);
  13763. $angleEl.css({ top: (angleTop + "px") });
  13764. }
  13765. }
  13766. // Apply Styles
  13767. $el.css({ top: (top + "px"), left: (left + "px") });
  13768. };
  13769. return Popover;
  13770. }(Modal));
  13771. var Popover$1 = {
  13772. name: 'popover',
  13773. params: {
  13774. popover: {
  13775. backdrop: true,
  13776. backdropEl: undefined,
  13777. closeByBackdropClick: true,
  13778. closeByOutsideClick: true,
  13779. closeOnEscape: false,
  13780. },
  13781. },
  13782. static: {
  13783. Popover: Popover,
  13784. },
  13785. create: function create() {
  13786. var app = this;
  13787. app.popover = Utils.extend(
  13788. ModalMethods({
  13789. app: app,
  13790. constructor: Popover,
  13791. defaultSelector: '.popover.modal-in',
  13792. }),
  13793. {
  13794. open: function open(popoverEl, targetEl, animate) {
  13795. var $popoverEl = $(popoverEl);
  13796. if ($popoverEl.length > 1) {
  13797. // check if same popover in other page
  13798. var $targetPage = $(targetEl).parents('.page');
  13799. if ($targetPage.length) {
  13800. $popoverEl.each(function (index, el) {
  13801. var $el = $(el);
  13802. if ($el.parents($targetPage)[0] === $targetPage[0]) {
  13803. $popoverEl = $el;
  13804. }
  13805. });
  13806. }
  13807. }
  13808. if ($popoverEl.length > 1) {
  13809. $popoverEl = $popoverEl.eq($popoverEl.length - 1);
  13810. }
  13811. var popover = $popoverEl[0].f7Modal;
  13812. var data = $popoverEl.dataset();
  13813. if (!popover) {
  13814. popover = new Popover(app, Object.assign(
  13815. {
  13816. el: $popoverEl,
  13817. targetEl: targetEl,
  13818. },
  13819. data
  13820. ));
  13821. }
  13822. return popover.open(targetEl, animate);
  13823. },
  13824. }
  13825. );
  13826. },
  13827. clicks: {
  13828. '.popover-open': function openPopover($clickedEl, data) {
  13829. if ( data === void 0 ) data = {};
  13830. var app = this;
  13831. app.popover.open(data.popover, $clickedEl, data.animate);
  13832. },
  13833. '.popover-close': function closePopover($clickedEl, data) {
  13834. if ( data === void 0 ) data = {};
  13835. var app = this;
  13836. app.popover.close(data.popover, data.animate, $clickedEl);
  13837. },
  13838. },
  13839. };
  13840. /* eslint indent: ["off"] */
  13841. var Actions = /*@__PURE__*/(function (Modal) {
  13842. function Actions(app, params) {
  13843. var extendedParams = Utils.extend(
  13844. { on: {} },
  13845. app.params.actions,
  13846. params
  13847. );
  13848. // Extends with open/close Modal methods;
  13849. Modal.call(this, app, extendedParams);
  13850. var actions = this;
  13851. actions.params = extendedParams;
  13852. // Buttons
  13853. var groups;
  13854. if (actions.params.buttons) {
  13855. groups = actions.params.buttons;
  13856. if (!Array.isArray(groups[0])) { groups = [groups]; }
  13857. }
  13858. actions.groups = groups;
  13859. // Find Element
  13860. var $el;
  13861. if (actions.params.el) {
  13862. $el = $(actions.params.el).eq(0);
  13863. } else if (actions.params.content) {
  13864. $el = $(actions.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  13865. } else if (actions.params.buttons) {
  13866. if (actions.params.convertToPopover) {
  13867. actions.popoverHtml = actions.renderPopover();
  13868. }
  13869. actions.actionsHtml = actions.render();
  13870. }
  13871. if ($el && $el.length > 0 && $el[0].f7Modal) {
  13872. return $el[0].f7Modal;
  13873. }
  13874. if ($el && $el.length === 0 && !(actions.actionsHtml || actions.popoverHtml)) {
  13875. return actions.destroy();
  13876. }
  13877. // Backdrop
  13878. var $backdropEl;
  13879. if (actions.params.backdrop && actions.params.backdropEl) {
  13880. $backdropEl = $(actions.params.backdropEl);
  13881. } else if (actions.params.backdrop) {
  13882. $backdropEl = app.root.children('.actions-backdrop');
  13883. if ($backdropEl.length === 0) {
  13884. $backdropEl = $('<div class="actions-backdrop"></div>');
  13885. app.root.append($backdropEl);
  13886. }
  13887. }
  13888. var originalOpen = actions.open;
  13889. var originalClose = actions.close;
  13890. var popover;
  13891. function buttonOnClick(e) {
  13892. var $buttonEl = $(this);
  13893. var buttonIndex;
  13894. var groupIndex;
  13895. if ($buttonEl.hasClass('list-button') || $buttonEl.hasClass('item-link')) {
  13896. buttonIndex = $buttonEl.parents('li').index();
  13897. groupIndex = $buttonEl.parents('.list').index();
  13898. } else {
  13899. buttonIndex = $buttonEl.index();
  13900. groupIndex = $buttonEl.parents('.actions-group').index();
  13901. }
  13902. if (typeof groups !== 'undefined') {
  13903. var button = groups[groupIndex][buttonIndex];
  13904. if (button.onClick) { button.onClick(actions, e); }
  13905. if (actions.params.onClick) { actions.params.onClick(actions, e); }
  13906. if (button.close !== false) { actions.close(); }
  13907. }
  13908. }
  13909. actions.open = function open(animate) {
  13910. var convertToPopover = false;
  13911. var ref = actions.params;
  13912. var targetEl = ref.targetEl;
  13913. var targetX = ref.targetX;
  13914. var targetY = ref.targetY;
  13915. var targetWidth = ref.targetWidth;
  13916. var targetHeight = ref.targetHeight;
  13917. if (actions.params.convertToPopover && (targetEl || (targetX !== undefined && targetY !== undefined))) {
  13918. // Popover
  13919. if (
  13920. actions.params.forceToPopover
  13921. || (app.device.ios && app.device.ipad)
  13922. || app.width >= 768
  13923. || (app.device.desktop && app.theme === 'aurora')
  13924. ) {
  13925. convertToPopover = true;
  13926. }
  13927. }
  13928. if (convertToPopover && actions.popoverHtml) {
  13929. popover = app.popover.create({
  13930. content: actions.popoverHtml,
  13931. backdrop: actions.params.backdrop,
  13932. targetEl: targetEl,
  13933. targetX: targetX,
  13934. targetY: targetY,
  13935. targetWidth: targetWidth,
  13936. targetHeight: targetHeight,
  13937. on: {
  13938. open: function open() {
  13939. if (!actions.$el) {
  13940. actions.$el = popover.$el;
  13941. }
  13942. actions.$el.trigger(("modal:open " + (actions.type.toLowerCase()) + ":open"));
  13943. actions.emit(("local::open modalOpen " + (actions.type) + "Open"), actions);
  13944. },
  13945. opened: function opened() {
  13946. if (!actions.$el) {
  13947. actions.$el = popover.$el;
  13948. }
  13949. actions.$el.trigger(("modal:opened " + (actions.type.toLowerCase()) + ":opened"));
  13950. actions.emit(("local::opened modalOpened " + (actions.type) + "Opened"), actions);
  13951. },
  13952. close: function close() {
  13953. if (!actions.$el) {
  13954. actions.$el = popover.$el;
  13955. }
  13956. actions.$el.trigger(("modal:close " + (actions.type.toLowerCase()) + ":close"));
  13957. actions.emit(("local::close modalClose " + (actions.type) + "Close"), actions);
  13958. },
  13959. closed: function closed() {
  13960. if (!actions.$el) {
  13961. actions.$el = popover.$el;
  13962. }
  13963. actions.$el.trigger(("modal:closed " + (actions.type.toLowerCase()) + ":closed"));
  13964. actions.emit(("local::closed modalClosed " + (actions.type) + "Closed"), actions);
  13965. },
  13966. },
  13967. });
  13968. popover.open(animate);
  13969. popover.once('popoverOpened', function () {
  13970. popover.$el.find('.list-button, .item-link').each(function (groupIndex, buttonEl) {
  13971. $(buttonEl).on('click', buttonOnClick);
  13972. });
  13973. });
  13974. popover.once('popoverClosed', function () {
  13975. popover.$el.find('.list-button, .item-link').each(function (groupIndex, buttonEl) {
  13976. $(buttonEl).off('click', buttonOnClick);
  13977. });
  13978. Utils.nextTick(function () {
  13979. popover.destroy();
  13980. popover = undefined;
  13981. });
  13982. });
  13983. } else {
  13984. actions.$el = actions.actionsHtml ? $(actions.actionsHtml) : actions.$el;
  13985. actions.$el[0].f7Modal = actions;
  13986. if (actions.groups) {
  13987. actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
  13988. $(buttonEl).on('click', buttonOnClick);
  13989. });
  13990. actions.once('actionsClosed', function () {
  13991. actions.$el.find('.actions-button').each(function (groupIndex, buttonEl) {
  13992. $(buttonEl).off('click', buttonOnClick);
  13993. });
  13994. });
  13995. }
  13996. actions.el = actions.$el[0];
  13997. originalOpen.call(actions, animate);
  13998. }
  13999. return actions;
  14000. };
  14001. actions.close = function close(animate) {
  14002. if (popover) {
  14003. popover.close(animate);
  14004. } else {
  14005. originalClose.call(actions, animate);
  14006. }
  14007. return actions;
  14008. };
  14009. Utils.extend(actions, {
  14010. app: app,
  14011. $el: $el,
  14012. el: $el ? $el[0] : undefined,
  14013. $backdropEl: $backdropEl,
  14014. backdropEl: $backdropEl && $backdropEl[0],
  14015. type: 'actions',
  14016. });
  14017. function handleClick(e) {
  14018. var target = e.target;
  14019. var $target = $(target);
  14020. var keyboardOpened = !app.device.desktop && app.device.cordova && ((win.Keyboard && win.Keyboard.isVisible) || (win.cordova.plugins && win.cordova.plugins.Keyboard && win.cordova.plugins.Keyboard.isVisible));
  14021. if (keyboardOpened) { return; }
  14022. if ($target.closest(actions.el).length === 0) {
  14023. if (
  14024. actions.params.closeByBackdropClick
  14025. && actions.params.backdrop
  14026. && actions.backdropEl
  14027. && actions.backdropEl === target
  14028. ) {
  14029. actions.close();
  14030. } else if (actions.params.closeByOutsideClick) {
  14031. actions.close();
  14032. }
  14033. }
  14034. }
  14035. function onKeyDown(e) {
  14036. var keyCode = e.keyCode;
  14037. if (keyCode === 27 && actions.params.closeOnEscape) {
  14038. actions.close();
  14039. }
  14040. }
  14041. if (actions.params.closeOnEscape) {
  14042. actions.on('open', function () {
  14043. $(doc).on('keydown', onKeyDown);
  14044. });
  14045. actions.on('close', function () {
  14046. $(doc).off('keydown', onKeyDown);
  14047. });
  14048. }
  14049. actions.on('opened', function () {
  14050. if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
  14051. app.on('click', handleClick);
  14052. }
  14053. });
  14054. actions.on('close', function () {
  14055. if (actions.params.closeByBackdropClick || actions.params.closeByOutsideClick) {
  14056. app.off('click', handleClick);
  14057. }
  14058. });
  14059. if ($el) {
  14060. $el[0].f7Modal = actions;
  14061. }
  14062. return actions;
  14063. }
  14064. if ( Modal ) Actions.__proto__ = Modal;
  14065. Actions.prototype = Object.create( Modal && Modal.prototype );
  14066. Actions.prototype.constructor = Actions;
  14067. Actions.prototype.render = function render () {
  14068. var actions = this;
  14069. if (actions.params.render) { return actions.params.render.call(actions, actions); }
  14070. var groups = actions.groups;
  14071. var cssClass = actions.params.cssClass;
  14072. return ("\n <div class=\"actions-modal" + (actions.params.grid ? ' actions-grid' : '') + " " + (cssClass || '') + "\">\n " + (groups.map(function (group) { return ("<div class=\"actions-group\">\n " + (group.map(function (button) {
  14073. var buttonClasses = [("actions-" + (button.label ? 'label' : 'button'))];
  14074. var color = button.color;
  14075. var bg = button.bg;
  14076. var bold = button.bold;
  14077. var disabled = button.disabled;
  14078. var label = button.label;
  14079. var text = button.text;
  14080. var icon = button.icon;
  14081. if (color) { buttonClasses.push(("color-" + color)); }
  14082. if (bg) { buttonClasses.push(("bg-color-" + bg)); }
  14083. if (bold) { buttonClasses.push('actions-button-bold'); }
  14084. if (disabled) { buttonClasses.push('disabled'); }
  14085. if (label) {
  14086. return ("<div class=\"" + (buttonClasses.join(' ')) + "\">" + text + "</div>");
  14087. }
  14088. return ("\n <div class=\"" + (buttonClasses.join(' ')) + "\">\n " + (icon ? ("<div class=\"actions-button-media\">" + icon + "</div>") : '') + "\n <div class=\"actions-button-text\">" + text + "</div>\n </div>").trim();
  14089. }).join('')) + "\n </div>"); }).join('')) + "\n </div>\n ").trim();
  14090. };
  14091. Actions.prototype.renderPopover = function renderPopover () {
  14092. var actions = this;
  14093. if (actions.params.renderPopover) { return actions.params.renderPopover.call(actions, actions); }
  14094. var groups = actions.groups;
  14095. var cssClass = actions.params.cssClass;
  14096. return ("\n <div class=\"popover popover-from-actions " + (cssClass || '') + "\">\n <div class=\"popover-inner\">\n " + (groups.map(function (group) { return ("\n <div class=\"list\">\n <ul>\n " + (group.map(function (button) {
  14097. var itemClasses = [];
  14098. var color = button.color;
  14099. var bg = button.bg;
  14100. var bold = button.bold;
  14101. var disabled = button.disabled;
  14102. var label = button.label;
  14103. var text = button.text;
  14104. var icon = button.icon;
  14105. if (color) { itemClasses.push(("color-" + color)); }
  14106. if (bg) { itemClasses.push(("bg-color-" + bg)); }
  14107. if (bold) { itemClasses.push('popover-from-actions-bold'); }
  14108. if (disabled) { itemClasses.push('disabled'); }
  14109. if (label) {
  14110. itemClasses.push('popover-from-actions-label');
  14111. return ("<li class=\"" + (itemClasses.join(' ')) + "\">" + text + "</li>");
  14112. }
  14113. if (icon) {
  14114. itemClasses.push('item-link item-content');
  14115. return ("\n <li>\n <a class=\"" + (itemClasses.join(' ')) + "\">\n <div class=\"item-media\">\n " + icon + "\n </div>\n <div class=\"item-inner\">\n <div class=\"item-title\">\n " + text + "\n </div>\n </div>\n </a>\n </li>\n ");
  14116. }
  14117. itemClasses.push('list-button');
  14118. return ("\n <li>\n <a class=\"" + (itemClasses.join(' ')) + "\">" + text + "</a>\n </li>\n ");
  14119. }).join('')) + "\n </ul>\n </div>\n "); }).join('')) + "\n </div>\n </div>\n ").trim();
  14120. };
  14121. return Actions;
  14122. }(Modal));
  14123. var Actions$1 = {
  14124. name: 'actions',
  14125. params: {
  14126. actions: {
  14127. convertToPopover: true,
  14128. forceToPopover: false,
  14129. backdrop: true,
  14130. backdropEl: undefined,
  14131. cssClass: null,
  14132. closeByBackdropClick: true,
  14133. closeOnEscape: false,
  14134. render: null,
  14135. renderPopover: null,
  14136. },
  14137. },
  14138. static: {
  14139. Actions: Actions,
  14140. },
  14141. create: function create() {
  14142. var app = this;
  14143. app.actions = ModalMethods({
  14144. app: app,
  14145. constructor: Actions,
  14146. defaultSelector: '.actions-modal.modal-in',
  14147. });
  14148. },
  14149. clicks: {
  14150. '.actions-open': function openActions($clickedEl, data) {
  14151. if ( data === void 0 ) data = {};
  14152. var app = this;
  14153. app.actions.open(data.actions, data.animate, $clickedEl);
  14154. },
  14155. '.actions-close': function closeActions($clickedEl, data) {
  14156. if ( data === void 0 ) data = {};
  14157. var app = this;
  14158. app.actions.close(data.actions, data.animate, $clickedEl);
  14159. },
  14160. },
  14161. };
  14162. var Sheet = /*@__PURE__*/(function (Modal) {
  14163. function Sheet(app, params) {
  14164. var extendedParams = Utils.extend(
  14165. { on: {} },
  14166. app.params.sheet,
  14167. params
  14168. );
  14169. // Extends with open/close Modal methods;
  14170. Modal.call(this, app, extendedParams);
  14171. var sheet = this;
  14172. sheet.params = extendedParams;
  14173. if (typeof sheet.params.backdrop === 'undefined') {
  14174. sheet.params.backdrop = app.theme !== 'ios';
  14175. }
  14176. // Find Element
  14177. var $el;
  14178. if (!sheet.params.el) {
  14179. $el = $(sheet.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  14180. } else {
  14181. $el = $(sheet.params.el).eq(0);
  14182. }
  14183. if ($el && $el.length > 0 && $el[0].f7Modal) {
  14184. return $el[0].f7Modal;
  14185. }
  14186. if ($el.length === 0) {
  14187. return sheet.destroy();
  14188. }
  14189. var $backdropEl;
  14190. if (sheet.params.backdrop && sheet.params.backdropEl) {
  14191. $backdropEl = $(sheet.params.backdropEl);
  14192. } else if (sheet.params.backdrop) {
  14193. $backdropEl = app.root.children('.sheet-backdrop');
  14194. if ($backdropEl.length === 0) {
  14195. $backdropEl = $('<div class="sheet-backdrop"></div>');
  14196. app.root.append($backdropEl);
  14197. }
  14198. }
  14199. Utils.extend(sheet, {
  14200. app: app,
  14201. push: $el.hasClass('sheet-modal-push') || sheet.params.push,
  14202. $el: $el,
  14203. el: $el[0],
  14204. $backdropEl: $backdropEl,
  14205. backdropEl: $backdropEl && $backdropEl[0],
  14206. type: 'sheet',
  14207. $htmlEl: $('html'),
  14208. });
  14209. if (sheet.params.push) {
  14210. $el.addClass('sheet-modal-push');
  14211. }
  14212. var $pageContentEl;
  14213. function scrollToElementOnOpen() {
  14214. var $scrollEl = $(sheet.params.scrollToEl).eq(0);
  14215. if ($scrollEl.length === 0) { return; }
  14216. $pageContentEl = $scrollEl.parents('.page-content');
  14217. if ($pageContentEl.length === 0) { return; }
  14218. var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  14219. var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  14220. var pageHeight = $pageContentEl[0].offsetHeight - paddingTop - $el.height();
  14221. var pageScrollHeight = $pageContentEl[0].scrollHeight - paddingTop - $el.height();
  14222. var pageScroll = $pageContentEl.scrollTop();
  14223. var newPaddingBottom;
  14224. var scrollElTop = ($scrollEl.offset().top - paddingTop) + $scrollEl[0].offsetHeight;
  14225. if (scrollElTop > pageHeight) {
  14226. var scrollTop = (pageScroll + scrollElTop) - pageHeight;
  14227. if (scrollTop + pageHeight > pageScrollHeight) {
  14228. newPaddingBottom = ((scrollTop + pageHeight) - pageScrollHeight) + paddingBottom;
  14229. if (pageHeight === pageScrollHeight) {
  14230. newPaddingBottom = $el.height();
  14231. }
  14232. $pageContentEl.css({
  14233. 'padding-bottom': (newPaddingBottom + "px"),
  14234. });
  14235. }
  14236. $pageContentEl.scrollTop(scrollTop, 300);
  14237. }
  14238. }
  14239. function scrollToElementOnClose() {
  14240. if ($pageContentEl && $pageContentEl.length > 0) {
  14241. $pageContentEl.css({
  14242. 'padding-bottom': '',
  14243. });
  14244. }
  14245. }
  14246. function handleClick(e) {
  14247. var target = e.target;
  14248. var $target = $(target);
  14249. var keyboardOpened = !app.device.desktop && app.device.cordova && ((win.Keyboard && win.Keyboard.isVisible) || (win.cordova.plugins && win.cordova.plugins.Keyboard && win.cordova.plugins.Keyboard.isVisible));
  14250. if (keyboardOpened) { return; }
  14251. if ($target.closest(sheet.el).length === 0) {
  14252. if (
  14253. sheet.params.closeByBackdropClick
  14254. && sheet.params.backdrop
  14255. && sheet.backdropEl
  14256. && sheet.backdropEl === target
  14257. ) {
  14258. sheet.close();
  14259. } else if (sheet.params.closeByOutsideClick) {
  14260. sheet.close();
  14261. }
  14262. }
  14263. }
  14264. function onKeyDown(e) {
  14265. var keyCode = e.keyCode;
  14266. if (keyCode === 27 && sheet.params.closeOnEscape) {
  14267. sheet.close();
  14268. }
  14269. }
  14270. var pushOffset;
  14271. function pushViewScale(offset) {
  14272. return (app.height - offset * 2) / app.height;
  14273. }
  14274. var isTouched = false;
  14275. var startTouch;
  14276. var currentTouch;
  14277. var isScrolling;
  14278. var touchStartTime;
  14279. var touchesDiff;
  14280. var isMoved = false;
  14281. var isTopSheetModal;
  14282. var swipeStepTranslate;
  14283. var startTranslate;
  14284. var currentTranslate;
  14285. var sheetElOffsetHeight;
  14286. var minTranslate;
  14287. var maxTranslate;
  14288. var $pushViewEl;
  14289. var pushBorderRadius;
  14290. var sheetPageContentEl;
  14291. var sheetPageContentScrollTop;
  14292. var sheetPageContentScrollHeight;
  14293. var sheetPageContentOffsetHeight;
  14294. function handleTouchStart(e) {
  14295. if (isTouched || !(sheet.params.swipeToClose || sheet.params.swipeToStep)) { return; }
  14296. if (sheet.params.swipeHandler && $(e.target).closest(sheet.params.swipeHandler).length === 0) {
  14297. return;
  14298. }
  14299. isTouched = true;
  14300. isMoved = false;
  14301. startTouch = {
  14302. x: e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX,
  14303. y: e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY,
  14304. };
  14305. touchStartTime = Utils.now();
  14306. isScrolling = undefined;
  14307. isTopSheetModal = $el.hasClass('sheet-modal-top');
  14308. if (!sheet.params.swipeHandler && e.type === 'touchstart') {
  14309. sheetPageContentEl = $(e.target).closest('.page-content')[0];
  14310. }
  14311. }
  14312. function handleTouchMove(e) {
  14313. if (!isTouched) { return; }
  14314. currentTouch = {
  14315. x: e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX,
  14316. y: e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY,
  14317. };
  14318. if (typeof isScrolling === 'undefined') {
  14319. isScrolling = !!(isScrolling || Math.abs(currentTouch.x - startTouch.x) > Math.abs(currentTouch.y - startTouch.y));
  14320. }
  14321. if (isScrolling) {
  14322. isTouched = false;
  14323. isMoved = false;
  14324. return;
  14325. }
  14326. touchesDiff = startTouch.y - currentTouch.y;
  14327. var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
  14328. if (!isMoved) {
  14329. if (sheetPageContentEl && !$el.hasClass('modal-in-swipe-step')) {
  14330. sheetPageContentScrollTop = sheetPageContentEl.scrollTop;
  14331. sheetPageContentScrollHeight = sheetPageContentEl.scrollHeight;
  14332. sheetPageContentOffsetHeight = sheetPageContentEl.offsetHeight;
  14333. if (
  14334. !(sheetPageContentScrollHeight === sheetPageContentOffsetHeight)
  14335. && !(direction === 'to-bottom' && sheetPageContentScrollTop === 0)
  14336. && !(direction === 'to-top' && sheetPageContentScrollTop === (sheetPageContentScrollHeight - sheetPageContentOffsetHeight))
  14337. ) {
  14338. $el.transform('');
  14339. isTouched = false;
  14340. isMoved = false;
  14341. return;
  14342. }
  14343. }
  14344. if (sheet.push && pushOffset) {
  14345. $pushViewEl = app.root.children('.view, .views');
  14346. }
  14347. sheetElOffsetHeight = $el[0].offsetHeight;
  14348. startTranslate = Utils.getTranslate($el[0], 'y');
  14349. if (isTopSheetModal) {
  14350. minTranslate = sheet.params.swipeToClose ? -sheetElOffsetHeight : -swipeStepTranslate;
  14351. maxTranslate = 0;
  14352. } else {
  14353. minTranslate = 0;
  14354. maxTranslate = sheet.params.swipeToClose ? sheetElOffsetHeight : swipeStepTranslate;
  14355. }
  14356. isMoved = true;
  14357. }
  14358. currentTranslate = startTranslate - touchesDiff;
  14359. currentTranslate = Math.min(Math.max(currentTranslate, minTranslate), maxTranslate);
  14360. e.preventDefault();
  14361. if (sheet.push && pushOffset) {
  14362. var progress = (currentTranslate - startTranslate) / sheetElOffsetHeight;
  14363. if (sheet.params.swipeToStep) {
  14364. if (isTopSheetModal) {
  14365. progress = (currentTranslate / swipeStepTranslate);
  14366. } else {
  14367. progress = 1 - (swipeStepTranslate - currentTranslate) / swipeStepTranslate;
  14368. }
  14369. }
  14370. progress = Math.abs(progress);
  14371. progress = Math.min(Math.max(progress, 0), 1);
  14372. var pushProgress = 1 - progress;
  14373. var scale = 1 - (1 - pushViewScale(pushOffset)) * pushProgress;
  14374. $pushViewEl.transition(0).transform(("translate3d(0,0,0) scale(" + scale + ")"));
  14375. if (sheet.params.swipeToStep) {
  14376. $pushViewEl.css('border-radius', ((pushBorderRadius * pushProgress) + "px"));
  14377. }
  14378. }
  14379. $el
  14380. .transition(0)
  14381. .transform(("translate3d(0," + currentTranslate + "px,0)"));
  14382. if (sheet.params.swipeToStep) {
  14383. var progress$1;
  14384. if (isTopSheetModal) {
  14385. progress$1 = 1 - (currentTranslate / swipeStepTranslate);
  14386. } else {
  14387. progress$1 = (swipeStepTranslate - currentTranslate) / swipeStepTranslate;
  14388. }
  14389. progress$1 = Math.min(Math.max(progress$1, 0), 1);
  14390. $el.trigger('sheet:stepprogress', progress$1);
  14391. sheet.emit('local::stepProgress sheetStepProgress', sheet, progress$1);
  14392. }
  14393. }
  14394. function handleTouchEnd() {
  14395. isTouched = false;
  14396. if (!isMoved) {
  14397. return;
  14398. }
  14399. isMoved = false;
  14400. $el.transform('').transition('');
  14401. if (sheet.push && pushOffset) {
  14402. $pushViewEl.transition('').transform('');
  14403. $pushViewEl.css('border-radius', '');
  14404. }
  14405. var direction = touchesDiff < 0 ? 'to-bottom' : 'to-top';
  14406. var diff = Math.abs(touchesDiff);
  14407. if (diff === 0 || currentTranslate === startTranslate) { return; }
  14408. var timeDiff = (new Date()).getTime() - touchStartTime;
  14409. if (!sheet.params.swipeToStep) {
  14410. if (direction !== (isTopSheetModal ? 'to-top' : 'to-bottom')) {
  14411. return;
  14412. }
  14413. if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > (sheetElOffsetHeight / 2))) {
  14414. sheet.close();
  14415. }
  14416. return;
  14417. }
  14418. var openDirection = isTopSheetModal ? 'to-bottom' : 'to-top';
  14419. var closeDirection = isTopSheetModal ? 'to-top' : 'to-bottom';
  14420. var absCurrentTranslate = Math.abs(currentTranslate);
  14421. var absSwipeStepTranslate = Math.abs(swipeStepTranslate);
  14422. if (timeDiff < 300 && diff > 10) {
  14423. if (direction === openDirection && absCurrentTranslate < absSwipeStepTranslate) {
  14424. // open step
  14425. $el.removeClass('modal-in-swipe-step');
  14426. $el.trigger('sheet:stepprogress', 1);
  14427. sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
  14428. $el.trigger('sheet:stepopen');
  14429. sheet.emit('local::stepOpen sheetStepOpen', sheet);
  14430. if (sheet.push && pushOffset) {
  14431. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  14432. $pushViewEl.css('border-radius', '');
  14433. }
  14434. }
  14435. if (direction === closeDirection && absCurrentTranslate > absSwipeStepTranslate) {
  14436. // close sheet
  14437. if (sheet.params.swipeToClose) {
  14438. sheet.close();
  14439. } else {
  14440. // close step
  14441. $el.addClass('modal-in-swipe-step');
  14442. $el.trigger('sheet:stepprogress', 0);
  14443. sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
  14444. $el.trigger('sheet:stepclose');
  14445. sheet.emit('local::stepClose sheetStepClose', sheet);
  14446. if (sheet.push && pushOffset) {
  14447. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  14448. $pushViewEl.css('border-radius', '0px');
  14449. }
  14450. }
  14451. }
  14452. if (direction === closeDirection && absCurrentTranslate <= absSwipeStepTranslate) {
  14453. // close step
  14454. $el.addClass('modal-in-swipe-step');
  14455. $el.trigger('sheet:stepprogress', 0);
  14456. sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
  14457. $el.trigger('sheet:stepclose');
  14458. sheet.emit('local::stepClose sheetStepClose', sheet);
  14459. if (sheet.push && pushOffset) {
  14460. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  14461. $pushViewEl.css('border-radius', '0px');
  14462. }
  14463. }
  14464. return;
  14465. }
  14466. if (timeDiff >= 300) {
  14467. var stepOpened = !$el.hasClass('modal-in-swipe-step');
  14468. if (!stepOpened) {
  14469. if (absCurrentTranslate < (absSwipeStepTranslate / 2)) {
  14470. // open step
  14471. $el.removeClass('modal-in-swipe-step');
  14472. $el.trigger('sheet:stepprogress', 1);
  14473. sheet.emit('local::stepProgress sheetStepProgress', sheet, 1);
  14474. $el.trigger('sheet:stepopen');
  14475. sheet.emit('local::stepOpen sheetStepOpen', sheet);
  14476. if (sheet.push && pushOffset) {
  14477. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  14478. $pushViewEl.css('border-radius', '');
  14479. }
  14480. } else if ((absCurrentTranslate - absSwipeStepTranslate) > (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
  14481. // close sheet
  14482. if (sheet.params.swipeToClose) { sheet.close(); }
  14483. }
  14484. } else if (stepOpened) {
  14485. if (absCurrentTranslate > absSwipeStepTranslate + (sheetElOffsetHeight - absSwipeStepTranslate) / 2) {
  14486. // close sheet
  14487. if (sheet.params.swipeToClose) { sheet.close(); }
  14488. } else if (absCurrentTranslate > absSwipeStepTranslate / 2) {
  14489. // close step
  14490. $el.addClass('modal-in-swipe-step');
  14491. $el.trigger('sheet:stepprogress', 0);
  14492. sheet.emit('local::stepProgress sheetStepProgress', sheet, 0);
  14493. $el.trigger('sheet:stepclose');
  14494. sheet.emit('local::stepClose sheetStepClose', sheet);
  14495. if (sheet.push && pushOffset) {
  14496. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  14497. $pushViewEl.css('border-radius', '0px');
  14498. }
  14499. }
  14500. }
  14501. }
  14502. }
  14503. sheet.setSwipeStep = function setSwipeStep(byResize) {
  14504. if ( byResize === void 0 ) byResize = true;
  14505. var $swipeStepEl = $el.find('.sheet-modal-swipe-step').eq(0);
  14506. if (!$swipeStepEl.length) { return; }
  14507. if ($el.hasClass('sheet-modal-top')) {
  14508. swipeStepTranslate = -($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
  14509. } else {
  14510. swipeStepTranslate = $el[0].offsetHeight - ($swipeStepEl.offset().top - $el.offset().top + $swipeStepEl[0].offsetHeight);
  14511. }
  14512. $el[0].style.setProperty('--f7-sheet-swipe-step', (swipeStepTranslate + "px"));
  14513. if (!byResize) {
  14514. $el.addClass('modal-in-swipe-step');
  14515. }
  14516. };
  14517. function onResize() {
  14518. sheet.setSwipeStep(true);
  14519. }
  14520. var passive = Support.passiveListener ? { passive: true } : false;
  14521. if (sheet.params.swipeToClose || sheet.params.swipeToStep) {
  14522. $el.on(app.touchEvents.start, handleTouchStart, passive);
  14523. app.on('touchmove', handleTouchMove);
  14524. app.on('touchend:passive', handleTouchEnd);
  14525. sheet.once('sheetDestroy', function () {
  14526. $el.off(app.touchEvents.start, handleTouchStart, passive);
  14527. app.off('touchmove', handleTouchMove);
  14528. app.off('touchend:passive', handleTouchEnd);
  14529. });
  14530. }
  14531. sheet.on('open', function () {
  14532. if (sheet.params.closeOnEscape) {
  14533. $(doc).on('keydown', onKeyDown);
  14534. }
  14535. $el.prevAll('.popup.modal-in').addClass('popup-behind');
  14536. if (sheet.params.swipeToStep) {
  14537. sheet.setSwipeStep(false);
  14538. app.on('resize', onResize);
  14539. }
  14540. if (sheet.params.scrollToEl) {
  14541. scrollToElementOnOpen();
  14542. }
  14543. if (sheet.push) {
  14544. pushOffset = parseInt($el.css('--f7-sheet-push-offset'), 10);
  14545. if (Number.isNaN(pushOffset)) { pushOffset = 0; }
  14546. if (pushOffset) {
  14547. $el.addClass('sheet-modal-push');
  14548. sheet.$htmlEl.addClass('with-modal-sheet-push');
  14549. if (!sheet.params.swipeToStep) {
  14550. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  14551. } else {
  14552. $pushViewEl = app.root.children('.view, .views');
  14553. pushBorderRadius = parseFloat($el.css(("border-" + (isTopSheetModal ? 'bottom' : 'top') + "-left-radius")));
  14554. $pushViewEl.css('border-radius', '0px');
  14555. }
  14556. }
  14557. }
  14558. });
  14559. sheet.on('opened', function () {
  14560. if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
  14561. app.on('click', handleClick);
  14562. }
  14563. });
  14564. sheet.on('close', function () {
  14565. if (sheet.params.swipeToStep) {
  14566. $el.removeClass('modal-in-swipe-step');
  14567. app.off('resize', onResize);
  14568. }
  14569. if (sheet.params.closeOnEscape) {
  14570. $(doc).off('keydown', onKeyDown);
  14571. }
  14572. if (sheet.params.scrollToEl) {
  14573. scrollToElementOnClose();
  14574. }
  14575. if (sheet.params.closeByOutsideClick || sheet.params.closeByBackdropClick) {
  14576. app.off('click', handleClick);
  14577. }
  14578. $el.prevAll('.popup.modal-in').eq(0).removeClass('popup-behind');
  14579. if (sheet.push && pushOffset) {
  14580. sheet.$htmlEl.removeClass('with-modal-sheet-push');
  14581. sheet.$htmlEl.addClass('with-modal-sheet-push-closing');
  14582. }
  14583. });
  14584. sheet.on('closed', function () {
  14585. if (sheet.push && pushOffset) {
  14586. sheet.$htmlEl.removeClass('with-modal-sheet-push-closing');
  14587. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  14588. }
  14589. });
  14590. sheet.stepOpen = function stepOpen() {
  14591. $el.removeClass('modal-in-swipe-step');
  14592. if (sheet.push) {
  14593. if (!pushOffset) {
  14594. pushOffset = parseInt($el.css('--f7-sheet-push-offset'), 10);
  14595. if (Number.isNaN(pushOffset)) { pushOffset = 0; }
  14596. }
  14597. if (pushOffset) {
  14598. sheet.$htmlEl[0].style.setProperty('--f7-sheet-push-scale', pushViewScale(pushOffset));
  14599. }
  14600. }
  14601. };
  14602. sheet.stepClose = function stepClose() {
  14603. $el.addClass('modal-in-swipe-step');
  14604. if (sheet.push) {
  14605. sheet.$htmlEl[0].style.removeProperty('--f7-sheet-push-scale');
  14606. }
  14607. };
  14608. sheet.stepToggle = function stepToggle() {
  14609. $el.toggleClass('modal-in-swipe-step');
  14610. };
  14611. $el[0].f7Modal = sheet;
  14612. return sheet;
  14613. }
  14614. if ( Modal ) Sheet.__proto__ = Modal;
  14615. Sheet.prototype = Object.create( Modal && Modal.prototype );
  14616. Sheet.prototype.constructor = Sheet;
  14617. return Sheet;
  14618. }(Modal));
  14619. var Sheet$1 = {
  14620. name: 'sheet',
  14621. params: {
  14622. sheet: {
  14623. push: false,
  14624. backdrop: undefined,
  14625. backdropEl: undefined,
  14626. closeByBackdropClick: true,
  14627. closeByOutsideClick: false,
  14628. closeOnEscape: false,
  14629. swipeToClose: false,
  14630. swipeToStep: false,
  14631. swipeHandler: null,
  14632. },
  14633. },
  14634. static: {
  14635. Sheet: Sheet,
  14636. },
  14637. create: function create() {
  14638. var app = this;
  14639. app.sheet = Utils.extend(
  14640. {},
  14641. ModalMethods({
  14642. app: app,
  14643. constructor: Sheet,
  14644. defaultSelector: '.sheet-modal.modal-in',
  14645. }),
  14646. {
  14647. stepOpen: function stepOpen(sheet) {
  14648. var sheetInstance = app.sheet.get(sheet);
  14649. if (sheetInstance && sheetInstance.stepOpen) { return sheetInstance.stepOpen(); }
  14650. return undefined;
  14651. },
  14652. stepClose: function stepClose(sheet) {
  14653. var sheetInstance = app.sheet.get(sheet);
  14654. if (sheetInstance && sheetInstance.stepClose) { return sheetInstance.stepClose(); }
  14655. return undefined;
  14656. },
  14657. stepToggle: function stepToggle(sheet) {
  14658. var sheetInstance = app.sheet.get(sheet);
  14659. if (sheetInstance && sheetInstance.stepToggle) { return sheetInstance.stepToggle(); }
  14660. return undefined;
  14661. },
  14662. }
  14663. );
  14664. },
  14665. clicks: {
  14666. '.sheet-open': function openSheet($clickedEl, data) {
  14667. if ( data === void 0 ) data = {};
  14668. var app = this;
  14669. if ($('.sheet-modal.modal-in').length > 0 && data.sheet && $(data.sheet)[0] !== $('.sheet-modal.modal-in')[0]) {
  14670. app.sheet.close('.sheet-modal.modal-in');
  14671. }
  14672. app.sheet.open(data.sheet, data.animate, $clickedEl);
  14673. },
  14674. '.sheet-close': function closeSheet($clickedEl, data) {
  14675. if ( data === void 0 ) data = {};
  14676. var app = this;
  14677. app.sheet.close(data.sheet, data.animate, $clickedEl);
  14678. },
  14679. },
  14680. };
  14681. var Toast = /*@__PURE__*/(function (Modal) {
  14682. function Toast(app, params) {
  14683. var extendedParams = Utils.extend({
  14684. on: {},
  14685. }, app.params.toast, params);
  14686. // Extends with open/close Modal methods;
  14687. Modal.call(this, app, extendedParams);
  14688. var toast = this;
  14689. toast.app = app;
  14690. toast.params = extendedParams;
  14691. var ref = toast.params;
  14692. var closeButton = ref.closeButton;
  14693. var closeTimeout = ref.closeTimeout;
  14694. var $el;
  14695. if (!toast.params.el) {
  14696. // Find Element
  14697. var toastHtml = toast.render();
  14698. $el = $(toastHtml);
  14699. } else {
  14700. $el = $(toast.params.el);
  14701. }
  14702. if ($el && $el.length > 0 && $el[0].f7Modal) {
  14703. return $el[0].f7Modal;
  14704. }
  14705. if ($el.length === 0) {
  14706. return toast.destroy();
  14707. }
  14708. Utils.extend(toast, {
  14709. $el: $el,
  14710. el: $el[0],
  14711. type: 'toast',
  14712. });
  14713. $el[0].f7Modal = toast;
  14714. if (closeButton) {
  14715. $el.find('.toast-button').on('click', function () {
  14716. toast.emit('local::closeButtonClick toastCloseButtonClick', toast);
  14717. toast.close();
  14718. });
  14719. toast.on('beforeDestroy', function () {
  14720. $el.find('.toast-button').off('click');
  14721. });
  14722. }
  14723. var timeoutId;
  14724. toast.on('open', function () {
  14725. $('.toast.modal-in').each(function (index, openedEl) {
  14726. var toastInstance = app.toast.get(openedEl);
  14727. if (openedEl !== toast.el && toastInstance) {
  14728. toastInstance.close();
  14729. }
  14730. });
  14731. if (closeTimeout) {
  14732. timeoutId = Utils.nextTick(function () {
  14733. toast.close();
  14734. }, closeTimeout);
  14735. }
  14736. });
  14737. toast.on('close', function () {
  14738. win.clearTimeout(timeoutId);
  14739. });
  14740. if (toast.params.destroyOnClose) {
  14741. toast.once('closed', function () {
  14742. setTimeout(function () {
  14743. toast.destroy();
  14744. }, 0);
  14745. });
  14746. }
  14747. return toast;
  14748. }
  14749. if ( Modal ) Toast.__proto__ = Modal;
  14750. Toast.prototype = Object.create( Modal && Modal.prototype );
  14751. Toast.prototype.constructor = Toast;
  14752. Toast.prototype.render = function render () {
  14753. var toast = this;
  14754. if (toast.params.render) { return toast.params.render.call(toast, toast); }
  14755. var ref = toast.params;
  14756. var position = ref.position;
  14757. var horizontalPosition = ref.horizontalPosition;
  14758. var cssClass = ref.cssClass;
  14759. var icon = ref.icon;
  14760. var text = ref.text;
  14761. var closeButton = ref.closeButton;
  14762. var closeButtonColor = ref.closeButtonColor;
  14763. var closeButtonText = ref.closeButtonText;
  14764. var horizontalClass = position === 'top' || position === 'bottom'
  14765. ? ("toast-horizontal-" + horizontalPosition)
  14766. : '';
  14767. return ("\n <div class=\"toast toast-" + position + " " + horizontalClass + " " + (cssClass || '') + " " + (icon ? 'toast-with-icon' : '') + "\">\n <div class=\"toast-content\">\n " + (icon ? ("<div class=\"toast-icon\">" + icon + "</div>") : '') + "\n <div class=\"toast-text\">" + text + "</div>\n " + (closeButton && !icon ? ("\n <a class=\"toast-button button " + (closeButtonColor ? ("color-" + closeButtonColor) : '') + "\">" + closeButtonText + "</a>\n ").trim() : '') + "\n </div>\n </div>\n ").trim();
  14768. };
  14769. return Toast;
  14770. }(Modal));
  14771. var Toast$1 = {
  14772. name: 'toast',
  14773. static: {
  14774. Toast: Toast,
  14775. },
  14776. create: function create() {
  14777. var app = this;
  14778. app.toast = Utils.extend(
  14779. {},
  14780. ModalMethods({
  14781. app: app,
  14782. constructor: Toast,
  14783. defaultSelector: '.toast.modal-in',
  14784. }),
  14785. {
  14786. // Shortcuts
  14787. show: function show(params) {
  14788. Utils.extend(params, {
  14789. destroyOnClose: true,
  14790. });
  14791. return new Toast(app, params).open();
  14792. },
  14793. }
  14794. );
  14795. },
  14796. params: {
  14797. toast: {
  14798. icon: null,
  14799. text: null,
  14800. position: 'bottom',
  14801. horizontalPosition: 'left',
  14802. closeButton: false,
  14803. closeButtonColor: null,
  14804. closeButtonText: 'Ok',
  14805. closeTimeout: null,
  14806. cssClass: null,
  14807. render: null,
  14808. },
  14809. },
  14810. };
  14811. var Preloader = {
  14812. init: function init(el) {
  14813. var app = this;
  14814. var $el = $(el);
  14815. if ($el.length === 0 || $el.children('.preloader-inner').length > 0 || $el.children('.preloader-inner-line').length > 0) { return; }
  14816. $el.append(Utils[((app.theme) + "PreloaderContent")]);
  14817. },
  14818. // Modal
  14819. visible: false,
  14820. show: function show(color) {
  14821. if ( color === void 0 ) color = 'white';
  14822. var app = this;
  14823. if (Preloader.visible) { return; }
  14824. var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
  14825. $('html').addClass('with-modal-preloader');
  14826. app.root.append(("\n <div class=\"preloader-backdrop\"></div>\n <div class=\"preloader-modal\">\n <div class=\"preloader color-" + color + "\">" + preloaderInner + "</div>\n </div>\n "));
  14827. Preloader.visible = true;
  14828. },
  14829. showIn: function showIn(el, color) {
  14830. if ( color === void 0 ) color = 'white';
  14831. var app = this;
  14832. var preloaderInner = Utils[((app.theme) + "PreloaderContent")] || '';
  14833. $(el || 'html').addClass('with-modal-preloader');
  14834. $(el || app.root).append(("\n <div class=\"preloader-backdrop\"></div>\n <div class=\"preloader-modal\">\n <div class=\"preloader color-" + color + "\">" + preloaderInner + "</div>\n </div>\n "));
  14835. },
  14836. hide: function hide() {
  14837. var app = this;
  14838. if (!Preloader.visible) { return; }
  14839. $('html').removeClass('with-modal-preloader');
  14840. app.root.find('.preloader-backdrop, .preloader-modal').remove();
  14841. Preloader.visible = false;
  14842. },
  14843. hideIn: function hideIn(el) {
  14844. var app = this;
  14845. $(el || 'html').removeClass('with-modal-preloader');
  14846. $(el || app.root).find('.preloader-backdrop, .preloader-modal').remove();
  14847. },
  14848. };
  14849. var Preloader$1 = {
  14850. name: 'preloader',
  14851. create: function create() {
  14852. var app = this;
  14853. Utils.extend(app, {
  14854. preloader: {
  14855. init: Preloader.init.bind(app),
  14856. show: Preloader.show.bind(app),
  14857. hide: Preloader.hide.bind(app),
  14858. showIn: Preloader.showIn.bind(app),
  14859. hideIn: Preloader.hideIn.bind(app),
  14860. },
  14861. });
  14862. },
  14863. on: {
  14864. photoBrowserOpen: function photoBrowserOpen(pb) {
  14865. var app = this;
  14866. pb.$el.find('.preloader').each(function (index, preloaderEl) {
  14867. app.preloader.init(preloaderEl);
  14868. });
  14869. },
  14870. tabMounted: function tabMounted(tabEl) {
  14871. var app = this;
  14872. $(tabEl).find('.preloader').each(function (index, preloaderEl) {
  14873. app.preloader.init(preloaderEl);
  14874. });
  14875. },
  14876. pageInit: function pageInit(page) {
  14877. var app = this;
  14878. page.$el.find('.preloader').each(function (index, preloaderEl) {
  14879. app.preloader.init(preloaderEl);
  14880. });
  14881. },
  14882. },
  14883. vnode: {
  14884. preloader: {
  14885. insert: function insert(vnode) {
  14886. var app = this;
  14887. var preloaderEl = vnode.elm;
  14888. app.preloader.init(preloaderEl);
  14889. },
  14890. },
  14891. },
  14892. };
  14893. var Progressbar = {
  14894. set: function set() {
  14895. var assign;
  14896. var args = [], len = arguments.length;
  14897. while ( len-- ) args[ len ] = arguments[ len ];
  14898. var app = this;
  14899. var el = args[0];
  14900. var progress = args[1];
  14901. var duration = args[2];
  14902. if (typeof args[0] === 'number') {
  14903. (assign = args, progress = assign[0], duration = assign[1]);
  14904. el = app.root;
  14905. }
  14906. if (typeof progress === 'undefined' || progress === null) { return el; }
  14907. if (!progress) { progress = 0; }
  14908. var $el = $(el || app.root);
  14909. if ($el.length === 0) {
  14910. return el;
  14911. }
  14912. var progressNormalized = Math.min(Math.max(progress, 0), 100);
  14913. var $progressbarEl;
  14914. if ($el.hasClass('progressbar')) { $progressbarEl = $el.eq(0); }
  14915. else {
  14916. $progressbarEl = $el.children('.progressbar');
  14917. }
  14918. if ($progressbarEl.length === 0 || $progressbarEl.hasClass('progressbar-infinite')) {
  14919. return $progressbarEl;
  14920. }
  14921. var $progressbarLine = $progressbarEl.children('span');
  14922. if ($progressbarLine.length === 0) {
  14923. $progressbarLine = $('<span></span>');
  14924. $progressbarEl.append($progressbarLine);
  14925. }
  14926. $progressbarLine
  14927. .transition(typeof duration !== 'undefined' ? duration : '')
  14928. .transform(("translate3d(" + ((-100 + progressNormalized)) + "%,0,0)"));
  14929. return $progressbarEl[0];
  14930. },
  14931. show: function show() {
  14932. var assign, assign$1;
  14933. var args = [], len = arguments.length;
  14934. while ( len-- ) args[ len ] = arguments[ len ];
  14935. var app = this;
  14936. // '.page', 50, 'multi'
  14937. var el = args[0];
  14938. var progress = args[1];
  14939. var color = args[2];
  14940. var type = 'determined';
  14941. if (args.length === 2) {
  14942. if ((typeof args[0] === 'string' || typeof args[0] === 'object') && typeof args[1] === 'string') {
  14943. // '.page', 'multi'
  14944. (assign = args, el = assign[0], color = assign[1], progress = assign[2]);
  14945. type = 'infinite';
  14946. } else if (typeof args[0] === 'number' && typeof args[1] === 'string') {
  14947. // 50, 'multi'
  14948. (assign$1 = args, progress = assign$1[0], color = assign$1[1]);
  14949. el = app.root;
  14950. }
  14951. } else if (args.length === 1) {
  14952. if (typeof args[0] === 'number') {
  14953. el = app.root;
  14954. progress = args[0];
  14955. } else if (typeof args[0] === 'string') {
  14956. type = 'infinite';
  14957. el = app.root;
  14958. color = args[0];
  14959. }
  14960. } else if (args.length === 0) {
  14961. type = 'infinite';
  14962. el = app.root;
  14963. }
  14964. var $el = $(el);
  14965. if ($el.length === 0) { return undefined; }
  14966. var $progressbarEl;
  14967. if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
  14968. $progressbarEl = $el;
  14969. } else {
  14970. $progressbarEl = $el.children('.progressbar:not(.progressbar-out), .progressbar-infinite:not(.progressbar-out)');
  14971. if ($progressbarEl.length === 0) {
  14972. $progressbarEl = $(("\n <span class=\"progressbar" + (type === 'infinite' ? '-infinite' : '') + (color ? (" color-" + color) : '') + " progressbar-in\">\n " + (type === 'infinite' ? '' : '<span></span>') + "\n </span>"));
  14973. $el.append($progressbarEl);
  14974. }
  14975. }
  14976. if (typeof progress !== 'undefined') {
  14977. app.progressbar.set($progressbarEl, progress);
  14978. }
  14979. return $progressbarEl[0];
  14980. },
  14981. hide: function hide(el, removeAfterHide) {
  14982. if ( removeAfterHide === void 0 ) removeAfterHide = true;
  14983. var app = this;
  14984. var $el = $(el || app.root);
  14985. if ($el.length === 0) { return undefined; }
  14986. var $progressbarEl;
  14987. if ($el.hasClass('progressbar') || $el.hasClass('progressbar-infinite')) {
  14988. $progressbarEl = $el;
  14989. } else {
  14990. $progressbarEl = $el.children('.progressbar, .progressbar-infinite');
  14991. }
  14992. if ($progressbarEl.length === 0 || !$progressbarEl.hasClass('progressbar-in') || $progressbarEl.hasClass('progressbar-out')) {
  14993. return $progressbarEl;
  14994. }
  14995. $progressbarEl
  14996. .removeClass('progressbar-in')
  14997. .addClass('progressbar-out')
  14998. .animationEnd(function () {
  14999. if (removeAfterHide) {
  15000. $progressbarEl.remove();
  15001. }
  15002. });
  15003. return $progressbarEl;
  15004. },
  15005. };
  15006. var Progressbar$1 = {
  15007. name: 'progressbar',
  15008. create: function create() {
  15009. var app = this;
  15010. Utils.extend(app, {
  15011. progressbar: {
  15012. set: Progressbar.set.bind(app),
  15013. show: Progressbar.show.bind(app),
  15014. hide: Progressbar.hide.bind(app),
  15015. },
  15016. });
  15017. },
  15018. on: {
  15019. tabMounted: function tabMounted(tabEl) {
  15020. var app = this;
  15021. $(tabEl).find('.progressbar').each(function (index, progressbarEl) {
  15022. var $progressbarEl = $(progressbarEl);
  15023. app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
  15024. });
  15025. },
  15026. pageInit: function pageInit(page) {
  15027. var app = this;
  15028. page.$el.find('.progressbar').each(function (index, progressbarEl) {
  15029. var $progressbarEl = $(progressbarEl);
  15030. app.progressbar.set($progressbarEl, $progressbarEl.attr('data-progress'));
  15031. });
  15032. },
  15033. },
  15034. vnode: {
  15035. progressbar: {
  15036. insert: function insert(vnode) {
  15037. var app = this;
  15038. var el = vnode.elm;
  15039. app.progressbar.set(el, el.getAttribute('data-progress'));
  15040. },
  15041. update: function update(vnode) {
  15042. var app = this;
  15043. var el = vnode.elm;
  15044. app.progressbar.set(el, el.getAttribute('data-progress'));
  15045. },
  15046. },
  15047. },
  15048. };
  15049. var Sortable = {
  15050. init: function init() {
  15051. var app = this;
  15052. var isTouched;
  15053. var isMoved;
  15054. var touchStartY;
  15055. var touchesDiff;
  15056. var $sortingEl;
  15057. var $sortingItems;
  15058. var $sortableContainer;
  15059. var sortingElHeight;
  15060. var minTop;
  15061. var maxTop;
  15062. var $insertAfterEl;
  15063. var $insertBeforeEl;
  15064. var indexFrom;
  15065. var $pageEl;
  15066. var $pageContentEl;
  15067. var pageHeight;
  15068. var pageOffset;
  15069. var sortingElOffsetLocal;
  15070. var sortingElOffsetTop;
  15071. var initialScrollTop;
  15072. var wasTapHold;
  15073. function handleTouchStart(e, isTapHold) {
  15074. isMoved = false;
  15075. isTouched = true;
  15076. wasTapHold = false;
  15077. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  15078. $sortingEl = $(e.target).closest('li').eq(0);
  15079. indexFrom = $sortingEl.index();
  15080. $sortableContainer = $sortingEl.parents('.sortable');
  15081. var $listGroup = $sortingEl.parents('.list-group');
  15082. if ($listGroup.length && $listGroup.parents($sortableContainer).length) {
  15083. $sortableContainer = $listGroup;
  15084. }
  15085. $sortingItems = $sortableContainer.children('ul').children('li:not(.disallow-sorting):not(.no-sorting)');
  15086. if (app.panel) { app.panel.allowOpen = false; }
  15087. if (app.swipeout) { app.swipeout.allow = false; }
  15088. if (isTapHold) {
  15089. $sortingEl.addClass('sorting');
  15090. $sortableContainer.addClass('sortable-sorting');
  15091. wasTapHold = true;
  15092. }
  15093. }
  15094. function handleTouchMove(e) {
  15095. if (!isTouched || !$sortingEl) { return; }
  15096. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  15097. if (!isMoved) {
  15098. $pageEl = $sortingEl.parents('.page');
  15099. $pageContentEl = $sortingEl.parents('.page-content');
  15100. var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  15101. var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  15102. initialScrollTop = $pageContentEl[0].scrollTop;
  15103. pageOffset = $pageEl.offset().top + paddingTop;
  15104. pageHeight = $pageEl.height() - paddingTop - paddingBottom;
  15105. $sortingEl.addClass('sorting');
  15106. $sortableContainer.addClass('sortable-sorting');
  15107. sortingElOffsetLocal = $sortingEl[0].offsetTop;
  15108. minTop = $sortingEl[0].offsetTop;
  15109. maxTop = $sortingEl.parent().height() - sortingElOffsetLocal - $sortingEl.height();
  15110. sortingElHeight = $sortingEl[0].offsetHeight;
  15111. sortingElOffsetTop = $sortingEl.offset().top;
  15112. }
  15113. isMoved = true;
  15114. e.preventDefault();
  15115. e.f7PreventSwipePanel = true;
  15116. touchesDiff = pageY - touchStartY;
  15117. var translateScrollOffset = $pageContentEl[0].scrollTop - initialScrollTop;
  15118. var translate = Math.min(Math.max(touchesDiff + translateScrollOffset, -minTop), maxTop);
  15119. $sortingEl.transform(("translate3d(0," + translate + "px,0)"));
  15120. var scrollAddition = 44;
  15121. var allowScroll = true;
  15122. if ((touchesDiff + translateScrollOffset) + scrollAddition < -minTop) {
  15123. allowScroll = false;
  15124. }
  15125. if ((touchesDiff + translateScrollOffset) - scrollAddition > maxTop) {
  15126. allowScroll = false;
  15127. }
  15128. $insertBeforeEl = undefined;
  15129. $insertAfterEl = undefined;
  15130. var scrollDiff;
  15131. if (allowScroll) {
  15132. if (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition > pageOffset + pageHeight) {
  15133. // To Bottom
  15134. scrollDiff = (sortingElOffsetTop + touchesDiff + sortingElHeight + scrollAddition) - (pageOffset + pageHeight);
  15135. }
  15136. if (sortingElOffsetTop + touchesDiff < pageOffset + scrollAddition) {
  15137. // To Top
  15138. scrollDiff = (sortingElOffsetTop + touchesDiff) - pageOffset - scrollAddition;
  15139. }
  15140. if (scrollDiff) {
  15141. $pageContentEl[0].scrollTop += scrollDiff;
  15142. }
  15143. }
  15144. $sortingItems.each(function (index, el) {
  15145. var $currentEl = $(el);
  15146. if ($currentEl[0] === $sortingEl[0]) { return; }
  15147. var currentElOffset = $currentEl[0].offsetTop;
  15148. var currentElHeight = $currentEl.height();
  15149. var sortingElOffset = sortingElOffsetLocal + translate;
  15150. if ((sortingElOffset >= currentElOffset - (currentElHeight / 2)) && $sortingEl.index() < $currentEl.index()) {
  15151. $currentEl.transform(("translate3d(0, " + (-sortingElHeight) + "px,0)"));
  15152. $insertAfterEl = $currentEl;
  15153. $insertBeforeEl = undefined;
  15154. } else if ((sortingElOffset <= currentElOffset + (currentElHeight / 2)) && $sortingEl.index() > $currentEl.index()) {
  15155. $currentEl.transform(("translate3d(0, " + sortingElHeight + "px,0)"));
  15156. $insertAfterEl = undefined;
  15157. if (!$insertBeforeEl) { $insertBeforeEl = $currentEl; }
  15158. } else {
  15159. $currentEl.transform('translate3d(0, 0%,0)');
  15160. }
  15161. });
  15162. }
  15163. function handleTouchEnd() {
  15164. if (!isTouched || !isMoved) {
  15165. if (isTouched && !isMoved) {
  15166. if (app.panel) { app.panel.allowOpen = true; }
  15167. if (app.swipeout) { app.swipeout.allow = true; }
  15168. if (wasTapHold) {
  15169. $sortingEl.removeClass('sorting');
  15170. $sortableContainer.removeClass('sortable-sorting');
  15171. }
  15172. }
  15173. isTouched = false;
  15174. isMoved = false;
  15175. return;
  15176. }
  15177. if (app.panel) { app.panel.allowOpen = true; }
  15178. if (app.swipeout) { app.swipeout.allow = true; }
  15179. $sortingItems.transform('');
  15180. $sortingEl.removeClass('sorting');
  15181. $sortableContainer.removeClass('sortable-sorting');
  15182. var indexTo;
  15183. if ($insertAfterEl) { indexTo = $insertAfterEl.index(); }
  15184. else if ($insertBeforeEl) { indexTo = $insertBeforeEl.index(); }
  15185. var moveElements = $sortableContainer.dataset().sortableMoveElements;
  15186. if (typeof moveElements === 'undefined') {
  15187. moveElements = app.params.sortable.moveElements;
  15188. }
  15189. if (moveElements) {
  15190. if ($insertAfterEl) {
  15191. $sortingEl.insertAfter($insertAfterEl);
  15192. }
  15193. if ($insertBeforeEl) {
  15194. $sortingEl.insertBefore($insertBeforeEl);
  15195. }
  15196. }
  15197. if (($insertAfterEl || $insertBeforeEl)
  15198. && $sortableContainer.hasClass('virtual-list')
  15199. ) {
  15200. indexFrom = $sortingEl[0].f7VirtualListIndex;
  15201. if (typeof indexFrom === 'undefined') { indexFrom = $sortingEl.attr('data-virtual-list-index'); }
  15202. if ($insertBeforeEl) {
  15203. indexTo = $insertBeforeEl[0].f7VirtualListIndex;
  15204. if (typeof indexTo === 'undefined') { indexTo = $insertBeforeEl.attr('data-virtual-list-index'); }
  15205. } else {
  15206. indexTo = $insertAfterEl[0].f7VirtualListIndex;
  15207. if (typeof indexTo === 'undefined') { indexTo = $insertAfterEl.attr('data-virtual-list-index'); }
  15208. }
  15209. if (indexTo !== null) { indexTo = parseInt(indexTo, 10); }
  15210. else { indexTo = undefined; }
  15211. var virtualList = $sortableContainer[0].f7VirtualList;
  15212. if (indexFrom) { indexFrom = parseInt(indexFrom, 10); }
  15213. if (indexTo) { indexTo = parseInt(indexTo, 10); }
  15214. if (virtualList) { virtualList.moveItem(indexFrom, indexTo); }
  15215. }
  15216. if (typeof indexTo !== 'undefined' && !Number.isNaN(indexTo) && indexTo !== indexFrom) {
  15217. $sortingEl.trigger('sortable:sort', { from: indexFrom, to: indexTo });
  15218. app.emit('sortableSort', $sortingEl[0], { from: indexFrom, to: indexTo, el: $sortingEl[0] }, $sortableContainer[0]);
  15219. }
  15220. $insertBeforeEl = undefined;
  15221. $insertAfterEl = undefined;
  15222. isTouched = false;
  15223. isMoved = false;
  15224. }
  15225. var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
  15226. $(doc).on(app.touchEvents.start, '.list.sortable .sortable-handler', handleTouchStart, activeListener);
  15227. app.on('touchmove:active', handleTouchMove);
  15228. app.on('touchend:passive', handleTouchEnd);
  15229. $(doc).on('taphold', '.sortable-tap-hold', function (e, pointerEvent) {
  15230. handleTouchStart(pointerEvent, true);
  15231. });
  15232. },
  15233. enable: function enable(el) {
  15234. if ( el === void 0 ) el = '.list.sortable';
  15235. var app = this;
  15236. var $el = $(el);
  15237. if ($el.length === 0) { return; }
  15238. $el.addClass('sortable-enabled');
  15239. $el.trigger('sortable:enable');
  15240. app.emit('sortableEnable', $el[0]);
  15241. },
  15242. disable: function disable(el) {
  15243. if ( el === void 0 ) el = '.list.sortable';
  15244. var app = this;
  15245. var $el = $(el);
  15246. if ($el.length === 0) { return; }
  15247. $el.removeClass('sortable-enabled');
  15248. $el.trigger('sortable:disable');
  15249. app.emit('sortableDisable', $el[0]);
  15250. },
  15251. toggle: function toggle(el) {
  15252. if ( el === void 0 ) el = '.list.sortable';
  15253. var app = this;
  15254. var $el = $(el);
  15255. if ($el.length === 0) { return; }
  15256. if ($el.hasClass('sortable-enabled')) {
  15257. app.sortable.disable($el);
  15258. } else {
  15259. app.sortable.enable($el);
  15260. }
  15261. },
  15262. };
  15263. var Sortable$1 = {
  15264. name: 'sortable',
  15265. params: {
  15266. sortable: {
  15267. moveElements: true,
  15268. },
  15269. },
  15270. create: function create() {
  15271. var app = this;
  15272. Utils.extend(app, {
  15273. sortable: {
  15274. init: Sortable.init.bind(app),
  15275. enable: Sortable.enable.bind(app),
  15276. disable: Sortable.disable.bind(app),
  15277. toggle: Sortable.toggle.bind(app),
  15278. },
  15279. });
  15280. },
  15281. on: {
  15282. init: function init() {
  15283. var app = this;
  15284. if (!app.params.sortable) { return; }
  15285. app.sortable.init();
  15286. },
  15287. },
  15288. clicks: {
  15289. '.sortable-enable': function enable($clickedEl, data) {
  15290. if ( data === void 0 ) data = {};
  15291. var app = this;
  15292. app.sortable.enable(data.sortable);
  15293. },
  15294. '.sortable-disable': function disable($clickedEl, data) {
  15295. if ( data === void 0 ) data = {};
  15296. var app = this;
  15297. app.sortable.disable(data.sortable);
  15298. },
  15299. '.sortable-toggle': function toggle($clickedEl, data) {
  15300. if ( data === void 0 ) data = {};
  15301. var app = this;
  15302. app.sortable.toggle(data.sortable);
  15303. },
  15304. },
  15305. };
  15306. var Swipeout = {
  15307. init: function init() {
  15308. var app = this;
  15309. var touchesStart = {};
  15310. var isTouched;
  15311. var isMoved;
  15312. var isScrolling;
  15313. var touchStartTime;
  15314. var touchesDiff;
  15315. var $swipeoutEl;
  15316. var $swipeoutContent;
  15317. var $actionsRight;
  15318. var $actionsLeft;
  15319. var actionsLeftWidth;
  15320. var actionsRightWidth;
  15321. var translate;
  15322. var opened;
  15323. var openedActionsSide;
  15324. var $leftButtons;
  15325. var $rightButtons;
  15326. var direction;
  15327. var $overswipeLeftButton;
  15328. var $overswipeRightButton;
  15329. var overswipeLeft;
  15330. var overswipeRight;
  15331. function handleTouchStart(e) {
  15332. if (!Swipeout.allow) { return; }
  15333. isMoved = false;
  15334. isTouched = true;
  15335. isScrolling = undefined;
  15336. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  15337. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  15338. touchStartTime = (new Date()).getTime();
  15339. $swipeoutEl = $(this);
  15340. }
  15341. function handleTouchMove(e) {
  15342. if (!isTouched) { return; }
  15343. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  15344. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  15345. if (typeof isScrolling === 'undefined') {
  15346. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  15347. }
  15348. if (isScrolling) {
  15349. isTouched = false;
  15350. return;
  15351. }
  15352. if (!isMoved) {
  15353. if ($('.list.sortable-opened').length > 0) { return; }
  15354. $swipeoutContent = $swipeoutEl.find('.swipeout-content');
  15355. $actionsRight = $swipeoutEl.find('.swipeout-actions-right');
  15356. $actionsLeft = $swipeoutEl.find('.swipeout-actions-left');
  15357. actionsLeftWidth = null;
  15358. actionsRightWidth = null;
  15359. $leftButtons = null;
  15360. $rightButtons = null;
  15361. $overswipeRightButton = null;
  15362. $overswipeLeftButton = null;
  15363. if ($actionsLeft.length > 0) {
  15364. actionsLeftWidth = $actionsLeft.outerWidth();
  15365. $leftButtons = $actionsLeft.children('a');
  15366. $overswipeLeftButton = $actionsLeft.find('.swipeout-overswipe');
  15367. }
  15368. if ($actionsRight.length > 0) {
  15369. actionsRightWidth = $actionsRight.outerWidth();
  15370. $rightButtons = $actionsRight.children('a');
  15371. $overswipeRightButton = $actionsRight.find('.swipeout-overswipe');
  15372. }
  15373. opened = $swipeoutEl.hasClass('swipeout-opened');
  15374. if (opened) {
  15375. openedActionsSide = $swipeoutEl.find('.swipeout-actions-left.swipeout-actions-opened').length > 0 ? 'left' : 'right';
  15376. }
  15377. $swipeoutEl.removeClass('swipeout-transitioning');
  15378. if (!app.params.swipeout.noFollow) {
  15379. $swipeoutEl.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
  15380. $swipeoutEl.removeClass('swipeout-opened');
  15381. }
  15382. }
  15383. isMoved = true;
  15384. e.preventDefault();
  15385. touchesDiff = pageX - touchesStart.x;
  15386. translate = touchesDiff;
  15387. if (opened) {
  15388. if (openedActionsSide === 'right') { translate -= actionsRightWidth; }
  15389. else { translate += actionsLeftWidth; }
  15390. }
  15391. if (
  15392. (translate > 0 && $actionsLeft.length === 0)
  15393. || (translate < 0 && $actionsRight.length === 0)
  15394. ) {
  15395. if (!opened) {
  15396. isTouched = false;
  15397. isMoved = false;
  15398. $swipeoutContent.transform('');
  15399. if ($rightButtons && $rightButtons.length > 0) {
  15400. $rightButtons.transform('');
  15401. }
  15402. if ($leftButtons && $leftButtons.length > 0) {
  15403. $leftButtons.transform('');
  15404. }
  15405. return;
  15406. }
  15407. translate = 0;
  15408. }
  15409. if (translate < 0) { direction = 'to-left'; }
  15410. else if (translate > 0) { direction = 'to-right'; }
  15411. else if (!direction) { direction = 'to-left'; }
  15412. var buttonOffset;
  15413. var progress;
  15414. e.f7PreventSwipePanel = true;
  15415. if (app.params.swipeout.noFollow) {
  15416. if (opened) {
  15417. if (openedActionsSide === 'right' && touchesDiff > 0) {
  15418. app.swipeout.close($swipeoutEl);
  15419. }
  15420. if (openedActionsSide === 'left' && touchesDiff < 0) {
  15421. app.swipeout.close($swipeoutEl);
  15422. }
  15423. } else {
  15424. if (touchesDiff < 0 && $actionsRight.length > 0) {
  15425. app.swipeout.open($swipeoutEl, 'right');
  15426. }
  15427. if (touchesDiff > 0 && $actionsLeft.length > 0) {
  15428. app.swipeout.open($swipeoutEl, 'left');
  15429. }
  15430. }
  15431. isTouched = false;
  15432. isMoved = false;
  15433. return;
  15434. }
  15435. overswipeLeft = false;
  15436. overswipeRight = false;
  15437. if ($actionsRight.length > 0) {
  15438. // Show right actions
  15439. var buttonTranslate = translate;
  15440. progress = buttonTranslate / actionsRightWidth;
  15441. if (buttonTranslate < -actionsRightWidth) {
  15442. buttonTranslate = -actionsRightWidth - (Math.pow( (-buttonTranslate - actionsRightWidth), 0.8 ));
  15443. translate = buttonTranslate;
  15444. if ($overswipeRightButton.length > 0) {
  15445. overswipeRight = true;
  15446. }
  15447. }
  15448. if (direction !== 'to-left') {
  15449. progress = 0;
  15450. buttonTranslate = 0;
  15451. }
  15452. $rightButtons.each(function (index, buttonEl) {
  15453. var $buttonEl = $(buttonEl);
  15454. if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
  15455. $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
  15456. }
  15457. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  15458. if ($overswipeRightButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-left') {
  15459. $buttonEl.css({ left: ((overswipeRight ? -buttonOffset : 0) + "px") });
  15460. if (overswipeRight) {
  15461. if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
  15462. $swipeoutEl.trigger('swipeout:overswipeenter');
  15463. app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
  15464. }
  15465. $buttonEl.addClass('swipeout-overswipe-active');
  15466. } else {
  15467. if ($buttonEl.hasClass('swipeout-overswipe-active')) {
  15468. $swipeoutEl.trigger('swipeout:overswipeexit');
  15469. app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
  15470. }
  15471. $buttonEl.removeClass('swipeout-overswipe-active');
  15472. }
  15473. }
  15474. $buttonEl.transform(("translate3d(" + (buttonTranslate - (buttonOffset * (1 + Math.max(progress, -1)))) + "px,0,0)"));
  15475. });
  15476. }
  15477. if ($actionsLeft.length > 0) {
  15478. // Show left actions
  15479. var buttonTranslate$1 = translate;
  15480. progress = buttonTranslate$1 / actionsLeftWidth;
  15481. if (buttonTranslate$1 > actionsLeftWidth) {
  15482. buttonTranslate$1 = actionsLeftWidth + (Math.pow( (buttonTranslate$1 - actionsLeftWidth), 0.8 ));
  15483. translate = buttonTranslate$1;
  15484. if ($overswipeLeftButton.length > 0) {
  15485. overswipeLeft = true;
  15486. }
  15487. }
  15488. if (direction !== 'to-right') {
  15489. buttonTranslate$1 = 0;
  15490. progress = 0;
  15491. }
  15492. $leftButtons.each(function (index, buttonEl) {
  15493. var $buttonEl = $(buttonEl);
  15494. if (typeof buttonEl.f7SwipeoutButtonOffset === 'undefined') {
  15495. $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
  15496. }
  15497. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  15498. if ($overswipeLeftButton.length > 0 && $buttonEl.hasClass('swipeout-overswipe') && direction === 'to-right') {
  15499. $buttonEl.css({ left: ((overswipeLeft ? buttonOffset : 0) + "px") });
  15500. if (overswipeLeft) {
  15501. if (!$buttonEl.hasClass('swipeout-overswipe-active')) {
  15502. $swipeoutEl.trigger('swipeout:overswipeenter');
  15503. app.emit('swipeoutOverswipeEnter', $swipeoutEl[0]);
  15504. }
  15505. $buttonEl.addClass('swipeout-overswipe-active');
  15506. } else {
  15507. if ($buttonEl.hasClass('swipeout-overswipe-active')) {
  15508. $swipeoutEl.trigger('swipeout:overswipeexit');
  15509. app.emit('swipeoutOverswipeExit', $swipeoutEl[0]);
  15510. }
  15511. $buttonEl.removeClass('swipeout-overswipe-active');
  15512. }
  15513. }
  15514. if ($leftButtons.length > 1) {
  15515. $buttonEl.css('z-index', $leftButtons.length - index);
  15516. }
  15517. $buttonEl.transform(("translate3d(" + (buttonTranslate$1 + (buttonOffset * (1 - Math.min(progress, 1)))) + "px,0,0)"));
  15518. });
  15519. }
  15520. $swipeoutEl.trigger('swipeout', progress);
  15521. app.emit('swipeout', $swipeoutEl[0], progress);
  15522. $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
  15523. }
  15524. function handleTouchEnd() {
  15525. if (!isTouched || !isMoved) {
  15526. isTouched = false;
  15527. isMoved = false;
  15528. return;
  15529. }
  15530. isTouched = false;
  15531. isMoved = false;
  15532. var timeDiff = (new Date()).getTime() - touchStartTime;
  15533. var $actions = direction === 'to-left' ? $actionsRight : $actionsLeft;
  15534. var actionsWidth = direction === 'to-left' ? actionsRightWidth : actionsLeftWidth;
  15535. var action;
  15536. var $buttons;
  15537. var i;
  15538. if (
  15539. (
  15540. timeDiff < 300
  15541. && (
  15542. (touchesDiff < -10 && direction === 'to-left')
  15543. || (touchesDiff > 10 && direction === 'to-right')
  15544. )
  15545. )
  15546. || (
  15547. timeDiff >= 300
  15548. && (Math.abs(translate) > actionsWidth / 2)
  15549. )
  15550. ) {
  15551. action = 'open';
  15552. } else {
  15553. action = 'close';
  15554. }
  15555. if (timeDiff < 300) {
  15556. if (Math.abs(translate) === 0) { action = 'close'; }
  15557. if (Math.abs(translate) === actionsWidth) { action = 'open'; }
  15558. }
  15559. if (action === 'open') {
  15560. Swipeout.el = $swipeoutEl[0];
  15561. $swipeoutEl.trigger('swipeout:open');
  15562. app.emit('swipeoutOpen', $swipeoutEl[0]);
  15563. $swipeoutEl.addClass('swipeout-opened swipeout-transitioning');
  15564. var newTranslate = direction === 'to-left' ? -actionsWidth : actionsWidth;
  15565. $swipeoutContent.transform(("translate3d(" + newTranslate + "px,0,0)"));
  15566. $actions.addClass('swipeout-actions-opened');
  15567. $buttons = direction === 'to-left' ? $rightButtons : $leftButtons;
  15568. if ($buttons) {
  15569. for (i = 0; i < $buttons.length; i += 1) {
  15570. $($buttons[i]).transform(("translate3d(" + newTranslate + "px,0,0)"));
  15571. }
  15572. }
  15573. if (overswipeRight) {
  15574. $actionsRight.find('.swipeout-overswipe').trigger('click', 'f7Overswipe');
  15575. }
  15576. if (overswipeLeft) {
  15577. $actionsLeft.find('.swipeout-overswipe').trigger('click', 'f7Overswipe');
  15578. }
  15579. } else {
  15580. $swipeoutEl.trigger('swipeout:close');
  15581. app.emit('swipeoutClose', $swipeoutEl[0]);
  15582. Swipeout.el = undefined;
  15583. $swipeoutEl.addClass('swipeout-transitioning').removeClass('swipeout-opened');
  15584. $swipeoutContent.transform('');
  15585. $actions.removeClass('swipeout-actions-opened');
  15586. }
  15587. var buttonOffset;
  15588. if ($leftButtons && $leftButtons.length > 0 && $leftButtons !== $buttons) {
  15589. $leftButtons.each(function (index, buttonEl) {
  15590. var $buttonEl = $(buttonEl);
  15591. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  15592. if (typeof buttonOffset === 'undefined') {
  15593. $buttonEl[0].f7SwipeoutButtonOffset = actionsLeftWidth - buttonEl.offsetLeft - buttonEl.offsetWidth;
  15594. }
  15595. $buttonEl.transform(("translate3d(" + buttonOffset + "px,0,0)"));
  15596. });
  15597. }
  15598. if ($rightButtons && $rightButtons.length > 0 && $rightButtons !== $buttons) {
  15599. $rightButtons.each(function (index, buttonEl) {
  15600. var $buttonEl = $(buttonEl);
  15601. buttonOffset = buttonEl.f7SwipeoutButtonOffset;
  15602. if (typeof buttonOffset === 'undefined') {
  15603. $buttonEl[0].f7SwipeoutButtonOffset = buttonEl.offsetLeft;
  15604. }
  15605. $buttonEl.transform(("translate3d(" + (-buttonOffset) + "px,0,0)"));
  15606. });
  15607. }
  15608. $swipeoutContent.transitionEnd(function () {
  15609. if ((opened && action === 'open') || (!opened && action === 'close')) { return; }
  15610. $swipeoutEl.trigger(action === 'open' ? 'swipeout:opened' : 'swipeout:closed');
  15611. app.emit(action === 'open' ? 'swipeoutOpened' : 'swipeoutClosed', $swipeoutEl[0]);
  15612. $swipeoutEl.removeClass('swipeout-transitioning');
  15613. if (opened && action === 'close') {
  15614. if ($actionsRight.length > 0) {
  15615. $rightButtons.transform('');
  15616. }
  15617. if ($actionsLeft.length > 0) {
  15618. $leftButtons.transform('');
  15619. }
  15620. }
  15621. });
  15622. }
  15623. var passiveListener = app.support.passiveListener ? { passive: true } : false;
  15624. app.on('touchstart', function (e) {
  15625. if (Swipeout.el) {
  15626. var $targetEl = $(e.target);
  15627. if (!(
  15628. $(Swipeout.el).is($targetEl[0])
  15629. || $targetEl.parents('.swipeout').is(Swipeout.el)
  15630. || $targetEl.hasClass('modal-in')
  15631. || ($targetEl.attr('class') || '').indexOf('-backdrop') > 0
  15632. || $targetEl.hasClass('actions-modal')
  15633. || $targetEl.parents('.actions-modal.modal-in, .dialog.modal-in').length > 0
  15634. )) {
  15635. app.swipeout.close(Swipeout.el);
  15636. }
  15637. }
  15638. });
  15639. $(doc).on(app.touchEvents.start, 'li.swipeout', handleTouchStart, passiveListener);
  15640. app.on('touchmove:active', handleTouchMove);
  15641. app.on('touchend:passive', handleTouchEnd);
  15642. },
  15643. allow: true,
  15644. el: undefined,
  15645. open: function open() {
  15646. var assign;
  15647. var args = [], len = arguments.length;
  15648. while ( len-- ) args[ len ] = arguments[ len ];
  15649. var app = this;
  15650. var el = args[0];
  15651. var side = args[1];
  15652. var callback = args[2];
  15653. if (typeof args[1] === 'function') {
  15654. (assign = args, el = assign[0], callback = assign[1], side = assign[2]);
  15655. }
  15656. var $el = $(el).eq(0);
  15657. if ($el.length === 0) { return; }
  15658. if (!$el.hasClass('swipeout') || $el.hasClass('swipeout-opened')) { return; }
  15659. if (!side) {
  15660. if ($el.find('.swipeout-actions-right').length > 0) { side = 'right'; }
  15661. else { side = 'left'; }
  15662. }
  15663. var $swipeoutActions = $el.find((".swipeout-actions-" + side));
  15664. var $swipeoutContent = $el.find('.swipeout-content');
  15665. if ($swipeoutActions.length === 0) { return; }
  15666. $el.trigger('swipeout:open').addClass('swipeout-opened').removeClass('swipeout-transitioning');
  15667. app.emit('swipeoutOpen', $el[0]);
  15668. $swipeoutActions.addClass('swipeout-actions-opened');
  15669. var $buttons = $swipeoutActions.children('a');
  15670. var swipeoutActionsWidth = $swipeoutActions.outerWidth();
  15671. var translate = side === 'right' ? -swipeoutActionsWidth : swipeoutActionsWidth;
  15672. if ($buttons.length > 1) {
  15673. $buttons.each(function (buttonIndex, buttonEl) {
  15674. var $buttonEl = $(buttonEl);
  15675. if (side === 'right') {
  15676. $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
  15677. } else {
  15678. $buttonEl.css('z-index', $buttons.length - buttonIndex).transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
  15679. }
  15680. });
  15681. }
  15682. $el.addClass('swipeout-transitioning');
  15683. $swipeoutContent.transitionEnd(function () {
  15684. $el.trigger('swipeout:opened');
  15685. app.emit('swipeoutOpened', $el[0]);
  15686. if (callback) { callback.call($el[0]); }
  15687. });
  15688. Utils.nextFrame(function () {
  15689. $buttons.transform(("translate3d(" + translate + "px,0,0)"));
  15690. $swipeoutContent.transform(("translate3d(" + translate + "px,0,0)"));
  15691. });
  15692. Swipeout.el = $el[0];
  15693. },
  15694. close: function close(el, callback) {
  15695. var app = this;
  15696. var $el = $(el).eq(0);
  15697. if ($el.length === 0) { return; }
  15698. if (!$el.hasClass('swipeout-opened')) { return; }
  15699. var side = $el.find('.swipeout-actions-opened').hasClass('swipeout-actions-right') ? 'right' : 'left';
  15700. var $swipeoutActions = $el.find('.swipeout-actions-opened').removeClass('swipeout-actions-opened');
  15701. var $buttons = $swipeoutActions.children('a');
  15702. var swipeoutActionsWidth = $swipeoutActions.outerWidth();
  15703. Swipeout.allow = false;
  15704. $el.trigger('swipeout:close');
  15705. app.emit('swipeoutClose', $el[0]);
  15706. $el.removeClass('swipeout-opened').addClass('swipeout-transitioning');
  15707. var closeTimeout;
  15708. function onSwipeoutClose() {
  15709. Swipeout.allow = true;
  15710. if ($el.hasClass('swipeout-opened')) { return; }
  15711. $el.removeClass('swipeout-transitioning');
  15712. $buttons.transform('');
  15713. $el.trigger('swipeout:closed');
  15714. app.emit('swipeoutClosed', $el[0]);
  15715. if (callback) { callback.call($el[0]); }
  15716. if (closeTimeout) { clearTimeout(closeTimeout); }
  15717. }
  15718. $el.find('.swipeout-content').transform('').transitionEnd(onSwipeoutClose);
  15719. closeTimeout = setTimeout(onSwipeoutClose, 500);
  15720. $buttons.each(function (index, buttonEl) {
  15721. var $buttonEl = $(buttonEl);
  15722. if (side === 'right') {
  15723. $buttonEl.transform(("translate3d(" + (-buttonEl.offsetLeft) + "px,0,0)"));
  15724. } else {
  15725. $buttonEl.transform(("translate3d(" + (swipeoutActionsWidth - buttonEl.offsetWidth - buttonEl.offsetLeft) + "px,0,0)"));
  15726. }
  15727. $buttonEl.css({ left: '0px' }).removeClass('swipeout-overswipe-active');
  15728. });
  15729. if (Swipeout.el && Swipeout.el === $el[0]) { Swipeout.el = undefined; }
  15730. },
  15731. delete: function delete$1(el, callback) {
  15732. var app = this;
  15733. var $el = $(el).eq(0);
  15734. if ($el.length === 0) { return; }
  15735. Swipeout.el = undefined;
  15736. $el.trigger('swipeout:delete');
  15737. app.emit('swipeoutDelete', $el[0]);
  15738. $el.css({ height: (($el.outerHeight()) + "px") });
  15739. $el.transitionEnd(function () {
  15740. $el.trigger('swipeout:deleted');
  15741. app.emit('swipeoutDeleted', $el[0]);
  15742. if (callback) { callback.call($el[0]); }
  15743. if ($el.parents('.virtual-list').length > 0) {
  15744. var virtualList = $el.parents('.virtual-list')[0].f7VirtualList;
  15745. var virtualIndex = $el[0].f7VirtualListIndex;
  15746. if (virtualList && typeof virtualIndex !== 'undefined') { virtualList.deleteItem(virtualIndex); }
  15747. } else if (app.params.swipeout.removeElements) {
  15748. if (app.params.swipeout.removeElementsWithTimeout) {
  15749. setTimeout(function () {
  15750. $el.remove();
  15751. }, app.params.swipeout.removeElementsTimeout);
  15752. } else {
  15753. $el.remove();
  15754. }
  15755. } else {
  15756. $el.removeClass('swipeout-deleting swipeout-transitioning');
  15757. }
  15758. });
  15759. // eslint-disable-next-line
  15760. // $el[0]._clientLeft = $el[0].clientLeft;
  15761. Utils.nextFrame(function () {
  15762. $el
  15763. .addClass('swipeout-deleting swipeout-transitioning')
  15764. .css({ height: '0px' })
  15765. .find('.swipeout-content')
  15766. .transform('translate3d(-100%,0,0)');
  15767. });
  15768. },
  15769. };
  15770. var Swipeout$1 = {
  15771. name: 'swipeout',
  15772. params: {
  15773. swipeout: {
  15774. actionsNoFold: false,
  15775. noFollow: false,
  15776. removeElements: true,
  15777. removeElementsWithTimeout: false,
  15778. removeElementsTimeout: 0,
  15779. },
  15780. },
  15781. create: function create() {
  15782. var app = this;
  15783. Utils.extend(app, {
  15784. swipeout: {
  15785. init: Swipeout.init.bind(app),
  15786. open: Swipeout.open.bind(app),
  15787. close: Swipeout.close.bind(app),
  15788. delete: Swipeout.delete.bind(app),
  15789. },
  15790. });
  15791. Object.defineProperty(app.swipeout, 'el', {
  15792. enumerable: true,
  15793. configurable: true,
  15794. get: function () { return Swipeout.el; },
  15795. set: function set(el) {
  15796. Swipeout.el = el;
  15797. },
  15798. });
  15799. Object.defineProperty(app.swipeout, 'allow', {
  15800. enumerable: true,
  15801. configurable: true,
  15802. get: function () { return Swipeout.allow; },
  15803. set: function set(allow) {
  15804. Swipeout.allow = allow;
  15805. },
  15806. });
  15807. },
  15808. clicks: {
  15809. '.swipeout-open': function openSwipeout($clickedEl, data) {
  15810. if ( data === void 0 ) data = {};
  15811. var app = this;
  15812. app.swipeout.open(data.swipeout, data.side);
  15813. },
  15814. '.swipeout-close': function closeSwipeout($clickedEl) {
  15815. var app = this;
  15816. var $swipeoutEl = $clickedEl.closest('.swipeout');
  15817. if ($swipeoutEl.length === 0) { return; }
  15818. app.swipeout.close($swipeoutEl);
  15819. },
  15820. '.swipeout-delete': function deleteSwipeout($clickedEl, data) {
  15821. if ( data === void 0 ) data = {};
  15822. var app = this;
  15823. var $swipeoutEl = $clickedEl.closest('.swipeout');
  15824. if ($swipeoutEl.length === 0) { return; }
  15825. var confirm = data.confirm;
  15826. var confirmTitle = data.confirmTitle;
  15827. if (data.confirm) {
  15828. app.dialog.confirm(confirm, confirmTitle, function () {
  15829. app.swipeout.delete($swipeoutEl);
  15830. });
  15831. } else {
  15832. app.swipeout.delete($swipeoutEl);
  15833. }
  15834. },
  15835. },
  15836. on: {
  15837. init: function init() {
  15838. var app = this;
  15839. if (!app.params.swipeout) { return; }
  15840. app.swipeout.init();
  15841. },
  15842. },
  15843. };
  15844. var Accordion = {
  15845. toggleClicked: function toggleClicked($clickedEl) {
  15846. var app = this;
  15847. var $accordionItemEl = $clickedEl.closest('.accordion-item').eq(0);
  15848. if (!$accordionItemEl.length) { $accordionItemEl = $clickedEl.parents('li').eq(0); }
  15849. var $accordionContent = $clickedEl.parents('.accordion-item-content').eq(0);
  15850. if ($accordionContent.length) {
  15851. if ($accordionContent.parents($accordionItemEl).length) { return; }
  15852. }
  15853. if ($clickedEl.parents('li').length > 1 && $clickedEl.parents('li')[0] !== $accordionItemEl[0]) { return; }
  15854. app.accordion.toggle($accordionItemEl);
  15855. },
  15856. open: function open(el) {
  15857. var app = this;
  15858. var $el = $(el);
  15859. var prevented = false;
  15860. function prevent() {
  15861. prevented = true;
  15862. }
  15863. $el.trigger('accordion:beforeopen', { prevent: prevent }, prevent);
  15864. app.emit('accordionBeforeOpen', $el[0], prevent);
  15865. if (prevented) { return; }
  15866. var $list = $el.parents('.accordion-list').eq(0);
  15867. var $contentEl = $el.children('.accordion-item-content');
  15868. $contentEl.removeAttr('aria-hidden');
  15869. if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
  15870. if ($contentEl.length === 0) { return; }
  15871. var $openedItem = $list.length > 0 && $el.parent().children('.accordion-item-opened');
  15872. if ($openedItem.length > 0) {
  15873. app.accordion.close($openedItem);
  15874. }
  15875. $contentEl.transitionEnd(function () {
  15876. if ($el.hasClass('accordion-item-opened')) {
  15877. $contentEl.transition(0);
  15878. $contentEl.css('height', 'auto');
  15879. Utils.nextFrame(function () {
  15880. $contentEl.transition('');
  15881. $el.trigger('accordion:opened');
  15882. app.emit('accordionOpened', $el[0]);
  15883. });
  15884. } else {
  15885. $contentEl.css('height', '');
  15886. $el.trigger('accordion:closed');
  15887. app.emit('accordionClosed', $el[0]);
  15888. }
  15889. });
  15890. $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
  15891. $el.trigger('accordion:open');
  15892. $el.addClass('accordion-item-opened');
  15893. app.emit('accordionOpen', $el[0]);
  15894. },
  15895. close: function close(el) {
  15896. var app = this;
  15897. var $el = $(el);
  15898. var prevented = false;
  15899. function prevent() {
  15900. prevented = true;
  15901. }
  15902. $el.trigger('accordion:beforeclose', { prevent: prevent }, prevent);
  15903. app.emit('accordionBeforeClose', $el[0], prevent);
  15904. if (prevented) { return; }
  15905. var $contentEl = $el.children('.accordion-item-content');
  15906. if ($contentEl.length === 0) { $contentEl = $el.find('.accordion-item-content'); }
  15907. $el.removeClass('accordion-item-opened');
  15908. $contentEl.attr('aria-hidden', true);
  15909. $contentEl.transition(0);
  15910. $contentEl.css('height', (($contentEl[0].scrollHeight) + "px"));
  15911. // Close
  15912. $contentEl.transitionEnd(function () {
  15913. if ($el.hasClass('accordion-item-opened')) {
  15914. $contentEl.transition(0);
  15915. $contentEl.css('height', 'auto');
  15916. Utils.nextFrame(function () {
  15917. $contentEl.transition('');
  15918. $el.trigger('accordion:opened');
  15919. app.emit('accordionOpened', $el[0]);
  15920. });
  15921. } else {
  15922. $contentEl.css('height', '');
  15923. $el.trigger('accordion:closed');
  15924. app.emit('accordionClosed', $el[0]);
  15925. }
  15926. });
  15927. Utils.nextFrame(function () {
  15928. $contentEl.transition('');
  15929. $contentEl.css('height', '');
  15930. $el.trigger('accordion:close');
  15931. app.emit('accordionClose', $el[0]);
  15932. });
  15933. },
  15934. toggle: function toggle(el) {
  15935. var app = this;
  15936. var $el = $(el);
  15937. if ($el.length === 0) { return; }
  15938. if ($el.hasClass('accordion-item-opened')) { app.accordion.close(el); }
  15939. else { app.accordion.open(el); }
  15940. },
  15941. };
  15942. var Accordion$1 = {
  15943. name: 'accordion',
  15944. create: function create() {
  15945. var app = this;
  15946. Utils.extend(app, {
  15947. accordion: {
  15948. open: Accordion.open.bind(app),
  15949. close: Accordion.close.bind(app),
  15950. toggle: Accordion.toggle.bind(app),
  15951. },
  15952. });
  15953. },
  15954. clicks: {
  15955. '.accordion-item .item-link, .accordion-item-toggle, .links-list.accordion-list > ul > li > a': function open($clickedEl) {
  15956. var app = this;
  15957. Accordion.toggleClicked.call(app, $clickedEl);
  15958. },
  15959. },
  15960. };
  15961. var ContactsList = {
  15962. name: 'contactsList',
  15963. };
  15964. var VirtualList = /*@__PURE__*/(function (Framework7Class) {
  15965. function VirtualList(app, params) {
  15966. if ( params === void 0 ) params = {};
  15967. Framework7Class.call(this, params, [app]);
  15968. var vl = this;
  15969. var defaultHeight;
  15970. if (app.theme === 'md') {
  15971. defaultHeight = 48;
  15972. } else if (app.theme === 'ios') {
  15973. defaultHeight = 44;
  15974. } else if (app.theme === 'aurora') {
  15975. defaultHeight = 38;
  15976. }
  15977. var defaults = {
  15978. cols: 1,
  15979. height: defaultHeight,
  15980. cache: true,
  15981. dynamicHeightBufferSize: 1,
  15982. showFilteredItemsOnly: false,
  15983. renderExternal: undefined,
  15984. setListHeight: true,
  15985. searchByItem: undefined,
  15986. searchAll: undefined,
  15987. itemTemplate: undefined,
  15988. ul: null,
  15989. createUl: true,
  15990. scrollableParentEl: undefined,
  15991. renderItem: function renderItem(item) {
  15992. return ("\n <li>\n <div class=\"item-content\">\n <div class=\"item-inner\">\n <div class=\"item-title\">" + item + "</div>\n </div>\n </div>\n </li>\n ").trim();
  15993. },
  15994. on: {},
  15995. };
  15996. // Extend defaults with modules params
  15997. vl.useModulesParams(defaults);
  15998. vl.params = Utils.extend(defaults, params);
  15999. if (vl.params.height === undefined || !vl.params.height) {
  16000. vl.params.height = defaultHeight;
  16001. }
  16002. vl.$el = $(params.el);
  16003. vl.el = vl.$el[0];
  16004. if (vl.$el.length === 0) { return undefined; }
  16005. vl.$el[0].f7VirtualList = vl;
  16006. vl.items = vl.params.items;
  16007. if (vl.params.showFilteredItemsOnly) {
  16008. vl.filteredItems = [];
  16009. }
  16010. if (vl.params.itemTemplate) {
  16011. if (typeof vl.params.itemTemplate === 'string') { vl.renderItem = app.t7.compile(vl.params.itemTemplate); }
  16012. else if (typeof vl.params.itemTemplate === 'function') { vl.renderItem = vl.params.itemTemplate; }
  16013. } else if (vl.params.renderItem) {
  16014. vl.renderItem = vl.params.renderItem;
  16015. }
  16016. vl.$pageContentEl = vl.$el.parents('.page-content');
  16017. vl.pageContentEl = vl.$pageContentEl[0];
  16018. vl.$scrollableParentEl = vl.params.scrollableParentEl ? $(vl.params.scrollableParentEl).eq(0) : vl.$pageContentEl;
  16019. if (!vl.$scrollableParentEl.length && vl.$pageContentEl.length) {
  16020. vl.$scrollableParentEl = vl.$pageContentEl;
  16021. }
  16022. vl.scrollableParentEl = vl.$scrollableParentEl[0];
  16023. // Bad scroll
  16024. if (typeof vl.params.updatableScroll !== 'undefined') {
  16025. vl.updatableScroll = vl.params.updatableScroll;
  16026. } else {
  16027. vl.updatableScroll = true;
  16028. if (Device.ios && Device.osVersion.split('.')[0] < 8) {
  16029. vl.updatableScroll = false;
  16030. }
  16031. }
  16032. // Append <ul>
  16033. var ul = vl.params.ul;
  16034. vl.$ul = ul ? $(vl.params.ul) : vl.$el.children('ul');
  16035. if (vl.$ul.length === 0 && vl.params.createUl) {
  16036. vl.$el.append('<ul></ul>');
  16037. vl.$ul = vl.$el.children('ul');
  16038. }
  16039. vl.ul = vl.$ul[0];
  16040. var $itemsWrapEl;
  16041. if (!vl.ul && !vl.params.createUl) { $itemsWrapEl = vl.$el; }
  16042. else { $itemsWrapEl = vl.$ul; }
  16043. Utils.extend(vl, {
  16044. $itemsWrapEl: $itemsWrapEl,
  16045. itemsWrapEl: $itemsWrapEl[0],
  16046. // DOM cached items
  16047. domCache: {},
  16048. displayDomCache: {},
  16049. // Temporary DOM Element
  16050. tempDomElement: doc.createElement('ul'),
  16051. // Last repain position
  16052. lastRepaintY: null,
  16053. // Fragment
  16054. fragment: doc.createDocumentFragment(),
  16055. // Props
  16056. pageHeight: undefined,
  16057. rowsPerScreen: undefined,
  16058. rowsBefore: undefined,
  16059. rowsAfter: undefined,
  16060. rowsToRender: undefined,
  16061. maxBufferHeight: 0,
  16062. listHeight: undefined,
  16063. dynamicHeight: typeof vl.params.height === 'function',
  16064. });
  16065. // Install Modules
  16066. vl.useModules();
  16067. // Attach events
  16068. var handleScrollBound = vl.handleScroll.bind(vl);
  16069. var handleResizeBound = vl.handleResize.bind(vl);
  16070. var $pageEl;
  16071. var $tabEl;
  16072. var $panelEl;
  16073. var $popupEl;
  16074. vl.attachEvents = function attachEvents() {
  16075. $pageEl = vl.$el.parents('.page').eq(0);
  16076. $tabEl = vl.$el.parents('.tab').filter(function (tabElIndex, tabEl) {
  16077. return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, .tabs-swipeable-wrap').length === 0;
  16078. }).eq(0);
  16079. $panelEl = vl.$el.parents('.panel').eq(0);
  16080. $popupEl = vl.$el.parents('.popup').eq(0);
  16081. vl.$scrollableParentEl.on('scroll', handleScrollBound);
  16082. if ($pageEl.length) { $pageEl.on('page:reinit', handleResizeBound); }
  16083. if ($tabEl.length) { $tabEl.on('tab:show', handleResizeBound); }
  16084. if ($panelEl.length) { $panelEl.on('panel:open', handleResizeBound); }
  16085. if ($popupEl.length) { $popupEl.on('popup:open', handleResizeBound); }
  16086. app.on('resize', handleResizeBound);
  16087. };
  16088. vl.detachEvents = function attachEvents() {
  16089. vl.$scrollableParentEl.off('scroll', handleScrollBound);
  16090. if ($pageEl.length) { $pageEl.off('page:reinit', handleResizeBound); }
  16091. if ($tabEl.length) { $tabEl.off('tab:show', handleResizeBound); }
  16092. if ($panelEl.length) { $panelEl.off('panel:open', handleResizeBound); }
  16093. if ($popupEl.length) { $popupEl.off('popup:open', handleResizeBound); }
  16094. app.off('resize', handleResizeBound);
  16095. };
  16096. // Init
  16097. vl.init();
  16098. return vl;
  16099. }
  16100. if ( Framework7Class ) VirtualList.__proto__ = Framework7Class;
  16101. VirtualList.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  16102. VirtualList.prototype.constructor = VirtualList;
  16103. VirtualList.prototype.setListSize = function setListSize () {
  16104. var vl = this;
  16105. var items = vl.filteredItems || vl.items;
  16106. vl.pageHeight = vl.$scrollableParentEl[0].offsetHeight;
  16107. if (vl.dynamicHeight) {
  16108. vl.listHeight = 0;
  16109. vl.heights = [];
  16110. for (var i = 0; i < items.length; i += 1) {
  16111. var itemHeight = vl.params.height(items[i]);
  16112. vl.listHeight += itemHeight;
  16113. vl.heights.push(itemHeight);
  16114. }
  16115. } else {
  16116. vl.listHeight = Math.ceil(items.length / vl.params.cols) * vl.params.height;
  16117. vl.rowsPerScreen = Math.ceil(vl.pageHeight / vl.params.height);
  16118. vl.rowsBefore = vl.params.rowsBefore || vl.rowsPerScreen * 2;
  16119. vl.rowsAfter = vl.params.rowsAfter || vl.rowsPerScreen;
  16120. vl.rowsToRender = (vl.rowsPerScreen + vl.rowsBefore + vl.rowsAfter);
  16121. vl.maxBufferHeight = (vl.rowsBefore / 2) * vl.params.height;
  16122. }
  16123. if (vl.updatableScroll || vl.params.setListHeight) {
  16124. vl.$itemsWrapEl.css({ height: ((vl.listHeight) + "px") });
  16125. }
  16126. };
  16127. VirtualList.prototype.render = function render (force, forceScrollTop) {
  16128. var vl = this;
  16129. if (force) { vl.lastRepaintY = null; }
  16130. var scrollTop = -(vl.$el[0].getBoundingClientRect().top - vl.$scrollableParentEl[0].getBoundingClientRect().top);
  16131. if (typeof forceScrollTop !== 'undefined') { scrollTop = forceScrollTop; }
  16132. if (vl.lastRepaintY === null || Math.abs(scrollTop - vl.lastRepaintY) > vl.maxBufferHeight || (!vl.updatableScroll && (vl.$scrollableParentEl[0].scrollTop + vl.pageHeight >= vl.$scrollableParentEl[0].scrollHeight))) {
  16133. vl.lastRepaintY = scrollTop;
  16134. } else {
  16135. return;
  16136. }
  16137. var items = vl.filteredItems || vl.items;
  16138. var fromIndex;
  16139. var toIndex;
  16140. var heightBeforeFirstItem = 0;
  16141. var heightBeforeLastItem = 0;
  16142. if (vl.dynamicHeight) {
  16143. var itemTop = 0;
  16144. var itemHeight;
  16145. vl.maxBufferHeight = vl.pageHeight;
  16146. for (var j = 0; j < vl.heights.length; j += 1) {
  16147. itemHeight = vl.heights[j];
  16148. if (typeof fromIndex === 'undefined') {
  16149. if (itemTop + itemHeight >= scrollTop - (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize)) { fromIndex = j; }
  16150. else { heightBeforeFirstItem += itemHeight; }
  16151. }
  16152. if (typeof toIndex === 'undefined') {
  16153. if (itemTop + itemHeight >= scrollTop + (vl.pageHeight * 2 * vl.params.dynamicHeightBufferSize) || j === vl.heights.length - 1) { toIndex = j + 1; }
  16154. heightBeforeLastItem += itemHeight;
  16155. }
  16156. itemTop += itemHeight;
  16157. }
  16158. toIndex = Math.min(toIndex, items.length);
  16159. } else {
  16160. fromIndex = (parseInt(scrollTop / vl.params.height, 10) - vl.rowsBefore) * vl.params.cols;
  16161. if (fromIndex < 0) {
  16162. fromIndex = 0;
  16163. }
  16164. toIndex = Math.min(fromIndex + (vl.rowsToRender * vl.params.cols), items.length);
  16165. }
  16166. var topPosition;
  16167. var renderExternalItems = [];
  16168. vl.reachEnd = false;
  16169. var i;
  16170. for (i = fromIndex; i < toIndex; i += 1) {
  16171. var itemEl = (void 0);
  16172. // Define real item index
  16173. var index = vl.items.indexOf(items[i]);
  16174. if (i === fromIndex) { vl.currentFromIndex = index; }
  16175. if (i === toIndex - 1) { vl.currentToIndex = index; }
  16176. if (vl.filteredItems) {
  16177. if (vl.items[index] === vl.filteredItems[vl.filteredItems.length - 1]) { vl.reachEnd = true; }
  16178. } else if (index === vl.items.length - 1) { vl.reachEnd = true; }
  16179. // Find items
  16180. if (vl.params.renderExternal) {
  16181. renderExternalItems.push(items[i]);
  16182. } else if (vl.domCache[index]) {
  16183. itemEl = vl.domCache[index];
  16184. itemEl.f7VirtualListIndex = index;
  16185. } else {
  16186. if (vl.renderItem) {
  16187. vl.tempDomElement.innerHTML = vl.renderItem(items[i], index).trim();
  16188. } else {
  16189. vl.tempDomElement.innerHTML = items[i].toString().trim();
  16190. }
  16191. itemEl = vl.tempDomElement.childNodes[0];
  16192. if (vl.params.cache) { vl.domCache[index] = itemEl; }
  16193. itemEl.f7VirtualListIndex = index;
  16194. }
  16195. // Set item top position
  16196. if (i === fromIndex) {
  16197. if (vl.dynamicHeight) {
  16198. topPosition = heightBeforeFirstItem;
  16199. } else {
  16200. topPosition = ((i * vl.params.height) / vl.params.cols);
  16201. }
  16202. }
  16203. if (!vl.params.renderExternal) {
  16204. itemEl.style.top = topPosition + "px";
  16205. // Before item insert
  16206. vl.emit('local::itemBeforeInsert vlItemBeforeInsert', vl, itemEl, items[i]);
  16207. // Append item to fragment
  16208. vl.fragment.appendChild(itemEl);
  16209. }
  16210. }
  16211. // Update list height with not updatable scroll
  16212. if (!vl.updatableScroll) {
  16213. if (vl.dynamicHeight) {
  16214. vl.itemsWrapEl.style.height = heightBeforeLastItem + "px";
  16215. } else {
  16216. vl.itemsWrapEl.style.height = ((i * vl.params.height) / vl.params.cols) + "px";
  16217. }
  16218. }
  16219. // Update list html
  16220. if (vl.params.renderExternal) {
  16221. if (items && items.length === 0) {
  16222. vl.reachEnd = true;
  16223. }
  16224. } else {
  16225. vl.emit('local::beforeClear vlBeforeClear', vl, vl.fragment);
  16226. vl.itemsWrapEl.innerHTML = '';
  16227. vl.emit('local::itemsBeforeInsert vlItemsBeforeInsert', vl, vl.fragment);
  16228. if (items && items.length === 0) {
  16229. vl.reachEnd = true;
  16230. if (vl.params.emptyTemplate) { vl.itemsWrapEl.innerHTML = vl.params.emptyTemplate; }
  16231. } else {
  16232. vl.itemsWrapEl.appendChild(vl.fragment);
  16233. }
  16234. vl.emit('local::itemsAfterInsert vlItemsAfterInsert', vl, vl.fragment);
  16235. }
  16236. if (typeof forceScrollTop !== 'undefined' && force) {
  16237. vl.$scrollableParentEl.scrollTop(forceScrollTop, 0);
  16238. }
  16239. if (vl.params.renderExternal) {
  16240. vl.params.renderExternal(vl, {
  16241. fromIndex: fromIndex,
  16242. toIndex: toIndex,
  16243. listHeight: vl.listHeight,
  16244. topPosition: topPosition,
  16245. items: renderExternalItems,
  16246. });
  16247. }
  16248. };
  16249. // Filter
  16250. VirtualList.prototype.filterItems = function filterItems (indexes, resetScrollTop) {
  16251. if ( resetScrollTop === void 0 ) resetScrollTop = true;
  16252. var vl = this;
  16253. vl.filteredItems = [];
  16254. for (var i = 0; i < indexes.length; i += 1) {
  16255. vl.filteredItems.push(vl.items[indexes[i]]);
  16256. }
  16257. if (resetScrollTop) {
  16258. vl.$scrollableParentEl[0].scrollTop = 0;
  16259. }
  16260. vl.update();
  16261. };
  16262. VirtualList.prototype.resetFilter = function resetFilter () {
  16263. var vl = this;
  16264. if (vl.params.showFilteredItemsOnly) {
  16265. vl.filteredItems = [];
  16266. } else {
  16267. vl.filteredItems = null;
  16268. delete vl.filteredItems;
  16269. }
  16270. vl.update();
  16271. };
  16272. VirtualList.prototype.scrollToItem = function scrollToItem (index) {
  16273. var vl = this;
  16274. if (index > vl.items.length) { return false; }
  16275. var itemTop = 0;
  16276. if (vl.dynamicHeight) {
  16277. for (var i = 0; i < index; i += 1) {
  16278. itemTop += vl.heights[i];
  16279. }
  16280. } else {
  16281. itemTop = index * vl.params.height;
  16282. }
  16283. var listTop = vl.$el[0].offsetTop;
  16284. vl.render(true, (listTop + itemTop) - parseInt(vl.$scrollableParentEl.css('padding-top'), 10));
  16285. return true;
  16286. };
  16287. VirtualList.prototype.handleScroll = function handleScroll () {
  16288. var vl = this;
  16289. vl.render();
  16290. };
  16291. // Handle resize event
  16292. VirtualList.prototype.isVisible = function isVisible () {
  16293. var vl = this;
  16294. return !!(vl.el.offsetWidth || vl.el.offsetHeight || vl.el.getClientRects().length);
  16295. };
  16296. VirtualList.prototype.handleResize = function handleResize () {
  16297. var vl = this;
  16298. if (vl.isVisible()) {
  16299. vl.setListSize();
  16300. vl.render(true);
  16301. }
  16302. };
  16303. // Append
  16304. VirtualList.prototype.appendItems = function appendItems (items) {
  16305. var vl = this;
  16306. for (var i = 0; i < items.length; i += 1) {
  16307. vl.items.push(items[i]);
  16308. }
  16309. vl.update();
  16310. };
  16311. VirtualList.prototype.appendItem = function appendItem (item) {
  16312. var vl = this;
  16313. vl.appendItems([item]);
  16314. };
  16315. // Replace
  16316. VirtualList.prototype.replaceAllItems = function replaceAllItems (items) {
  16317. var vl = this;
  16318. vl.items = items;
  16319. delete vl.filteredItems;
  16320. vl.domCache = {};
  16321. vl.update();
  16322. };
  16323. VirtualList.prototype.replaceItem = function replaceItem (index, item) {
  16324. var vl = this;
  16325. vl.items[index] = item;
  16326. if (vl.params.cache) { delete vl.domCache[index]; }
  16327. vl.update();
  16328. };
  16329. // Prepend
  16330. VirtualList.prototype.prependItems = function prependItems (items) {
  16331. var vl = this;
  16332. for (var i = items.length - 1; i >= 0; i -= 1) {
  16333. vl.items.unshift(items[i]);
  16334. }
  16335. if (vl.params.cache) {
  16336. var newCache = {};
  16337. Object.keys(vl.domCache).forEach(function (cached) {
  16338. newCache[parseInt(cached, 10) + items.length] = vl.domCache[cached];
  16339. });
  16340. vl.domCache = newCache;
  16341. }
  16342. vl.update();
  16343. };
  16344. VirtualList.prototype.prependItem = function prependItem (item) {
  16345. var vl = this;
  16346. vl.prependItems([item]);
  16347. };
  16348. // Move
  16349. VirtualList.prototype.moveItem = function moveItem (from, to) {
  16350. var vl = this;
  16351. var fromIndex = from;
  16352. var toIndex = to;
  16353. if (fromIndex === toIndex) { return; }
  16354. // remove item from array
  16355. var item = vl.items.splice(fromIndex, 1)[0];
  16356. if (toIndex >= vl.items.length) {
  16357. // Add item to the end
  16358. vl.items.push(item);
  16359. toIndex = vl.items.length - 1;
  16360. } else {
  16361. // Add item to new index
  16362. vl.items.splice(toIndex, 0, item);
  16363. }
  16364. // Update cache
  16365. if (vl.params.cache) {
  16366. var newCache = {};
  16367. Object.keys(vl.domCache).forEach(function (cached) {
  16368. var cachedIndex = parseInt(cached, 10);
  16369. var leftIndex = fromIndex < toIndex ? fromIndex : toIndex;
  16370. var rightIndex = fromIndex < toIndex ? toIndex : fromIndex;
  16371. var indexShift = fromIndex < toIndex ? -1 : 1;
  16372. if (cachedIndex < leftIndex || cachedIndex > rightIndex) { newCache[cachedIndex] = vl.domCache[cachedIndex]; }
  16373. if (cachedIndex === leftIndex) { newCache[rightIndex] = vl.domCache[cachedIndex]; }
  16374. if (cachedIndex > leftIndex && cachedIndex <= rightIndex) { newCache[cachedIndex + indexShift] = vl.domCache[cachedIndex]; }
  16375. });
  16376. vl.domCache = newCache;
  16377. }
  16378. vl.update();
  16379. };
  16380. // Insert before
  16381. VirtualList.prototype.insertItemBefore = function insertItemBefore (index, item) {
  16382. var vl = this;
  16383. if (index === 0) {
  16384. vl.prependItem(item);
  16385. return;
  16386. }
  16387. if (index >= vl.items.length) {
  16388. vl.appendItem(item);
  16389. return;
  16390. }
  16391. vl.items.splice(index, 0, item);
  16392. // Update cache
  16393. if (vl.params.cache) {
  16394. var newCache = {};
  16395. Object.keys(vl.domCache).forEach(function (cached) {
  16396. var cachedIndex = parseInt(cached, 10);
  16397. if (cachedIndex >= index) {
  16398. newCache[cachedIndex + 1] = vl.domCache[cachedIndex];
  16399. }
  16400. });
  16401. vl.domCache = newCache;
  16402. }
  16403. vl.update();
  16404. };
  16405. // Delete
  16406. VirtualList.prototype.deleteItems = function deleteItems (indexes) {
  16407. var vl = this;
  16408. var prevIndex;
  16409. var indexShift = 0;
  16410. var loop = function ( i ) {
  16411. var index = indexes[i];
  16412. if (typeof prevIndex !== 'undefined') {
  16413. if (index > prevIndex) {
  16414. indexShift = -i;
  16415. }
  16416. }
  16417. index += indexShift;
  16418. prevIndex = indexes[i];
  16419. // Delete item
  16420. var deletedItem = vl.items.splice(index, 1)[0];
  16421. // Delete from filtered
  16422. if (vl.filteredItems && vl.filteredItems.indexOf(deletedItem) >= 0) {
  16423. vl.filteredItems.splice(vl.filteredItems.indexOf(deletedItem), 1);
  16424. }
  16425. // Update cache
  16426. if (vl.params.cache) {
  16427. var newCache = {};
  16428. Object.keys(vl.domCache).forEach(function (cached) {
  16429. var cachedIndex = parseInt(cached, 10);
  16430. if (cachedIndex === index) {
  16431. delete vl.domCache[index];
  16432. } else if (parseInt(cached, 10) > index) {
  16433. newCache[cachedIndex - 1] = vl.domCache[cached];
  16434. } else {
  16435. newCache[cachedIndex] = vl.domCache[cached];
  16436. }
  16437. });
  16438. vl.domCache = newCache;
  16439. }
  16440. };
  16441. for (var i = 0; i < indexes.length; i += 1) loop( i );
  16442. vl.update();
  16443. };
  16444. VirtualList.prototype.deleteAllItems = function deleteAllItems () {
  16445. var vl = this;
  16446. vl.items = [];
  16447. delete vl.filteredItems;
  16448. if (vl.params.cache) { vl.domCache = {}; }
  16449. vl.update();
  16450. };
  16451. VirtualList.prototype.deleteItem = function deleteItem (index) {
  16452. var vl = this;
  16453. vl.deleteItems([index]);
  16454. };
  16455. // Clear cache
  16456. VirtualList.prototype.clearCache = function clearCache () {
  16457. var vl = this;
  16458. vl.domCache = {};
  16459. };
  16460. // Update Virtual List
  16461. VirtualList.prototype.update = function update (deleteCache) {
  16462. var vl = this;
  16463. if (deleteCache && vl.params.cache) {
  16464. vl.domCache = {};
  16465. }
  16466. vl.setListSize();
  16467. vl.render(true);
  16468. };
  16469. VirtualList.prototype.init = function init () {
  16470. var vl = this;
  16471. vl.attachEvents();
  16472. vl.setListSize();
  16473. vl.render();
  16474. };
  16475. VirtualList.prototype.destroy = function destroy () {
  16476. var vl = this;
  16477. vl.detachEvents();
  16478. vl.$el[0].f7VirtualList = null;
  16479. delete vl.$el[0].f7VirtualList;
  16480. Utils.deleteProps(vl);
  16481. vl = null;
  16482. };
  16483. return VirtualList;
  16484. }(Framework7Class));
  16485. var VirtualList$1 = {
  16486. name: 'virtualList',
  16487. static: {
  16488. VirtualList: VirtualList,
  16489. },
  16490. create: function create() {
  16491. var app = this;
  16492. app.virtualList = ConstructorMethods({
  16493. defaultSelector: '.virtual-list',
  16494. constructor: VirtualList,
  16495. app: app,
  16496. domProp: 'f7VirtualList',
  16497. });
  16498. },
  16499. };
  16500. var ListIndex = /*@__PURE__*/(function (Framework7Class) {
  16501. function ListIndex(app, params) {
  16502. if ( params === void 0 ) params = {};
  16503. Framework7Class.call(this, params, [app]);
  16504. var index = this;
  16505. var defaults = {
  16506. el: null, // where to render indexes
  16507. listEl: null, // list el to generate indexes
  16508. indexes: 'auto', // or array of indexes
  16509. iosItemHeight: 14,
  16510. mdItemHeight: 14,
  16511. auroraItemHeight: 14,
  16512. scrollList: true,
  16513. label: false,
  16514. // eslint-disable-next-line
  16515. renderItem: function renderItem(itemContent, itemIndex) {
  16516. return ("\n <li>" + itemContent + "</li>\n ").trim();
  16517. },
  16518. renderSkipPlaceholder: function renderSkipPlaceholder() {
  16519. return '<li class="list-index-skip-placeholder"></li>';
  16520. },
  16521. on: {},
  16522. };
  16523. // Extend defaults with modules params
  16524. index.useModulesParams(defaults);
  16525. index.params = Utils.extend(defaults, params);
  16526. var $el;
  16527. var $listEl;
  16528. var $pageContentEl;
  16529. var $ul;
  16530. if (index.params.el) {
  16531. $el = $(index.params.el);
  16532. } else {
  16533. return index;
  16534. }
  16535. if ($el[0].f7ListIndex) {
  16536. return $el[0].f7ListIndex;
  16537. }
  16538. $ul = $el.find('ul');
  16539. if ($ul.length === 0) {
  16540. $ul = $('<ul></ul>');
  16541. $el.append($ul);
  16542. }
  16543. if (index.params.listEl) {
  16544. $listEl = $(index.params.listEl);
  16545. }
  16546. if (index.params.indexes === 'auto' && !$listEl) {
  16547. return index;
  16548. }
  16549. if ($listEl) {
  16550. $pageContentEl = $listEl.parents('.page-content').eq(0);
  16551. } else {
  16552. $pageContentEl = $el.siblings('.page-content').eq(0);
  16553. if ($pageContentEl.length === 0) {
  16554. $pageContentEl = $el.parents('.page').eq(0).find('.page-content').eq(0);
  16555. }
  16556. }
  16557. $el[0].f7ListIndex = index;
  16558. Utils.extend(index, {
  16559. app: app,
  16560. $el: $el,
  16561. el: $el && $el[0],
  16562. $ul: $ul,
  16563. ul: $ul && $ul[0],
  16564. $listEl: $listEl,
  16565. listEl: $listEl && $listEl[0],
  16566. $pageContentEl: $pageContentEl,
  16567. pageContentEl: $pageContentEl && $pageContentEl[0],
  16568. indexes: params.indexes,
  16569. height: 0,
  16570. skipRate: 0,
  16571. });
  16572. // Install Modules
  16573. index.useModules();
  16574. // Attach events
  16575. function handleResize() {
  16576. var height = { index: index };
  16577. index.calcSize();
  16578. if (height !== index.height) {
  16579. index.render();
  16580. }
  16581. }
  16582. function handleClick(e) {
  16583. var $clickedLi = $(e.target).closest('li');
  16584. if (!$clickedLi.length) { return; }
  16585. var itemIndex = $clickedLi.index();
  16586. if (index.skipRate > 0) {
  16587. var percentage = itemIndex / ($clickedLi.siblings('li').length - 1);
  16588. itemIndex = Math.round((index.indexes.length - 1) * percentage);
  16589. }
  16590. var itemContent = index.indexes[itemIndex];
  16591. index.$el.trigger('listindex:click', { content: itemContent, index: itemIndex });
  16592. index.emit('local::click listIndexClick', index, itemContent, itemIndex);
  16593. index.$el.trigger('listindex:select', { content: itemContent, index: itemIndex });
  16594. index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
  16595. if (index.$listEl && index.params.scrollList) {
  16596. index.scrollListToIndex(itemContent, itemIndex);
  16597. }
  16598. }
  16599. var touchesStart = {};
  16600. var isTouched;
  16601. var isMoved;
  16602. var topPoint;
  16603. var bottomPoint;
  16604. var $labelEl;
  16605. var previousIndex = null;
  16606. function handleTouchStart(e) {
  16607. var $children = $ul.children();
  16608. if (!$children.length) { return; }
  16609. topPoint = $children[0].getBoundingClientRect().top;
  16610. bottomPoint = $children[$children.length - 1].getBoundingClientRect().top + $children[0].offsetHeight;
  16611. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  16612. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  16613. isTouched = true;
  16614. isMoved = false;
  16615. previousIndex = null;
  16616. }
  16617. function handleTouchMove(e) {
  16618. if (!isTouched) { return; }
  16619. if (!isMoved && index.params.label) {
  16620. $labelEl = $('<span class="list-index-label"></span>');
  16621. $el.append($labelEl);
  16622. }
  16623. isMoved = true;
  16624. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  16625. e.preventDefault();
  16626. var percentage = (pageY - topPoint) / (bottomPoint - topPoint);
  16627. percentage = Math.min(Math.max(percentage, 0), 1);
  16628. var itemIndex = Math.round((index.indexes.length - 1) * percentage);
  16629. var itemContent = index.indexes[itemIndex];
  16630. var ulHeight = bottomPoint - topPoint;
  16631. var bubbleBottom = ((index.height - ulHeight) / 2) + ((1 - percentage) * ulHeight);
  16632. if (itemIndex !== previousIndex) {
  16633. if (index.params.label) {
  16634. $labelEl.html(itemContent).transform(("translateY(-" + bubbleBottom + "px)"));
  16635. }
  16636. if (index.$listEl && index.params.scrollList) {
  16637. index.scrollListToIndex(itemContent, itemIndex);
  16638. }
  16639. }
  16640. previousIndex = itemIndex;
  16641. index.$el.trigger('listindex:select');
  16642. index.emit('local::select listIndexSelect', index, itemContent, itemIndex);
  16643. }
  16644. function handleTouchEnd() {
  16645. if (!isTouched) { return; }
  16646. isTouched = false;
  16647. isMoved = false;
  16648. if (index.params.label) {
  16649. if ($labelEl) { $labelEl.remove(); }
  16650. $labelEl = undefined;
  16651. }
  16652. }
  16653. var passiveListener = app.support.passiveListener ? { passive: true } : false;
  16654. index.attachEvents = function attachEvents() {
  16655. $el.parents('.tab').on('tab:show', handleResize);
  16656. $el.parents('.page').on('page:reinit', handleResize);
  16657. $el.parents('.panel').on('panel:open', handleResize);
  16658. $el
  16659. .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
  16660. .on('modal:open', handleResize);
  16661. app.on('resize', handleResize);
  16662. $el.on('click', handleClick);
  16663. $el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  16664. app.on('touchmove:active', handleTouchMove);
  16665. app.on('touchend:passive', handleTouchEnd);
  16666. };
  16667. index.detachEvents = function attachEvents() {
  16668. $el.parents('.tab').off('tab:show', handleResize);
  16669. $el.parents('.page').off('page:reinit', handleResize);
  16670. $el.parents('.panel').off('panel:open', handleResize);
  16671. $el
  16672. .parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast')
  16673. .off('modal:open', handleResize);
  16674. app.off('resize', handleResize);
  16675. $el.off('click', handleClick);
  16676. $el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  16677. app.off('touchmove:active', handleTouchMove);
  16678. app.off('touchend:passive', handleTouchEnd);
  16679. };
  16680. // Init
  16681. index.init();
  16682. return index;
  16683. }
  16684. if ( Framework7Class ) ListIndex.__proto__ = Framework7Class;
  16685. ListIndex.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  16686. ListIndex.prototype.constructor = ListIndex;
  16687. // eslint-disable-next-line
  16688. ListIndex.prototype.scrollListToIndex = function scrollListToIndex (itemContent, itemIndex) {
  16689. var index = this;
  16690. var $listEl = index.$listEl;
  16691. var $pageContentEl = index.$pageContentEl;
  16692. var app = index.app;
  16693. if (!$listEl || !$pageContentEl || $pageContentEl.length === 0) { return index; }
  16694. var $scrollToEl;
  16695. $listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
  16696. if ($scrollToEl) { return; }
  16697. var $el = $(el);
  16698. if ($el.text() === itemContent) {
  16699. $scrollToEl = $el;
  16700. }
  16701. });
  16702. if (!$scrollToEl || $scrollToEl.length === 0) { return index; }
  16703. var parentTop = $scrollToEl.parent().offset().top;
  16704. var paddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  16705. var scrollTop = $pageContentEl[0].scrollTop;
  16706. var scrollToElTop = $scrollToEl.offset().top;
  16707. if ($pageContentEl.parents('.page-with-navbar-large').length) {
  16708. var navbarInnerEl = app.navbar.getElByPage($pageContentEl.parents('.page-with-navbar-large').eq(0));
  16709. var $titleLargeEl = $(navbarInnerEl).find('.title-large');
  16710. if ($titleLargeEl.length) {
  16711. paddingTop -= $titleLargeEl[0].offsetHeight || 0;
  16712. }
  16713. }
  16714. if (parentTop <= paddingTop) {
  16715. $pageContentEl.scrollTop((parentTop + scrollTop) - paddingTop);
  16716. } else {
  16717. $pageContentEl.scrollTop((scrollToElTop + scrollTop) - paddingTop);
  16718. }
  16719. return index;
  16720. };
  16721. ListIndex.prototype.renderSkipPlaceholder = function renderSkipPlaceholder () {
  16722. var index = this;
  16723. return index.params.renderSkipPlaceholder.call(index);
  16724. };
  16725. ListIndex.prototype.renderItem = function renderItem (itemContent, itemIndex) {
  16726. var index = this;
  16727. return index.params.renderItem.call(index, itemContent, itemIndex);
  16728. };
  16729. ListIndex.prototype.render = function render () {
  16730. var index = this;
  16731. var $ul = index.$ul;
  16732. var indexes = index.indexes;
  16733. var skipRate = index.skipRate;
  16734. var wasSkipped;
  16735. var html = indexes.map(function (itemContent, itemIndex) {
  16736. if (itemIndex % skipRate !== 0 && skipRate > 0) {
  16737. wasSkipped = true;
  16738. return '';
  16739. }
  16740. var itemHtml = index.renderItem(itemContent, itemIndex);
  16741. if (wasSkipped) {
  16742. itemHtml = index.renderSkipPlaceholder() + itemHtml;
  16743. }
  16744. wasSkipped = false;
  16745. return itemHtml;
  16746. }).join('');
  16747. $ul.html(html);
  16748. return index;
  16749. };
  16750. ListIndex.prototype.calcSize = function calcSize () {
  16751. var index = this;
  16752. var app = index.app;
  16753. var params = index.params;
  16754. var el = index.el;
  16755. var indexes = index.indexes;
  16756. var height = el.offsetHeight;
  16757. var itemHeight = params[((app.theme) + "ItemHeight")];
  16758. var maxItems = Math.floor(height / itemHeight);
  16759. var items = indexes.length;
  16760. var skipRate = 0;
  16761. if (items > maxItems) {
  16762. skipRate = Math.ceil(((items * 2) - 1) / maxItems);
  16763. }
  16764. index.height = height;
  16765. index.skipRate = skipRate;
  16766. return index;
  16767. };
  16768. ListIndex.prototype.calcIndexes = function calcIndexes () {
  16769. var index = this;
  16770. if (index.params.indexes === 'auto') {
  16771. index.indexes = [];
  16772. index.$listEl.find('.list-group-title, .item-divider').each(function (elIndex, el) {
  16773. var elContent = $(el).text();
  16774. if (index.indexes.indexOf(elContent) < 0) {
  16775. index.indexes.push(elContent);
  16776. }
  16777. });
  16778. } else {
  16779. index.indexes = index.params.indexes;
  16780. }
  16781. return index;
  16782. };
  16783. ListIndex.prototype.update = function update () {
  16784. var index = this;
  16785. index.calcIndexes();
  16786. index.calcSize();
  16787. index.render();
  16788. return index;
  16789. };
  16790. ListIndex.prototype.init = function init () {
  16791. var index = this;
  16792. index.calcIndexes();
  16793. index.calcSize();
  16794. index.render();
  16795. index.attachEvents();
  16796. };
  16797. ListIndex.prototype.destroy = function destroy () {
  16798. var index = this;
  16799. index.$el.trigger('listindex:beforedestroy', index);
  16800. index.emit('local::beforeDestroy listIndexBeforeDestroy');
  16801. index.detachEvents();
  16802. if (index.$el[0]) {
  16803. index.$el[0].f7ListIndex = null;
  16804. delete index.$el[0].f7ListIndex;
  16805. }
  16806. Utils.deleteProps(index);
  16807. index = null;
  16808. };
  16809. return ListIndex;
  16810. }(Framework7Class));
  16811. var ListIndex$1 = {
  16812. name: 'listIndex',
  16813. static: {
  16814. ListIndex: ListIndex,
  16815. },
  16816. create: function create() {
  16817. var app = this;
  16818. app.listIndex = ConstructorMethods({
  16819. defaultSelector: '.list-index',
  16820. constructor: ListIndex,
  16821. app: app,
  16822. domProp: 'f7ListIndex',
  16823. });
  16824. },
  16825. on: {
  16826. tabMounted: function tabMounted(tabEl) {
  16827. var app = this;
  16828. $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
  16829. var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
  16830. app.listIndex.create(params);
  16831. });
  16832. },
  16833. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  16834. $(tabEl).find('.list-index-init').each(function (index, listIndexEl) {
  16835. if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
  16836. });
  16837. },
  16838. pageInit: function pageInit(page) {
  16839. var app = this;
  16840. page.$el.find('.list-index-init').each(function (index, listIndexEl) {
  16841. var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
  16842. app.listIndex.create(params);
  16843. });
  16844. },
  16845. pageBeforeRemove: function pageBeforeRemove(page) {
  16846. page.$el.find('.list-index-init').each(function (index, listIndexEl) {
  16847. if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
  16848. });
  16849. },
  16850. },
  16851. vnode: {
  16852. 'list-index-init': {
  16853. insert: function insert(vnode) {
  16854. var app = this;
  16855. var listIndexEl = vnode.elm;
  16856. var params = Utils.extend($(listIndexEl).dataset(), { el: listIndexEl });
  16857. app.listIndex.create(params);
  16858. },
  16859. destroy: function destroy(vnode) {
  16860. var listIndexEl = vnode.elm;
  16861. if (listIndexEl.f7ListIndex) { listIndexEl.f7ListIndex.destroy(); }
  16862. },
  16863. },
  16864. },
  16865. };
  16866. var Timeline = {
  16867. name: 'timeline',
  16868. };
  16869. var Tab = {
  16870. show: function show() {
  16871. var assign, assign$1, assign$2;
  16872. var args = [], len = arguments.length;
  16873. while ( len-- ) args[ len ] = arguments[ len ];
  16874. var app = this;
  16875. var tabEl;
  16876. var tabLinkEl;
  16877. var animate;
  16878. var tabRoute;
  16879. var animatedInit;
  16880. if (args.length === 1 && args[0] && args[0].constructor === Object) {
  16881. tabEl = args[0].tabEl;
  16882. tabLinkEl = args[0].tabLinkEl;
  16883. animate = args[0].animate;
  16884. tabRoute = args[0].tabRoute;
  16885. animatedInit = args[0].animatedInit;
  16886. } else {
  16887. (assign = args, tabEl = assign[0], tabLinkEl = assign[1], animate = assign[2], tabRoute = assign[3]);
  16888. if (typeof args[1] === 'boolean') {
  16889. (assign$1 = args, tabEl = assign$1[0], animate = assign$1[1], tabLinkEl = assign$1[2], tabRoute = assign$1[3]);
  16890. if (args.length > 2 && tabLinkEl.constructor === Object) {
  16891. (assign$2 = args, tabEl = assign$2[0], animate = assign$2[1], tabRoute = assign$2[2], tabLinkEl = assign$2[3]);
  16892. }
  16893. }
  16894. }
  16895. if (typeof animate === 'undefined') { animate = true; }
  16896. var $newTabEl = $(tabEl);
  16897. if (tabRoute && $newTabEl[0]) {
  16898. $newTabEl[0].f7TabRoute = tabRoute;
  16899. }
  16900. if (!animatedInit && ($newTabEl.length === 0 || $newTabEl.hasClass('tab-active'))) {
  16901. return {
  16902. $newTabEl: $newTabEl,
  16903. newTabEl: $newTabEl[0],
  16904. };
  16905. }
  16906. var $tabLinkEl;
  16907. if (tabLinkEl) { $tabLinkEl = $(tabLinkEl); }
  16908. var $tabsEl = $newTabEl.parent('.tabs');
  16909. if ($tabsEl.length === 0) {
  16910. return {
  16911. $newTabEl: $newTabEl,
  16912. newTabEl: $newTabEl[0],
  16913. };
  16914. }
  16915. // Release swipeouts in hidden tabs
  16916. if (app.swipeout) { app.swipeout.allowOpen = true; }
  16917. // Animated tabs
  16918. var tabsChangedCallbacks = [];
  16919. function onTabsChanged(callback) {
  16920. tabsChangedCallbacks.push(callback);
  16921. }
  16922. function tabsChanged() {
  16923. tabsChangedCallbacks.forEach(function (callback) {
  16924. callback();
  16925. });
  16926. }
  16927. var animated = false;
  16928. if ($tabsEl.parent().hasClass('tabs-animated-wrap')) {
  16929. $tabsEl.parent()[animate ? 'removeClass' : 'addClass']('not-animated');
  16930. var transitionDuration = parseFloat($tabsEl.css('transition-duration').replace(',', '.'));
  16931. if (animate && transitionDuration) {
  16932. $tabsEl.transitionEnd(tabsChanged);
  16933. animated = true;
  16934. }
  16935. var tabsTranslate = (app.rtl ? $newTabEl.index() : -$newTabEl.index()) * 100;
  16936. $tabsEl.transform(("translate3d(" + tabsTranslate + "%,0,0)"));
  16937. }
  16938. // Swipeable tabs
  16939. var swiper;
  16940. if ($tabsEl.parent().hasClass('tabs-swipeable-wrap') && app.swiper) {
  16941. swiper = $tabsEl.parent()[0].swiper;
  16942. if (swiper && swiper.activeIndex !== $newTabEl.index()) {
  16943. animated = true;
  16944. swiper
  16945. .once('slideChangeTransitionEnd', function () {
  16946. tabsChanged();
  16947. })
  16948. .slideTo($newTabEl.index(), animate ? undefined : 0);
  16949. } else if (swiper && swiper.animating) {
  16950. animated = true;
  16951. swiper
  16952. .once('slideChangeTransitionEnd', function () {
  16953. tabsChanged();
  16954. });
  16955. }
  16956. }
  16957. // Remove active class from old tabs
  16958. var $oldTabEl = $tabsEl.children('.tab-active');
  16959. $oldTabEl.removeClass('tab-active');
  16960. if (!animatedInit && (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute))) {
  16961. if ($oldTabEl.hasClass('view') && $oldTabEl.children('.page').length) {
  16962. $oldTabEl.children('.page').each(function (pageIndex, pageEl) {
  16963. $(pageEl).trigger('page:tabhide');
  16964. app.emit('pageTabHide', pageEl);
  16965. });
  16966. }
  16967. $oldTabEl.trigger('tab:hide');
  16968. app.emit('tabHide', $oldTabEl[0]);
  16969. }
  16970. // Trigger 'show' event on new tab
  16971. $newTabEl.addClass('tab-active');
  16972. if (!animatedInit && (!swiper || (swiper && !swiper.animating) || (swiper && tabRoute))) {
  16973. if ($newTabEl.hasClass('view') && $newTabEl.children('.page').length) {
  16974. $newTabEl.children('.page').each(function (pageIndex, pageEl) {
  16975. $(pageEl).trigger('page:tabshow');
  16976. app.emit('pageTabShow', pageEl);
  16977. });
  16978. }
  16979. $newTabEl.trigger('tab:show');
  16980. app.emit('tabShow', $newTabEl[0]);
  16981. }
  16982. // Find related link for new tab
  16983. if (!$tabLinkEl) {
  16984. // Search by id
  16985. if (typeof tabEl === 'string') { $tabLinkEl = $((".tab-link[href=\"" + tabEl + "\"]")); }
  16986. else { $tabLinkEl = $((".tab-link[href=\"#" + ($newTabEl.attr('id')) + "\"]")); }
  16987. // Search by data-tab
  16988. if (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0)) {
  16989. $('[data-tab]').each(function (index, el) {
  16990. if ($newTabEl.is($(el).attr('data-tab'))) { $tabLinkEl = $(el); }
  16991. });
  16992. }
  16993. if (tabRoute && (!$tabLinkEl || ($tabLinkEl && $tabLinkEl.length === 0))) {
  16994. $tabLinkEl = $(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
  16995. if ($tabLinkEl.length === 0) {
  16996. $tabLinkEl = $((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
  16997. }
  16998. }
  16999. if ($tabLinkEl.length > 1 && $newTabEl.parents('.page').length) {
  17000. // eslint-disable-next-line
  17001. $tabLinkEl = $tabLinkEl.filter(function (index, tabLinkElement) {
  17002. return $(tabLinkElement).parents('.page')[0] === $newTabEl.parents('.page')[0];
  17003. });
  17004. if (app.theme === 'ios' && $tabLinkEl.length === 0 && tabRoute) {
  17005. var $pageEl = $newTabEl.parents('.page');
  17006. var $navbarEl = $(app.navbar.getElByPage($pageEl));
  17007. $tabLinkEl = $navbarEl.find(("[data-route-tab-id=\"" + (tabRoute.route.tab.id) + "\"]"));
  17008. if ($tabLinkEl.length === 0) {
  17009. $tabLinkEl = $navbarEl.find((".tab-link[href=\"" + (tabRoute.url) + "\"]"));
  17010. }
  17011. }
  17012. }
  17013. }
  17014. if ($tabLinkEl.length > 0) {
  17015. // Find related link for old tab
  17016. var $oldTabLinkEl;
  17017. if ($oldTabEl && $oldTabEl.length > 0) {
  17018. // Search by id
  17019. var oldTabId = $oldTabEl.attr('id');
  17020. if (oldTabId) {
  17021. $oldTabLinkEl = $((".tab-link[href=\"#" + oldTabId + "\"]"));
  17022. // Search by data-route-tab-id
  17023. if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
  17024. $oldTabLinkEl = $((".tab-link[data-route-tab-id=\"" + oldTabId + "\"]"));
  17025. }
  17026. }
  17027. // Search by data-tab
  17028. if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
  17029. $('[data-tab]').each(function (index, tabLinkElement) {
  17030. if ($oldTabEl.is($(tabLinkElement).attr('data-tab'))) { $oldTabLinkEl = $(tabLinkElement); }
  17031. });
  17032. }
  17033. if (!$oldTabLinkEl || ($oldTabLinkEl && $oldTabLinkEl.length === 0)) {
  17034. $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
  17035. }
  17036. } else if (tabRoute) {
  17037. $oldTabLinkEl = $tabLinkEl.siblings('.tab-link-active');
  17038. }
  17039. if ($oldTabLinkEl && $oldTabLinkEl.length > 1 && $oldTabEl && $oldTabEl.parents('.page').length) {
  17040. // eslint-disable-next-line
  17041. $oldTabLinkEl = $oldTabLinkEl.filter(function (index, tabLinkElement) {
  17042. return $(tabLinkElement).parents('.page')[0] === $oldTabEl.parents('.page')[0];
  17043. });
  17044. }
  17045. if ($oldTabLinkEl && $oldTabLinkEl.length > 0) { $oldTabLinkEl.removeClass('tab-link-active'); }
  17046. // Update links' classes
  17047. if ($tabLinkEl && $tabLinkEl.length > 0) {
  17048. $tabLinkEl.addClass('tab-link-active');
  17049. // Material Highlight
  17050. if (app.theme === 'md' && app.toolbar) {
  17051. var $tabbarEl = $tabLinkEl.parents('.tabbar, .tabbar-labels');
  17052. if ($tabbarEl.length > 0) {
  17053. app.toolbar.setHighlight($tabbarEl);
  17054. }
  17055. }
  17056. }
  17057. }
  17058. return {
  17059. $newTabEl: $newTabEl,
  17060. newTabEl: $newTabEl[0],
  17061. $oldTabEl: $oldTabEl,
  17062. oldTabEl: $oldTabEl[0],
  17063. onTabsChanged: onTabsChanged,
  17064. animated: animated,
  17065. };
  17066. },
  17067. };
  17068. var Tabs = {
  17069. name: 'tabs',
  17070. create: function create() {
  17071. var app = this;
  17072. Utils.extend(app, {
  17073. tab: {
  17074. show: Tab.show.bind(app),
  17075. },
  17076. });
  17077. },
  17078. on: {
  17079. 'pageInit tabMounted': function onInit(pageOrTabEl) {
  17080. var $el = $(pageOrTabEl.el || pageOrTabEl);
  17081. var animatedTabEl = $el.find('.tabs-animated-wrap > .tabs > .tab-active')[0];
  17082. if (!animatedTabEl) { return; }
  17083. var app = this;
  17084. app.tab.show({ tabEl: animatedTabEl, animatedInit: true, animate: false });
  17085. },
  17086. },
  17087. clicks: {
  17088. '.tab-link': function tabLinkClick($clickedEl, data) {
  17089. if ( data === void 0 ) data = {};
  17090. if (($clickedEl.attr('href') && $clickedEl.attr('href').indexOf('#') === 0) || $clickedEl.attr('data-tab')) {
  17091. var app = this;
  17092. app.tab.show({
  17093. tabEl: data.tab || $clickedEl.attr('href'),
  17094. tabLinkEl: $clickedEl,
  17095. animate: data.animate,
  17096. });
  17097. }
  17098. },
  17099. },
  17100. };
  17101. function swipePanel(panel) {
  17102. var app = panel.app;
  17103. if (panel.swipeInitialized) {
  17104. return;
  17105. }
  17106. Utils.extend(panel, {
  17107. swipeable: true,
  17108. swipeInitialized: true,
  17109. });
  17110. var params = panel.params;
  17111. var $el = panel.$el;
  17112. var $backdropEl = panel.$backdropEl;
  17113. var side = panel.side;
  17114. var effect = panel.effect;
  17115. var otherPanel;
  17116. var isTouched;
  17117. var isGestureStarted;
  17118. var isMoved;
  17119. var isScrolling;
  17120. var isInterrupted;
  17121. var touchesStart = {};
  17122. var touchStartTime;
  17123. var touchesDiff;
  17124. var translate;
  17125. var backdropOpacity;
  17126. var panelWidth;
  17127. var direction;
  17128. var $viewEl;
  17129. var touchMoves = 0;
  17130. function handleTouchStart(e) {
  17131. if (!panel.swipeable || isGestureStarted) { return; }
  17132. if (!app.panel.allowOpen || (!params.swipe && !params.swipeOnlyClose) || isTouched) { return; }
  17133. if ($('.modal-in:not(.toast):not(.notification), .photo-browser-in').length > 0) { return; }
  17134. otherPanel = app.panel.get(side === 'left' ? 'right' : 'left') || {};
  17135. var otherPanelOpened = otherPanel.opened && otherPanel.$el && !otherPanel.$el.hasClass('panel-in-breakpoint');
  17136. if (!panel.opened && otherPanelOpened) {
  17137. return;
  17138. }
  17139. if (!params.swipeOnlyClose) {
  17140. if (otherPanelOpened) { return; }
  17141. }
  17142. if (e.target && e.target.nodeName.toLowerCase() === 'input' && e.target.type === 'range') { return; }
  17143. if ($(e.target).closest('.range-slider, .tabs-swipeable-wrap, .calendar-months, .no-swipe-panel, .card-opened').length > 0) { return; }
  17144. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  17145. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  17146. if (params.swipeOnlyClose && !panel.opened) {
  17147. return;
  17148. }
  17149. if (params.swipeActiveArea && !panel.opened) {
  17150. if (side === 'left') {
  17151. if (touchesStart.x > params.swipeActiveArea) { return; }
  17152. }
  17153. if (side === 'right') {
  17154. if (touchesStart.x < app.width - params.swipeActiveArea) { return; }
  17155. }
  17156. }
  17157. touchMoves = 0;
  17158. $viewEl = $(panel.getViewEl());
  17159. isMoved = false;
  17160. isTouched = true;
  17161. isScrolling = undefined;
  17162. isInterrupted = false;
  17163. touchStartTime = Utils.now();
  17164. direction = undefined;
  17165. }
  17166. function handleTouchMove(e) {
  17167. if (!isTouched || isGestureStarted || isInterrupted) { return; }
  17168. touchMoves += 1;
  17169. if (touchMoves < 2) { return; }
  17170. if (e.f7PreventSwipePanel || app.preventSwipePanelBySwipeBack || app.preventSwipePanel) {
  17171. isTouched = false;
  17172. return;
  17173. }
  17174. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  17175. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  17176. if (typeof isScrolling === 'undefined') {
  17177. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  17178. }
  17179. if (isScrolling) {
  17180. isTouched = false;
  17181. return;
  17182. }
  17183. if (!direction) {
  17184. if (pageX > touchesStart.x) {
  17185. direction = 'to-right';
  17186. } else {
  17187. direction = 'to-left';
  17188. }
  17189. if (params.swipeActiveArea > 0 && !panel.opened) {
  17190. if (side === 'left' && touchesStart.x > params.swipeActiveArea) {
  17191. isTouched = false;
  17192. return;
  17193. }
  17194. if (side === 'right' && touchesStart.x < app.width - params.swipeActiveArea) {
  17195. isTouched = false;
  17196. return;
  17197. }
  17198. }
  17199. if ($el.hasClass('panel-in-breakpoint')) {
  17200. isTouched = false;
  17201. return;
  17202. }
  17203. if (
  17204. (side === 'left'
  17205. && (
  17206. direction === 'to-left' && !$el.hasClass('panel-in')
  17207. )
  17208. )
  17209. || (side === 'right'
  17210. && (
  17211. direction === 'to-right' && !$el.hasClass('panel-in')
  17212. )
  17213. )
  17214. ) {
  17215. isTouched = false;
  17216. return;
  17217. }
  17218. }
  17219. var threshold = panel.opened ? 0 : -params.swipeThreshold;
  17220. if (side === 'right') { threshold = -threshold; }
  17221. if (!isMoved) {
  17222. if (!panel.opened) {
  17223. panel.insertToRoot();
  17224. $el.addClass('panel-in-swipe');
  17225. $backdropEl.css('visibility', 'visible');
  17226. $el.trigger('panel:swipeopen');
  17227. panel.emit('local::swipeOpen panelSwipeOpen', panel);
  17228. }
  17229. panelWidth = $el[0].offsetWidth;
  17230. if (effect === 'reveal' && $el.hasClass('panel-in-collapsed')) {
  17231. panelWidth -= parseFloat($viewEl.css(("margin-" + side)));
  17232. }
  17233. $el.transition(0);
  17234. }
  17235. isMoved = true;
  17236. e.preventDefault();
  17237. touchesDiff = (pageX - touchesStart.x) + threshold;
  17238. if (side === 'right') {
  17239. if (effect === 'cover') {
  17240. translate = touchesDiff + (panel.opened ? 0 : panelWidth);
  17241. if (translate < 0) { translate = 0; }
  17242. if (translate > panelWidth) {
  17243. translate = panelWidth;
  17244. }
  17245. } else {
  17246. translate = touchesDiff - (panel.opened ? panelWidth : 0);
  17247. if (translate > 0) { translate = 0; }
  17248. if (translate < -panelWidth) {
  17249. translate = -panelWidth;
  17250. }
  17251. }
  17252. } else {
  17253. translate = touchesDiff + (panel.opened ? panelWidth : 0);
  17254. if (translate < 0) { translate = 0; }
  17255. if (translate > panelWidth) {
  17256. translate = panelWidth;
  17257. }
  17258. }
  17259. var noFollowProgress = Math.abs(translate / panelWidth);
  17260. if (effect === 'reveal') {
  17261. if (!params.swipeNoFollow) {
  17262. $viewEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
  17263. $backdropEl.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
  17264. }
  17265. $el.trigger('panel:swipe', Math.abs(translate / panelWidth));
  17266. panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
  17267. } else {
  17268. if (side === 'left') { translate -= panelWidth; }
  17269. if (!params.swipeNoFollow) {
  17270. $el.transform(("translate3d(" + translate + "px,0,0)")).transition(0);
  17271. $backdropEl.transition(0);
  17272. backdropOpacity = 1 - Math.abs(translate / panelWidth);
  17273. $backdropEl.css({ opacity: backdropOpacity });
  17274. }
  17275. $el.trigger('panel:swipe', Math.abs(translate / panelWidth));
  17276. panel.emit('local::swipe panelSwipe', panel, Math.abs(translate / panelWidth));
  17277. }
  17278. if (params.swipeNoFollow) {
  17279. var stateChanged = (panel.opened && noFollowProgress === 0) || (!panel.opened && noFollowProgress === 1);
  17280. if (stateChanged) {
  17281. isInterrupted = true;
  17282. // eslint-disable-next-line
  17283. handleTouchEnd(e);
  17284. }
  17285. }
  17286. }
  17287. function handleTouchEnd(e) {
  17288. if (!isTouched || !isMoved) {
  17289. isTouched = false;
  17290. isMoved = false;
  17291. return;
  17292. }
  17293. var isGesture = e.type === 'gesturestart' || isGestureStarted;
  17294. isTouched = false;
  17295. isMoved = false;
  17296. var timeDiff = (new Date()).getTime() - touchStartTime;
  17297. var action;
  17298. var edge = (translate === 0 || Math.abs(translate) === panelWidth) && !params.swipeNoFollow;
  17299. var threshold = params.swipeThreshold || 0;
  17300. if (isGesture) {
  17301. action = 'reset';
  17302. } else if (!panel.opened) {
  17303. if (Math.abs(touchesDiff) < threshold) {
  17304. action = 'reset';
  17305. } else if (effect === 'cover') {
  17306. if (translate === 0) {
  17307. action = 'swap'; // open
  17308. } else if (timeDiff < 300 && Math.abs(translate) > 0) {
  17309. action = 'swap'; // open
  17310. } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
  17311. action = 'swap'; // open
  17312. } else {
  17313. action = 'reset'; // close
  17314. }
  17315. } else if (translate === 0) {
  17316. action = 'reset';
  17317. } else if (
  17318. (timeDiff < 300 && Math.abs(translate) > 0)
  17319. || (timeDiff >= 300 && (Math.abs(translate) >= panelWidth / 2))
  17320. ) {
  17321. action = 'swap';
  17322. } else {
  17323. action = 'reset';
  17324. }
  17325. } else if (effect === 'cover') {
  17326. if (translate === 0) {
  17327. action = 'reset'; // open
  17328. } else if (timeDiff < 300 && Math.abs(translate) > 0) {
  17329. action = 'swap'; // open
  17330. } else if (timeDiff >= 300 && Math.abs(translate) < panelWidth / 2) {
  17331. action = 'reset'; // open
  17332. } else {
  17333. action = 'swap'; // close
  17334. }
  17335. } else if (translate === -panelWidth) {
  17336. action = 'reset';
  17337. } else if (
  17338. (timeDiff < 300 && Math.abs(translate) >= 0)
  17339. || (timeDiff >= 300 && (Math.abs(translate) <= panelWidth / 2))
  17340. ) {
  17341. if (side === 'left' && translate === panelWidth) { action = 'reset'; }
  17342. else { action = 'swap'; }
  17343. } else {
  17344. action = 'reset';
  17345. }
  17346. if (action === 'swap') {
  17347. if (panel.opened) {
  17348. panel.close(!edge);
  17349. } else {
  17350. panel.open(!edge);
  17351. }
  17352. }
  17353. var removePanelInClass = true;
  17354. if (action === 'reset') {
  17355. if (!panel.opened) {
  17356. if (edge) {
  17357. // edge position
  17358. $el.removeClass('panel-in-swipe');
  17359. } else {
  17360. removePanelInClass = false;
  17361. var target = effect === 'reveal' ? $viewEl : $el;
  17362. $('html').addClass('with-panel-closing');
  17363. target.transitionEnd(function () {
  17364. if ($el.hasClass('panel-in')) { return; }
  17365. $el.removeClass('panel-in-swipe');
  17366. $('html').removeClass('with-panel-closing');
  17367. });
  17368. }
  17369. }
  17370. }
  17371. if (effect === 'reveal') {
  17372. Utils.nextFrame(function () {
  17373. $viewEl.transition('');
  17374. $viewEl.transform('');
  17375. });
  17376. }
  17377. if (removePanelInClass) {
  17378. $el.removeClass('panel-in-swipe');
  17379. }
  17380. $el.transition('').transform('');
  17381. $backdropEl.transform('').transition('').css({ opacity: '', visibility: '' });
  17382. }
  17383. function handleGestureStart(e) {
  17384. isGestureStarted = true;
  17385. handleTouchEnd(e);
  17386. }
  17387. function handleGestureEnd() {
  17388. isGestureStarted = false;
  17389. }
  17390. // Add Events
  17391. app.on('touchstart:passive', handleTouchStart);
  17392. app.on('touchmove:active', handleTouchMove);
  17393. app.on('touchend:passive', handleTouchEnd);
  17394. app.on('gesturestart', handleGestureStart);
  17395. app.on('gestureend', handleGestureEnd);
  17396. panel.on('panelDestroy', function () {
  17397. app.off('touchstart:passive', handleTouchStart);
  17398. app.off('touchmove:active', handleTouchMove);
  17399. app.off('touchend:passive', handleTouchEnd);
  17400. app.off('gesturestart', handleGestureStart);
  17401. app.off('gestureend', handleGestureEnd);
  17402. });
  17403. }
  17404. function resizablePanel(panel) {
  17405. var app = panel.app;
  17406. if (panel.resizableInitialized) { return; }
  17407. Utils.extend(panel, {
  17408. resizable: true,
  17409. resizableWidth: null,
  17410. resizableInitialized: true,
  17411. });
  17412. var $htmlEl = $('html');
  17413. var $el = panel.$el;
  17414. var $backdropEl = panel.$backdropEl;
  17415. var side = panel.side;
  17416. var effect = panel.effect;
  17417. if (!$el) { return; }
  17418. var isTouched;
  17419. var isMoved;
  17420. var touchesStart = {};
  17421. var touchesDiff;
  17422. var panelWidth;
  17423. var $viewEl;
  17424. var panelMinWidth;
  17425. var panelMaxWidth;
  17426. var visibleByBreakpoint;
  17427. function transformCSSWidth(v) {
  17428. if (!v) { return null; }
  17429. if (v.indexOf('%') >= 0 || v.indexOf('vw') >= 0) {
  17430. return parseInt(v, 10) / 100 * app.width;
  17431. }
  17432. var newV = parseInt(v, 10);
  17433. if (Number.isNaN(newV)) { return null; }
  17434. return newV;
  17435. }
  17436. function isResizable() {
  17437. return panel.resizable && $el.hasClass('panel-resizable');
  17438. }
  17439. function handleTouchStart(e) {
  17440. if (!isResizable()) { return; }
  17441. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  17442. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  17443. isMoved = false;
  17444. isTouched = true;
  17445. panelMinWidth = transformCSSWidth($el.css('min-width'));
  17446. panelMaxWidth = transformCSSWidth($el.css('max-width'));
  17447. visibleByBreakpoint = $el.hasClass('panel-in-breakpoint');
  17448. }
  17449. function handleTouchMove(e) {
  17450. if (!isTouched) { return; }
  17451. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  17452. if (!isMoved) {
  17453. panelWidth = $el[0].offsetWidth;
  17454. $el.transition(0);
  17455. $el.addClass('panel-resizing');
  17456. $htmlEl.css('cursor', 'col-resize');
  17457. if (effect === 'reveal' || visibleByBreakpoint) {
  17458. $viewEl = $(panel.getViewEl());
  17459. }
  17460. if (effect === 'reveal' && !visibleByBreakpoint) {
  17461. $backdropEl.transition(0);
  17462. $viewEl.transition(0);
  17463. }
  17464. }
  17465. isMoved = true;
  17466. e.preventDefault();
  17467. touchesDiff = (pageX - touchesStart.x);
  17468. var newPanelWidth = side === 'left' ? panelWidth + touchesDiff : panelWidth - touchesDiff;
  17469. if (panelMinWidth && !Number.isNaN(panelMinWidth)) {
  17470. newPanelWidth = Math.max(newPanelWidth, panelMinWidth);
  17471. }
  17472. if (panelMaxWidth && !Number.isNaN(panelMaxWidth)) {
  17473. newPanelWidth = Math.min(newPanelWidth, panelMaxWidth);
  17474. }
  17475. newPanelWidth = Math.min(Math.max(newPanelWidth, 0), app.width);
  17476. panel.resizableWidth = newPanelWidth;
  17477. $el[0].style.width = newPanelWidth + "px";
  17478. if (effect === 'reveal' && !visibleByBreakpoint) {
  17479. if ($viewEl) {
  17480. $viewEl.transform(("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)"));
  17481. }
  17482. if ($backdropEl) {
  17483. $backdropEl.transform(("translate3d(" + (side === 'left' ? newPanelWidth : -newPanelWidth) + "px, 0, 0)"));
  17484. }
  17485. } else if (visibleByBreakpoint && $viewEl) {
  17486. $viewEl.css(("margin-" + side), (newPanelWidth + "px"));
  17487. }
  17488. $el.trigger('panel:resize', newPanelWidth);
  17489. panel.emit('local::resize panelResize', panel, newPanelWidth);
  17490. }
  17491. function handleTouchEnd() {
  17492. $('html').css('cursor', '');
  17493. if (!isTouched || !isMoved) {
  17494. isTouched = false;
  17495. isMoved = false;
  17496. return;
  17497. }
  17498. isTouched = false;
  17499. isMoved = false;
  17500. $htmlEl[0].style.setProperty(("--f7-panel-" + side + "-width"), ((panel.resizableWidth) + "px"));
  17501. $el[0].style.width = '';
  17502. if (effect === 'reveal' && !visibleByBreakpoint) {
  17503. $viewEl.transform('');
  17504. $backdropEl.transform('');
  17505. }
  17506. $el.removeClass('panel-resizing');
  17507. Utils.nextFrame(function () {
  17508. $el.transition('');
  17509. if (effect === 'reveal') {
  17510. $backdropEl.transition('');
  17511. if ($viewEl) { $viewEl.transition(''); }
  17512. }
  17513. });
  17514. }
  17515. function handleResize() {
  17516. if (!panel.opened || !panel.resizableWidth) { return; }
  17517. panelMinWidth = transformCSSWidth($el.css('min-width'));
  17518. panelMaxWidth = transformCSSWidth($el.css('max-width'));
  17519. if (panelMinWidth && !Number.isNaN(panelMinWidth) && panel.resizableWidth < panelMinWidth) {
  17520. panel.resizableWidth = Math.max(panel.resizableWidth, panelMinWidth);
  17521. }
  17522. if (panelMaxWidth && !Number.isNaN(panelMaxWidth) && panel.resizableWidth > panelMaxWidth) {
  17523. panel.resizableWidth = Math.min(panel.resizableWidth, panelMaxWidth);
  17524. }
  17525. panel.resizableWidth = Math.min(Math.max(panel.resizableWidth, 0), app.width);
  17526. $htmlEl[0].style.setProperty(("--f7-panel-" + side + "-width"), ((panel.resizableWidth) + "px"));
  17527. }
  17528. if (panel.$el.find('.panel-resize-handler').length === 0) {
  17529. panel.$el.append('<div class="panel-resize-handler"></div>');
  17530. }
  17531. panel.$resizeHandlerEl = panel.$el.children('.panel-resize-handler');
  17532. $el.addClass('panel-resizable');
  17533. // Add Events
  17534. var passive = Support.passiveListener ? { passive: true } : false;
  17535. panel.$el.on(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
  17536. app.on('touchmove:active', handleTouchMove);
  17537. app.on('touchend:passive', handleTouchEnd);
  17538. app.on('resize', handleResize);
  17539. panel.on('beforeOpen', handleResize);
  17540. panel.once('panelDestroy', function () {
  17541. $el.removeClass('panel-resizable');
  17542. panel.$resizeHandlerEl.remove();
  17543. panel.$el.off(app.touchEvents.start, '.panel-resize-handler', handleTouchStart, passive);
  17544. app.off('touchmove:active', handleTouchMove);
  17545. app.off('touchend:passive', handleTouchEnd);
  17546. app.off('resize', handleResize);
  17547. panel.off('beforeOpen', handleResize);
  17548. });
  17549. }
  17550. var Panel = /*@__PURE__*/(function (Framework7Class) {
  17551. function Panel(app, params) {
  17552. if ( params === void 0 ) params = {};
  17553. var extendedParams = Utils.extend(
  17554. { on: {} },
  17555. app.params.panel,
  17556. params
  17557. );
  17558. Framework7Class.call(this, extendedParams, [app]);
  17559. var panel = this;
  17560. panel.params = extendedParams;
  17561. panel.$containerEl = panel.params.containerEl ? $(panel.params.containerEl).eq(0) : app.root;
  17562. panel.containerEl = panel.$containerEl[0];
  17563. var $el;
  17564. if (panel.params.el) {
  17565. $el = $(panel.params.el).eq(0);
  17566. } else if (panel.params.content) {
  17567. $el = $(panel.params.content).filter(function (elIndex, node) { return node.nodeType === 1; }).eq(0);
  17568. }
  17569. if ($el.length === 0) { return panel; }
  17570. if ($el[0].f7Panel) { return $el[0].f7Panel; }
  17571. $el[0].f7Panel = panel;
  17572. var ref = panel.params;
  17573. var side = ref.side;
  17574. var effect = ref.effect;
  17575. var resizable = ref.resizable;
  17576. if (typeof side === 'undefined') { side = $el.hasClass('panel-left') ? 'left' : 'right'; }
  17577. if (typeof effect === 'undefined') { effect = $el.hasClass('panel-cover') ? 'cover' : 'reveal'; }
  17578. if (typeof resizable === 'undefined') { resizable = $el.hasClass('panel-resizable'); }
  17579. var $backdropEl;
  17580. if (panel.params.backdrop && panel.params.backdropEl) {
  17581. $backdropEl = $(panel.params.backdropEl);
  17582. } else if (panel.params.backdrop) {
  17583. $backdropEl = panel.$containerEl.children('.panel-backdrop');
  17584. if ($backdropEl.length === 0) {
  17585. $backdropEl = $('<div class="panel-backdrop"></div>');
  17586. panel.$containerEl.prepend($backdropEl);
  17587. }
  17588. }
  17589. Utils.extend(panel, {
  17590. app: app,
  17591. side: side,
  17592. effect: effect,
  17593. resizable: resizable,
  17594. $el: $el,
  17595. el: $el[0],
  17596. opened: false,
  17597. $backdropEl: $backdropEl,
  17598. backdropEl: $backdropEl && $backdropEl[0],
  17599. });
  17600. // Install Modules
  17601. panel.useModules();
  17602. // Init
  17603. panel.init();
  17604. return panel;
  17605. }
  17606. if ( Framework7Class ) Panel.__proto__ = Framework7Class;
  17607. Panel.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  17608. Panel.prototype.constructor = Panel;
  17609. Panel.prototype.getViewEl = function getViewEl () {
  17610. var panel = this;
  17611. var viewEl;
  17612. if (panel.$containerEl.children('.views').length > 0) {
  17613. viewEl = panel.$containerEl.children('.views')[0];
  17614. } else {
  17615. viewEl = panel.$containerEl.children('.view')[0];
  17616. }
  17617. return viewEl;
  17618. };
  17619. Panel.prototype.enableVisibleBreakpoint = function enableVisibleBreakpoint () {
  17620. var panel = this;
  17621. panel.visibleBreakpointDisabled = false;
  17622. panel.setVisibleBreakpoint();
  17623. return panel;
  17624. };
  17625. Panel.prototype.disableVisibleBreakpoint = function disableVisibleBreakpoint () {
  17626. var panel = this;
  17627. panel.visibleBreakpointDisabled = true;
  17628. panel.setVisibleBreakpoint();
  17629. return panel;
  17630. };
  17631. Panel.prototype.toggleVisibleBreakpoint = function toggleVisibleBreakpoint () {
  17632. var panel = this;
  17633. panel.visibleBreakpointDisabled = !panel.visibleBreakpointDisabled;
  17634. panel.setVisibleBreakpoint();
  17635. return panel;
  17636. };
  17637. Panel.prototype.setVisibleBreakpoint = function setVisibleBreakpoint (emitEvents) {
  17638. var obj, obj$1, obj$2;
  17639. if ( emitEvents === void 0 ) emitEvents = true;
  17640. var panel = this;
  17641. var app = panel.app;
  17642. if (!panel.visibleBreakpointResizeHandler) {
  17643. panel.visibleBreakpointResizeHandler = function visibleBreakpointResizeHandler() {
  17644. panel.setVisibleBreakpoint();
  17645. };
  17646. app.on('resize', panel.visibleBreakpointResizeHandler);
  17647. }
  17648. var side = panel.side;
  17649. var $el = panel.$el;
  17650. var params = panel.params;
  17651. var visibleBreakpointDisabled = panel.visibleBreakpointDisabled;
  17652. var breakpoint = params.visibleBreakpoint;
  17653. var $viewEl = $(panel.getViewEl());
  17654. var wasVisible = $el.hasClass('panel-in-breakpoint');
  17655. if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !visibleBreakpointDisabled) {
  17656. if (!wasVisible) {
  17657. $('html').removeClass(("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel"));
  17658. $el.addClass('panel-in-breakpoint').removeClass('panel-in panel-in-collapsed');
  17659. panel.onOpen(false);
  17660. panel.onOpened();
  17661. $viewEl.css(( obj = {}, obj[("margin-" + side)] = (($el.width()) + "px"), obj ));
  17662. app.allowPanelOpen = true;
  17663. if (emitEvents) {
  17664. panel.emit('local::breakpoint panelBreakpoint', panel);
  17665. panel.$el.trigger('panel:breakpoint');
  17666. }
  17667. } else {
  17668. $viewEl.css(( obj$1 = {}, obj$1[("margin-" + side)] = (($el.width()) + "px"), obj$1 ));
  17669. }
  17670. } else if (wasVisible) {
  17671. $el.removeClass('panel-in-breakpoint panel-in');
  17672. panel.onClose();
  17673. panel.onClosed();
  17674. $viewEl.css(( obj$2 = {}, obj$2[("margin-" + side)] = '', obj$2 ));
  17675. if (emitEvents) {
  17676. panel.emit('local::breakpoint panelBreakpoint', panel);
  17677. panel.$el.trigger('panel:breakpoint');
  17678. }
  17679. }
  17680. };
  17681. Panel.prototype.enableCollapsedBreakpoint = function enableCollapsedBreakpoint () {
  17682. var panel = this;
  17683. panel.collapsedBreakpointDisabled = false;
  17684. panel.setCollapsedBreakpoint();
  17685. return panel;
  17686. };
  17687. Panel.prototype.disableCollapsedBreakpoint = function disableCollapsedBreakpoint () {
  17688. var panel = this;
  17689. panel.collapsedBreakpointDisabled = true;
  17690. panel.setCollapsedBreakpoint();
  17691. return panel;
  17692. };
  17693. Panel.prototype.toggleCollapsedBreakpoint = function toggleCollapsedBreakpoint () {
  17694. var panel = this;
  17695. panel.collapsedBreakpointDisabled = !panel.collapsedBreakpointDisabled;
  17696. panel.setCollapsedBreakpoint();
  17697. return panel;
  17698. };
  17699. Panel.prototype.setCollapsedBreakpoint = function setCollapsedBreakpoint (emitEvents) {
  17700. var panel = this;
  17701. var app = panel.app;
  17702. if (!panel.collapsedBreakpointResizeHandler) {
  17703. panel.collapsedBreakpointResizeHandler = function collapsedBreakpointResizeHandler() {
  17704. panel.setCollapsedBreakpoint();
  17705. };
  17706. app.on('resize', panel.collapsedBreakpointResizeHandler);
  17707. }
  17708. var side = panel.side;
  17709. var $el = panel.$el;
  17710. var params = panel.params;
  17711. var collapsedBreakpointDisabled = panel.collapsedBreakpointDisabled;
  17712. if ($el.hasClass('panel-in-breakpoint')) { return; }
  17713. var breakpoint = params.collapsedBreakpoint;
  17714. var wasVisible = $el.hasClass('panel-in-collapsed');
  17715. if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null && !collapsedBreakpointDisabled) {
  17716. if (!wasVisible) {
  17717. $('html').removeClass(("with-panel-" + side + "-reveal with-panel-" + side + "-cover with-panel"));
  17718. $el.addClass('panel-in-collapsed').removeClass('panel-in');
  17719. panel.collapsed = true;
  17720. app.allowPanelOpen = true;
  17721. if (emitEvents) {
  17722. panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);
  17723. panel.$el.trigger('panel:collapsedbreakpoint');
  17724. }
  17725. }
  17726. } else if (wasVisible) {
  17727. $el.removeClass('panel-in-collapsed panel-in');
  17728. panel.collapsed = false;
  17729. if (emitEvents) {
  17730. panel.emit('local::collapsedBreakpoint panelCollapsedBreakpoint', panel);
  17731. panel.$el.trigger('panel:collapsedbreakpoint');
  17732. }
  17733. }
  17734. };
  17735. Panel.prototype.enableResizable = function enableResizable () {
  17736. var panel = this;
  17737. if (panel.resizableInitialized) {
  17738. panel.resizable = true;
  17739. panel.$el.addClass('panel-resizable');
  17740. } else {
  17741. resizablePanel(panel);
  17742. }
  17743. return panel;
  17744. };
  17745. Panel.prototype.disableResizable = function disableResizable () {
  17746. var panel = this;
  17747. panel.resizable = false;
  17748. panel.$el.removeClass('panel-resizable');
  17749. return panel;
  17750. };
  17751. Panel.prototype.enableSwipe = function enableSwipe () {
  17752. var panel = this;
  17753. if (panel.swipeInitialized) {
  17754. panel.swipeable = true;
  17755. } else {
  17756. swipePanel(panel);
  17757. }
  17758. return panel;
  17759. };
  17760. Panel.prototype.disableSwipe = function disableSwipe () {
  17761. var panel = this;
  17762. panel.swipeable = false;
  17763. return panel;
  17764. };
  17765. Panel.prototype.onOpen = function onOpen (modifyHtmlClasses) {
  17766. if ( modifyHtmlClasses === void 0 ) modifyHtmlClasses = true;
  17767. var panel = this;
  17768. var app = panel.app;
  17769. panel.opened = true;
  17770. app.panel.allowOpen = false;
  17771. panel.$el.trigger('panel:beforeopen');
  17772. panel.emit('local::beforeOpen panelBeforeOpen', panel);
  17773. if (modifyHtmlClasses) {
  17774. $('html').addClass(("with-panel with-panel-" + (panel.side) + "-" + (panel.effect)));
  17775. }
  17776. panel.$el.trigger('panel:open');
  17777. panel.emit('local::open panelOpen', panel);
  17778. };
  17779. Panel.prototype.onOpened = function onOpened () {
  17780. var panel = this;
  17781. var app = panel.app;
  17782. app.panel.allowOpen = true;
  17783. panel.$el.trigger('panel:opened');
  17784. panel.emit('local::opened panelOpened', panel);
  17785. };
  17786. Panel.prototype.onClose = function onClose () {
  17787. var panel = this;
  17788. var app = panel.app;
  17789. panel.opened = false;
  17790. app.panel.allowOpen = false;
  17791. panel.$el.trigger('panel:beforeclose');
  17792. panel.emit('local::beforeClose panelBeforeClose', panel);
  17793. $('html').addClass('with-panel-closing');
  17794. $('html').removeClass(("with-panel with-panel-" + (panel.side) + "-" + (panel.effect)));
  17795. panel.$el.trigger('panel:close');
  17796. panel.emit('local::close panelClose', panel);
  17797. };
  17798. Panel.prototype.onClosed = function onClosed () {
  17799. var panel = this;
  17800. var app = panel.app;
  17801. app.panel.allowOpen = true;
  17802. $('html').removeClass('with-panel-closing');
  17803. panel.$el.removeClass('panel-out');
  17804. if (panel.$backdropEl) {
  17805. var otherPanel = app.panel.get('.panel-in');
  17806. var shouldHideBackdrop = !otherPanel || (otherPanel && !otherPanel.$backdropEl);
  17807. if (shouldHideBackdrop) {
  17808. panel.$backdropEl.removeClass('panel-backdrop-in');
  17809. }
  17810. }
  17811. panel.$el.trigger('panel:closed');
  17812. panel.emit('local::closed panelClosed', panel);
  17813. };
  17814. Panel.prototype.toggle = function toggle (animate) {
  17815. if ( animate === void 0 ) animate = true;
  17816. var panel = this;
  17817. var breakpoint = panel.params.visibleBreakpoint;
  17818. var app = panel.app;
  17819. if (app.width >= breakpoint && typeof breakpoint !== 'undefined' && breakpoint !== null) {
  17820. return panel.toggleVisibleBreakpoint();
  17821. }
  17822. if (panel.opened) { panel.close(animate); }
  17823. else { panel.open(animate); }
  17824. return panel;
  17825. };
  17826. Panel.prototype.insertToRoot = function insertToRoot () {
  17827. var panel = this;
  17828. var $el = panel.$el;
  17829. var $backdropEl = panel.$backdropEl;
  17830. var $containerEl = panel.$containerEl;
  17831. var $panelParentEl = $el.parent();
  17832. var wasInDom = $el.parents(document).length > 0;
  17833. if (!$panelParentEl.is($containerEl) || $el.prevAll('.views, .view').length) {
  17834. var $insertBeforeEl = $containerEl.children('.panel, .views, .view').eq(0);
  17835. var $insertAfterEl = $containerEl.children('.panel-backdrop').eq(0);
  17836. if ($insertBeforeEl.length) {
  17837. $el.insertBefore($insertBeforeEl);
  17838. } else if ($insertAfterEl) {
  17839. $el.insertBefore($insertAfterEl);
  17840. } else {
  17841. $containerEl.prepend($el);
  17842. }
  17843. if ($backdropEl
  17844. && $backdropEl.length
  17845. && (
  17846. (
  17847. !$backdropEl.parent().is($containerEl)
  17848. && $backdropEl.nextAll('.panel').length === 0
  17849. )
  17850. || (
  17851. $backdropEl.parent().is($containerEl)
  17852. && $backdropEl.nextAll('.panel').length === 0
  17853. )
  17854. )
  17855. ) {
  17856. $backdropEl.insertBefore($el);
  17857. }
  17858. panel.once('panelClosed', function () {
  17859. if (wasInDom) {
  17860. $panelParentEl.append($el);
  17861. } else {
  17862. $el.remove();
  17863. }
  17864. });
  17865. }
  17866. };
  17867. Panel.prototype.open = function open (animate) {
  17868. if ( animate === void 0 ) animate = true;
  17869. var panel = this;
  17870. var app = panel.app;
  17871. if (!app.panel.allowOpen) { return false; }
  17872. var effect = panel.effect;
  17873. var $el = panel.$el;
  17874. var $backdropEl = panel.$backdropEl;
  17875. var opened = panel.opened;
  17876. if (!$el || $el.hasClass('panel-in')) {
  17877. return panel;
  17878. }
  17879. panel.insertToRoot();
  17880. // Ignore if opened
  17881. if (opened || $el.hasClass('panel-in-breakpoint') || $el.hasClass('panel-in')) { return false; }
  17882. // Close if some panel is opened
  17883. var otherOpenedPanel = app.panel.get('.panel-in');
  17884. if (otherOpenedPanel && otherOpenedPanel !== panel) {
  17885. otherOpenedPanel.close(animate);
  17886. }
  17887. $el[animate ? 'removeClass' : 'addClass']('not-animated');
  17888. $el.addClass('panel-in');
  17889. if ($backdropEl) {
  17890. $backdropEl.addClass('panel-backdrop-in');
  17891. $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
  17892. }
  17893. if (panel.effect === 'cover') {
  17894. /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
  17895. panel._clientLeft = $el[0].clientLeft;
  17896. }
  17897. // Transitionend
  17898. var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
  17899. function panelTransitionEnd() {
  17900. transitionEndTarget.transitionEnd(function (e) {
  17901. if ($(e.target).is(transitionEndTarget)) {
  17902. if ($el.hasClass('panel-out')) {
  17903. panel.onClosed();
  17904. } else {
  17905. panel.onOpened();
  17906. }
  17907. } else { panelTransitionEnd(); }
  17908. });
  17909. }
  17910. if (animate) {
  17911. if ($backdropEl) {
  17912. $backdropEl.removeClass('not-animated');
  17913. }
  17914. panelTransitionEnd();
  17915. $el
  17916. .removeClass('panel-out not-animated')
  17917. .addClass('panel-in');
  17918. panel.onOpen();
  17919. } else {
  17920. if ($backdropEl) {
  17921. $backdropEl.addClass('not-animated');
  17922. }
  17923. $el.removeClass('panel-out').addClass('panel-in not-animated');
  17924. panel.onOpen();
  17925. panel.onOpened();
  17926. }
  17927. return true;
  17928. };
  17929. Panel.prototype.close = function close (animate) {
  17930. if ( animate === void 0 ) animate = true;
  17931. var panel = this;
  17932. var effect = panel.effect;
  17933. var $el = panel.$el;
  17934. var $backdropEl = panel.$backdropEl;
  17935. var opened = panel.opened;
  17936. if (!opened || $el.hasClass('panel-in-breakpoint') || !$el.hasClass('panel-in')) { return panel; }
  17937. $el[animate ? 'removeClass' : 'addClass']('not-animated');
  17938. if ($backdropEl) {
  17939. $backdropEl[animate ? 'removeClass' : 'addClass']('not-animated');
  17940. }
  17941. var transitionEndTarget = effect === 'reveal' ? $el.nextAll('.view, .views').eq(0) : $el;
  17942. function transitionEnd() {
  17943. if ($el.hasClass('panel-out')) {
  17944. panel.onClosed();
  17945. } else if ($el.hasClass('panel-in')) {
  17946. panel.onOpened();
  17947. }
  17948. $('html').removeClass('with-panel-closing');
  17949. }
  17950. if (animate) {
  17951. transitionEndTarget
  17952. .transitionEnd(function () {
  17953. transitionEnd();
  17954. });
  17955. $el
  17956. .removeClass('panel-in')
  17957. .addClass('panel-out');
  17958. // Emit close
  17959. panel.onClose();
  17960. } else {
  17961. $el
  17962. .addClass('not-animated')
  17963. .removeClass('panel-in')
  17964. .addClass('panel-out');
  17965. // Emit close
  17966. panel.onClose();
  17967. panel.onClosed();
  17968. }
  17969. return panel;
  17970. };
  17971. Panel.prototype.init = function init () {
  17972. var panel = this;
  17973. // const app = panel.app;
  17974. if (typeof panel.params.visibleBreakpoint !== 'undefined') {
  17975. panel.setVisibleBreakpoint();
  17976. }
  17977. if (typeof panel.params.collapsedBreakpoint !== 'undefined') {
  17978. panel.setCollapsedBreakpoint();
  17979. }
  17980. if (panel.params.swipe) {
  17981. panel.enableSwipe();
  17982. }
  17983. if (panel.resizable) {
  17984. panel.enableResizable();
  17985. }
  17986. };
  17987. Panel.prototype.destroy = function destroy () {
  17988. var obj;
  17989. var panel = this;
  17990. var app = panel.app;
  17991. if (!panel.$el) {
  17992. // Panel already destroyed
  17993. return;
  17994. }
  17995. panel.emit('local::beforeDestroy panelBeforeDestroy', panel);
  17996. panel.$el.trigger('panel:beforedestroy');
  17997. if (panel.visibleBreakpointResizeHandler) {
  17998. app.off('resize', panel.visibleBreakpointResizeHandler);
  17999. }
  18000. if (panel.collapsedBreakpointResizeHandler) {
  18001. app.off('resize', panel.collapsedBreakpointResizeHandler);
  18002. }
  18003. if (panel.$el.hasClass('panel-in-breakpoint') || panel.$el.hasClass('panel-in-collapsed')) {
  18004. var $viewEl = $(panel.getViewEl());
  18005. panel.$el.removeClass('panel-in-breakpoint panel-in-collapsed panel-in');
  18006. $viewEl.css(( obj = {}, obj[("margin-" + (panel.side))] = '', obj ));
  18007. panel.emit('local::breakpoint panelBreakpoint', panel);
  18008. panel.$el.trigger('panel:breakpoint');
  18009. }
  18010. panel.$el.trigger('panel:destroy');
  18011. panel.emit('local::destroy panelDestroy', panel);
  18012. if (panel.el) {
  18013. panel.el.f7Panel = null;
  18014. delete panel.el.f7Panel;
  18015. }
  18016. Utils.deleteProps(panel);
  18017. panel = null;
  18018. };
  18019. return Panel;
  18020. }(Framework7Class));
  18021. var Panel$1 = {
  18022. name: 'panel',
  18023. params: {
  18024. panel: {
  18025. opened: undefined, // default based on panel-in class
  18026. side: undefined, // default based on panel class
  18027. effect: undefined, // default based on panel class
  18028. resizable: undefined, // default based on panel-resizable class
  18029. backdrop: true,
  18030. backdropEl: undefined,
  18031. visibleBreakpoint: undefined,
  18032. collapsedBreakpoint: undefined,
  18033. swipe: false, // or true
  18034. swipeNoFollow: false, // or true
  18035. swipeOnlyClose: false,
  18036. swipeActiveArea: 0,
  18037. swipeThreshold: 0,
  18038. closeByBackdropClick: true,
  18039. containerEl: undefined,
  18040. },
  18041. },
  18042. static: {
  18043. Panel: Panel,
  18044. },
  18045. instance: {
  18046. panel: {
  18047. allowOpen: true,
  18048. },
  18049. },
  18050. create: function create() {
  18051. var app = this;
  18052. Utils.extend(app.panel, {
  18053. create: function create(params) {
  18054. return new Panel(app, params);
  18055. },
  18056. get: function get(el) {
  18057. if ( el === void 0 ) el = '.panel';
  18058. if (el instanceof Panel) { return el; }
  18059. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  18060. var $el = $(el);
  18061. if ($el.length === 0 || $el.length > 1) { return undefined; }
  18062. return $el[0].f7Panel;
  18063. },
  18064. destroy: function destroy(el) {
  18065. if ( el === void 0 ) el = '.panel';
  18066. var panel = app.panel.get(el);
  18067. if (panel && panel.destroy) { return panel.destroy(); }
  18068. return undefined;
  18069. },
  18070. open: function open(el, animate) {
  18071. if ( el === void 0 ) el = '.panel';
  18072. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  18073. var panel = app.panel.get(el);
  18074. if (panel && panel.open) { return panel.open(animate); }
  18075. if (!panel) {
  18076. panel = app.panel.create({ el: el });
  18077. return panel.open(animate);
  18078. }
  18079. return undefined;
  18080. },
  18081. close: function close(el, animate) {
  18082. if ( el === void 0 ) el = '.panel-in';
  18083. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  18084. var panel = app.panel.get(el);
  18085. if (panel && panel.open) { return panel.close(animate); }
  18086. if (!panel) {
  18087. panel = app.panel.create({ el: el });
  18088. return panel.close(animate);
  18089. }
  18090. return undefined;
  18091. },
  18092. toggle: function toggle(el, animate) {
  18093. if ( el === void 0 ) el = '.panel';
  18094. if (el === 'left' || el === 'right') { el = ".panel-" + el; } // eslint-disable-line
  18095. var panel = app.panel.get(el);
  18096. if (panel && panel.toggle) { return panel.toggle(animate); }
  18097. if (!panel) {
  18098. panel = app.panel.create({ el: el });
  18099. return panel.toggle(animate);
  18100. }
  18101. return undefined;
  18102. },
  18103. });
  18104. },
  18105. on: {
  18106. init: function init() {
  18107. var app = this;
  18108. $('.panel-init').each(function (index, panelEl) {
  18109. var params = Object.assign(
  18110. { el: panelEl },
  18111. $(panelEl).dataset() || {}
  18112. );
  18113. app.panel.create(params);
  18114. });
  18115. },
  18116. pageInit: function pageInit(page) {
  18117. var app = this;
  18118. page.$el.find('.panel-init').each(function (index, panelEl) {
  18119. var params = Object.assign(
  18120. { el: panelEl },
  18121. $(panelEl).dataset() || {}
  18122. );
  18123. app.panel.create(params);
  18124. });
  18125. },
  18126. pageBeforeRemove: function pageBeforeRemove(page) {
  18127. var app = this;
  18128. page.$el.find('.panel-init').each(function (index, panelEl) {
  18129. var panel = app.panel.get(panelEl);
  18130. if (panel && panel.destroy) { panel.destroy(); }
  18131. });
  18132. },
  18133. },
  18134. vnode: {
  18135. 'panel-init': {
  18136. insert: function insert(vnode) {
  18137. var app = this;
  18138. var panelEl = vnode.elm;
  18139. var params = Object.assign(
  18140. { el: panelEl },
  18141. $(panelEl).dataset() || {}
  18142. );
  18143. app.panel.create(params);
  18144. },
  18145. destroy: function destroy(vnode) {
  18146. var app = this;
  18147. var panelEl = vnode.elm;
  18148. var panel = app.panel.get(panelEl);
  18149. if (panel && panel.destroy) { panel.destroy(); }
  18150. },
  18151. },
  18152. },
  18153. clicks: {
  18154. '.panel-open': function open(clickedEl, data) {
  18155. if ( data === void 0 ) data = {};
  18156. var app = this;
  18157. app.panel.open(data.panel, data.animate);
  18158. },
  18159. '.panel-close': function close(clickedEl, data) {
  18160. if ( data === void 0 ) data = {};
  18161. var app = this;
  18162. app.panel.close(data.panel, data.animate);
  18163. },
  18164. '.panel-toggle': function close(clickedEl, data) {
  18165. if ( data === void 0 ) data = {};
  18166. var app = this;
  18167. app.panel.toggle(data.panel, data.animate);
  18168. },
  18169. '.panel-backdrop': function close() {
  18170. var app = this;
  18171. var $panelEl = $('.panel-in:not(.panel-out)');
  18172. if (!$panelEl.length) { return; }
  18173. var instance = $panelEl[0] && $panelEl[0].f7Panel;
  18174. $panelEl.trigger('panel:backdrop-click');
  18175. if (instance) {
  18176. instance.emit('backdropClick', instance);
  18177. }
  18178. app.emit('panelBackdropClick', instance || $panelEl[0]);
  18179. if (app.params.panel.closeByBackdropClick) { app.panel.close(); }
  18180. },
  18181. },
  18182. };
  18183. /* eslint no-param-reassign: "off" */
  18184. var CardExpandable = {
  18185. open: function open(cardEl, animate) {
  18186. var assign;
  18187. if ( cardEl === void 0 ) cardEl = '.card-expandable';
  18188. if ( animate === void 0 ) animate = true;
  18189. var app = this;
  18190. var $cardEl = $(cardEl).eq(0);
  18191. if (!$cardEl || !$cardEl.length) { return; }
  18192. if ($cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
  18193. var $pageEl = $cardEl.parents('.page').eq(0);
  18194. if (!$pageEl.length) { return; }
  18195. if ($pageEl.find('.card-opened').length) {
  18196. return;
  18197. }
  18198. var prevented;
  18199. function prevent() {
  18200. prevented = true;
  18201. }
  18202. $cardEl.trigger('card:beforeopen', { prevent: prevent });
  18203. app.emit('cardBeforeOpen', $cardEl[0], prevent);
  18204. if (prevented) { return; }
  18205. var cardParams = Object.assign({ animate: animate }, app.params.card, $cardEl.dataset());
  18206. var $pageContentEl = $cardEl.parents('.page-content');
  18207. var $backdropEl;
  18208. if ($cardEl.attr('data-backdrop-el')) {
  18209. $backdropEl = $($cardEl.attr('data-backdrop-el'));
  18210. }
  18211. if (!$backdropEl && cardParams.backdrop) {
  18212. $backdropEl = $pageContentEl.find('.card-backdrop');
  18213. if (!$backdropEl.length) {
  18214. $backdropEl = $('<div class="card-backdrop"></div>');
  18215. $pageContentEl.append($backdropEl);
  18216. }
  18217. }
  18218. var $navbarEl;
  18219. var $toolbarEl;
  18220. if (cardParams.hideNavbarOnOpen) {
  18221. $navbarEl = $pageEl.children('.navbar');
  18222. if (!$navbarEl.length) {
  18223. if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
  18224. }
  18225. }
  18226. if (cardParams.hideToolbarOnOpen) {
  18227. $toolbarEl = $pageEl.children('.toolbar');
  18228. if (!$toolbarEl.length) {
  18229. $toolbarEl = $pageEl.parents('.view').children('.toolbar');
  18230. }
  18231. if (!$toolbarEl.length) {
  18232. $toolbarEl = $pageEl.parents('.views').children('.toolbar');
  18233. }
  18234. }
  18235. var currTransform = $cardEl.css('transform');
  18236. var hasTransform;
  18237. if (currTransform && currTransform.match(/[2-9]/)) {
  18238. hasTransform = true;
  18239. }
  18240. var $cardContentEl = $cardEl.children('.card-content');
  18241. var $cardSizeEl = $(document.createElement('div')).addClass('card-expandable-size');
  18242. $cardEl.append($cardSizeEl);
  18243. var cardWidth = $cardEl[0].offsetWidth;
  18244. var cardHeight = $cardEl[0].offsetHeight;
  18245. var pageWidth = $pageEl[0].offsetWidth;
  18246. var pageHeight = $pageEl[0].offsetHeight;
  18247. var maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
  18248. var maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
  18249. var statusbarHeight;
  18250. if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {
  18251. statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);
  18252. if (Number.isNaN(statusbarHeight)) { statusbarHeight = 0; }
  18253. }
  18254. if (statusbarHeight) {
  18255. maxHeight -= statusbarHeight;
  18256. }
  18257. var scaleX = maxWidth / cardWidth;
  18258. var scaleY = maxHeight / cardHeight;
  18259. var offset = $cardEl.offset();
  18260. var pageOffset = $pageEl.offset();
  18261. if (statusbarHeight) {
  18262. pageOffset.top += statusbarHeight / 2;
  18263. }
  18264. offset.left -= pageOffset.left;
  18265. var cardLeftOffset;
  18266. var cardTopOffset;
  18267. if (hasTransform) {
  18268. var transformValues = currTransform
  18269. .replace(/matrix\(|\)/g, '')
  18270. .split(',')
  18271. .map(function (el) { return el.trim(); });
  18272. if (transformValues && transformValues.length > 1) {
  18273. var scale = parseFloat(transformValues[0]);
  18274. cardLeftOffset = offset.left - cardWidth * (1 - scale) / 2;
  18275. cardTopOffset = offset.top - pageOffset.top - cardHeight * (1 - scale) / 2;
  18276. if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
  18277. } else {
  18278. cardLeftOffset = $cardEl[0].offsetLeft;
  18279. cardTopOffset = $cardEl[0].offsetTop - ($pageContentEl.length ? $pageContentEl[0].scrollTop : 0);
  18280. }
  18281. } else {
  18282. cardLeftOffset = offset.left;
  18283. cardTopOffset = offset.top - pageOffset.top;
  18284. if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
  18285. }
  18286. cardLeftOffset -= (pageWidth - maxWidth) / 2;
  18287. cardTopOffset -= (pageHeight - maxHeight) / 2;
  18288. var cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
  18289. if (app.rtl) {
  18290. (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
  18291. }
  18292. var cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
  18293. var translateX = (cardRightOffset - cardLeftOffset) / 2;
  18294. var translateY = (cardBottomOffset - cardTopOffset) / 2;
  18295. if (cardParams.hideNavbarOnOpen && $navbarEl && $navbarEl.length) {
  18296. if ($navbarEl.closest('.navbar-hidden').length) {
  18297. // Was hidden
  18298. $cardEl[0].f7KeepNavbarOnClose = true;
  18299. } else {
  18300. delete $cardEl[0].f7KeepNavbarOnClose;
  18301. app.navbar.hide($navbarEl, cardParams.animate, cardParams.hideStatusbarOnOpen);
  18302. }
  18303. }
  18304. if (cardParams.hideToolbarOnOpen && $toolbarEl && $toolbarEl.length) {
  18305. if ($toolbarEl.closest('.toolbar-hidden').length) {
  18306. // Was hidden
  18307. $cardEl[0].f7KeepToolbarOnClose = true;
  18308. } else {
  18309. delete $cardEl[0].f7KeepToolbarOnClose;
  18310. app.toolbar.hide($toolbarEl, cardParams.animate);
  18311. }
  18312. }
  18313. if ($backdropEl) {
  18314. $backdropEl.removeClass('card-backdrop-out').addClass('card-backdrop-in');
  18315. }
  18316. $cardEl.removeClass('card-transitioning');
  18317. if (cardParams.animate) {
  18318. $cardEl.addClass('card-opening');
  18319. }
  18320. $cardEl.trigger('card:open');
  18321. app.emit('cardOpen', $cardEl[0]);
  18322. function transitionEnd() {
  18323. $pageEl.addClass('page-with-card-opened');
  18324. if (app.device.ios && $pageContentEl.length) {
  18325. $pageContentEl.css('height', (($pageContentEl[0].offsetHeight + 1) + "px"));
  18326. setTimeout(function () {
  18327. $pageContentEl.css('height', '');
  18328. });
  18329. }
  18330. $cardEl.addClass('card-opened');
  18331. $cardEl.removeClass('card-opening');
  18332. $cardEl.trigger('card:opened');
  18333. app.emit('cardOpened', $cardEl[0], $pageEl[0]);
  18334. }
  18335. $cardContentEl
  18336. .css({
  18337. width: (maxWidth + "px"),
  18338. height: (maxHeight + "px"),
  18339. })
  18340. .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  18341. $cardEl
  18342. .transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
  18343. if (cardParams.animate) {
  18344. $cardEl.transitionEnd(function () {
  18345. transitionEnd();
  18346. });
  18347. } else {
  18348. transitionEnd();
  18349. }
  18350. function onResize() {
  18351. var assign;
  18352. $cardEl.removeClass('card-transitioning');
  18353. cardWidth = $cardEl[0].offsetWidth;
  18354. cardHeight = $cardEl[0].offsetHeight;
  18355. pageWidth = $pageEl[0].offsetWidth;
  18356. pageHeight = $pageEl[0].offsetHeight;
  18357. maxWidth = $cardSizeEl[0].offsetWidth || pageWidth;
  18358. maxHeight = $cardSizeEl[0].offsetHeight || pageHeight;
  18359. statusbarHeight = 0;
  18360. if ($navbarEl && !cardParams.hideStatusbarOnOpen && maxHeight === pageHeight) {
  18361. statusbarHeight = parseInt($navbarEl.css('--f7-safe-area-top'), 10);
  18362. if (Number.isNaN(statusbarHeight)) { statusbarHeight = 0; }
  18363. }
  18364. if (statusbarHeight) {
  18365. maxHeight -= statusbarHeight;
  18366. }
  18367. scaleX = maxWidth / cardWidth;
  18368. scaleY = maxHeight / cardHeight;
  18369. $cardEl.transform('translate3d(0px, 0px, 0) scale(1)');
  18370. offset = $cardEl.offset();
  18371. pageOffset = $pageEl.offset();
  18372. if (statusbarHeight) {
  18373. pageOffset.top += statusbarHeight / 2;
  18374. }
  18375. offset.left -= pageOffset.left;
  18376. offset.top -= pageOffset.top;
  18377. cardLeftOffset = offset.left - (pageWidth - maxWidth) / 2;
  18378. if (app.rtl) { cardLeftOffset -= $cardEl[0].scrollLeft; }
  18379. cardTopOffset = offset.top - (pageHeight - maxHeight) / 2;
  18380. cardRightOffset = maxWidth - cardWidth - cardLeftOffset;
  18381. cardBottomOffset = maxHeight - cardHeight - cardTopOffset;
  18382. if (app.rtl) {
  18383. (assign = [cardRightOffset, cardLeftOffset], cardLeftOffset = assign[0], cardRightOffset = assign[1]);
  18384. }
  18385. translateX = (cardRightOffset - cardLeftOffset) / 2;
  18386. translateY = (cardBottomOffset - cardTopOffset) / 2;
  18387. $cardEl.transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
  18388. $cardContentEl
  18389. .css({
  18390. width: (maxWidth + "px"),
  18391. height: (maxHeight + "px"),
  18392. })
  18393. .transform(("translate3d(" + (app.rtl ? (cardLeftOffset + translateX) : (-cardLeftOffset - translateX)) + "px, 0px, 0) scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  18394. }
  18395. var cardScrollTop;
  18396. var isTouched;
  18397. var isMoved;
  18398. var touchStartX;
  18399. var touchStartY;
  18400. var touchEndX;
  18401. var touchEndY;
  18402. var isScrolling;
  18403. var progress;
  18404. var isV;
  18405. var isH;
  18406. var $cardScrollableEl;
  18407. function onTouchStart(e) {
  18408. if (!$(e.target).closest($cardEl).length) { return; }
  18409. if (!$cardEl.hasClass('card-opened')) { return; }
  18410. $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);
  18411. if ($cardScrollableEl[0]
  18412. && $cardScrollableEl[0] !== $cardContentEl[0]
  18413. && !$cardScrollableEl[0].contains(e.target)
  18414. ) {
  18415. cardScrollTop = 0;
  18416. } else {
  18417. cardScrollTop = $cardScrollableEl.scrollTop();
  18418. }
  18419. isTouched = true;
  18420. touchStartX = e.targetTouches[0].pageX;
  18421. touchStartY = e.targetTouches[0].pageY;
  18422. isScrolling = undefined;
  18423. isV = false;
  18424. isH = false;
  18425. }
  18426. function onTouchMove(e) {
  18427. if (!isTouched) { return; }
  18428. touchEndX = e.targetTouches[0].pageX;
  18429. touchEndY = e.targetTouches[0].pageY;
  18430. if (typeof isScrolling === 'undefined') {
  18431. isScrolling = !!(isScrolling || Math.abs(touchEndY - touchStartY) > Math.abs(touchEndX - touchStartX));
  18432. }
  18433. if (!isH && !isV) {
  18434. if (!isScrolling && e.targetTouches[0].clientX <= 50) {
  18435. isH = true;
  18436. } else {
  18437. isV = true;
  18438. }
  18439. }
  18440. if (!(isH || isV) || (isV && cardScrollTop !== 0)) {
  18441. isTouched = true;
  18442. isMoved = true;
  18443. return;
  18444. }
  18445. if (!isMoved) {
  18446. $cardEl.removeClass('card-transitioning');
  18447. }
  18448. isMoved = true;
  18449. progress = isV ? Math.max((touchEndY - touchStartY) / 150, 0) : Math.max((touchEndX - touchStartX) / (cardWidth / 2), 0);
  18450. if ((progress > 0 && isV) || isH) {
  18451. if (isV && app.device.ios && $cardScrollableEl[0] === $cardContentEl[0]) {
  18452. $cardScrollableEl.css('-webkit-overflow-scrolling', 'auto');
  18453. $cardScrollableEl.scrollTop(0);
  18454. }
  18455. e.preventDefault();
  18456. }
  18457. if (progress > 1) { progress = Math.pow( progress, 0.3 ); }
  18458. if (progress > (isV ? 1.3 : 1.1)) {
  18459. isTouched = false;
  18460. isMoved = false;
  18461. app.card.close($cardEl);
  18462. } else {
  18463. $cardEl.transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + (scaleX * (1 - progress * 0.2)) + ", " + (scaleY * (1 - progress * 0.2)) + ")"));
  18464. }
  18465. }
  18466. function onTouchEnd() {
  18467. if (!isTouched || !isMoved) { return; }
  18468. isTouched = false;
  18469. isMoved = false;
  18470. if (app.device.ios) {
  18471. $cardScrollableEl.css('-webkit-overflow-scrolling', '');
  18472. }
  18473. if (progress >= 0.8) {
  18474. app.card.close($cardEl);
  18475. } else {
  18476. $cardEl
  18477. .addClass('card-transitioning')
  18478. .transform(("translate3d(" + (app.rtl ? -translateX : translateX) + "px, " + translateY + "px, 0) scale(" + scaleX + ", " + scaleY + ")"));
  18479. }
  18480. }
  18481. $cardEl[0].detachEventHandlers = function detachEventHandlers() {
  18482. app.off('resize', onResize);
  18483. if (Support.touch && cardParams.swipeToClose) {
  18484. app.off('touchstart:passive', onTouchStart);
  18485. app.off('touchmove:active', onTouchMove);
  18486. app.off('touchend:passive', onTouchEnd);
  18487. }
  18488. };
  18489. app.on('resize', onResize);
  18490. if (Support.touch && cardParams.swipeToClose) {
  18491. app.on('touchstart:passive', onTouchStart);
  18492. app.on('touchmove:active', onTouchMove);
  18493. app.on('touchend:passive', onTouchEnd);
  18494. }
  18495. },
  18496. close: function close(cardEl, animate) {
  18497. if ( cardEl === void 0 ) cardEl = '.card-expandable.card-opened';
  18498. if ( animate === void 0 ) animate = true;
  18499. var app = this;
  18500. var $cardEl = $(cardEl).eq(0);
  18501. if (!$cardEl || !$cardEl.length) { return; }
  18502. if (!$cardEl.hasClass('card-opened') || $cardEl.hasClass('card-opening') || $cardEl.hasClass('card-closing')) { return; }
  18503. var $cardContentEl = $cardEl.children('.card-content');
  18504. var $pageContentEl = $cardEl.parents('.page-content');
  18505. var $pageEl = $cardEl.parents('.page').eq(0);
  18506. if (!$pageEl.length) { return; }
  18507. var cardParams = Object.assign({ animate: animate }, app.params.card, $cardEl.dataset());
  18508. var $cardScrollableEl = $cardEl.find(cardParams.scrollableEl);
  18509. var $navbarEl;
  18510. var $toolbarEl;
  18511. var $backdropEl;
  18512. if ($cardEl.attr('data-backdrop-el')) {
  18513. $backdropEl = $($cardEl.attr('data-backdrop-el'));
  18514. }
  18515. if (cardParams.backdrop) {
  18516. $backdropEl = $cardEl.parents('.page-content').find('.card-backdrop');
  18517. }
  18518. if (cardParams.hideNavbarOnOpen) {
  18519. $navbarEl = $pageEl.children('.navbar');
  18520. if (!$navbarEl.length) {
  18521. if ($pageEl[0].f7Page) { $navbarEl = $pageEl[0].f7Page.$navbarEl; }
  18522. }
  18523. if ($navbarEl && $navbarEl.length && !$cardEl[0].f7KeepNavbarOnClose) {
  18524. app.navbar.show($navbarEl, cardParams.animate);
  18525. }
  18526. }
  18527. if (cardParams.hideToolbarOnOpen) {
  18528. $toolbarEl = $pageEl.children('.toolbar');
  18529. if (!$toolbarEl.length) {
  18530. $toolbarEl = $pageEl.parents('.view').children('.toolbar');
  18531. }
  18532. if (!$toolbarEl.length) {
  18533. $toolbarEl = $pageEl.parents('.views').children('.toolbar');
  18534. }
  18535. if ($toolbarEl && $toolbarEl.length && !$cardEl[0].f7KeepToolbarOnClose) {
  18536. app.toolbar.show($toolbarEl, cardParams.animate);
  18537. }
  18538. }
  18539. $pageEl.removeClass('page-with-card-opened');
  18540. if (app.device.ios && $pageContentEl.length) {
  18541. $pageContentEl.css('height', (($pageContentEl[0].offsetHeight + 1) + "px"));
  18542. setTimeout(function () {
  18543. $pageContentEl.css('height', '');
  18544. });
  18545. }
  18546. if ($backdropEl && $backdropEl.length) {
  18547. $backdropEl.removeClass('card-backdrop-in').addClass('card-backdrop-out');
  18548. }
  18549. $cardEl.removeClass('card-opened card-transitioning');
  18550. if (cardParams.animate) {
  18551. $cardEl.addClass('card-closing');
  18552. } else {
  18553. $cardEl.addClass('card-no-transition');
  18554. }
  18555. $cardEl.transform('');
  18556. $cardEl.trigger('card:close');
  18557. app.emit('cardClose', $cardEl[0], $pageEl[0]);
  18558. var animateWidth = $cardEl.hasClass('card-expandable-animate-width');
  18559. function transitionEnd() {
  18560. if (!animateWidth) {
  18561. $cardContentEl
  18562. .css({
  18563. width: '',
  18564. height: '',
  18565. });
  18566. }
  18567. if ($backdropEl && $backdropEl.length) {
  18568. $backdropEl.removeClass('card-backdrop-in card-backdrop-out');
  18569. }
  18570. $cardEl.removeClass('card-closing card-no-transition');
  18571. $cardEl.trigger('card:closed');
  18572. $cardEl.find('.card-expandable-size').remove();
  18573. app.emit('cardClosed', $cardEl[0], $pageEl[0]);
  18574. }
  18575. if (animateWidth) {
  18576. $cardContentEl
  18577. .css({
  18578. width: '',
  18579. height: '',
  18580. });
  18581. }
  18582. $cardContentEl
  18583. .transform('')
  18584. .scrollTop(0, animate ? 300 : 0);
  18585. if ($cardScrollableEl.length && $cardScrollableEl[0] !== $cardContentEl[0]) {
  18586. $cardScrollableEl.scrollTop(0, animate ? 300 : 0);
  18587. }
  18588. if (animate) {
  18589. $cardContentEl.transitionEnd(function () {
  18590. transitionEnd();
  18591. });
  18592. } else {
  18593. transitionEnd();
  18594. }
  18595. if ($cardEl[0].detachEventHandlers) {
  18596. $cardEl[0].detachEventHandlers();
  18597. delete $cardEl[0].detachEventHandlers;
  18598. }
  18599. },
  18600. toggle: function toggle(cardEl, animate) {
  18601. if ( cardEl === void 0 ) cardEl = '.card-expandable';
  18602. var app = this;
  18603. var $cardEl = $(cardEl).eq(0);
  18604. if (!$cardEl.length) { return; }
  18605. if ($cardEl.hasClass('card-opened')) {
  18606. app.card.close($cardEl, animate);
  18607. } else {
  18608. app.card.open($cardEl, animate);
  18609. }
  18610. },
  18611. };
  18612. var Card = {
  18613. name: 'card',
  18614. params: {
  18615. card: {
  18616. hideNavbarOnOpen: true,
  18617. hideStatusbarOnOpen: true,
  18618. hideToolbarOnOpen: true,
  18619. scrollableEl: '.card-content',
  18620. swipeToClose: true,
  18621. closeByBackdropClick: true,
  18622. backdrop: true,
  18623. },
  18624. },
  18625. create: function create() {
  18626. var app = this;
  18627. Utils.extend(app, {
  18628. card: {
  18629. open: CardExpandable.open.bind(app),
  18630. close: CardExpandable.close.bind(app),
  18631. toggle: CardExpandable.toggle.bind(app),
  18632. },
  18633. });
  18634. },
  18635. on: {
  18636. pageBeforeIn: function pageBeforeIn(page) {
  18637. var app = this;
  18638. if (app.params.card.hideNavbarOnOpen && page.navbarEl && page.$el.find('.card-opened.card-expandable').length) {
  18639. app.navbar.hide(page.navbarEl, true, app.params.card.hideStatusbarOnOpen);
  18640. }
  18641. if (app.params.card.hideToolbarOnOpen && page.$el.find('.card-opened.card-expandable').length) {
  18642. var $toolbarEl = page.$el.children('.toolbar');
  18643. if (!$toolbarEl.length) {
  18644. $toolbarEl = page.$el.parents('.view').children('.toolbar');
  18645. }
  18646. if (!$toolbarEl.length) {
  18647. $toolbarEl = page.$el.parents('.views').children('.toolbar');
  18648. }
  18649. if ($toolbarEl && $toolbarEl.length) {
  18650. app.toolbar.hide($toolbarEl);
  18651. }
  18652. }
  18653. },
  18654. },
  18655. clicks: {
  18656. '.card-close': function closeCard($clickedEl, data) {
  18657. var app = this;
  18658. app.card.close(data.card, data.animate);
  18659. },
  18660. '.card-open': function closeCard($clickedEl, data) {
  18661. var app = this;
  18662. app.card.open(data.card, data.animate);
  18663. },
  18664. '.card-expandable': function toggleExpandableCard($clickedEl, data, e) {
  18665. var app = this;
  18666. if ($clickedEl.hasClass('card-opened') || $clickedEl.hasClass('card-opening') || $clickedEl.hasClass('card-closing')) { return; }
  18667. if ($(e.target).closest('.card-prevent-open, .card-close').length) { return; }
  18668. app.card.open($clickedEl);
  18669. },
  18670. '.card-backdrop-in': function onBackdropClick() {
  18671. var app = this;
  18672. var needToClose = false;
  18673. if (app.params.card.closeByBackdropClick) { needToClose = true; }
  18674. var $openedCardEl = $('.card-opened');
  18675. if (!$openedCardEl.length) { return; }
  18676. if ($openedCardEl.attr('data-close-by-backdrop-click') === 'true') {
  18677. needToClose = true;
  18678. } else if ($openedCardEl.attr('data-close-by-backdrop-click') === 'false') {
  18679. needToClose = false;
  18680. }
  18681. if (needToClose) { app.card.close($openedCardEl); }
  18682. },
  18683. },
  18684. };
  18685. var Chip = {
  18686. name: 'chip',
  18687. };
  18688. // Form Data
  18689. var FormData$1 = {
  18690. store: function store(form, data) {
  18691. var app = this;
  18692. var formId = form;
  18693. var $formEl = $(form);
  18694. if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
  18695. formId = $formEl.attr('id');
  18696. }
  18697. // Store form data in app.formsData
  18698. app.form.data[("form-" + formId)] = data;
  18699. // Store form data in local storage also
  18700. win.localStorage[("f7form-" + formId)] = JSON.stringify(data);
  18701. },
  18702. get: function get(form) {
  18703. var app = this;
  18704. var formId = form;
  18705. var $formEl = $(form);
  18706. if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
  18707. formId = $formEl.attr('id');
  18708. }
  18709. if (win.localStorage[("f7form-" + formId)]) {
  18710. return JSON.parse(win.localStorage[("f7form-" + formId)]);
  18711. }
  18712. if (app.form.data[("form-" + formId)]) {
  18713. return app.form.data[("form-" + formId)];
  18714. }
  18715. return undefined;
  18716. },
  18717. remove: function remove(form) {
  18718. var app = this;
  18719. var formId = form;
  18720. var $formEl = $(form);
  18721. if ($formEl.length && $formEl.is('form') && $formEl.attr('id')) {
  18722. formId = $formEl.attr('id');
  18723. }
  18724. // Delete form data from app.formsData
  18725. if (app.form.data[("form-" + formId)]) {
  18726. app.form.data[("form-" + formId)] = '';
  18727. delete app.form.data[("form-" + formId)];
  18728. }
  18729. // Delete form data from local storage also
  18730. if (win.localStorage[("f7form-" + formId)]) {
  18731. win.localStorage[("f7form-" + formId)] = '';
  18732. win.localStorage.removeItem(("f7form-" + formId));
  18733. }
  18734. },
  18735. };
  18736. // Form Storage
  18737. var FormStorage = {
  18738. init: function init(formEl) {
  18739. var app = this;
  18740. var $formEl = $(formEl);
  18741. var formId = $formEl.attr('id');
  18742. if (!formId) { return; }
  18743. var initialData = app.form.getFormData(formId);
  18744. if (initialData) {
  18745. app.form.fillFromData($formEl, initialData);
  18746. }
  18747. function store() {
  18748. var data = app.form.convertToData($formEl);
  18749. if (!data) { return; }
  18750. app.form.storeFormData(formId, data);
  18751. $formEl.trigger('form:storedata', data);
  18752. app.emit('formStoreData', $formEl[0], data);
  18753. }
  18754. $formEl.on('change submit', store);
  18755. },
  18756. destroy: function destroy(formEl) {
  18757. var $formEl = $(formEl);
  18758. $formEl.off('change submit');
  18759. },
  18760. };
  18761. // Form To/From Data
  18762. function formToData(formEl) {
  18763. var app = this;
  18764. var $formEl = $(formEl).eq(0);
  18765. if ($formEl.length === 0) { return undefined; }
  18766. // Form data
  18767. var data = {};
  18768. // Skip input types
  18769. var skipTypes = ['submit', 'image', 'button', 'file'];
  18770. var skipNames = [];
  18771. $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
  18772. var $inputEl = $(inputEl);
  18773. if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
  18774. return;
  18775. }
  18776. var name = $inputEl.attr('name');
  18777. var type = $inputEl.attr('type');
  18778. var tag = inputEl.nodeName.toLowerCase();
  18779. if (skipTypes.indexOf(type) >= 0) { return; }
  18780. if (skipNames.indexOf(name) >= 0 || !name) { return; }
  18781. if (tag === 'select' && $inputEl.prop('multiple')) {
  18782. skipNames.push(name);
  18783. data[name] = [];
  18784. $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
  18785. if (el.selected) { data[name].push(el.value); }
  18786. });
  18787. } else {
  18788. switch (type) {
  18789. case 'checkbox':
  18790. skipNames.push(name);
  18791. data[name] = [];
  18792. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  18793. if (el.checked) { data[name].push(el.value); }
  18794. });
  18795. break;
  18796. case 'radio':
  18797. skipNames.push(name);
  18798. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  18799. if (el.checked) { data[name] = el.value; }
  18800. });
  18801. break;
  18802. default:
  18803. data[name] = $inputEl.val();
  18804. break;
  18805. }
  18806. }
  18807. });
  18808. $formEl.trigger('form:todata', data);
  18809. app.emit('formToData', $formEl[0], data);
  18810. return data;
  18811. }
  18812. function formFromData(formEl, formData) {
  18813. var app = this;
  18814. var $formEl = $(formEl).eq(0);
  18815. if (!$formEl.length) { return; }
  18816. var data = formData;
  18817. var formId = $formEl.attr('id');
  18818. if (!data && formId) {
  18819. data = app.form.getFormData(formId);
  18820. }
  18821. if (!data) { return; }
  18822. // Skip input types
  18823. var skipTypes = ['submit', 'image', 'button', 'file'];
  18824. var skipNames = [];
  18825. $formEl.find('input, select, textarea').each(function (inputIndex, inputEl) {
  18826. var $inputEl = $(inputEl);
  18827. if ($inputEl.hasClass('ignore-store-data') || $inputEl.hasClass('no-store-data')) {
  18828. return;
  18829. }
  18830. var name = $inputEl.attr('name');
  18831. var type = $inputEl.attr('type');
  18832. var tag = inputEl.nodeName.toLowerCase();
  18833. if (typeof data[name] === 'undefined' || data[name] === null) { return; }
  18834. if (skipTypes.indexOf(type) >= 0) { return; }
  18835. if (skipNames.indexOf(name) >= 0 || !name) { return; }
  18836. if (tag === 'select' && $inputEl.prop('multiple')) {
  18837. skipNames.push(name);
  18838. $formEl.find(("select[name=\"" + name + "\"] option")).each(function (index, el) {
  18839. var selectEl = el;
  18840. if (data[name].indexOf(el.value) >= 0) { selectEl.selected = true; }
  18841. else { selectEl.selected = false; }
  18842. });
  18843. } else {
  18844. switch (type) {
  18845. case 'checkbox':
  18846. skipNames.push(name);
  18847. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  18848. var checkboxEl = el;
  18849. if (data[name].indexOf(el.value) >= 0) { checkboxEl.checked = true; }
  18850. else { checkboxEl.checked = false; }
  18851. });
  18852. break;
  18853. case 'radio':
  18854. skipNames.push(name);
  18855. $formEl.find(("input[name=\"" + name + "\"]")).each(function (index, el) {
  18856. var radioEl = el;
  18857. if (data[name] === el.value) { radioEl.checked = true; }
  18858. else { radioEl.checked = false; }
  18859. });
  18860. break;
  18861. default:
  18862. $inputEl.val(data[name]);
  18863. break;
  18864. }
  18865. }
  18866. if (tag === 'select' || tag === 'input' || tag === 'textarea') {
  18867. $inputEl.trigger('change', 'fromdata');
  18868. }
  18869. });
  18870. $formEl.trigger('form:fromdata', data);
  18871. app.emit('formFromData', $formEl[0], data);
  18872. }
  18873. function initAjaxForm() {
  18874. var app = this;
  18875. function onSubmitChange(e, fromData) {
  18876. var $formEl = $(this);
  18877. if (e.type === 'change' && !$formEl.hasClass('form-ajax-submit-onchange')) { return; }
  18878. if (e.type === 'submit') { e.preventDefault(); }
  18879. if (e.type === 'change' && fromData === 'fromdata') { return; }
  18880. var method = ($formEl.attr('method') || 'GET').toUpperCase();
  18881. var contentType = $formEl.prop('enctype') || $formEl.attr('enctype');
  18882. var url = $formEl.attr('action');
  18883. if (!url) { return; }
  18884. var data;
  18885. if (method === 'POST') {
  18886. if (contentType === 'application/x-www-form-urlencoded') {
  18887. data = app.form.convertToData($formEl[0]);
  18888. } else {
  18889. data = new win.FormData($formEl[0]);
  18890. }
  18891. } else {
  18892. data = Utils.serializeObject(app.form.convertToData($formEl[0]));
  18893. }
  18894. app.request({
  18895. method: method,
  18896. url: url,
  18897. contentType: contentType,
  18898. data: data,
  18899. beforeSend: function beforeSend(xhr) {
  18900. $formEl.trigger('formajax:beforesend', { data: data, xhr: xhr });
  18901. app.emit('formAjaxBeforeSend', $formEl[0], data, xhr);
  18902. },
  18903. error: function error(xhr) {
  18904. $formEl.trigger('formajax:error', { data: data, xhr: xhr });
  18905. app.emit('formAjaxError', $formEl[0], data, xhr);
  18906. },
  18907. complete: function complete(xhr) {
  18908. $formEl.trigger('formajax:complete', { data: data, xhr: xhr });
  18909. app.emit('formAjaxComplete', $formEl[0], data, xhr);
  18910. },
  18911. success: function success(response, status, xhr) {
  18912. $formEl.trigger('formajax:success', { data: data, xhr: xhr });
  18913. app.emit('formAjaxSuccess', $formEl[0], data, xhr);
  18914. },
  18915. });
  18916. }
  18917. $(doc).on('submit change', 'form.form-ajax-submit, form.form-ajax-submit-onchange', onSubmitChange);
  18918. }
  18919. var Form = {
  18920. name: 'form',
  18921. create: function create() {
  18922. var app = this;
  18923. Utils.extend(app, {
  18924. form: {
  18925. data: {},
  18926. storeFormData: FormData$1.store.bind(app),
  18927. getFormData: FormData$1.get.bind(app),
  18928. removeFormData: FormData$1.remove.bind(app),
  18929. convertToData: formToData.bind(app),
  18930. fillFromData: formFromData.bind(app),
  18931. storage: {
  18932. init: FormStorage.init.bind(app),
  18933. destroy: FormStorage.destroy.bind(app),
  18934. },
  18935. },
  18936. });
  18937. },
  18938. on: {
  18939. init: function init() {
  18940. var app = this;
  18941. initAjaxForm.call(app);
  18942. },
  18943. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  18944. var app = this;
  18945. $(tabEl).find('.form-store-data').each(function (index, formEl) {
  18946. app.form.storage.destroy(formEl);
  18947. });
  18948. },
  18949. tabMounted: function tabMounted(tabEl) {
  18950. var app = this;
  18951. $(tabEl).find('.form-store-data').each(function (index, formEl) {
  18952. app.form.storage.init(formEl);
  18953. });
  18954. },
  18955. pageBeforeRemove: function pageBeforeRemove(page) {
  18956. var app = this;
  18957. page.$el.find('.form-store-data').each(function (index, formEl) {
  18958. app.form.storage.destroy(formEl);
  18959. });
  18960. },
  18961. pageInit: function pageInit(page) {
  18962. var app = this;
  18963. page.$el.find('.form-store-data').each(function (index, formEl) {
  18964. app.form.storage.init(formEl);
  18965. });
  18966. },
  18967. },
  18968. };
  18969. var Input = {
  18970. ignoreTypes: ['checkbox', 'button', 'submit', 'range', 'radio', 'image'],
  18971. createTextareaResizableShadow: function createTextareaResizableShadow() {
  18972. var $shadowEl = $(doc.createElement('textarea'));
  18973. $shadowEl.addClass('textarea-resizable-shadow');
  18974. $shadowEl.prop({
  18975. disabled: true,
  18976. readonly: true,
  18977. });
  18978. Input.textareaResizableShadow = $shadowEl;
  18979. },
  18980. textareaResizableShadow: undefined,
  18981. resizeTextarea: function resizeTextarea(textareaEl) {
  18982. var app = this;
  18983. var $textareaEl = $(textareaEl);
  18984. if (!Input.textareaResizableShadow) {
  18985. Input.createTextareaResizableShadow();
  18986. }
  18987. var $shadowEl = Input.textareaResizableShadow;
  18988. if (!$textareaEl.length) { return; }
  18989. if (!$textareaEl.hasClass('resizable')) { return; }
  18990. if (Input.textareaResizableShadow.parents().length === 0) {
  18991. app.root.append($shadowEl);
  18992. }
  18993. var styles = win.getComputedStyle($textareaEl[0]);
  18994. ('padding-top padding-bottom padding-left padding-right margin-left margin-right margin-top margin-bottom width font-size font-family font-style font-weight line-height font-variant text-transform letter-spacing border box-sizing display').split(' ').forEach(function (style) {
  18995. var styleValue = styles[style];
  18996. if (('font-size line-height letter-spacing width').split(' ').indexOf(style) >= 0) {
  18997. styleValue = styleValue.replace(',', '.');
  18998. }
  18999. $shadowEl.css(style, styleValue);
  19000. });
  19001. var currentHeight = $textareaEl[0].clientHeight;
  19002. $shadowEl.val('');
  19003. var initialHeight = $shadowEl[0].scrollHeight;
  19004. $shadowEl.val($textareaEl.val());
  19005. $shadowEl.css('height', 0);
  19006. var scrollHeight = $shadowEl[0].scrollHeight;
  19007. if (currentHeight !== scrollHeight) {
  19008. if (scrollHeight > initialHeight) {
  19009. $textareaEl.css('height', (scrollHeight + "px"));
  19010. } else if (scrollHeight < currentHeight) {
  19011. $textareaEl.css('height', '');
  19012. }
  19013. if (scrollHeight > initialHeight || scrollHeight < currentHeight) {
  19014. $textareaEl.trigger('textarea:resize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
  19015. app.emit('textareaResize', { initialHeight: initialHeight, currentHeight: currentHeight, scrollHeight: scrollHeight });
  19016. }
  19017. }
  19018. },
  19019. validate: function validate(inputEl) {
  19020. var $inputEl = $(inputEl);
  19021. if (!$inputEl.length) { return true; }
  19022. var $itemInputEl = $inputEl.parents('.item-input');
  19023. var $inputWrapEl = $inputEl.parents('.input');
  19024. function unsetReadonly() {
  19025. if ($inputEl[0].f7ValidateReadonly) {
  19026. $inputEl[0].readOnly = false;
  19027. }
  19028. }
  19029. function setReadonly() {
  19030. if ($inputEl[0].f7ValidateReadonly) {
  19031. $inputEl[0].readOnly = true;
  19032. }
  19033. }
  19034. unsetReadonly();
  19035. var validity = $inputEl[0].validity;
  19036. var validationMessage = $inputEl.dataset().errorMessage || $inputEl[0].validationMessage || '';
  19037. if (!validity) {
  19038. setReadonly();
  19039. return true;
  19040. }
  19041. if (!validity.valid) {
  19042. var $errorEl = $inputEl.nextAll('.item-input-error-message, .input-error-message');
  19043. if (validationMessage) {
  19044. if ($errorEl.length === 0) {
  19045. $errorEl = $(("<div class=\"" + ($inputWrapEl.length ? 'input-error-message' : 'item-input-error-message') + "\"></div>"));
  19046. $errorEl.insertAfter($inputEl);
  19047. }
  19048. $errorEl.text(validationMessage);
  19049. }
  19050. if ($errorEl.length > 0) {
  19051. $itemInputEl.addClass('item-input-with-error-message');
  19052. $inputWrapEl.addClass('input-with-error-message');
  19053. }
  19054. $itemInputEl.addClass('item-input-invalid');
  19055. $inputWrapEl.addClass('input-invalid');
  19056. $inputEl.addClass('input-invalid');
  19057. setReadonly();
  19058. return false;
  19059. }
  19060. $itemInputEl.removeClass('item-input-invalid item-input-with-error-message');
  19061. $inputWrapEl.removeClass('input-invalid input-with-error-message');
  19062. $inputEl.removeClass('input-invalid');
  19063. setReadonly();
  19064. return true;
  19065. },
  19066. validateInputs: function validateInputs(el) {
  19067. var app = this;
  19068. var validates = $(el)
  19069. .find('input, textarea, select')
  19070. .toArray()
  19071. .map(function (inputEl) { return app.input.validate(inputEl); });
  19072. return validates.indexOf(false) < 0;
  19073. },
  19074. focus: function focus(inputEl) {
  19075. var $inputEl = $(inputEl);
  19076. var type = $inputEl.attr('type');
  19077. if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
  19078. $inputEl.parents('.item-input').addClass('item-input-focused');
  19079. $inputEl.parents('.input').addClass('input-focused');
  19080. $inputEl.addClass('input-focused');
  19081. },
  19082. blur: function blur(inputEl) {
  19083. var $inputEl = $(inputEl);
  19084. $inputEl.parents('.item-input').removeClass('item-input-focused');
  19085. $inputEl.parents('.input').removeClass('input-focused');
  19086. $inputEl.removeClass('input-focused');
  19087. },
  19088. checkEmptyState: function checkEmptyState(inputEl) {
  19089. var app = this;
  19090. var $inputEl = $(inputEl);
  19091. if (!$inputEl.is('input, select, textarea, .item-input [contenteditable]')) {
  19092. $inputEl = $inputEl.find('input, select, textarea, .item-input [contenteditable]').eq(0);
  19093. }
  19094. if (!$inputEl.length) { return; }
  19095. var isContentEditable = $inputEl[0].hasAttribute('contenteditable');
  19096. var value;
  19097. if (isContentEditable) {
  19098. if ($inputEl.find('.text-editor-placeholder').length) { value = ''; }
  19099. else { value = $inputEl.html(); }
  19100. } else {
  19101. value = $inputEl.val();
  19102. }
  19103. var $itemInputEl = $inputEl.parents('.item-input');
  19104. var $inputWrapEl = $inputEl.parents('.input');
  19105. if ((value && (typeof value === 'string' && value.trim() !== '')) || (Array.isArray(value) && value.length > 0)) {
  19106. $itemInputEl.addClass('item-input-with-value');
  19107. $inputWrapEl.addClass('input-with-value');
  19108. $inputEl.addClass('input-with-value');
  19109. $inputEl.trigger('input:notempty');
  19110. app.emit('inputNotEmpty', $inputEl[0]);
  19111. } else {
  19112. $itemInputEl.removeClass('item-input-with-value');
  19113. $inputWrapEl.removeClass('input-with-value');
  19114. $inputEl.removeClass('input-with-value');
  19115. $inputEl.trigger('input:empty');
  19116. app.emit('inputEmpty', $inputEl[0]);
  19117. }
  19118. },
  19119. scrollIntoView: function scrollIntoView(inputEl, duration, centered, force) {
  19120. if ( duration === void 0 ) duration = 0;
  19121. var $inputEl = $(inputEl);
  19122. var $scrollableEl = $inputEl.parents('.page-content, .panel, .card-expandable .card-content').eq(0);
  19123. if (!$scrollableEl.length) {
  19124. return false;
  19125. }
  19126. var contentHeight = $scrollableEl[0].offsetHeight;
  19127. var contentScrollTop = $scrollableEl[0].scrollTop;
  19128. var contentPaddingTop = parseInt($scrollableEl.css('padding-top'), 10);
  19129. var contentPaddingBottom = parseInt($scrollableEl.css('padding-bottom'), 10);
  19130. var contentOffsetTop = $scrollableEl.offset().top - contentScrollTop;
  19131. var inputOffsetTop = $inputEl.offset().top - contentOffsetTop;
  19132. var inputHeight = $inputEl[0].offsetHeight;
  19133. var min = (inputOffsetTop + contentScrollTop) - contentPaddingTop;
  19134. var max = ((inputOffsetTop + contentScrollTop) - contentHeight) + contentPaddingBottom + inputHeight;
  19135. var centeredPosition = min + ((max - min) / 2);
  19136. if (contentScrollTop > min) {
  19137. $scrollableEl.scrollTop(centered ? centeredPosition : min, duration);
  19138. return true;
  19139. }
  19140. if (contentScrollTop < max) {
  19141. $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
  19142. return true;
  19143. }
  19144. if (force) {
  19145. $scrollableEl.scrollTop(centered ? centeredPosition : max, duration);
  19146. }
  19147. return false;
  19148. },
  19149. init: function init() {
  19150. var app = this;
  19151. Input.createTextareaResizableShadow();
  19152. function onFocus() {
  19153. var inputEl = this;
  19154. if (app.params.input.scrollIntoViewOnFocus) {
  19155. if (Device.android) {
  19156. $(win).once('resize', function () {
  19157. if (doc && doc.activeElement === inputEl) {
  19158. app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
  19159. }
  19160. });
  19161. } else {
  19162. app.input.scrollIntoView(inputEl, app.params.input.scrollIntoViewDuration, app.params.input.scrollIntoViewCentered, app.params.input.scrollIntoViewAlways);
  19163. }
  19164. }
  19165. app.input.focus(inputEl);
  19166. }
  19167. function onBlur() {
  19168. var $inputEl = $(this);
  19169. var tag = $inputEl[0].nodeName.toLowerCase();
  19170. app.input.blur($inputEl);
  19171. if ($inputEl.dataset().validate || $inputEl.attr('validate') !== null || $inputEl.attr('data-validate-on-blur') !== null) {
  19172. app.input.validate($inputEl);
  19173. }
  19174. // Resize textarea
  19175. if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
  19176. if (Input.textareaResizableShadow) { Input.textareaResizableShadow.remove(); }
  19177. }
  19178. }
  19179. function onChange() {
  19180. var $inputEl = $(this);
  19181. var type = $inputEl.attr('type');
  19182. var tag = $inputEl[0].nodeName.toLowerCase();
  19183. var isContentEditable = $inputEl[0].hasAttribute('contenteditable');
  19184. if (Input.ignoreTypes.indexOf(type) >= 0) { return; }
  19185. // Check Empty State
  19186. app.input.checkEmptyState($inputEl);
  19187. if (isContentEditable) { return; }
  19188. // Check validation
  19189. if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
  19190. app.input.validate($inputEl);
  19191. }
  19192. // Resize textarea
  19193. if (tag === 'textarea' && $inputEl.hasClass('resizable')) {
  19194. app.input.resizeTextarea($inputEl);
  19195. }
  19196. }
  19197. function onInvalid(e) {
  19198. var $inputEl = $(this);
  19199. if ($inputEl.attr('data-validate-on-blur') === null && ($inputEl.dataset().validate || $inputEl.attr('validate') !== null)) {
  19200. e.preventDefault();
  19201. app.input.validate($inputEl);
  19202. }
  19203. }
  19204. function clearInput() {
  19205. var $clicked = $(this);
  19206. var $inputEl = $clicked.siblings('input, textarea').eq(0);
  19207. var previousValue = $inputEl.val();
  19208. $inputEl
  19209. .val('')
  19210. .trigger('input change')
  19211. .focus()
  19212. .trigger('input:clear', previousValue);
  19213. app.emit('inputClear', previousValue);
  19214. }
  19215. function preventDefault(e) {
  19216. e.preventDefault();
  19217. }
  19218. $(doc).on('click', '.input-clear-button', clearInput);
  19219. $(doc).on('mousedown', '.input-clear-button', preventDefault);
  19220. $(doc).on('change input', 'input, textarea, select, .item-input [contenteditable]', onChange, true);
  19221. $(doc).on('focus', 'input, textarea, select, .item-input [contenteditable]', onFocus, true);
  19222. $(doc).on('blur', 'input, textarea, select, .item-input [contenteditable]', onBlur, true);
  19223. $(doc).on('invalid', 'input, textarea, select', onInvalid, true);
  19224. },
  19225. };
  19226. var Input$1 = {
  19227. name: 'input',
  19228. params: {
  19229. input: {
  19230. scrollIntoViewOnFocus: Device.android,
  19231. scrollIntoViewCentered: false,
  19232. scrollIntoViewDuration: 0,
  19233. scrollIntoViewAlways: false,
  19234. },
  19235. },
  19236. create: function create() {
  19237. var app = this;
  19238. Utils.extend(app, {
  19239. input: {
  19240. scrollIntoView: Input.scrollIntoView.bind(app),
  19241. focus: Input.focus.bind(app),
  19242. blur: Input.blur.bind(app),
  19243. validate: Input.validate.bind(app),
  19244. validateInputs: Input.validateInputs.bind(app),
  19245. checkEmptyState: Input.checkEmptyState.bind(app),
  19246. resizeTextarea: Input.resizeTextarea.bind(app),
  19247. init: Input.init.bind(app),
  19248. },
  19249. });
  19250. },
  19251. on: {
  19252. init: function init() {
  19253. var app = this;
  19254. app.input.init();
  19255. },
  19256. tabMounted: function tabMounted(tabEl) {
  19257. var app = this;
  19258. var $tabEl = $(tabEl);
  19259. $tabEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
  19260. var $itemInputEl = $(itemInputEl);
  19261. $itemInputEl.find('input, select, textarea, [contenteditable]').each(function (inputIndex, inputEl) {
  19262. var $inputEl = $(inputEl);
  19263. if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
  19264. app.input.checkEmptyState($inputEl);
  19265. });
  19266. });
  19267. $tabEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
  19268. app.input.resizeTextarea(textareaEl);
  19269. });
  19270. },
  19271. pageInit: function pageInit(page) {
  19272. var app = this;
  19273. var $pageEl = page.$el;
  19274. $pageEl.find('.item-input, .input').each(function (itemInputIndex, itemInputEl) {
  19275. var $itemInputEl = $(itemInputEl);
  19276. $itemInputEl.find('input, select, textarea, [contenteditable]').each(function (inputIndex, inputEl) {
  19277. var $inputEl = $(inputEl);
  19278. if (Input.ignoreTypes.indexOf($inputEl.attr('type')) >= 0) { return; }
  19279. app.input.checkEmptyState($inputEl);
  19280. });
  19281. });
  19282. $pageEl.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
  19283. app.input.resizeTextarea(textareaEl);
  19284. });
  19285. },
  19286. 'panelBreakpoint panelCollapsedBreakpoint panelResize panelOpen panelSwipeOpen resize viewMasterDetailBreakpoint': function onPanelOpen(instance) {
  19287. var app = this;
  19288. if (instance && instance.$el) {
  19289. instance.$el.find('textarea.resizable').each(function (textareaIndex, textareaEl) {
  19290. app.input.resizeTextarea(textareaEl);
  19291. });
  19292. } else {
  19293. $('textarea.resizable').each(function (textareaIndex, textareaEl) {
  19294. app.input.resizeTextarea(textareaEl);
  19295. });
  19296. }
  19297. },
  19298. },
  19299. };
  19300. var Checkbox = {
  19301. name: 'checkbox',
  19302. };
  19303. var Radio = {
  19304. name: 'radio',
  19305. };
  19306. var Toggle = /*@__PURE__*/(function (Framework7Class) {
  19307. function Toggle(app, params) {
  19308. if ( params === void 0 ) params = {};
  19309. Framework7Class.call(this, params, [app]);
  19310. var toggle = this;
  19311. var defaults = {};
  19312. // Extend defaults with modules params
  19313. toggle.useModulesParams(defaults);
  19314. toggle.params = Utils.extend(defaults, params);
  19315. var el = toggle.params.el;
  19316. if (!el) { return toggle; }
  19317. var $el = $(el);
  19318. if ($el.length === 0) { return toggle; }
  19319. if ($el[0].f7Toggle) { return $el[0].f7Toggle; }
  19320. var $inputEl = $el.children('input[type="checkbox"]');
  19321. Utils.extend(toggle, {
  19322. app: app,
  19323. $el: $el,
  19324. el: $el[0],
  19325. $inputEl: $inputEl,
  19326. inputEl: $inputEl[0],
  19327. disabled: $el.hasClass('disabled') || $inputEl.hasClass('disabled') || $inputEl.attr('disabled') || $inputEl[0].disabled,
  19328. });
  19329. Object.defineProperty(toggle, 'checked', {
  19330. enumerable: true,
  19331. configurable: true,
  19332. set: function set(checked) {
  19333. if (!toggle || typeof toggle.$inputEl === 'undefined') { return; }
  19334. if (toggle.checked === checked) { return; }
  19335. $inputEl[0].checked = checked;
  19336. toggle.$inputEl.trigger('change');
  19337. },
  19338. get: function get() {
  19339. return $inputEl[0].checked;
  19340. },
  19341. });
  19342. $el[0].f7Toggle = toggle;
  19343. var isTouched;
  19344. var touchesStart = {};
  19345. var isScrolling;
  19346. var touchesDiff;
  19347. var toggleWidth;
  19348. var touchStartTime;
  19349. var touchStartChecked;
  19350. function handleTouchStart(e) {
  19351. if (isTouched || toggle.disabled) { return; }
  19352. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  19353. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  19354. touchesDiff = 0;
  19355. isTouched = true;
  19356. isScrolling = undefined;
  19357. touchStartTime = Utils.now();
  19358. touchStartChecked = toggle.checked;
  19359. toggleWidth = $el[0].offsetWidth;
  19360. Utils.nextTick(function () {
  19361. if (isTouched) {
  19362. $el.addClass('toggle-active-state');
  19363. }
  19364. });
  19365. }
  19366. function handleTouchMove(e) {
  19367. if (!isTouched || toggle.disabled) { return; }
  19368. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  19369. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  19370. var inverter = app.rtl ? -1 : 1;
  19371. if (typeof isScrolling === 'undefined') {
  19372. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  19373. }
  19374. if (isScrolling) {
  19375. isTouched = false;
  19376. return;
  19377. }
  19378. e.preventDefault();
  19379. touchesDiff = pageX - touchesStart.x;
  19380. var changed;
  19381. if (touchesDiff * inverter < 0 && Math.abs(touchesDiff) > toggleWidth / 3 && touchStartChecked) {
  19382. changed = true;
  19383. }
  19384. if (touchesDiff * inverter > 0 && Math.abs(touchesDiff) > toggleWidth / 3 && !touchStartChecked) {
  19385. changed = true;
  19386. }
  19387. if (changed) {
  19388. touchesStart.x = pageX;
  19389. toggle.checked = !touchStartChecked;
  19390. touchStartChecked = !touchStartChecked;
  19391. }
  19392. }
  19393. function handleTouchEnd() {
  19394. if (!isTouched || toggle.disabled) {
  19395. if (isScrolling) { $el.removeClass('toggle-active-state'); }
  19396. isTouched = false;
  19397. return;
  19398. }
  19399. var inverter = app.rtl ? -1 : 1;
  19400. isTouched = false;
  19401. $el.removeClass('toggle-active-state');
  19402. var changed;
  19403. if ((Utils.now() - touchStartTime) < 300) {
  19404. if (touchesDiff * inverter < 0 && touchStartChecked) {
  19405. changed = true;
  19406. }
  19407. if (touchesDiff * inverter > 0 && !touchStartChecked) {
  19408. changed = true;
  19409. }
  19410. if (changed) {
  19411. toggle.checked = !touchStartChecked;
  19412. }
  19413. }
  19414. }
  19415. function handleInputChange() {
  19416. toggle.$el.trigger('toggle:change');
  19417. toggle.emit('local::change toggleChange', toggle);
  19418. }
  19419. toggle.attachEvents = function attachEvents() {
  19420. var passive = Support.passiveListener ? { passive: true } : false;
  19421. $el.on(app.touchEvents.start, handleTouchStart, passive);
  19422. app.on('touchmove', handleTouchMove);
  19423. app.on('touchend:passive', handleTouchEnd);
  19424. toggle.$inputEl.on('change', handleInputChange);
  19425. };
  19426. toggle.detachEvents = function detachEvents() {
  19427. var passive = Support.passiveListener ? { passive: true } : false;
  19428. $el.off(app.touchEvents.start, handleTouchStart, passive);
  19429. app.off('touchmove', handleTouchMove);
  19430. app.off('touchend:passive', handleTouchEnd);
  19431. toggle.$inputEl.off('change', handleInputChange);
  19432. };
  19433. // Install Modules
  19434. toggle.useModules();
  19435. // Init
  19436. toggle.init();
  19437. }
  19438. if ( Framework7Class ) Toggle.__proto__ = Framework7Class;
  19439. Toggle.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  19440. Toggle.prototype.constructor = Toggle;
  19441. Toggle.prototype.toggle = function toggle () {
  19442. var toggle = this;
  19443. toggle.checked = !toggle.checked;
  19444. };
  19445. Toggle.prototype.init = function init () {
  19446. var toggle = this;
  19447. toggle.attachEvents();
  19448. };
  19449. Toggle.prototype.destroy = function destroy () {
  19450. var toggle = this;
  19451. toggle.$el.trigger('toggle:beforedestroy');
  19452. toggle.emit('local::beforeDestroy toggleBeforeDestroy', toggle);
  19453. delete toggle.$el[0].f7Toggle;
  19454. toggle.detachEvents();
  19455. Utils.deleteProps(toggle);
  19456. toggle = null;
  19457. };
  19458. return Toggle;
  19459. }(Framework7Class));
  19460. var Toggle$1 = {
  19461. name: 'toggle',
  19462. create: function create() {
  19463. var app = this;
  19464. app.toggle = ConstructorMethods({
  19465. defaultSelector: '.toggle',
  19466. constructor: Toggle,
  19467. app: app,
  19468. domProp: 'f7Toggle',
  19469. });
  19470. },
  19471. static: {
  19472. Toggle: Toggle,
  19473. },
  19474. on: {
  19475. tabMounted: function tabMounted(tabEl) {
  19476. var app = this;
  19477. $(tabEl).find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
  19478. },
  19479. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  19480. $(tabEl).find('.toggle-init').each(function (index, toggleEl) {
  19481. if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
  19482. });
  19483. },
  19484. pageInit: function pageInit(page) {
  19485. var app = this;
  19486. page.$el.find('.toggle-init').each(function (index, toggleEl) { return app.toggle.create({ el: toggleEl }); });
  19487. },
  19488. pageBeforeRemove: function pageBeforeRemove(page) {
  19489. page.$el.find('.toggle-init').each(function (index, toggleEl) {
  19490. if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
  19491. });
  19492. },
  19493. },
  19494. vnode: {
  19495. 'toggle-init': {
  19496. insert: function insert(vnode) {
  19497. var app = this;
  19498. var toggleEl = vnode.elm;
  19499. app.toggle.create({ el: toggleEl });
  19500. },
  19501. destroy: function destroy(vnode) {
  19502. var toggleEl = vnode.elm;
  19503. if (toggleEl.f7Toggle) { toggleEl.f7Toggle.destroy(); }
  19504. },
  19505. },
  19506. },
  19507. };
  19508. var Range = /*@__PURE__*/(function (Framework7Class) {
  19509. function Range(app, params) {
  19510. Framework7Class.call(this, params, [app]);
  19511. var range = this;
  19512. var defaults = {
  19513. el: null,
  19514. inputEl: null,
  19515. dual: false,
  19516. step: 1,
  19517. label: false,
  19518. min: 0,
  19519. max: 100,
  19520. value: 0,
  19521. draggableBar: true,
  19522. vertical: false,
  19523. verticalReversed: false,
  19524. formatLabel: null,
  19525. scale: false,
  19526. scaleSteps: 5,
  19527. scaleSubSteps: 0,
  19528. formatScaleLabel: null,
  19529. limitKnobPosition: app.theme === 'ios',
  19530. };
  19531. // Extend defaults with modules params
  19532. range.useModulesParams(defaults);
  19533. range.params = Utils.extend(defaults, params);
  19534. var el = range.params.el;
  19535. if (!el) { return range; }
  19536. var $el = $(el);
  19537. if ($el.length === 0) { return range; }
  19538. if ($el[0].f7Range) { return $el[0].f7Range; }
  19539. var dataset = $el.dataset();
  19540. ('step min max value scaleSteps scaleSubSteps').split(' ').forEach(function (paramName) {
  19541. if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
  19542. range.params[paramName] = parseFloat(dataset[paramName]);
  19543. }
  19544. });
  19545. ('dual label vertical verticalReversed scale').split(' ').forEach(function (paramName) {
  19546. if (typeof params[paramName] === 'undefined' && typeof dataset[paramName] !== 'undefined') {
  19547. range.params[paramName] = dataset[paramName];
  19548. }
  19549. });
  19550. if (!range.params.value) {
  19551. if (typeof dataset.value !== 'undefined') { range.params.value = dataset.value; }
  19552. if (typeof dataset.valueLeft !== 'undefined' && typeof dataset.valueRight !== 'undefined') {
  19553. range.params.value = [parseFloat(dataset.valueLeft), parseFloat(dataset.valueRight)];
  19554. }
  19555. }
  19556. var $inputEl;
  19557. if (!range.params.dual) {
  19558. if (range.params.inputEl) {
  19559. $inputEl = $(range.params.inputEl);
  19560. } else if ($el.find('input[type="range"]').length) {
  19561. $inputEl = $el.find('input[type="range"]').eq(0);
  19562. }
  19563. }
  19564. var ref = range.params;
  19565. var dual = ref.dual;
  19566. var step = ref.step;
  19567. var label = ref.label;
  19568. var min = ref.min;
  19569. var max = ref.max;
  19570. var value = ref.value;
  19571. var vertical = ref.vertical;
  19572. var verticalReversed = ref.verticalReversed;
  19573. var scale = ref.scale;
  19574. var scaleSteps = ref.scaleSteps;
  19575. var scaleSubSteps = ref.scaleSubSteps;
  19576. var limitKnobPosition = ref.limitKnobPosition;
  19577. Utils.extend(range, {
  19578. app: app,
  19579. $el: $el,
  19580. el: $el[0],
  19581. $inputEl: $inputEl,
  19582. inputEl: $inputEl ? $inputEl[0] : undefined,
  19583. dual: dual,
  19584. step: step,
  19585. label: label,
  19586. min: min,
  19587. max: max,
  19588. value: value,
  19589. previousValue: value,
  19590. vertical: vertical,
  19591. verticalReversed: verticalReversed,
  19592. scale: scale,
  19593. scaleSteps: scaleSteps,
  19594. scaleSubSteps: scaleSubSteps,
  19595. limitKnobPosition: limitKnobPosition,
  19596. });
  19597. if ($inputEl) {
  19598. ('step min max').split(' ').forEach(function (paramName) {
  19599. if (!params[paramName] && $inputEl.attr(paramName)) {
  19600. range.params[paramName] = parseFloat($inputEl.attr(paramName));
  19601. range[paramName] = parseFloat($inputEl.attr(paramName));
  19602. }
  19603. });
  19604. if (typeof $inputEl.val() !== 'undefined') {
  19605. range.params.value = parseFloat($inputEl.val());
  19606. range.value = parseFloat($inputEl.val());
  19607. }
  19608. }
  19609. // Dual
  19610. if (range.dual) {
  19611. $el.addClass('range-slider-dual');
  19612. }
  19613. if (range.label) {
  19614. $el.addClass('range-slider-label');
  19615. }
  19616. // Vertical
  19617. if (range.vertical) {
  19618. $el.addClass('range-slider-vertical');
  19619. if (range.verticalReversed) {
  19620. $el.addClass('range-slider-vertical-reversed');
  19621. }
  19622. } else {
  19623. $el.addClass('range-slider-horizontal');
  19624. }
  19625. // Check for layout
  19626. var $barEl = $('<div class="range-bar"></div>');
  19627. var $barActiveEl = $('<div class="range-bar-active"></div>');
  19628. $barEl.append($barActiveEl);
  19629. // Create Knobs
  19630. var knobHTML = "\n <div class=\"range-knob-wrap\">\n <div class=\"range-knob\"></div>\n " + (range.label ? '<div class="range-knob-label"></div>' : '') + "\n </div>\n ";
  19631. var knobs = [$(knobHTML)];
  19632. if (range.dual) {
  19633. knobs.push($(knobHTML));
  19634. }
  19635. $el.append($barEl);
  19636. knobs.forEach(function ($knobEl) {
  19637. $el.append($knobEl);
  19638. });
  19639. // Labels
  19640. var labels = [];
  19641. if (range.label) {
  19642. labels.push(knobs[0].find('.range-knob-label'));
  19643. if (range.dual) {
  19644. labels.push(knobs[1].find('.range-knob-label'));
  19645. }
  19646. }
  19647. // Scale
  19648. var $scaleEl;
  19649. if (range.scale && range.scaleSteps >= 1) {
  19650. $scaleEl = $(("\n <div class=\"range-scale\">\n " + (range.renderScale()) + "\n </div>\n "));
  19651. $el.append($scaleEl);
  19652. }
  19653. Utils.extend(range, {
  19654. knobs: knobs,
  19655. labels: labels,
  19656. $barEl: $barEl,
  19657. $barActiveEl: $barActiveEl,
  19658. $scaleEl: $scaleEl,
  19659. });
  19660. $el[0].f7Range = range;
  19661. // Touch Events
  19662. var isTouched;
  19663. var touchesStart = {};
  19664. var isScrolling;
  19665. var rangeOffset;
  19666. var rangeOffsetLeft;
  19667. var rangeOffsetTop;
  19668. var $touchedKnobEl;
  19669. var dualValueIndex;
  19670. var valueChangedByTouch;
  19671. var targetTouchIdentifier;
  19672. function onTouchChange() {
  19673. valueChangedByTouch = true;
  19674. }
  19675. function handleTouchStart(e) {
  19676. if (isTouched) { return; }
  19677. if (!range.params.draggableBar) {
  19678. if ($(e.target).closest('.range-knob').length === 0) {
  19679. return;
  19680. }
  19681. }
  19682. valueChangedByTouch = false;
  19683. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  19684. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  19685. if (e.type === 'touchstart') {
  19686. targetTouchIdentifier = e.targetTouches[0].identifier;
  19687. }
  19688. isTouched = true;
  19689. isScrolling = undefined;
  19690. rangeOffset = $el.offset();
  19691. rangeOffsetLeft = rangeOffset.left;
  19692. rangeOffsetTop = rangeOffset.top;
  19693. var progress;
  19694. if (range.vertical) {
  19695. progress = (touchesStart.y - rangeOffsetTop) / range.rangeHeight;
  19696. if (!range.verticalReversed) { progress = 1 - progress; }
  19697. } else if (range.app.rtl) {
  19698. progress = ((rangeOffsetLeft + range.rangeWidth) - touchesStart.x) / range.rangeWidth;
  19699. } else {
  19700. progress = (touchesStart.x - rangeOffsetLeft) / range.rangeWidth;
  19701. }
  19702. var newValue = (progress * (range.max - range.min)) + range.min;
  19703. if (range.dual) {
  19704. if (Math.abs(range.value[0] - newValue) < Math.abs(range.value[1] - newValue)) {
  19705. dualValueIndex = 0;
  19706. $touchedKnobEl = range.knobs[0];
  19707. newValue = [newValue, range.value[1]];
  19708. } else {
  19709. dualValueIndex = 1;
  19710. $touchedKnobEl = range.knobs[1];
  19711. newValue = [range.value[0], newValue];
  19712. }
  19713. } else {
  19714. $touchedKnobEl = range.knobs[0];
  19715. newValue = (progress * (range.max - range.min)) + range.min;
  19716. }
  19717. Utils.nextTick(function () {
  19718. if (isTouched) { $touchedKnobEl.addClass('range-knob-active-state'); }
  19719. }, 70);
  19720. range.on('change', onTouchChange);
  19721. range.setValue(newValue, true);
  19722. }
  19723. function handleTouchMove(e) {
  19724. if (!isTouched) { return; }
  19725. var pageX;
  19726. var pageY;
  19727. if (e.type === 'touchmove') {
  19728. for (var i = 0; i < e.targetTouches.length; i += 1) {
  19729. if (e.targetTouches[i].identifier === targetTouchIdentifier) {
  19730. pageX = e.targetTouches[i].pageX;
  19731. pageY = e.targetTouches[i].pageY;
  19732. }
  19733. }
  19734. } else {
  19735. pageX = e.pageX;
  19736. pageY = e.pageY;
  19737. }
  19738. if (typeof pageX === 'undefined' && typeof pageY === 'undefined') { return; }
  19739. if (typeof isScrolling === 'undefined' && !range.vertical) {
  19740. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  19741. }
  19742. if (isScrolling) {
  19743. isTouched = false;
  19744. return;
  19745. }
  19746. e.preventDefault();
  19747. var progress;
  19748. if (range.vertical) {
  19749. progress = (pageY - rangeOffsetTop) / range.rangeHeight;
  19750. if (!range.verticalReversed) { progress = 1 - progress; }
  19751. } else if (range.app.rtl) {
  19752. progress = ((rangeOffsetLeft + range.rangeWidth) - pageX) / range.rangeWidth;
  19753. } else {
  19754. progress = (pageX - rangeOffsetLeft) / range.rangeWidth;
  19755. }
  19756. var newValue = (progress * (range.max - range.min)) + range.min;
  19757. if (range.dual) {
  19758. var leftValue;
  19759. var rightValue;
  19760. if (dualValueIndex === 0) {
  19761. leftValue = newValue;
  19762. rightValue = range.value[1];
  19763. if (leftValue > rightValue) {
  19764. rightValue = leftValue;
  19765. }
  19766. } else {
  19767. leftValue = range.value[0];
  19768. rightValue = newValue;
  19769. if (rightValue < leftValue) {
  19770. leftValue = rightValue;
  19771. }
  19772. }
  19773. newValue = [leftValue, rightValue];
  19774. }
  19775. range.setValue(newValue, true);
  19776. }
  19777. function handleTouchEnd(e) {
  19778. if (e.type === 'touchend') {
  19779. var touchEnded;
  19780. for (var i = 0; i < e.changedTouches.length; i += 1) {
  19781. if (e.changedTouches[i].identifier === targetTouchIdentifier) { touchEnded = true; }
  19782. }
  19783. if (!touchEnded) { return; }
  19784. }
  19785. if (!isTouched) {
  19786. if (isScrolling) { $touchedKnobEl.removeClass('range-knob-active-state'); }
  19787. isTouched = false;
  19788. return;
  19789. }
  19790. range.off('change', onTouchChange);
  19791. isTouched = false;
  19792. $touchedKnobEl.removeClass('range-knob-active-state');
  19793. if (valueChangedByTouch && range.$inputEl && !range.dual) {
  19794. range.$inputEl.trigger('change');
  19795. }
  19796. valueChangedByTouch = false;
  19797. if (typeof range.previousValue !== 'undefined') {
  19798. if (
  19799. (
  19800. range.dual
  19801. && (
  19802. range.previousValue[0] !== range.value[0]
  19803. || range.previousValue[1] !== range.value[1]
  19804. )
  19805. )
  19806. || (
  19807. !range.dual
  19808. && range.previousValue !== range.value
  19809. )
  19810. ) {
  19811. range.$el.trigger('range:changed', range.value);
  19812. range.emit('local::changed rangeChanged', range, range.value);
  19813. }
  19814. }
  19815. }
  19816. function handleResize() {
  19817. range.calcSize();
  19818. range.layout();
  19819. }
  19820. var parentModals;
  19821. var parentPanel;
  19822. var parentPage;
  19823. range.attachEvents = function attachEvents() {
  19824. var passive = Support.passiveListener ? { passive: true } : false;
  19825. range.$el.on(app.touchEvents.start, handleTouchStart, passive);
  19826. app.on('touchmove', handleTouchMove);
  19827. app.on('touchend:passive', handleTouchEnd);
  19828. app.on('tabShow', handleResize);
  19829. app.on('resize', handleResize);
  19830. parentModals = range.$el.parents('.sheet-modal, .actions-modal, .popup, .popover, .login-screen, .dialog, .toast');
  19831. parentModals.on('modal:open', handleResize);
  19832. parentPanel = range.$el.parents('.panel');
  19833. parentPanel.on('panel:open panel:resize', handleResize);
  19834. parentPage = range.$el.parents('.page').eq(0);
  19835. parentPage.on('page:reinit', handleResize);
  19836. };
  19837. range.detachEvents = function detachEvents() {
  19838. var passive = Support.passiveListener ? { passive: true } : false;
  19839. range.$el.off(app.touchEvents.start, handleTouchStart, passive);
  19840. app.off('touchmove', handleTouchMove);
  19841. app.off('touchend:passive', handleTouchEnd);
  19842. app.off('tabShow', handleResize);
  19843. app.off('resize', handleResize);
  19844. if (parentModals) {
  19845. parentModals.off('modal:open', handleResize);
  19846. }
  19847. if (parentPanel) {
  19848. parentPanel.off('panel:open panel:resize', handleResize);
  19849. }
  19850. if (parentPage) {
  19851. parentPage.off('page:reinit', handleResize);
  19852. }
  19853. parentModals = null;
  19854. parentPanel = null;
  19855. parentPage = null;
  19856. };
  19857. // Install Modules
  19858. range.useModules();
  19859. // Init
  19860. range.init();
  19861. return range;
  19862. }
  19863. if ( Framework7Class ) Range.__proto__ = Framework7Class;
  19864. Range.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  19865. Range.prototype.constructor = Range;
  19866. Range.prototype.calcSize = function calcSize () {
  19867. var range = this;
  19868. if (range.vertical) {
  19869. var height = range.$el.outerHeight();
  19870. if (height === 0) { return; }
  19871. range.rangeHeight = height;
  19872. range.knobHeight = range.knobs[0].outerHeight();
  19873. } else {
  19874. var width = range.$el.outerWidth();
  19875. if (width === 0) { return; }
  19876. range.rangeWidth = width;
  19877. range.knobWidth = range.knobs[0].outerWidth();
  19878. }
  19879. };
  19880. Range.prototype.layout = function layout () {
  19881. var obj;
  19882. var range = this;
  19883. var app = range.app;
  19884. var knobWidth = range.knobWidth;
  19885. var knobHeight = range.knobHeight;
  19886. var rangeWidth = range.rangeWidth;
  19887. var rangeHeight = range.rangeHeight;
  19888. var min = range.min;
  19889. var max = range.max;
  19890. var knobs = range.knobs;
  19891. var $barActiveEl = range.$barActiveEl;
  19892. var value = range.value;
  19893. var label = range.label;
  19894. var labels = range.labels;
  19895. var vertical = range.vertical;
  19896. var verticalReversed = range.verticalReversed;
  19897. var limitKnobPosition = range.limitKnobPosition;
  19898. var knobSize = vertical ? knobHeight : knobWidth;
  19899. var rangeSize = vertical ? rangeHeight : rangeWidth;
  19900. // eslint-disable-next-line
  19901. var positionProperty = vertical
  19902. ? (verticalReversed ? 'top' : 'bottom')
  19903. : (app.rtl ? 'right' : 'left');
  19904. if (range.dual) {
  19905. var progress = [((value[0] - min) / (max - min)), ((value[1] - min) / (max - min))];
  19906. $barActiveEl.css(( obj = {}, obj[positionProperty] = ((progress[0] * 100) + "%"), obj[vertical ? 'height' : 'width'] = (((progress[1] - progress[0]) * 100) + "%"), obj ));
  19907. knobs.forEach(function ($knobEl, knobIndex) {
  19908. var startPos = rangeSize * progress[knobIndex];
  19909. if (limitKnobPosition) {
  19910. var realStartPos = (rangeSize * progress[knobIndex]) - (knobSize / 2);
  19911. if (realStartPos < 0) { startPos = knobSize / 2; }
  19912. if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
  19913. }
  19914. $knobEl.css(positionProperty, (startPos + "px"));
  19915. if (label) { labels[knobIndex].text(range.formatLabel(value[knobIndex], labels[knobIndex][0])); }
  19916. });
  19917. } else {
  19918. var progress$1 = ((value - min) / (max - min));
  19919. $barActiveEl.css(vertical ? 'height' : 'width', ((progress$1 * 100) + "%"));
  19920. var startPos = rangeSize * progress$1;
  19921. if (limitKnobPosition) {
  19922. var realStartPos = (rangeSize * progress$1) - (knobSize / 2);
  19923. if (realStartPos < 0) { startPos = knobSize / 2; }
  19924. if ((realStartPos + knobSize) > rangeSize) { startPos = rangeSize - (knobSize / 2); }
  19925. }
  19926. knobs[0].css(positionProperty, (startPos + "px"));
  19927. if (label) { labels[0].text(range.formatLabel(value, labels[0][0])); }
  19928. }
  19929. if ((range.dual && value.indexOf(min) >= 0) || (!range.dual && value === min)) {
  19930. range.$el.addClass('range-slider-min');
  19931. } else {
  19932. range.$el.removeClass('range-slider-min');
  19933. }
  19934. if ((range.dual && value.indexOf(max) >= 0) || (!range.dual && value === max)) {
  19935. range.$el.addClass('range-slider-max');
  19936. } else {
  19937. range.$el.removeClass('range-slider-max');
  19938. }
  19939. };
  19940. Range.prototype.setValue = function setValue (newValue, byTouchMove) {
  19941. var range = this;
  19942. var step = range.step;
  19943. var min = range.min;
  19944. var max = range.max;
  19945. var valueChanged;
  19946. var oldValue;
  19947. if (range.dual) {
  19948. oldValue = [range.value[0], range.value[1]];
  19949. var newValues = newValue;
  19950. if (!Array.isArray(newValues)) { newValues = [newValue, newValue]; }
  19951. if (newValue[0] > newValue[1]) {
  19952. newValues = [newValues[0], newValues[0]];
  19953. }
  19954. newValues = newValues.map(function (value) { return Math.max(Math.min(Math.round(value / step) * step, max), min); });
  19955. if (newValues[0] === range.value[0] && newValues[1] === range.value[1]) {
  19956. return range;
  19957. }
  19958. newValues.forEach(function (value, valueIndex) {
  19959. range.value[valueIndex] = value;
  19960. });
  19961. valueChanged = oldValue[0] !== newValues[0] || oldValue[1] !== newValues[1];
  19962. range.layout();
  19963. } else {
  19964. oldValue = range.value;
  19965. var value = Math.max(Math.min(Math.round(newValue / step) * step, max), min);
  19966. range.value = value;
  19967. range.layout();
  19968. valueChanged = oldValue !== value;
  19969. }
  19970. if (valueChanged) {
  19971. range.previousValue = oldValue;
  19972. }
  19973. // Events
  19974. if (!valueChanged) { return range; }
  19975. range.$el.trigger('range:change', range.value);
  19976. if (range.$inputEl && !range.dual) {
  19977. range.$inputEl.val(range.value);
  19978. if (!byTouchMove) {
  19979. range.$inputEl.trigger('input change');
  19980. } else {
  19981. range.$inputEl.trigger('input');
  19982. }
  19983. }
  19984. if (!byTouchMove) {
  19985. range.$el.trigger('range:changed', range.value);
  19986. range.emit('local::changed rangeChanged', range, range.value);
  19987. }
  19988. range.emit('local::change rangeChange', range, range.value);
  19989. return range;
  19990. };
  19991. Range.prototype.getValue = function getValue () {
  19992. return this.value;
  19993. };
  19994. Range.prototype.formatLabel = function formatLabel (value, labelEl) {
  19995. var range = this;
  19996. if (range.params.formatLabel) { return range.params.formatLabel.call(range, value, labelEl); }
  19997. return value;
  19998. };
  19999. Range.prototype.formatScaleLabel = function formatScaleLabel (value) {
  20000. var range = this;
  20001. if (range.params.formatScaleLabel) { return range.params.formatScaleLabel.call(range, value); }
  20002. return value;
  20003. };
  20004. Range.prototype.renderScale = function renderScale () {
  20005. var range = this;
  20006. var app = range.app;
  20007. var verticalReversed = range.verticalReversed;
  20008. var vertical = range.vertical;
  20009. // eslint-disable-next-line
  20010. var positionProperty = vertical
  20011. ? (verticalReversed ? 'top' : 'bottom')
  20012. : (app.rtl ? 'right' : 'left');
  20013. var html = '';
  20014. Array
  20015. .from({ length: range.scaleSteps + 1 })
  20016. .forEach(function (scaleEl, index) {
  20017. var scaleStepValue = (range.max - range.min) / range.scaleSteps;
  20018. var scaleValue = range.min + scaleStepValue * index;
  20019. var progress = ((scaleValue - range.min) / (range.max - range.min));
  20020. html += "<div class=\"range-scale-step\" style=\"" + positionProperty + ": " + (progress * 100) + "%\">" + (range.formatScaleLabel(scaleValue)) + "</div>";
  20021. if (range.scaleSubSteps && range.scaleSubSteps > 1 && index < range.scaleSteps) {
  20022. Array
  20023. .from({ length: range.scaleSubSteps - 1 })
  20024. .forEach(function (subStepEl, subIndex) {
  20025. var subStep = scaleStepValue / range.scaleSubSteps;
  20026. var scaleSubValue = scaleValue + subStep * (subIndex + 1);
  20027. var subProgress = ((scaleSubValue - range.min) / (range.max - range.min));
  20028. html += "<div class=\"range-scale-step range-scale-substep\" style=\"" + positionProperty + ": " + (subProgress * 100) + "%\"></div>";
  20029. });
  20030. }
  20031. });
  20032. return html;
  20033. };
  20034. Range.prototype.updateScale = function updateScale () {
  20035. var range = this;
  20036. if (!range.scale || range.scaleSteps < 1) {
  20037. if (range.$scaleEl) { range.$scaleEl.remove(); }
  20038. delete range.$scaleEl;
  20039. return;
  20040. }
  20041. if (!range.$scaleEl) {
  20042. range.$scaleEl = $('<div class="range-scale"></div>');
  20043. range.$el.append(range.$scaleEl);
  20044. }
  20045. range.$scaleEl.html(range.renderScale());
  20046. };
  20047. Range.prototype.init = function init () {
  20048. var range = this;
  20049. range.calcSize();
  20050. range.layout();
  20051. range.attachEvents();
  20052. return range;
  20053. };
  20054. Range.prototype.destroy = function destroy () {
  20055. var range = this;
  20056. range.$el.trigger('range:beforedestroy');
  20057. range.emit('local::beforeDestroy rangeBeforeDestroy', range);
  20058. delete range.$el[0].f7Range;
  20059. range.detachEvents();
  20060. Utils.deleteProps(range);
  20061. range = null;
  20062. };
  20063. return Range;
  20064. }(Framework7Class));
  20065. var Range$1 = {
  20066. name: 'range',
  20067. create: function create() {
  20068. var app = this;
  20069. app.range = Utils.extend(
  20070. ConstructorMethods({
  20071. defaultSelector: '.range-slider',
  20072. constructor: Range,
  20073. app: app,
  20074. domProp: 'f7Range',
  20075. }),
  20076. {
  20077. getValue: function getValue(el) {
  20078. if ( el === void 0 ) el = '.range-slider';
  20079. var range = app.range.get(el);
  20080. if (range) { return range.getValue(); }
  20081. return undefined;
  20082. },
  20083. setValue: function setValue(el, value) {
  20084. if ( el === void 0 ) el = '.range-slider';
  20085. var range = app.range.get(el);
  20086. if (range) { return range.setValue(value); }
  20087. return undefined;
  20088. },
  20089. }
  20090. );
  20091. },
  20092. static: {
  20093. Range: Range,
  20094. },
  20095. on: {
  20096. tabMounted: function tabMounted(tabEl) {
  20097. var app = this;
  20098. $(tabEl).find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
  20099. el: rangeEl,
  20100. }); });
  20101. },
  20102. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  20103. $(tabEl).find('.range-slider-init').each(function (index, rangeEl) {
  20104. if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
  20105. });
  20106. },
  20107. pageInit: function pageInit(page) {
  20108. var app = this;
  20109. page.$el.find('.range-slider-init').each(function (index, rangeEl) { return new Range(app, {
  20110. el: rangeEl,
  20111. }); });
  20112. },
  20113. pageBeforeRemove: function pageBeforeRemove(page) {
  20114. page.$el.find('.range-slider-init').each(function (index, rangeEl) {
  20115. if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
  20116. });
  20117. },
  20118. },
  20119. vnode: {
  20120. 'range-slider-init': {
  20121. insert: function insert(vnode) {
  20122. var rangeEl = vnode.elm;
  20123. var app = this;
  20124. app.range.create({ el: rangeEl });
  20125. },
  20126. destroy: function destroy(vnode) {
  20127. var rangeEl = vnode.elm;
  20128. if (rangeEl.f7Range) { rangeEl.f7Range.destroy(); }
  20129. },
  20130. },
  20131. },
  20132. };
  20133. var Stepper = /*@__PURE__*/(function (Framework7Class) {
  20134. function Stepper(app, params) {
  20135. Framework7Class.call(this, params, [app]);
  20136. var stepper = this;
  20137. var defaults = {
  20138. el: null,
  20139. inputEl: null,
  20140. valueEl: null,
  20141. value: 0,
  20142. formatValue: null,
  20143. step: 1,
  20144. min: 0,
  20145. max: 100,
  20146. watchInput: true,
  20147. autorepeat: false,
  20148. autorepeatDynamic: false,
  20149. wraps: false,
  20150. manualInputMode: false,
  20151. decimalPoint: 4,
  20152. buttonsEndInputMode: true,
  20153. };
  20154. // Extend defaults with modules params
  20155. stepper.useModulesParams(defaults);
  20156. stepper.params = Utils.extend(defaults, params);
  20157. if (stepper.params.value < stepper.params.min) {
  20158. stepper.params.value = stepper.params.min;
  20159. }
  20160. if (stepper.params.value > stepper.params.max) {
  20161. stepper.params.value = stepper.params.max;
  20162. }
  20163. var el = stepper.params.el;
  20164. if (!el) { return stepper; }
  20165. var $el = $(el);
  20166. if ($el.length === 0) { return stepper; }
  20167. if ($el[0].f7Stepper) { return $el[0].f7Stepper; }
  20168. var $inputEl;
  20169. if (stepper.params.inputEl) {
  20170. $inputEl = $(stepper.params.inputEl);
  20171. } else if ($el.find('.stepper-input-wrap').find('input, textarea').length) {
  20172. $inputEl = $el.find('.stepper-input-wrap').find('input, textarea').eq(0);
  20173. }
  20174. if ($inputEl && $inputEl.length) {
  20175. ('step min max').split(' ').forEach(function (paramName) {
  20176. if (!params[paramName] && $inputEl.attr(paramName)) {
  20177. stepper.params[paramName] = parseFloat($inputEl.attr(paramName));
  20178. }
  20179. });
  20180. var decimalPoint$1 = parseInt(stepper.params.decimalPoint, 10);
  20181. if (Number.isNaN(decimalPoint$1)) {
  20182. stepper.params.decimalPoint = 0;
  20183. } else {
  20184. stepper.params.decimalPoint = decimalPoint$1;
  20185. }
  20186. var inputValue = parseFloat($inputEl.val());
  20187. if (typeof params.value === 'undefined' && !Number.isNaN(inputValue) && (inputValue || inputValue === 0)) {
  20188. stepper.params.value = inputValue;
  20189. }
  20190. }
  20191. var $valueEl;
  20192. if (stepper.params.valueEl) {
  20193. $valueEl = $(stepper.params.valueEl);
  20194. } else if ($el.find('.stepper-value').length) {
  20195. $valueEl = $el.find('.stepper-value').eq(0);
  20196. }
  20197. var $buttonPlusEl = $el.find('.stepper-button-plus');
  20198. var $buttonMinusEl = $el.find('.stepper-button-minus');
  20199. var ref = stepper.params;
  20200. var step = ref.step;
  20201. var min = ref.min;
  20202. var max = ref.max;
  20203. var value = ref.value;
  20204. var decimalPoint = ref.decimalPoint;
  20205. Utils.extend(stepper, {
  20206. app: app,
  20207. $el: $el,
  20208. el: $el[0],
  20209. $buttonPlusEl: $buttonPlusEl,
  20210. buttonPlusEl: $buttonPlusEl[0],
  20211. $buttonMinusEl: $buttonMinusEl,
  20212. buttonMinusEl: $buttonMinusEl[0],
  20213. $inputEl: $inputEl,
  20214. inputEl: $inputEl ? $inputEl[0] : undefined,
  20215. $valueEl: $valueEl,
  20216. valueEl: $valueEl ? $valueEl[0] : undefined,
  20217. step: step,
  20218. min: min,
  20219. max: max,
  20220. value: value,
  20221. decimalPoint: decimalPoint,
  20222. typeModeChanged: false,
  20223. });
  20224. $el[0].f7Stepper = stepper;
  20225. // Handle Events
  20226. var touchesStart = {};
  20227. var isTouched;
  20228. var isScrolling;
  20229. var preventButtonClick;
  20230. var intervalId;
  20231. var timeoutId;
  20232. var autorepeatAction = null;
  20233. var autorepeatInAction = false;
  20234. var manualInput = false;
  20235. function dynamicRepeat(current, progressions, startsIn, progressionStep, repeatEvery, action) {
  20236. clearTimeout(timeoutId);
  20237. timeoutId = setTimeout(function () {
  20238. if (current === 1) {
  20239. preventButtonClick = true;
  20240. autorepeatInAction = true;
  20241. }
  20242. clearInterval(intervalId);
  20243. action();
  20244. intervalId = setInterval(function () {
  20245. action();
  20246. }, repeatEvery);
  20247. if (current < progressions) {
  20248. dynamicRepeat(current + 1, progressions, startsIn, progressionStep, repeatEvery / 2, action);
  20249. }
  20250. }, current === 1 ? startsIn : progressionStep);
  20251. }
  20252. function onTouchStart(e) {
  20253. if (isTouched) { return; }
  20254. if (manualInput) { return; }
  20255. if ($(e.target).closest($buttonPlusEl).length) {
  20256. autorepeatAction = 'increment';
  20257. } else if ($(e.target).closest($buttonMinusEl).length) {
  20258. autorepeatAction = 'decrement';
  20259. }
  20260. if (!autorepeatAction) { return; }
  20261. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  20262. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  20263. isTouched = true;
  20264. isScrolling = undefined;
  20265. var progressions = stepper.params.autorepeatDynamic ? 4 : 1;
  20266. dynamicRepeat(1, progressions, 500, 1000, 300, function () {
  20267. stepper[autorepeatAction]();
  20268. });
  20269. }
  20270. function onTouchMove(e) {
  20271. if (!isTouched) { return; }
  20272. if (manualInput) { return; }
  20273. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  20274. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  20275. if (typeof isScrolling === 'undefined' && !autorepeatInAction) {
  20276. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  20277. }
  20278. var distance = Math.pow( ((Math.pow( (pageX - touchesStart.x), 2 )) + (Math.pow( (pageY - touchesStart.y), 2 ))), 0.5 );
  20279. if (isScrolling || distance > 20) {
  20280. isTouched = false;
  20281. clearTimeout(timeoutId);
  20282. clearInterval(intervalId);
  20283. }
  20284. }
  20285. function onTouchEnd() {
  20286. clearTimeout(timeoutId);
  20287. clearInterval(intervalId);
  20288. autorepeatAction = null;
  20289. autorepeatInAction = false;
  20290. isTouched = false;
  20291. }
  20292. function onMinusClick() {
  20293. if (manualInput) {
  20294. if (stepper.params.buttonsEndInputMode) {
  20295. manualInput = false;
  20296. stepper.endTypeMode(true);
  20297. }
  20298. return;
  20299. }
  20300. if (preventButtonClick) {
  20301. preventButtonClick = false;
  20302. return;
  20303. }
  20304. stepper.decrement(true);
  20305. }
  20306. function onPlusClick() {
  20307. if (manualInput) {
  20308. if (stepper.params.buttonsEndInputMode) {
  20309. manualInput = false;
  20310. stepper.endTypeMode(true);
  20311. }
  20312. return;
  20313. }
  20314. if (preventButtonClick) {
  20315. preventButtonClick = false;
  20316. return;
  20317. }
  20318. stepper.increment(true);
  20319. }
  20320. function onInputClick(e) {
  20321. if (!e.target.readOnly && stepper.params.manualInputMode) {
  20322. manualInput = true;
  20323. if (typeof e.target.selectionStart === 'number') {
  20324. e.target.selectionStart = e.target.value.length;
  20325. e.target.selectionEnd = e.target.value.length;
  20326. }
  20327. }
  20328. }
  20329. function onInputKey(e) {
  20330. if (e.keyCode === 13 || e.which === 13) {
  20331. e.preventDefault();
  20332. manualInput = false;
  20333. stepper.endTypeMode();
  20334. }
  20335. }
  20336. function onInputBlur() {
  20337. manualInput = false;
  20338. stepper.endTypeMode(true);
  20339. }
  20340. function onInput(e) {
  20341. if (manualInput) {
  20342. stepper.typeValue(e.target.value);
  20343. return;
  20344. }
  20345. if (e.detail && e.detail.sentByF7Stepper) { return; }
  20346. stepper.setValue(e.target.value, true);
  20347. }
  20348. stepper.attachEvents = function attachEvents() {
  20349. $buttonMinusEl.on('click', onMinusClick);
  20350. $buttonPlusEl.on('click', onPlusClick);
  20351. if (stepper.params.watchInput && $inputEl && $inputEl.length) {
  20352. $inputEl.on('input', onInput);
  20353. $inputEl.on('click', onInputClick);
  20354. $inputEl.on('blur', onInputBlur);
  20355. $inputEl.on('keyup', onInputKey);
  20356. }
  20357. if (stepper.params.autorepeat) {
  20358. app.on('touchstart:passive', onTouchStart);
  20359. app.on('touchmove:active', onTouchMove);
  20360. app.on('touchend:passive', onTouchEnd);
  20361. }
  20362. };
  20363. stepper.detachEvents = function detachEvents() {
  20364. $buttonMinusEl.off('click', onMinusClick);
  20365. $buttonPlusEl.off('click', onPlusClick);
  20366. if (stepper.params.watchInput && $inputEl && $inputEl.length) {
  20367. $inputEl.off('input', onInput);
  20368. $inputEl.off('click', onInputClick);
  20369. $inputEl.off('blur', onInputBlur);
  20370. $inputEl.off('keyup', onInputKey);
  20371. }
  20372. };
  20373. // Install Modules
  20374. stepper.useModules();
  20375. // Init
  20376. stepper.init();
  20377. return stepper;
  20378. }
  20379. if ( Framework7Class ) Stepper.__proto__ = Framework7Class;
  20380. Stepper.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  20381. Stepper.prototype.constructor = Stepper;
  20382. Stepper.prototype.minus = function minus () {
  20383. return this.decrement();
  20384. };
  20385. Stepper.prototype.plus = function plus () {
  20386. return this.increment();
  20387. };
  20388. Stepper.prototype.decrement = function decrement () {
  20389. var stepper = this;
  20390. return stepper.setValue(stepper.value - stepper.step, false, true);
  20391. };
  20392. Stepper.prototype.increment = function increment () {
  20393. var stepper = this;
  20394. return stepper.setValue(stepper.value + stepper.step, false, true);
  20395. };
  20396. Stepper.prototype.setValue = function setValue (newValue, forceUpdate, withWraps) {
  20397. var stepper = this;
  20398. var step = stepper.step;
  20399. var min = stepper.min;
  20400. var max = stepper.max;
  20401. var oldValue = stepper.value;
  20402. var value = Math.round(newValue / step) * step;
  20403. if (stepper.params.wraps && withWraps) {
  20404. if (value > max) { value = min; }
  20405. if (value < min) { value = max; }
  20406. } else {
  20407. value = Math.max(Math.min(value, max), min);
  20408. }
  20409. if (Number.isNaN(value)) {
  20410. value = oldValue;
  20411. }
  20412. stepper.value = value;
  20413. var valueChanged = oldValue !== value;
  20414. // Events
  20415. if (!valueChanged && !forceUpdate) { return stepper; }
  20416. stepper.$el.trigger('stepper:change', stepper.value);
  20417. var formattedValue = stepper.formatValue(stepper.value);
  20418. if (stepper.$inputEl && stepper.$inputEl.length) {
  20419. stepper.$inputEl.val(formattedValue);
  20420. stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
  20421. }
  20422. if (stepper.$valueEl && stepper.$valueEl.length) {
  20423. stepper.$valueEl.html(formattedValue);
  20424. }
  20425. stepper.emit('local::change stepperChange', stepper, stepper.value);
  20426. return stepper;
  20427. };
  20428. Stepper.prototype.endTypeMode = function endTypeMode (noBlur) {
  20429. var stepper = this;
  20430. var min = stepper.min;
  20431. var max = stepper.max;
  20432. var value = parseFloat(stepper.value);
  20433. if (Number.isNaN(value)) { value = 0; }
  20434. value = Math.max(Math.min(value, max), min);
  20435. stepper.value = value;
  20436. if (!stepper.typeModeChanged) {
  20437. if (stepper.$inputEl && stepper.$inputEl.length && !noBlur) {
  20438. stepper.$inputEl.blur();
  20439. }
  20440. return stepper;
  20441. }
  20442. stepper.typeModeChanged = false;
  20443. stepper.$el.trigger('stepper:change', stepper.value);
  20444. var formattedValue = stepper.formatValue(stepper.value);
  20445. if (stepper.$inputEl && stepper.$inputEl.length) {
  20446. stepper.$inputEl.val(formattedValue);
  20447. stepper.$inputEl.trigger('input change', { sentByF7Stepper: true });
  20448. if (!noBlur) { stepper.$inputEl.blur(); }
  20449. }
  20450. if (stepper.$valueEl && stepper.$valueEl.length) {
  20451. stepper.$valueEl.html(formattedValue);
  20452. }
  20453. stepper.emit('local::change stepperChange', stepper, stepper.value);
  20454. return stepper;
  20455. };
  20456. Stepper.prototype.typeValue = function typeValue (value) {
  20457. var stepper = this;
  20458. stepper.typeModeChanged = true;
  20459. var inputTxt = String(value);
  20460. if (inputTxt.lastIndexOf('.') + 1 === inputTxt.length || inputTxt.lastIndexOf(',') + 1 === inputTxt.length) {
  20461. if (inputTxt.lastIndexOf('.') !== inputTxt.indexOf('.') || inputTxt.lastIndexOf(',') !== inputTxt.indexOf(',')) {
  20462. inputTxt = inputTxt.slice(0, -1);
  20463. stepper.value = inputTxt;
  20464. stepper.$inputEl.val(stepper.value);
  20465. return stepper;
  20466. }
  20467. } else {
  20468. var newValue = parseFloat(inputTxt.replace(',', '.'));
  20469. if (newValue === 0) {
  20470. stepper.value = inputTxt.replace(',', '.');
  20471. stepper.$inputEl.val(stepper.value);
  20472. return stepper;
  20473. }
  20474. if (Number.isNaN(newValue)) {
  20475. stepper.value = 0;
  20476. stepper.$inputEl.val(stepper.value);
  20477. return stepper;
  20478. }
  20479. var powVal = Math.pow( 10, stepper.params.decimalPoint );
  20480. newValue = (Math.round((newValue) * powVal)).toFixed(stepper.params.decimalPoint + 1) / powVal;
  20481. stepper.value = parseFloat(String(newValue).replace(',', '.'));
  20482. stepper.$inputEl.val(stepper.value);
  20483. return stepper;
  20484. }
  20485. stepper.value = inputTxt;
  20486. stepper.$inputEl.val(inputTxt);
  20487. return stepper;
  20488. };
  20489. Stepper.prototype.getValue = function getValue () {
  20490. return this.value;
  20491. };
  20492. Stepper.prototype.formatValue = function formatValue (value) {
  20493. var stepper = this;
  20494. if (!stepper.params.formatValue) { return value; }
  20495. return stepper.params.formatValue.call(stepper, value);
  20496. };
  20497. Stepper.prototype.init = function init () {
  20498. var stepper = this;
  20499. stepper.attachEvents();
  20500. if (stepper.$valueEl && stepper.$valueEl.length) {
  20501. var formattedValue = stepper.formatValue(stepper.value);
  20502. stepper.$valueEl.html(formattedValue);
  20503. }
  20504. return stepper;
  20505. };
  20506. Stepper.prototype.destroy = function destroy () {
  20507. var stepper = this;
  20508. stepper.$el.trigger('stepper:beforedestroy');
  20509. stepper.emit('local::beforeDestroy stepperBeforeDestroy', stepper);
  20510. delete stepper.$el[0].f7Stepper;
  20511. stepper.detachEvents();
  20512. Utils.deleteProps(stepper);
  20513. stepper = null;
  20514. };
  20515. return Stepper;
  20516. }(Framework7Class));
  20517. var Stepper$1 = {
  20518. name: 'stepper',
  20519. create: function create() {
  20520. var app = this;
  20521. app.stepper = Utils.extend(
  20522. ConstructorMethods({
  20523. defaultSelector: '.stepper',
  20524. constructor: Stepper,
  20525. app: app,
  20526. domProp: 'f7Stepper',
  20527. }),
  20528. {
  20529. getValue: function getValue(el) {
  20530. if ( el === void 0 ) el = '.stepper';
  20531. var stepper = app.stepper.get(el);
  20532. if (stepper) { return stepper.getValue(); }
  20533. return undefined;
  20534. },
  20535. setValue: function setValue(el, value) {
  20536. if ( el === void 0 ) el = '.stepper';
  20537. var stepper = app.stepper.get(el);
  20538. if (stepper) { return stepper.setValue(value); }
  20539. return undefined;
  20540. },
  20541. }
  20542. );
  20543. },
  20544. static: {
  20545. Stepper: Stepper,
  20546. },
  20547. on: {
  20548. tabMounted: function tabMounted(tabEl) {
  20549. var app = this;
  20550. $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
  20551. var dataset = $(stepperEl).dataset();
  20552. app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
  20553. });
  20554. },
  20555. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  20556. $(tabEl).find('.stepper-init').each(function (index, stepperEl) {
  20557. if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
  20558. });
  20559. },
  20560. pageInit: function pageInit(page) {
  20561. var app = this;
  20562. page.$el.find('.stepper-init').each(function (index, stepperEl) {
  20563. var dataset = $(stepperEl).dataset();
  20564. app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
  20565. });
  20566. },
  20567. pageBeforeRemove: function pageBeforeRemove(page) {
  20568. page.$el.find('.stepper-init').each(function (index, stepperEl) {
  20569. if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
  20570. });
  20571. },
  20572. },
  20573. vnode: {
  20574. 'stepper-init': {
  20575. insert: function insert(vnode) {
  20576. var app = this;
  20577. var stepperEl = vnode.elm;
  20578. var dataset = $(stepperEl).dataset();
  20579. app.stepper.create(Utils.extend({ el: stepperEl }, dataset || {}));
  20580. },
  20581. destroy: function destroy(vnode) {
  20582. var stepperEl = vnode.elm;
  20583. if (stepperEl.f7Stepper) { stepperEl.f7Stepper.destroy(); }
  20584. },
  20585. },
  20586. },
  20587. };
  20588. var SmartSelect = /*@__PURE__*/(function (Framework7Class) {
  20589. function SmartSelect(app, params) {
  20590. if ( params === void 0 ) params = {};
  20591. Framework7Class.call(this, params, [app]);
  20592. var ss = this;
  20593. var defaults = Utils.extend({
  20594. on: {},
  20595. }, app.params.smartSelect);
  20596. if (typeof defaults.searchbarDisableButton === 'undefined') {
  20597. defaults.searchbarDisableButton = app.theme !== 'aurora';
  20598. }
  20599. // Extend defaults with modules params
  20600. ss.useModulesParams(defaults);
  20601. ss.params = Utils.extend({}, defaults, params);
  20602. ss.app = app;
  20603. var $el = $(ss.params.el).eq(0);
  20604. if ($el.length === 0) { return ss; }
  20605. if ($el[0].f7SmartSelect) { return $el[0].f7SmartSelect; }
  20606. var $selectEl = $el.find('select').eq(0);
  20607. if ($selectEl.length === 0) { return ss; }
  20608. var $valueEl;
  20609. if (ss.params.setValueText) {
  20610. $valueEl = $(ss.params.valueEl);
  20611. if ($valueEl.length === 0) {
  20612. $valueEl = $el.find('.item-after');
  20613. }
  20614. if ($valueEl.length === 0) {
  20615. $valueEl = $('<div class="item-after"></div>');
  20616. $valueEl.insertAfter($el.find('.item-title'));
  20617. }
  20618. }
  20619. // Url
  20620. var url = params.url;
  20621. if (!url) {
  20622. if ($el.attr('href') && $el.attr('href') !== '#') { url = $el.attr('href'); }
  20623. else if ($selectEl.attr('name')) { url = ($selectEl.attr('name').toLowerCase()) + "-select/"; }
  20624. }
  20625. if (!url) { url = ss.params.url; }
  20626. var multiple = $selectEl[0].multiple;
  20627. var inputType = multiple ? 'checkbox' : 'radio';
  20628. var id = Utils.id();
  20629. Utils.extend(ss, {
  20630. $el: $el,
  20631. el: $el[0],
  20632. $selectEl: $selectEl,
  20633. selectEl: $selectEl[0],
  20634. $valueEl: $valueEl,
  20635. valueEl: $valueEl && $valueEl[0],
  20636. url: url,
  20637. multiple: multiple,
  20638. inputType: inputType,
  20639. id: id,
  20640. inputName: (inputType + "-" + id),
  20641. selectName: $selectEl.attr('name'),
  20642. maxLength: $selectEl.attr('maxlength') || params.maxLength,
  20643. });
  20644. $el[0].f7SmartSelect = ss;
  20645. // Events
  20646. function onClick() {
  20647. ss.open();
  20648. }
  20649. function onChange() {
  20650. var value = ss.$selectEl.val();
  20651. ss.$el.trigger('smartselect:change', value);
  20652. ss.emit('local::change smartSelectChange', ss, value);
  20653. if (ss.vl) {
  20654. ss.vl.clearCache();
  20655. }
  20656. ss.setValueText();
  20657. }
  20658. ss.attachEvents = function attachEvents() {
  20659. $el.on('click', onClick);
  20660. $el.on('change', 'select', onChange);
  20661. };
  20662. ss.detachEvents = function detachEvents() {
  20663. $el.off('click', onClick);
  20664. $el.off('change', 'select', onChange);
  20665. };
  20666. function handleInputChange() {
  20667. var optionEl;
  20668. var text;
  20669. var inputEl = this;
  20670. var value = inputEl.value;
  20671. var optionText = [];
  20672. var displayAs;
  20673. if (inputEl.type === 'checkbox') {
  20674. for (var i = 0; i < ss.selectEl.options.length; i += 1) {
  20675. optionEl = ss.selectEl.options[i];
  20676. if (optionEl.value === value) {
  20677. optionEl.selected = inputEl.checked;
  20678. }
  20679. if (optionEl.selected) {
  20680. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
  20681. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  20682. optionText.push(text.trim());
  20683. }
  20684. }
  20685. if (ss.maxLength) {
  20686. ss.checkMaxLength();
  20687. }
  20688. } else {
  20689. optionEl = ss.$selectEl.find(("option[value=\"" + value + "\"]"))[0];
  20690. if (!optionEl) {
  20691. optionEl = ss.$selectEl.find('option').filter(function (index, optEl) { return optEl.value === value; })[0];
  20692. }
  20693. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
  20694. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  20695. optionText = [text];
  20696. ss.selectEl.value = value;
  20697. }
  20698. ss.$selectEl.trigger('change');
  20699. if (ss.params.setValueText) {
  20700. ss.$valueEl.text(ss.formatValueText(optionText));
  20701. }
  20702. if (ss.params.closeOnSelect && ss.inputType === 'radio') {
  20703. ss.close();
  20704. }
  20705. }
  20706. ss.attachInputsEvents = function attachInputsEvents() {
  20707. ss.$containerEl.on('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
  20708. };
  20709. ss.detachInputsEvents = function detachInputsEvents() {
  20710. ss.$containerEl.off('change', 'input[type="checkbox"], input[type="radio"]', handleInputChange);
  20711. };
  20712. // Install Modules
  20713. ss.useModules();
  20714. // Init
  20715. ss.init();
  20716. return ss;
  20717. }
  20718. if ( Framework7Class ) SmartSelect.__proto__ = Framework7Class;
  20719. SmartSelect.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  20720. SmartSelect.prototype.constructor = SmartSelect;
  20721. var prototypeAccessors = { view: { configurable: true } };
  20722. SmartSelect.prototype.setValue = function setValue (value) {
  20723. var ss = this;
  20724. var newValue = value;
  20725. var optionText = [];
  20726. var optionEl;
  20727. var displayAs;
  20728. var text;
  20729. if (ss.multiple) {
  20730. if (!Array.isArray(newValue)) { newValue = [newValue]; }
  20731. for (var i = 0; i < ss.selectEl.options.length; i += 1) {
  20732. optionEl = ss.selectEl.options[i];
  20733. if (newValue.indexOf(optionEl.value) >= 0) {
  20734. optionEl.selected = true;
  20735. } else {
  20736. optionEl.selected = false;
  20737. }
  20738. if (optionEl.selected) {
  20739. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-value-as');
  20740. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  20741. optionText.push(text.trim());
  20742. }
  20743. }
  20744. } else {
  20745. optionEl = ss.$selectEl.find(("option[value=\"" + newValue + "\"]"))[0];
  20746. if (optionEl) {
  20747. displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $(optionEl).data('display-as');
  20748. text = displayAs && typeof displayAs !== 'undefined' ? displayAs : optionEl.textContent;
  20749. optionText = [text];
  20750. }
  20751. ss.selectEl.value = newValue;
  20752. }
  20753. if (ss.params.setValueText) {
  20754. ss.$valueEl.text(ss.formatValueText(optionText));
  20755. }
  20756. ss.$selectEl.trigger('change');
  20757. return ss;
  20758. };
  20759. SmartSelect.prototype.unsetValue = function unsetValue () {
  20760. var ss = this;
  20761. if (ss.params.setValueText) {
  20762. ss.$valueEl.text(ss.formatValueText([]));
  20763. }
  20764. ss.$selectEl.find('option').each(function (optionIndex, optionEl) {
  20765. optionEl.selected = false;
  20766. optionEl.checked = false;
  20767. });
  20768. ss.$selectEl[0].value = null;
  20769. if (ss.$containerEl) {
  20770. ss.$containerEl.find(("input[name=\"" + (ss.inputName) + "\"][type=\"checkbox\"], input[name=\"" + (ss.inputName) + "\"][type=\"radio\"]")).prop('checked', false);
  20771. }
  20772. ss.$selectEl.trigger('change');
  20773. };
  20774. SmartSelect.prototype.getValue = function getValue () {
  20775. var ss = this;
  20776. return ss.$selectEl.val();
  20777. };
  20778. prototypeAccessors.view.get = function () {
  20779. var ref = this;
  20780. var params = ref.params;
  20781. var $el = ref.$el;
  20782. var view;
  20783. if (params.view) {
  20784. view = params.view;
  20785. }
  20786. if (!view) {
  20787. view = $el.parents('.view').length && $el.parents('.view')[0].f7View;
  20788. }
  20789. if (!view && params.openIn === 'page') {
  20790. throw Error('Smart Select requires initialized View');
  20791. }
  20792. return view;
  20793. };
  20794. SmartSelect.prototype.checkMaxLength = function checkMaxLength () {
  20795. var ss = this;
  20796. var $containerEl = ss.$containerEl;
  20797. if (ss.selectEl.selectedOptions.length >= ss.maxLength) {
  20798. $containerEl.find('input[type="checkbox"]').each(function (index, inputEl) {
  20799. if (!inputEl.checked) {
  20800. $(inputEl).parents('li').addClass('disabled');
  20801. } else {
  20802. $(inputEl).parents('li').removeClass('disabled');
  20803. }
  20804. });
  20805. } else {
  20806. $containerEl.find('.disabled').removeClass('disabled');
  20807. }
  20808. };
  20809. SmartSelect.prototype.formatValueText = function formatValueText (values) {
  20810. var ss = this;
  20811. var textValue;
  20812. if (ss.params.formatValueText) {
  20813. textValue = ss.params.formatValueText.call(ss, values, ss);
  20814. } else {
  20815. textValue = values.join(', ');
  20816. }
  20817. return textValue;
  20818. };
  20819. SmartSelect.prototype.setValueText = function setValueText (value) {
  20820. var ss = this;
  20821. var valueArray = [];
  20822. if (typeof value !== 'undefined') {
  20823. if (Array.isArray(value)) {
  20824. valueArray = value;
  20825. } else {
  20826. valueArray = [value];
  20827. }
  20828. } else {
  20829. ss.$selectEl.find('option').each(function (optionIndex, optionEl) {
  20830. var $optionEl = $(optionEl);
  20831. if (optionEl.selected) {
  20832. var displayAs = optionEl.dataset ? optionEl.dataset.displayAs : $optionEl.data('display-value-as');
  20833. if (displayAs && typeof displayAs !== 'undefined') {
  20834. valueArray.push(displayAs);
  20835. } else {
  20836. valueArray.push(optionEl.textContent.trim());
  20837. }
  20838. }
  20839. });
  20840. }
  20841. if (ss.params.setValueText) {
  20842. ss.$valueEl.text(ss.formatValueText(valueArray));
  20843. }
  20844. };
  20845. SmartSelect.prototype.getItemsData = function getItemsData () {
  20846. var ss = this;
  20847. var theme = ss.app.theme;
  20848. var items = [];
  20849. var previousGroupEl;
  20850. ss.$selectEl.find('option').each(function (index, optionEl) {
  20851. var $optionEl = $(optionEl);
  20852. var optionData = $optionEl.dataset();
  20853. var optionImage = optionData.optionImage || ss.params.optionImage;
  20854. var optionIcon = optionData.optionIcon || ss.params.optionIcon;
  20855. var optionIconIos = theme === 'ios' && (optionData.optionIconIos || ss.params.optionIconIos);
  20856. var optionIconMd = theme === 'md' && (optionData.optionIconMd || ss.params.optionIconMd);
  20857. var optionIconAurora = theme === 'aurora' && (optionData.optionIconAurora || ss.params.optionIconAurora);
  20858. var optionHasMedia = optionImage || optionIcon || optionIconIos || optionIconMd || optionIconAurora;
  20859. var optionColor = optionData.optionColor;
  20860. var optionClassName = optionData.optionClass || '';
  20861. if ($optionEl[0].disabled) { optionClassName += ' disabled'; }
  20862. var optionGroupEl = $optionEl.parent('optgroup')[0];
  20863. var optionGroupLabel = optionGroupEl && optionGroupEl.label;
  20864. var optionIsLabel = false;
  20865. if (optionGroupEl && optionGroupEl !== previousGroupEl) {
  20866. optionIsLabel = true;
  20867. previousGroupEl = optionGroupEl;
  20868. items.push({
  20869. groupLabel: optionGroupLabel,
  20870. isLabel: optionIsLabel,
  20871. });
  20872. }
  20873. items.push({
  20874. value: $optionEl[0].value,
  20875. text: $optionEl[0].textContent.trim(),
  20876. selected: $optionEl[0].selected,
  20877. groupEl: optionGroupEl,
  20878. groupLabel: optionGroupLabel,
  20879. image: optionImage,
  20880. icon: optionIcon,
  20881. iconIos: optionIconIos,
  20882. iconMd: optionIconMd,
  20883. iconAurora: optionIconAurora,
  20884. color: optionColor,
  20885. className: optionClassName,
  20886. disabled: $optionEl[0].disabled,
  20887. id: ss.id,
  20888. hasMedia: optionHasMedia,
  20889. checkbox: ss.inputType === 'checkbox',
  20890. radio: ss.inputType === 'radio',
  20891. inputName: ss.inputName,
  20892. inputType: ss.inputType,
  20893. });
  20894. });
  20895. ss.items = items;
  20896. return items;
  20897. };
  20898. SmartSelect.prototype.renderSearchbar = function renderSearchbar () {
  20899. var ss = this;
  20900. if (ss.params.renderSearchbar) { return ss.params.renderSearchbar.call(ss); }
  20901. var searchbarHTML = "\n <form class=\"searchbar\">\n <div class=\"searchbar-inner\">\n <div class=\"searchbar-input-wrap\">\n <input type=\"search\" spellcheck=\"" + (ss.params.searchbarSpellcheck || 'false') + "\" placeholder=\"" + (ss.params.searchbarPlaceholder) + "\"/>\n <i class=\"searchbar-icon\"></i>\n <span class=\"input-clear-button\"></span>\n </div>\n " + (ss.params.searchbarDisableButton ? ("\n <span class=\"searchbar-disable-button\">" + (ss.params.searchbarDisableText) + "</span>\n ") : '') + "\n </div>\n </form>\n ";
  20902. return searchbarHTML;
  20903. };
  20904. SmartSelect.prototype.renderItem = function renderItem (item, index) {
  20905. var ss = this;
  20906. if (ss.params.renderItem) { return ss.params.renderItem.call(ss, item, index); }
  20907. function getIconContent(iconValue) {
  20908. if ( iconValue === void 0 ) iconValue = '';
  20909. if (iconValue.indexOf(':') >= 0) {
  20910. return iconValue.split(':')[1];
  20911. }
  20912. return '';
  20913. }
  20914. function getIconClass(iconValue) {
  20915. if ( iconValue === void 0 ) iconValue = '';
  20916. if (iconValue.indexOf(':') >= 0) {
  20917. var className = iconValue.split(':')[0];
  20918. if (className === 'f7') { className = 'f7-icons'; }
  20919. if (className === 'material') { className = 'material-icons'; }
  20920. return className;
  20921. }
  20922. return iconValue;
  20923. }
  20924. var itemHtml;
  20925. if (item.isLabel) {
  20926. itemHtml = "<li class=\"item-divider\">" + (item.groupLabel) + "</li>";
  20927. } else {
  20928. var selected = item.selected;
  20929. var disabled;
  20930. if (ss.params.virtualList) {
  20931. var ssValue = ss.getValue();
  20932. selected = ss.multiple ? ssValue.indexOf(item.value) >= 0 : ssValue === item.value;
  20933. if (ss.multiple) {
  20934. disabled = ss.multiple && !selected && ssValue.length === parseInt(ss.maxLength, 10);
  20935. }
  20936. }
  20937. var icon = item.icon;
  20938. var iconIos = item.iconIos;
  20939. var iconMd = item.iconMd;
  20940. var iconAurora = item.iconAurora;
  20941. var hasIcon = icon || iconIos || iconMd || iconAurora;
  20942. var iconContent = getIconContent(icon || iconIos || iconMd || iconAurora || '');
  20943. var iconClass = getIconClass(icon || iconIos || iconMd || iconAurora || '');
  20944. itemHtml = "\n <li class=\"" + (item.className || '') + (disabled ? ' disabled' : '') + "\">\n <label class=\"item-" + (item.inputType) + " item-content\">\n <input type=\"" + (item.inputType) + "\" name=\"" + (item.inputName) + "\" value=\"" + (item.value) + "\" " + (selected ? 'checked' : '') + "/>\n <i class=\"icon icon-" + (item.inputType) + "\"></i>\n " + (item.hasMedia ? ("\n <div class=\"item-media\">\n " + (hasIcon ? ("<i class=\"icon " + iconClass + "\">" + iconContent + "</i>") : '') + "\n " + (item.image ? ("<img src=\"" + (item.image) + "\">") : '') + "\n </div>\n ") : '') + "\n <div class=\"item-inner\">\n <div class=\"item-title" + (item.color ? (" text-color-" + (item.color)) : '') + "\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
  20945. }
  20946. return itemHtml;
  20947. };
  20948. SmartSelect.prototype.renderItems = function renderItems () {
  20949. var ss = this;
  20950. if (ss.params.renderItems) { return ss.params.renderItems.call(ss, ss.items); }
  20951. var itemsHtml = "\n " + (ss.items.map(function (item, index) { return ("" + (ss.renderItem(item, index))); }).join('')) + "\n ";
  20952. return itemsHtml;
  20953. };
  20954. SmartSelect.prototype.renderPage = function renderPage () {
  20955. var ss = this;
  20956. if (ss.params.renderPage) { return ss.params.renderPage.call(ss, ss.items); }
  20957. var pageTitle = ss.params.pageTitle;
  20958. if (typeof pageTitle === 'undefined') {
  20959. var $itemTitleEl = ss.$el.find('.item-title');
  20960. pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
  20961. }
  20962. var cssClass = ss.params.cssClass;
  20963. var pageHtml = "\n <div class=\"page smart-select-page " + cssClass + "\" data-name=\"smart-select-page\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"navbar " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"navbar-bg\"></div>\n <div class=\"navbar-inner sliding " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"left\">\n <a class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"if-not-md\">" + (ss.params.pageBackLinkText) + "</span>\n </a>\n </div>\n " + (pageTitle ? ("<div class=\"title\">" + pageTitle + "</div>") : '') + "\n " + (ss.params.searchbar ? ("<div class=\"subnavbar\">" + (ss.renderSearchbar()) + "</div>") : '') + "\n </div>\n </div>\n " + (ss.params.searchbar ? '<div class="searchbar-backdrop"></div>' : '') + "\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n ";
  20964. return pageHtml;
  20965. };
  20966. SmartSelect.prototype.renderPopup = function renderPopup () {
  20967. var ss = this;
  20968. if (ss.params.renderPopup) { return ss.params.renderPopup.call(ss, ss.items); }
  20969. var pageTitle = ss.params.pageTitle;
  20970. if (typeof pageTitle === 'undefined') {
  20971. var $itemTitleEl = ss.$el.find('.item-title');
  20972. pageTitle = $itemTitleEl.length ? $itemTitleEl.text().trim() : '';
  20973. }
  20974. var cssClass = ss.params.cssClass || '';
  20975. var popupHtml = "\n <div class=\"popup smart-select-popup " + cssClass + " " + (ss.params.popupTabletFullscreen ? 'popup-tablet-fullscreen' : '') + "\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"view\">\n <div class=\"page smart-select-page " + (ss.params.searchbar ? 'page-with-subnavbar' : '') + "\" data-name=\"smart-select-page\">\n <div class=\"navbar " + (ss.params.navbarColorTheme ? ("color-" + (ss.params.navbarColorTheme)) : '') + "\">\n <div class=\"navbar-bg\"></div>\n <div class=\"navbar-inner sliding\">\n " + (pageTitle ? ("<div class=\"title\">" + pageTitle + "</div>") : '') + "\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".smart-select-popup[data-select-name='" + (ss.selectName) + "']\">" + (ss.params.popupCloseLinkText) + "</span></a>\n </div>\n " + (ss.params.searchbar ? ("<div class=\"subnavbar\">" + (ss.renderSearchbar()) + "</div>") : '') + "\n </div>\n </div>\n " + (ss.params.searchbar ? '<div class="searchbar-backdrop"></div>' : '') + "\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n ";
  20976. return popupHtml;
  20977. };
  20978. SmartSelect.prototype.renderSheet = function renderSheet () {
  20979. var ss = this;
  20980. if (ss.params.renderSheet) { return ss.params.renderSheet.call(ss, ss.items); }
  20981. var cssClass = ss.params.cssClass;
  20982. var sheetHtml = "\n <div class=\"sheet-modal smart-select-sheet " + cssClass + "\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"toolbar toolbar-top " + (ss.params.toolbarColorTheme ? ("color-" + (ss.params.toolbarColorTheme)) : '') + "\">\n <div class=\"toolbar-inner\">\n <div class=\"left\"></div>\n <div class=\"right\">\n <a class=\"link sheet-close\">" + (ss.params.sheetCloseLinkText) + "</a>\n </div>\n </div>\n </div>\n <div class=\"sheet-modal-inner\">\n <div class=\"page-content\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n </div>\n ";
  20983. return sheetHtml;
  20984. };
  20985. SmartSelect.prototype.renderPopover = function renderPopover () {
  20986. var ss = this;
  20987. if (ss.params.renderPopover) { return ss.params.renderPopover.call(ss, ss.items); }
  20988. var cssClass = ss.params.cssClass;
  20989. var popoverHtml = "\n <div class=\"popover smart-select-popover " + cssClass + "\" data-select-name=\"" + (ss.selectName) + "\">\n <div class=\"popover-inner\">\n <div class=\"list smart-select-list-" + (ss.id) + " " + (ss.params.virtualList ? ' virtual-list' : '') + " " + (ss.params.formColorTheme ? ("color-" + (ss.params.formColorTheme)) : '') + "\">\n <ul>" + (!ss.params.virtualList && ss.renderItems(ss.items)) + "</ul>\n </div>\n </div>\n </div>\n ";
  20990. return popoverHtml;
  20991. };
  20992. SmartSelect.prototype.scrollToSelectedItem = function scrollToSelectedItem () {
  20993. var ss = this;
  20994. var params = ss.params;
  20995. var $containerEl = ss.$containerEl;
  20996. if (!ss.opened) { return ss; }
  20997. if (params.virtualList) {
  20998. var selectedIndex;
  20999. ss.vl.items.forEach(function (item, index) {
  21000. if (typeof selectedIndex === 'undefined' && item.selected) {
  21001. selectedIndex = index;
  21002. }
  21003. });
  21004. if (typeof selectedIndex !== 'undefined') {
  21005. ss.vl.scrollToItem(selectedIndex);
  21006. }
  21007. } else {
  21008. var $selectedItemEl = $containerEl.find('input:checked').parents('li');
  21009. if (!$selectedItemEl.length) { return ss; }
  21010. var $pageContentEl = $containerEl.find('.page-content');
  21011. $pageContentEl.scrollTop($selectedItemEl.offset().top - $pageContentEl.offset().top - parseInt($pageContentEl.css('padding-top'), 10));
  21012. }
  21013. return ss;
  21014. };
  21015. SmartSelect.prototype.onOpen = function onOpen (type, containerEl) {
  21016. var ss = this;
  21017. var app = ss.app;
  21018. var $containerEl = $(containerEl);
  21019. ss.$containerEl = $containerEl;
  21020. ss.openedIn = type;
  21021. ss.opened = true;
  21022. // Init VL
  21023. if (ss.params.virtualList) {
  21024. ss.vl = app.virtualList.create({
  21025. el: $containerEl.find('.virtual-list'),
  21026. items: ss.items,
  21027. renderItem: ss.renderItem.bind(ss),
  21028. height: ss.params.virtualListHeight,
  21029. searchByItem: function searchByItem(query, item) {
  21030. if (item.text && item.text.toLowerCase().indexOf(query.trim().toLowerCase()) >= 0) { return true; }
  21031. return false;
  21032. },
  21033. });
  21034. }
  21035. if (ss.params.scrollToSelectedItem) {
  21036. ss.scrollToSelectedItem();
  21037. }
  21038. // Init SB
  21039. if (ss.params.searchbar) {
  21040. var $searchbarEl = $containerEl.find('.searchbar');
  21041. if (type === 'page' && app.theme === 'ios') {
  21042. $searchbarEl = $(app.navbar.getElByPage($containerEl)).find('.searchbar');
  21043. }
  21044. if (ss.params.appendSearchbarNotFound && (type === 'page' || type === 'popup')) {
  21045. var $notFoundEl = null;
  21046. if (typeof ss.params.appendSearchbarNotFound === 'string') {
  21047. $notFoundEl = $(("<div class=\"block searchbar-not-found\">" + (ss.params.appendSearchbarNotFound) + "</div>"));
  21048. } else if (typeof ss.params.appendSearchbarNotFound === 'boolean') {
  21049. $notFoundEl = $('<div class="block searchbar-not-found">Nothing found</div>');
  21050. } else {
  21051. $notFoundEl = ss.params.appendSearchbarNotFound;
  21052. }
  21053. if ($notFoundEl) {
  21054. $containerEl.find('.page-content').append($notFoundEl[0]);
  21055. }
  21056. }
  21057. var searchbarParams = Utils.extend({
  21058. el: $searchbarEl,
  21059. backdropEl: $containerEl.find('.searchbar-backdrop'),
  21060. searchContainer: (".smart-select-list-" + (ss.id)),
  21061. searchIn: '.item-title',
  21062. }, typeof ss.params.searchbar === 'object' ? ss.params.searchbar : {});
  21063. ss.searchbar = app.searchbar.create(searchbarParams);
  21064. }
  21065. // Check for max length
  21066. if (ss.maxLength) {
  21067. ss.checkMaxLength();
  21068. }
  21069. // Close on select
  21070. if (ss.params.closeOnSelect) {
  21071. ss.$containerEl.find(("input[type=\"radio\"][name=\"" + (ss.inputName) + "\"]:checked")).parents('label').once('click', function () {
  21072. ss.close();
  21073. });
  21074. }
  21075. // Attach input events
  21076. ss.attachInputsEvents();
  21077. ss.$el.trigger('smartselect:open');
  21078. ss.emit('local::open smartSelectOpen', ss);
  21079. };
  21080. SmartSelect.prototype.onOpened = function onOpened () {
  21081. var ss = this;
  21082. ss.$el.trigger('smartselect:opened');
  21083. ss.emit('local::opened smartSelectOpened', ss);
  21084. };
  21085. SmartSelect.prototype.onClose = function onClose () {
  21086. var ss = this;
  21087. if (ss.destroyed) { return; }
  21088. // Destroy VL
  21089. if (ss.vl && ss.vl.destroy) {
  21090. ss.vl.destroy();
  21091. ss.vl = null;
  21092. delete ss.vl;
  21093. }
  21094. // Destroy SB
  21095. if (ss.searchbar && ss.searchbar.destroy) {
  21096. ss.searchbar.destroy();
  21097. ss.searchbar = null;
  21098. delete ss.searchbar;
  21099. }
  21100. // Detach events
  21101. ss.detachInputsEvents();
  21102. ss.$el.trigger('smartselect:close');
  21103. ss.emit('local::close smartSelectClose', ss);
  21104. };
  21105. SmartSelect.prototype.onClosed = function onClosed () {
  21106. var ss = this;
  21107. if (ss.destroyed) { return; }
  21108. ss.opened = false;
  21109. ss.$containerEl = null;
  21110. delete ss.$containerEl;
  21111. ss.$el.trigger('smartselect:closed');
  21112. ss.emit('local::closed smartSelectClosed', ss);
  21113. };
  21114. SmartSelect.prototype.openPage = function openPage () {
  21115. var ss = this;
  21116. if (ss.opened) { return ss; }
  21117. ss.getItemsData();
  21118. var pageHtml = ss.renderPage(ss.items);
  21119. ss.view.router.navigate({
  21120. url: ss.url,
  21121. route: {
  21122. content: pageHtml,
  21123. path: ss.url,
  21124. on: {
  21125. pageBeforeIn: function pageBeforeIn(e, page) {
  21126. ss.onOpen('page', page.el);
  21127. },
  21128. pageAfterIn: function pageAfterIn(e, page) {
  21129. ss.onOpened('page', page.el);
  21130. },
  21131. pageBeforeOut: function pageBeforeOut(e, page) {
  21132. ss.onClose('page', page.el);
  21133. },
  21134. pageAfterOut: function pageAfterOut(e, page) {
  21135. ss.onClosed('page', page.el);
  21136. },
  21137. },
  21138. },
  21139. });
  21140. return ss;
  21141. };
  21142. SmartSelect.prototype.openPopup = function openPopup () {
  21143. var ss = this;
  21144. if (ss.opened) { return ss; }
  21145. ss.getItemsData();
  21146. var popupHtml = ss.renderPopup(ss.items);
  21147. var popupParams = {
  21148. content: popupHtml,
  21149. push: ss.params.popupPush,
  21150. swipeToClose: ss.params.popupSwipeToClose,
  21151. on: {
  21152. popupOpen: function popupOpen(popup) {
  21153. ss.onOpen('popup', popup.el);
  21154. },
  21155. popupOpened: function popupOpened(popup) {
  21156. ss.onOpened('popup', popup.el);
  21157. },
  21158. popupClose: function popupClose(popup) {
  21159. ss.onClose('popup', popup.el);
  21160. },
  21161. popupClosed: function popupClosed(popup) {
  21162. ss.onClosed('popup', popup.el);
  21163. },
  21164. },
  21165. };
  21166. if (ss.params.routableModals && ss.view) {
  21167. ss.view.router.navigate({
  21168. url: ss.url,
  21169. route: {
  21170. path: ss.url,
  21171. popup: popupParams,
  21172. },
  21173. });
  21174. } else {
  21175. ss.modal = ss.app.popup.create(popupParams).open();
  21176. }
  21177. return ss;
  21178. };
  21179. SmartSelect.prototype.openSheet = function openSheet () {
  21180. var ss = this;
  21181. if (ss.opened) { return ss; }
  21182. ss.getItemsData();
  21183. var sheetHtml = ss.renderSheet(ss.items);
  21184. var sheetParams = {
  21185. content: sheetHtml,
  21186. backdrop: false,
  21187. scrollToEl: ss.$el,
  21188. closeByOutsideClick: true,
  21189. push: ss.params.sheetPush,
  21190. swipeToClose: ss.params.sheetSwipeToClose,
  21191. on: {
  21192. sheetOpen: function sheetOpen(sheet) {
  21193. ss.onOpen('sheet', sheet.el);
  21194. },
  21195. sheetOpened: function sheetOpened(sheet) {
  21196. ss.onOpened('sheet', sheet.el);
  21197. },
  21198. sheetClose: function sheetClose(sheet) {
  21199. ss.onClose('sheet', sheet.el);
  21200. },
  21201. sheetClosed: function sheetClosed(sheet) {
  21202. ss.onClosed('sheet', sheet.el);
  21203. },
  21204. },
  21205. };
  21206. if (ss.params.routableModals && ss.view) {
  21207. ss.view.router.navigate({
  21208. url: ss.url,
  21209. route: {
  21210. path: ss.url,
  21211. sheet: sheetParams,
  21212. },
  21213. });
  21214. } else {
  21215. ss.modal = ss.app.sheet.create(sheetParams).open();
  21216. }
  21217. return ss;
  21218. };
  21219. SmartSelect.prototype.openPopover = function openPopover () {
  21220. var ss = this;
  21221. if (ss.opened) { return ss; }
  21222. ss.getItemsData();
  21223. var popoverHtml = ss.renderPopover(ss.items);
  21224. var popoverParams = {
  21225. content: popoverHtml,
  21226. targetEl: ss.$el,
  21227. on: {
  21228. popoverOpen: function popoverOpen(popover) {
  21229. ss.onOpen('popover', popover.el);
  21230. },
  21231. popoverOpened: function popoverOpened(popover) {
  21232. ss.onOpened('popover', popover.el);
  21233. },
  21234. popoverClose: function popoverClose(popover) {
  21235. ss.onClose('popover', popover.el);
  21236. },
  21237. popoverClosed: function popoverClosed(popover) {
  21238. ss.onClosed('popover', popover.el);
  21239. },
  21240. },
  21241. };
  21242. if (ss.params.routableModals && ss.view) {
  21243. ss.view.router.navigate({
  21244. url: ss.url,
  21245. route: {
  21246. path: ss.url,
  21247. popover: popoverParams,
  21248. },
  21249. });
  21250. } else {
  21251. ss.modal = ss.app.popover.create(popoverParams).open();
  21252. }
  21253. return ss;
  21254. };
  21255. SmartSelect.prototype.open = function open (type) {
  21256. var ss = this;
  21257. if (ss.opened) { return ss; }
  21258. var prevented = false;
  21259. function prevent() {
  21260. prevented = true;
  21261. }
  21262. if (ss.$el) {
  21263. ss.$el.trigger('smartselect:beforeopen', { prevent: prevent });
  21264. }
  21265. ss.emit('local::beforeOpen smartSelectBeforeOpen', ss, prevent);
  21266. if (prevented) { return ss; }
  21267. var openIn = type || ss.params.openIn;
  21268. ss[("open" + (openIn.split('').map(function (el, index) {
  21269. if (index === 0) { return el.toUpperCase(); }
  21270. return el;
  21271. }).join('')))]();
  21272. return ss;
  21273. };
  21274. SmartSelect.prototype.close = function close () {
  21275. var ss = this;
  21276. if (!ss.opened) { return ss; }
  21277. if ((ss.params.routableModals && ss.view) || ss.openedIn === 'page') {
  21278. ss.view.router.back();
  21279. } else {
  21280. ss.modal.once('modalClosed', function () {
  21281. Utils.nextTick(function () {
  21282. if (ss.destroyed) { return; }
  21283. ss.modal.destroy();
  21284. delete ss.modal;
  21285. });
  21286. });
  21287. ss.modal.close();
  21288. }
  21289. return ss;
  21290. };
  21291. SmartSelect.prototype.init = function init () {
  21292. var ss = this;
  21293. ss.attachEvents();
  21294. ss.setValueText();
  21295. };
  21296. SmartSelect.prototype.destroy = function destroy () {
  21297. var ss = this;
  21298. ss.emit('local::beforeDestroy smartSelectBeforeDestroy', ss);
  21299. ss.$el.trigger('smartselect:beforedestroy');
  21300. ss.detachEvents();
  21301. delete ss.$el[0].f7SmartSelect;
  21302. Utils.deleteProps(ss);
  21303. ss.destroyed = true;
  21304. };
  21305. Object.defineProperties( SmartSelect.prototype, prototypeAccessors );
  21306. return SmartSelect;
  21307. }(Framework7Class));
  21308. var SmartSelect$1 = {
  21309. name: 'smartSelect',
  21310. params: {
  21311. smartSelect: {
  21312. el: undefined,
  21313. valueEl: undefined,
  21314. setValueText: true,
  21315. formatValueText: null,
  21316. openIn: 'page', // or 'popup' or 'sheet' or 'popover'
  21317. popupPush: false,
  21318. popupSwipeToClose: undefined, // defaults to app
  21319. sheetPush: false,
  21320. sheetSwipeToClose: undefined, // defaults to app
  21321. pageTitle: undefined,
  21322. pageBackLinkText: 'Back',
  21323. popupCloseLinkText: 'Close',
  21324. popupTabletFullscreen: false,
  21325. sheetCloseLinkText: 'Done',
  21326. searchbar: false,
  21327. searchbarPlaceholder: 'Search',
  21328. searchbarDisableText: 'Cancel',
  21329. searchbarDisableButton: undefined,
  21330. searchbarSpellcheck: false,
  21331. closeOnSelect: false,
  21332. virtualList: false,
  21333. virtualListHeight: undefined,
  21334. scrollToSelectedItem: false,
  21335. formColorTheme: undefined,
  21336. navbarColorTheme: undefined,
  21337. routableModals: true,
  21338. url: 'select/',
  21339. cssClass: '',
  21340. /*
  21341. Custom render functions
  21342. */
  21343. renderPage: undefined,
  21344. renderPopup: undefined,
  21345. renderSheet: undefined,
  21346. renderPopover: undefined,
  21347. renderItems: undefined,
  21348. renderItem: undefined,
  21349. renderSearchbar: undefined,
  21350. },
  21351. },
  21352. static: {
  21353. SmartSelect: SmartSelect,
  21354. },
  21355. create: function create() {
  21356. var app = this;
  21357. app.smartSelect = Utils.extend(
  21358. ConstructorMethods({
  21359. defaultSelector: '.smart-select',
  21360. constructor: SmartSelect,
  21361. app: app,
  21362. domProp: 'f7SmartSelect',
  21363. }),
  21364. {
  21365. open: function open(smartSelectEl) {
  21366. var ss = app.smartSelect.get(smartSelectEl);
  21367. if (ss && ss.open) { return ss.open(); }
  21368. return undefined;
  21369. },
  21370. close: function close(smartSelectEl) {
  21371. var ss = app.smartSelect.get(smartSelectEl);
  21372. if (ss && ss.close) { return ss.close(); }
  21373. return undefined;
  21374. },
  21375. }
  21376. );
  21377. },
  21378. on: {
  21379. tabMounted: function tabMounted(tabEl) {
  21380. var app = this;
  21381. $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
  21382. app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
  21383. });
  21384. },
  21385. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  21386. $(tabEl).find('.smart-select-init').each(function (index, smartSelectEl) {
  21387. if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
  21388. smartSelectEl.f7SmartSelect.destroy();
  21389. }
  21390. });
  21391. },
  21392. pageInit: function pageInit(page) {
  21393. var app = this;
  21394. page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
  21395. app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
  21396. });
  21397. },
  21398. pageBeforeRemove: function pageBeforeRemove(page) {
  21399. page.$el.find('.smart-select-init').each(function (index, smartSelectEl) {
  21400. if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
  21401. smartSelectEl.f7SmartSelect.destroy();
  21402. }
  21403. });
  21404. },
  21405. },
  21406. clicks: {
  21407. '.smart-select': function open($clickedEl, data) {
  21408. var app = this;
  21409. if (!$clickedEl[0].f7SmartSelect) {
  21410. var ss = app.smartSelect.create(Utils.extend({ el: $clickedEl }, data));
  21411. ss.open();
  21412. }
  21413. },
  21414. },
  21415. vnode: {
  21416. 'smart-select-init': {
  21417. insert: function insert(vnode) {
  21418. var app = this;
  21419. var smartSelectEl = vnode.elm;
  21420. app.smartSelect.create(Utils.extend({ el: smartSelectEl }, $(smartSelectEl).dataset()));
  21421. },
  21422. destroy: function destroy(vnode) {
  21423. var smartSelectEl = vnode.elm;
  21424. if (smartSelectEl.f7SmartSelect && smartSelectEl.f7SmartSelect.destroy) {
  21425. smartSelectEl.f7SmartSelect.destroy();
  21426. }
  21427. },
  21428. },
  21429. },
  21430. };
  21431. function getElMinSize(dimension, $el) {
  21432. var minSize = $el.css(("min-" + dimension));
  21433. if (minSize === 'auto' || minSize === 'none') {
  21434. minSize = 0;
  21435. } else if (minSize.indexOf('px') >= 0) {
  21436. minSize = parseFloat(minSize);
  21437. } else if (minSize.indexOf('%') >= 0) {
  21438. minSize = $el.parent()[0][dimension === 'height' ? 'offsetHeight' : 'offsetWidth'] * parseFloat(minSize) / 100;
  21439. }
  21440. return minSize;
  21441. }
  21442. function getElMaxSize(dimension, $el) {
  21443. var maxSize = $el.css(("max-" + dimension));
  21444. if (maxSize === 'auto' || maxSize === 'none') {
  21445. maxSize = null;
  21446. } else if (maxSize.indexOf('px') >= 0) {
  21447. maxSize = parseFloat(maxSize);
  21448. } else if (maxSize.indexOf('%') >= 0) {
  21449. maxSize = $el.parent()[0][dimension === 'height' ? 'offsetHeight' : 'offsetWidth'] * parseFloat(maxSize) / 100;
  21450. }
  21451. return maxSize;
  21452. }
  21453. var Grid = {
  21454. init: function init() {
  21455. var app = this;
  21456. var isTouched;
  21457. var isMoved;
  21458. var touchStartX;
  21459. var touchStartY;
  21460. var $resizeHandlerEl;
  21461. var $prevResizableEl;
  21462. var $nextResizableEl;
  21463. var prevElSize;
  21464. var prevElMinSize;
  21465. var prevElMaxSize;
  21466. var nextElSize;
  21467. var nextElMinSize;
  21468. var nextElMaxSize;
  21469. var parentSize;
  21470. var itemsInFlow;
  21471. var gapSize;
  21472. var isScrolling;
  21473. function handleTouchStart(e) {
  21474. if (isTouched || isMoved) { return; }
  21475. $resizeHandlerEl = $(e.target).closest('.resize-handler');
  21476. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  21477. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  21478. isTouched = true;
  21479. $prevResizableEl = undefined;
  21480. $nextResizableEl = undefined;
  21481. isScrolling = undefined;
  21482. }
  21483. function handleTouchMove(e) {
  21484. if (!isTouched) { return; }
  21485. var isRow = $resizeHandlerEl.parent('.row').length === 1;
  21486. var sizeProp = isRow ? 'height' : 'width';
  21487. var getSizeProp = isRow ? 'offsetHeight' : 'offsetWidth';
  21488. if (!isMoved) {
  21489. $prevResizableEl = $resizeHandlerEl.parent(isRow ? '.row' : '.col');
  21490. if ($prevResizableEl.length && (!$prevResizableEl.hasClass('resizable') || $prevResizableEl.hasClass('resizable-fixed'))) {
  21491. $prevResizableEl = $prevResizableEl.prevAll('.resizable:not(.resizable-fixed)').eq(0);
  21492. }
  21493. $nextResizableEl = $prevResizableEl.next(isRow ? '.row' : '.col');
  21494. if ($nextResizableEl.length && (!$nextResizableEl.hasClass('resizable') || $nextResizableEl.hasClass('resizable-fixed'))) {
  21495. $nextResizableEl = $nextResizableEl.nextAll('.resizable:not(.resizable-fixed)').eq(0);
  21496. }
  21497. if ($prevResizableEl.length) {
  21498. prevElSize = $prevResizableEl[0][getSizeProp];
  21499. prevElMinSize = getElMinSize(sizeProp, $prevResizableEl);
  21500. prevElMaxSize = getElMaxSize(sizeProp, $prevResizableEl);
  21501. parentSize = $prevResizableEl.parent()[0][getSizeProp];
  21502. itemsInFlow = $prevResizableEl.parent().children(isRow ? '.row' : '[class*="col-"], .col').length;
  21503. gapSize = parseFloat($prevResizableEl.css(isRow ? '--f7-grid-row-gap' : '--f7-grid-gap'));
  21504. }
  21505. if ($nextResizableEl.length) {
  21506. nextElSize = $nextResizableEl[0][getSizeProp];
  21507. nextElMinSize = getElMinSize(sizeProp, $nextResizableEl);
  21508. nextElMaxSize = getElMaxSize(sizeProp, $nextResizableEl);
  21509. if (!$prevResizableEl.length) {
  21510. parentSize = $nextResizableEl.parent()[0][getSizeProp];
  21511. itemsInFlow = $nextResizableEl.parent().children(isRow ? '.row' : '[class*="col-"], .col').length;
  21512. gapSize = parseFloat($nextResizableEl.css(isRow ? '--f7-grid-row-gap' : '--f7-grid-gap'));
  21513. }
  21514. }
  21515. }
  21516. isMoved = true;
  21517. var touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  21518. var touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  21519. if (typeof isScrolling === 'undefined' && !isRow) {
  21520. isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
  21521. }
  21522. if (isScrolling) {
  21523. isTouched = false;
  21524. isMoved = false;
  21525. return;
  21526. }
  21527. var isAbsolute = $prevResizableEl.hasClass('resizable-absolute') || $nextResizableEl.hasClass('resizable-absolute');
  21528. var resizeNextEl = !isRow || (isRow && !isAbsolute);
  21529. if ((resizeNextEl && !$nextResizableEl.length) || !$prevResizableEl.length) {
  21530. isTouched = false;
  21531. isMoved = false;
  21532. return;
  21533. }
  21534. e.preventDefault();
  21535. var diff = isRow
  21536. ? touchCurrentY - touchStartY
  21537. : touchCurrentX - touchStartX;
  21538. var prevElNewSize;
  21539. var nextElNewSize;
  21540. if ($prevResizableEl.length) {
  21541. prevElNewSize = prevElSize + diff;
  21542. if (prevElNewSize < prevElMinSize) {
  21543. prevElNewSize = prevElMinSize;
  21544. diff = prevElNewSize - prevElSize;
  21545. }
  21546. if (prevElMaxSize && prevElNewSize > prevElMaxSize) {
  21547. prevElNewSize = prevElMaxSize;
  21548. diff = prevElNewSize - prevElSize;
  21549. }
  21550. }
  21551. if ($nextResizableEl.length && resizeNextEl) {
  21552. nextElNewSize = nextElSize - diff;
  21553. if (nextElNewSize < nextElMinSize) {
  21554. nextElNewSize = nextElMinSize;
  21555. diff = nextElSize - nextElNewSize;
  21556. prevElNewSize = prevElSize + diff;
  21557. }
  21558. if (nextElMaxSize && nextElNewSize > nextElMaxSize) {
  21559. nextElNewSize = nextElMaxSize;
  21560. diff = nextElSize - nextElNewSize;
  21561. prevElNewSize = prevElSize + diff;
  21562. }
  21563. }
  21564. if (isAbsolute) {
  21565. $prevResizableEl[0].style[sizeProp] = prevElNewSize + "px";
  21566. if (resizeNextEl) {
  21567. $nextResizableEl[0].style[sizeProp] = nextElNewSize + "px";
  21568. }
  21569. $prevResizableEl.trigger('grid:resize');
  21570. $nextResizableEl.trigger('grid:resize');
  21571. app.emit('gridResize', $prevResizableEl[0]);
  21572. app.emit('gridResize', $nextResizableEl[0]);
  21573. return;
  21574. }
  21575. var gapAddSize = (itemsInFlow - 1) * gapSize / itemsInFlow;
  21576. var gapAddSizeCSS = isRow
  21577. ? ((itemsInFlow - 1) + " * var(--f7-grid-row-gap) / " + itemsInFlow)
  21578. : '(var(--f7-cols-per-row) - 1) * var(--f7-grid-gap) / var(--f7-cols-per-row)';
  21579. var prevElNewSizeNormalized = prevElNewSize + gapAddSize;
  21580. var nextElNewSizeNormalized = nextElNewSize + gapAddSize;
  21581. $prevResizableEl[0].style[sizeProp] = "calc(" + (prevElNewSizeNormalized / parentSize * 100) + "% - " + gapAddSizeCSS + ")";
  21582. $nextResizableEl[0].style[sizeProp] = "calc(" + (nextElNewSizeNormalized / parentSize * 100) + "% - " + gapAddSizeCSS + ")";
  21583. $prevResizableEl.trigger('grid:resize');
  21584. $nextResizableEl.trigger('grid:resize');
  21585. app.emit('gridResize', $prevResizableEl[0]);
  21586. app.emit('gridResize', $nextResizableEl[0]);
  21587. }
  21588. function handleTouchEnd() {
  21589. if (!isTouched) { return; }
  21590. if (!isMoved) {
  21591. isTouched = false;
  21592. }
  21593. isTouched = false;
  21594. isMoved = false;
  21595. }
  21596. $(document).on(app.touchEvents.start, '.col > .resize-handler, .row > .resize-handler', handleTouchStart);
  21597. app.on('touchmove', handleTouchMove);
  21598. app.on('touchend', handleTouchEnd);
  21599. },
  21600. };
  21601. var Grid$1 = {
  21602. name: 'grid',
  21603. create: function create() {
  21604. var app = this;
  21605. Utils.extend(app, {
  21606. grid: {
  21607. init: Grid.init.bind(app),
  21608. },
  21609. });
  21610. },
  21611. on: {
  21612. init: function init() {
  21613. var app = this;
  21614. app.grid.init();
  21615. },
  21616. },
  21617. };
  21618. var Calendar = /*@__PURE__*/(function (Framework7Class) {
  21619. function Calendar(app, params) {
  21620. if ( params === void 0 ) params = {};
  21621. Framework7Class.call(this, params, [app]);
  21622. var calendar = this;
  21623. calendar.params = Utils.extend({}, app.params.calendar, params);
  21624. var $containerEl;
  21625. if (calendar.params.containerEl) {
  21626. $containerEl = $(calendar.params.containerEl);
  21627. if ($containerEl.length === 0) { return calendar; }
  21628. }
  21629. var $inputEl;
  21630. if (calendar.params.inputEl) {
  21631. $inputEl = $(calendar.params.inputEl);
  21632. }
  21633. var isHorizontal = calendar.params.direction === 'horizontal';
  21634. var inverter = 1;
  21635. if (isHorizontal) {
  21636. inverter = app.rtl ? -1 : 1;
  21637. }
  21638. Utils.extend(calendar, {
  21639. app: app,
  21640. $containerEl: $containerEl,
  21641. containerEl: $containerEl && $containerEl[0],
  21642. inline: $containerEl && $containerEl.length > 0,
  21643. $inputEl: $inputEl,
  21644. inputEl: $inputEl && $inputEl[0],
  21645. initialized: false,
  21646. opened: false,
  21647. url: calendar.params.url,
  21648. isHorizontal: isHorizontal,
  21649. inverter: inverter,
  21650. animating: false,
  21651. hasTimePicker: calendar.params.timePicker && !calendar.params.rangePicker && !calendar.params.multiple,
  21652. });
  21653. calendar.dayFormatter = new Intl.DateTimeFormat(calendar.params.locale, { day: 'numeric' });
  21654. calendar.monthFormatter = new Intl.DateTimeFormat(calendar.params.locale, { month: 'long' });
  21655. calendar.yearFormatter = new Intl.DateTimeFormat(calendar.params.locale, { year: 'numeric' });
  21656. calendar.timeSelectorFormatter = new Intl.DateTimeFormat(calendar.params.locale, calendar.params.timePickerFormat);
  21657. // Auto names
  21658. var ref = calendar.params;
  21659. var monthNames = ref.monthNames;
  21660. var monthNamesShort = ref.monthNamesShort;
  21661. var dayNames = ref.dayNames;
  21662. var dayNamesShort = ref.dayNamesShort;
  21663. var ref$1 = calendar.getIntlNames();
  21664. var monthNamesIntl = ref$1.monthNamesIntl;
  21665. var monthNamesShortIntl = ref$1.monthNamesShortIntl;
  21666. var dayNamesIntl = ref$1.dayNamesIntl;
  21667. var dayNamesShortIntl = ref$1.dayNamesShortIntl;
  21668. if (monthNames === 'auto') { monthNames = monthNamesIntl; }
  21669. if (monthNamesShort === 'auto') { monthNamesShort = monthNamesShortIntl; }
  21670. if (dayNames === 'auto') { dayNames = dayNamesIntl; }
  21671. if (dayNamesShort === 'auto') { dayNamesShort = dayNamesShortIntl; }
  21672. Utils.extend(calendar, {
  21673. monthNames: monthNames,
  21674. monthNamesShort: monthNamesShort,
  21675. dayNames: dayNames,
  21676. dayNamesShort: dayNamesShort,
  21677. });
  21678. function onInputClick() {
  21679. calendar.open();
  21680. }
  21681. function onInputFocus(e) {
  21682. e.preventDefault();
  21683. }
  21684. function onInputClear() {
  21685. calendar.setValue([]);
  21686. if (calendar.opened) {
  21687. calendar.update();
  21688. }
  21689. }
  21690. function onHtmlClick(e) {
  21691. var $targetEl = $(e.target);
  21692. if (calendar.destroyed || !calendar.params) { return; }
  21693. if (calendar.isPopover()) { return; }
  21694. if (!calendar.opened || calendar.closing) { return; }
  21695. if ($targetEl.closest('[class*="backdrop"]').length) { return; }
  21696. if ($inputEl && $inputEl.length > 0) {
  21697. if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal, .calendar-modal').length === 0) {
  21698. calendar.close();
  21699. }
  21700. } else if ($(e.target).closest('.sheet-modal, .calendar-modal').length === 0) {
  21701. calendar.close();
  21702. }
  21703. }
  21704. // Events
  21705. Utils.extend(calendar, {
  21706. attachInputEvents: function attachInputEvents() {
  21707. calendar.$inputEl.on('click', onInputClick);
  21708. calendar.$inputEl.on('input:clear', onInputClear);
  21709. if (calendar.params.inputReadOnly) {
  21710. calendar.$inputEl.on('focus mousedown', onInputFocus);
  21711. if (calendar.$inputEl[0]) {
  21712. calendar.$inputEl[0].f7ValidateReadonly = true;
  21713. }
  21714. }
  21715. },
  21716. detachInputEvents: function detachInputEvents() {
  21717. calendar.$inputEl.off('click', onInputClick);
  21718. calendar.$inputEl.off('input:clear', onInputClear);
  21719. if (calendar.params.inputReadOnly) {
  21720. calendar.$inputEl.off('focus mousedown', onInputFocus);
  21721. if (calendar.$inputEl[0]) {
  21722. delete calendar.$inputEl[0].f7ValidateReadonly;
  21723. }
  21724. }
  21725. },
  21726. attachHtmlEvents: function attachHtmlEvents() {
  21727. app.on('click', onHtmlClick);
  21728. },
  21729. detachHtmlEvents: function detachHtmlEvents() {
  21730. app.off('click', onHtmlClick);
  21731. },
  21732. });
  21733. calendar.attachCalendarEvents = function attachCalendarEvents() {
  21734. var allowItemClick = true;
  21735. var isTouched;
  21736. var isMoved;
  21737. var touchStartX;
  21738. var touchStartY;
  21739. var touchCurrentX;
  21740. var touchCurrentY;
  21741. var touchStartTime;
  21742. var touchEndTime;
  21743. var currentTranslate;
  21744. var wrapperWidth;
  21745. var wrapperHeight;
  21746. var percentage;
  21747. var touchesDiff;
  21748. var isScrolling;
  21749. var $el = calendar.$el;
  21750. var $wrapperEl = calendar.$wrapperEl;
  21751. function handleTouchStart(e) {
  21752. if (isMoved || isTouched) { return; }
  21753. isTouched = true;
  21754. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  21755. touchCurrentX = touchStartX;
  21756. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  21757. touchCurrentY = touchStartY;
  21758. touchStartTime = (new Date()).getTime();
  21759. percentage = 0;
  21760. allowItemClick = true;
  21761. isScrolling = undefined;
  21762. currentTranslate = calendar.monthsTranslate;
  21763. }
  21764. function handleTouchMove(e) {
  21765. if (!isTouched) { return; }
  21766. var isH = calendar.isHorizontal;
  21767. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  21768. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  21769. if (typeof isScrolling === 'undefined') {
  21770. isScrolling = !!(isScrolling || Math.abs(touchCurrentY - touchStartY) > Math.abs(touchCurrentX - touchStartX));
  21771. }
  21772. if (isH && isScrolling) {
  21773. isTouched = false;
  21774. return;
  21775. }
  21776. e.preventDefault();
  21777. if (calendar.animating) {
  21778. isTouched = false;
  21779. return;
  21780. }
  21781. allowItemClick = false;
  21782. if (!isMoved) {
  21783. // First move
  21784. isMoved = true;
  21785. wrapperWidth = $wrapperEl[0].offsetWidth;
  21786. wrapperHeight = $wrapperEl[0].offsetHeight;
  21787. $wrapperEl.transition(0);
  21788. }
  21789. touchesDiff = isH ? touchCurrentX - touchStartX : touchCurrentY - touchStartY;
  21790. percentage = touchesDiff / (isH ? wrapperWidth : wrapperHeight);
  21791. currentTranslate = ((calendar.monthsTranslate * calendar.inverter) + percentage) * 100;
  21792. // Transform wrapper
  21793. $wrapperEl.transform(("translate3d(" + (isH ? currentTranslate : 0) + "%, " + (isH ? 0 : currentTranslate) + "%, 0)"));
  21794. }
  21795. function handleTouchEnd() {
  21796. if (!isTouched || !isMoved) {
  21797. isTouched = false;
  21798. isMoved = false;
  21799. return;
  21800. }
  21801. isTouched = false;
  21802. isMoved = false;
  21803. touchEndTime = new Date().getTime();
  21804. if (touchEndTime - touchStartTime < 300) {
  21805. if (Math.abs(touchesDiff) < 10) {
  21806. calendar.resetMonth();
  21807. } else if (touchesDiff >= 10) {
  21808. if (app.rtl) { calendar.nextMonth(); }
  21809. else { calendar.prevMonth(); }
  21810. } else if (app.rtl) { calendar.prevMonth(); }
  21811. else { calendar.nextMonth(); }
  21812. } else if (percentage <= -0.5) {
  21813. if (app.rtl) { calendar.prevMonth(); }
  21814. else { calendar.nextMonth(); }
  21815. } else if (percentage >= 0.5) {
  21816. if (app.rtl) { calendar.nextMonth(); }
  21817. else { calendar.prevMonth(); }
  21818. } else {
  21819. calendar.resetMonth();
  21820. }
  21821. // Allow click
  21822. setTimeout(function () {
  21823. allowItemClick = true;
  21824. }, 100);
  21825. }
  21826. function handleDayClick(e) {
  21827. if (!allowItemClick) { return; }
  21828. var $dayEl = $(e.target).parents('.calendar-day');
  21829. if ($dayEl.length === 0 && $(e.target).hasClass('calendar-day')) {
  21830. $dayEl = $(e.target);
  21831. }
  21832. if ($dayEl.length === 0) { return; }
  21833. if ($dayEl.hasClass('calendar-day-disabled')) { return; }
  21834. if (!calendar.params.rangePicker) {
  21835. if ($dayEl.hasClass('calendar-day-next')) { calendar.nextMonth(); }
  21836. if ($dayEl.hasClass('calendar-day-prev')) { calendar.prevMonth(); }
  21837. }
  21838. var dateYear = parseInt($dayEl.attr('data-year'), 10);
  21839. var dateMonth = parseInt($dayEl.attr('data-month'), 10);
  21840. var dateDay = parseInt($dayEl.attr('data-day'), 10);
  21841. calendar.emit(
  21842. 'local::dayClick calendarDayClick',
  21843. calendar,
  21844. $dayEl[0],
  21845. dateYear,
  21846. dateMonth,
  21847. dateDay
  21848. );
  21849. if (!$dayEl.hasClass('calendar-day-selected') || calendar.params.multiple || calendar.params.rangePicker) {
  21850. var valueToAdd = new Date(dateYear, dateMonth, dateDay, 0, 0, 0);
  21851. if (calendar.hasTimePicker) {
  21852. if (calendar.value && calendar.value[0]) {
  21853. valueToAdd.setHours(calendar.value[0].getHours(), calendar.value[0].getMinutes());
  21854. } else {
  21855. valueToAdd.setHours(new Date().getHours(), new Date().getMinutes());
  21856. }
  21857. }
  21858. calendar.addValue(valueToAdd);
  21859. }
  21860. if (calendar.params.closeOnSelect) {
  21861. if (
  21862. (calendar.params.rangePicker && calendar.value.length === 2)
  21863. || !calendar.params.rangePicker
  21864. ) {
  21865. calendar.close();
  21866. }
  21867. }
  21868. }
  21869. function onNextMonthClick() {
  21870. calendar.nextMonth();
  21871. }
  21872. function onPrevMonthClick() {
  21873. calendar.prevMonth();
  21874. }
  21875. function onNextYearClick() {
  21876. calendar.nextYear();
  21877. }
  21878. function onPrevYearClick() {
  21879. calendar.prevYear();
  21880. }
  21881. function onMonthSelectorClick() {
  21882. $el.append(calendar.renderMonthPicker());
  21883. }
  21884. function onMonthSelectorItemClick() {
  21885. var $clickedEl = $(this);
  21886. if ($clickedEl.hasClass('calendar-month-picker-item-current')) {
  21887. $el.find('.calendar-month-picker').remove();
  21888. return;
  21889. }
  21890. $el.find('.calendar-month-picker-item-current').add($clickedEl).toggleClass('calendar-month-picker-item-current');
  21891. var index = $clickedEl.index();
  21892. var localeMonthIndex = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);
  21893. var monthIndex = calendar.currentMonth;
  21894. var diff = localeMonthIndex - monthIndex;
  21895. var diffIndex = index - diff;
  21896. calendar.setYearMonth(calendar.currentYear, diffIndex, 0);
  21897. setTimeout(function () {
  21898. $el.find('.calendar-month-picker').remove();
  21899. }, 200);
  21900. }
  21901. function onYearSelectorClick() {
  21902. $el.append(calendar.renderYearPicker());
  21903. var $currentEl = $el.find('.calendar-year-picker-item-current');
  21904. var $yearPickerEl = $el.find('.calendar-year-picker');
  21905. if (!$currentEl || !$currentEl.length) { return; }
  21906. $yearPickerEl.scrollTop(
  21907. $currentEl[0].offsetTop
  21908. - $yearPickerEl[0].offsetHeight / 2
  21909. + $currentEl[0].offsetHeight / 2
  21910. );
  21911. }
  21912. function onYearSelectorItemClick() {
  21913. var $clickedEl = $(this);
  21914. if ($clickedEl.hasClass('calendar-year-picker-item-current')) {
  21915. $el.find('.calendar-year-picker').remove();
  21916. return;
  21917. }
  21918. $el.find('.calendar-year-picker-item-current').add($clickedEl).toggleClass('calendar-year-picker-item-current');
  21919. var year = parseInt($clickedEl.attr('data-year'), 10);
  21920. calendar.setYearMonth(year, undefined, 0);
  21921. setTimeout(function () {
  21922. $el.find('.calendar-year-picker').remove();
  21923. }, 200);
  21924. }
  21925. function onTimeSelectorClick() {
  21926. calendar.openTimePicker();
  21927. }
  21928. function onTimePickerCloseClick() {
  21929. calendar.closeTimePicker();
  21930. }
  21931. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  21932. // Selectors clicks
  21933. $el.find('.calendar-prev-month-button').on('click', onPrevMonthClick);
  21934. $el.find('.calendar-next-month-button').on('click', onNextMonthClick);
  21935. $el.find('.calendar-prev-year-button').on('click', onPrevYearClick);
  21936. $el.find('.calendar-next-year-button').on('click', onNextYearClick);
  21937. if (calendar.params.monthPicker) {
  21938. $el.find('.current-month-value').on('click', onMonthSelectorClick);
  21939. $el.on('click', '.calendar-month-picker-item', onMonthSelectorItemClick);
  21940. }
  21941. if (calendar.params.yearPicker) {
  21942. $el.find('.current-year-value').on('click', onYearSelectorClick);
  21943. $el.on('click', '.calendar-year-picker-item', onYearSelectorItemClick);
  21944. }
  21945. if (calendar.hasTimePicker) {
  21946. $el.find('.calendar-time-selector a').on('click', onTimeSelectorClick);
  21947. $el.on('click', '.calendar-time-picker-close', onTimePickerCloseClick);
  21948. }
  21949. // Day clicks
  21950. $wrapperEl.on('click', handleDayClick);
  21951. // Touch events
  21952. if (calendar.params.touchMove) {
  21953. $wrapperEl.on(app.touchEvents.start, handleTouchStart, passiveListener);
  21954. app.on('touchmove:active', handleTouchMove);
  21955. app.on('touchend:passive', handleTouchEnd);
  21956. }
  21957. calendar.detachCalendarEvents = function detachCalendarEvents() {
  21958. $el.find('.calendar-prev-month-button').off('click', onPrevMonthClick);
  21959. $el.find('.calendar-next-month-button').off('click', onNextMonthClick);
  21960. $el.find('.calendar-prev-year-button').off('click', onPrevYearClick);
  21961. $el.find('.calendar-next-year-button').off('click', onNextYearClick);
  21962. if (calendar.params.monthPicker) {
  21963. $el.find('.current-month-value').off('click', onMonthSelectorClick);
  21964. $el.off('click', '.calendar-month-picker-item', onMonthSelectorItemClick);
  21965. }
  21966. if (calendar.params.yearPicker) {
  21967. $el.find('.current-year-value').off('click', onYearSelectorClick);
  21968. $el.off('click', '.calendar-year-picker-item', onYearSelectorItemClick);
  21969. }
  21970. if (calendar.hasTimePicker) {
  21971. $el.find('.calendar-time-selector a').off('click', onTimeSelectorClick);
  21972. $el.off('click', '.calendar-time-picker-close', onTimePickerCloseClick);
  21973. }
  21974. $wrapperEl.off('click', handleDayClick);
  21975. if (calendar.params.touchMove) {
  21976. $wrapperEl.off(app.touchEvents.start, handleTouchStart, passiveListener);
  21977. app.off('touchmove:active', handleTouchMove);
  21978. app.off('touchend:passive', handleTouchEnd);
  21979. }
  21980. };
  21981. };
  21982. calendar.init();
  21983. return calendar;
  21984. }
  21985. if ( Framework7Class ) Calendar.__proto__ = Framework7Class;
  21986. Calendar.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  21987. Calendar.prototype.constructor = Calendar;
  21988. var prototypeAccessors = { view: { configurable: true } };
  21989. prototypeAccessors.view.get = function () {
  21990. var ref = this;
  21991. var $inputEl = ref.$inputEl;
  21992. var app = ref.app;
  21993. var params = ref.params;
  21994. var view;
  21995. if (params.view) {
  21996. view = params.view;
  21997. } else if ($inputEl) {
  21998. view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
  21999. }
  22000. if (!view) { view = app.views.main; }
  22001. return view;
  22002. };
  22003. Calendar.prototype.getIntlNames = function getIntlNames () {
  22004. var calendar = this;
  22005. var locale = calendar.params.locale;
  22006. var monthNamesIntl = [];
  22007. var monthNamesShortIntl = [];
  22008. var dayNamesIntl = [];
  22009. var dayNamesShortIntl = [];
  22010. var formatterMonthNames = new Intl.DateTimeFormat(locale, { month: 'long' });
  22011. var formatterMonthNamesShort = new Intl.DateTimeFormat(locale, { month: 'short' });
  22012. var formatterDayNames = new Intl.DateTimeFormat(locale, { weekday: 'long' });
  22013. var formatterDayNamesShort = new Intl.DateTimeFormat(locale, { weekday: 'short' });
  22014. var year;
  22015. var yearStarted;
  22016. var yearEnded;
  22017. for (var i = 0; i < 24; i += 1) {
  22018. var date = new Date().setMonth(i, 1);
  22019. var currentYear = calendar.yearFormatter.format(date);
  22020. if (year && currentYear !== year) {
  22021. if (yearStarted) { yearEnded = true; }
  22022. yearStarted = true;
  22023. year = currentYear;
  22024. }
  22025. if (!year) {
  22026. year = currentYear;
  22027. }
  22028. if (yearStarted && year === currentYear && !yearEnded) {
  22029. monthNamesIntl.push(formatterMonthNames.format(date));
  22030. monthNamesShortIntl.push(formatterMonthNamesShort.format(date));
  22031. }
  22032. }
  22033. var weekDay = new Date().getDay();
  22034. for (var i$1 = 0; i$1 < 7; i$1 += 1) {
  22035. var date$1 = new Date().getTime() + (i$1 - weekDay) * 24 * 60 * 60 * 1000;
  22036. dayNamesIntl.push(formatterDayNames.format(date$1));
  22037. dayNamesShortIntl.push(formatterDayNamesShort.format(date$1));
  22038. }
  22039. return {
  22040. monthNamesIntl: monthNamesIntl,
  22041. monthNamesShortIntl: monthNamesShortIntl,
  22042. dayNamesIntl: dayNamesIntl,
  22043. dayNamesShortIntl: dayNamesShortIntl,
  22044. };
  22045. };
  22046. Calendar.prototype.normalizeDate = function normalizeDate (date) {
  22047. var calendar = this;
  22048. var d = new Date(date);
  22049. if (calendar.hasTimePicker) {
  22050. return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());
  22051. }
  22052. return new Date(d.getFullYear(), d.getMonth(), d.getDate());
  22053. };
  22054. Calendar.prototype.normalizeValues = function normalizeValues (values) {
  22055. var calendar = this;
  22056. var newValues = [];
  22057. if (values && Array.isArray(values)) {
  22058. newValues = values.map(function (val) { return calendar.normalizeDate(val); });
  22059. }
  22060. return newValues;
  22061. };
  22062. Calendar.prototype.initInput = function initInput () {
  22063. var calendar = this;
  22064. if (!calendar.$inputEl) { return; }
  22065. if (calendar.params.inputReadOnly) { calendar.$inputEl.prop('readOnly', true); }
  22066. };
  22067. Calendar.prototype.isPopover = function isPopover () {
  22068. var calendar = this;
  22069. var app = calendar.app;
  22070. var modal = calendar.modal;
  22071. var params = calendar.params;
  22072. if (params.openIn === 'sheet') { return false; }
  22073. if (modal && modal.type !== 'popover') { return false; }
  22074. if (!calendar.inline && calendar.inputEl) {
  22075. if (params.openIn === 'popover') { return true; }
  22076. if (app.device.ios) {
  22077. return !!app.device.ipad;
  22078. }
  22079. if (app.width >= 768) {
  22080. return true;
  22081. }
  22082. if (app.device.desktop && app.theme === 'aurora') {
  22083. return true;
  22084. }
  22085. }
  22086. return false;
  22087. };
  22088. Calendar.prototype.formatDate = function formatDate (d) {
  22089. var calendar = this;
  22090. var date = new Date(d);
  22091. var year = date.getFullYear();
  22092. var month = date.getMonth();
  22093. var month1 = month + 1;
  22094. var day = date.getDate();
  22095. var weekDay = date.getDay();
  22096. var monthNames = calendar.monthNames;
  22097. var monthNamesShort = calendar.monthNamesShort;
  22098. var dayNames = calendar.dayNames;
  22099. var dayNamesShort = calendar.dayNamesShort;
  22100. var ref = calendar.params;
  22101. var dateFormat = ref.dateFormat;
  22102. var locale = ref.locale;
  22103. function twoDigits(number) {
  22104. return (number < 10) ? ("0" + number) : number;
  22105. }
  22106. if (typeof dateFormat === 'string') {
  22107. var tokens = {
  22108. yyyy: year,
  22109. yy: String(year).substring(2),
  22110. mm: twoDigits(month1),
  22111. m: month1,
  22112. MM: monthNames[month],
  22113. M: monthNamesShort[month],
  22114. dd: twoDigits(day),
  22115. d: day,
  22116. DD: dayNames[weekDay],
  22117. D: dayNamesShort[weekDay],
  22118. };
  22119. if (calendar.params.timePicker) {
  22120. var hours = date.getHours();
  22121. var minutes = date.getMinutes();
  22122. var seconds = date.getSeconds();
  22123. var hours12 = hours;
  22124. if (hours > 12) { hours12 = hours - 12; }
  22125. if (hours === 0) { hours12 = 12; }
  22126. var a = hours >= 12 && hours !== 0 ? 'pm' : 'am';
  22127. Object.assign(tokens, {
  22128. HH: twoDigits(hours),
  22129. H: hours,
  22130. hh: twoDigits(hours12),
  22131. h: hours12,
  22132. ss: twoDigits(seconds),
  22133. s: seconds,
  22134. ':mm': twoDigits(minutes),
  22135. ':m': minutes,
  22136. a: a,
  22137. A: a.toUpperCase(),
  22138. });
  22139. }
  22140. var regexp = new RegExp(
  22141. Object.keys(tokens).map(function (t) { return ("(" + t + ")"); }).join('|'),
  22142. 'g'
  22143. );
  22144. return dateFormat.replace(regexp, function (token) {
  22145. if (token in tokens) { return tokens[token]; }
  22146. return token;
  22147. });
  22148. }
  22149. if (typeof dateFormat === 'function') {
  22150. return dateFormat(date);
  22151. }
  22152. // Intl Object
  22153. var formatter = new Intl.DateTimeFormat(locale, dateFormat);
  22154. return formatter.format(date);
  22155. };
  22156. Calendar.prototype.formatValue = function formatValue () {
  22157. var calendar = this;
  22158. var value = calendar.value;
  22159. if (calendar.params.formatValue) {
  22160. return calendar.params.formatValue.call(calendar, value);
  22161. }
  22162. return value
  22163. .map(function (v) { return calendar.formatDate(v); })
  22164. .join(calendar.params.rangePicker ? ' - ' : ', ');
  22165. };
  22166. Calendar.prototype.addValue = function addValue (newValue) {
  22167. var calendar = this;
  22168. var ref = calendar.params;
  22169. var multiple = ref.multiple;
  22170. var rangePicker = ref.rangePicker;
  22171. var rangePickerMinDays = ref.rangePickerMinDays;
  22172. var rangePickerMaxDays = ref.rangePickerMaxDays;
  22173. if (multiple) {
  22174. if (!calendar.value) { calendar.value = []; }
  22175. var inValuesIndex;
  22176. for (var i = 0; i < calendar.value.length; i += 1) {
  22177. if (new Date(newValue).getTime() === new Date(calendar.value[i]).getTime()) {
  22178. inValuesIndex = i;
  22179. }
  22180. }
  22181. if (typeof inValuesIndex === 'undefined') {
  22182. calendar.value.push(newValue);
  22183. } else {
  22184. calendar.value.splice(inValuesIndex, 1);
  22185. }
  22186. calendar.updateValue();
  22187. } else if (rangePicker) {
  22188. if (!calendar.value) { calendar.value = []; }
  22189. if (calendar.value.length === 2 || calendar.value.length === 0) {
  22190. calendar.value = [];
  22191. }
  22192. if ((calendar.value.length === 0
  22193. || ((Math.abs(calendar.value[0].getTime() - newValue.getTime()) >= (rangePickerMinDays - 1) * 60 * 60 * 24 * 1000) && (rangePickerMaxDays === 0 || Math.abs(calendar.value[0].getTime() - newValue.getTime()) <= (rangePickerMaxDays - 1) * 60 * 60 * 24 * 1000)))) { calendar.value.push(newValue); }
  22194. else { calendar.value = []; }
  22195. calendar.value.sort(function (a, b) { return a - b; });
  22196. calendar.updateValue();
  22197. } else {
  22198. calendar.value = [newValue];
  22199. calendar.updateValue();
  22200. }
  22201. };
  22202. Calendar.prototype.setValue = function setValue (values) {
  22203. var calendar = this;
  22204. var currentValue = calendar.value;
  22205. if (Array.isArray(currentValue) && Array.isArray(values) && currentValue.length === values.length) {
  22206. var equal = true;
  22207. currentValue.forEach(function (v, index) {
  22208. if (v !== values[index]) { equal = false; }
  22209. });
  22210. if (equal) { return; }
  22211. }
  22212. calendar.value = values;
  22213. calendar.updateValue();
  22214. };
  22215. Calendar.prototype.getValue = function getValue () {
  22216. var calendar = this;
  22217. return calendar.value;
  22218. };
  22219. Calendar.prototype.updateValue = function updateValue (onlyHeader) {
  22220. var calendar = this;
  22221. var $el = calendar.$el;
  22222. var $wrapperEl = calendar.$wrapperEl;
  22223. var $inputEl = calendar.$inputEl;
  22224. var value = calendar.value;
  22225. var params = calendar.params;
  22226. var i;
  22227. if ($el && $el.length > 0) {
  22228. $wrapperEl.find('.calendar-day-selected').removeClass('calendar-day-selected');
  22229. var valueDate;
  22230. if (params.rangePicker && value.length === 2) {
  22231. for (i = new Date(value[0]).getTime(); i <= new Date(value[1]).getTime(); i += 24 * 60 * 60 * 1000) {
  22232. valueDate = new Date(i);
  22233. $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
  22234. }
  22235. valueDate = new Date(new Date(value[1]).getTime());
  22236. $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
  22237. } else {
  22238. for (i = 0; i < calendar.value.length; i += 1) {
  22239. valueDate = new Date(value[i]);
  22240. $wrapperEl.find((".calendar-day[data-date=\"" + (valueDate.getFullYear()) + "-" + (valueDate.getMonth()) + "-" + (valueDate.getDate()) + "\"]")).addClass('calendar-day-selected');
  22241. }
  22242. }
  22243. }
  22244. if (!onlyHeader) {
  22245. calendar.emit('local::change calendarChange', calendar, value);
  22246. }
  22247. if ($el && $el.length > 0 && calendar.hasTimePicker) {
  22248. $el.find('.calendar-time-selector a').text(value && value.length ? calendar.timeSelectorFormatter.format(value[0]) : calendar.params.timePickerPlaceholder);
  22249. }
  22250. if (($inputEl && $inputEl.length) || params.header) {
  22251. var inputValue = calendar.formatValue(value);
  22252. if (params.header && $el && $el.length) {
  22253. $el.find('.calendar-selected-date').text(inputValue);
  22254. }
  22255. if ($inputEl && $inputEl.length && !onlyHeader) {
  22256. $inputEl.val(inputValue);
  22257. $inputEl.trigger('change');
  22258. }
  22259. }
  22260. };
  22261. Calendar.prototype.updateCurrentMonthYear = function updateCurrentMonthYear (dir) {
  22262. var calendar = this;
  22263. var $months = calendar.$months;
  22264. var $el = calendar.$el;
  22265. var monthNames = calendar.monthNames;
  22266. var currentLocaleMonth;
  22267. var currentLocaleYear;
  22268. if (typeof dir === 'undefined') {
  22269. calendar.currentMonth = parseInt($months.eq(1).attr('data-month'), 10);
  22270. calendar.currentYear = parseInt($months.eq(1).attr('data-year'), 10);
  22271. currentLocaleMonth = $months.eq(1).attr('data-locale-month');
  22272. currentLocaleYear = $months.eq(1).attr('data-locale-year');
  22273. } else {
  22274. calendar.currentMonth = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-month'), 10);
  22275. calendar.currentYear = parseInt($months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-year'), 10);
  22276. currentLocaleMonth = $months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-locale-month');
  22277. currentLocaleYear = $months.eq(dir === 'next' ? ($months.length - 1) : 0).attr('data-locale-year');
  22278. }
  22279. $el.find('.current-month-value').text(monthNames[currentLocaleMonth]);
  22280. $el.find('.current-year-value').text(currentLocaleYear);
  22281. };
  22282. Calendar.prototype.update = function update () {
  22283. var calendar = this;
  22284. var currentYear = calendar.currentYear;
  22285. var currentMonth = calendar.currentMonth;
  22286. var $wrapperEl = calendar.$wrapperEl;
  22287. var currentDate = new Date(currentYear, currentMonth);
  22288. var prevMonthHtml = calendar.renderMonth(currentDate, 'prev');
  22289. var currentMonthHtml = calendar.renderMonth(currentDate);
  22290. var nextMonthHtml = calendar.renderMonth(currentDate, 'next');
  22291. $wrapperEl
  22292. .transition(0)
  22293. .html(("" + prevMonthHtml + currentMonthHtml + nextMonthHtml))
  22294. .transform('translate3d(0,0,0)');
  22295. calendar.$months = $wrapperEl.find('.calendar-month');
  22296. calendar.monthsTranslate = 0;
  22297. calendar.setMonthsTranslate();
  22298. calendar.$months.each(function (index, monthEl) {
  22299. calendar.emit(
  22300. 'local::monthAdd calendarMonthAdd',
  22301. monthEl
  22302. );
  22303. });
  22304. };
  22305. Calendar.prototype.onMonthChangeStart = function onMonthChangeStart (dir) {
  22306. var calendar = this;
  22307. var $months = calendar.$months;
  22308. var currentYear = calendar.currentYear;
  22309. var currentMonth = calendar.currentMonth;
  22310. calendar.updateCurrentMonthYear(dir);
  22311. $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
  22312. var currentIndex = dir === 'next' ? $months.length - 1 : 0;
  22313. $months.eq(currentIndex).addClass('calendar-month-current');
  22314. $months.eq(dir === 'next' ? currentIndex - 1 : currentIndex + 1).addClass(dir === 'next' ? 'calendar-month-prev' : 'calendar-month-next');
  22315. calendar.emit(
  22316. 'local::monthYearChangeStart calendarMonthYearChangeStart',
  22317. calendar,
  22318. currentYear,
  22319. currentMonth
  22320. );
  22321. };
  22322. Calendar.prototype.onMonthChangeEnd = function onMonthChangeEnd (dir, rebuildBoth) {
  22323. var calendar = this;
  22324. var currentYear = calendar.currentYear;
  22325. var currentMonth = calendar.currentMonth;
  22326. var $wrapperEl = calendar.$wrapperEl;
  22327. var monthsTranslate = calendar.monthsTranslate;
  22328. calendar.animating = false;
  22329. var nextMonthHtml;
  22330. var prevMonthHtml;
  22331. var currentMonthHtml;
  22332. $wrapperEl
  22333. .find('.calendar-month:not(.calendar-month-prev):not(.calendar-month-current):not(.calendar-month-next)')
  22334. .remove();
  22335. if (typeof dir === 'undefined') {
  22336. dir = 'next'; // eslint-disable-line
  22337. rebuildBoth = true; // eslint-disable-line
  22338. }
  22339. if (!rebuildBoth) {
  22340. currentMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), dir);
  22341. } else {
  22342. $wrapperEl.find('.calendar-month-next, .calendar-month-prev').remove();
  22343. prevMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'prev');
  22344. nextMonthHtml = calendar.renderMonth(new Date(currentYear, currentMonth), 'next');
  22345. }
  22346. if (dir === 'next' || rebuildBoth) {
  22347. $wrapperEl.append(currentMonthHtml || nextMonthHtml);
  22348. }
  22349. if (dir === 'prev' || rebuildBoth) {
  22350. $wrapperEl.prepend(currentMonthHtml || prevMonthHtml);
  22351. }
  22352. var $months = $wrapperEl.find('.calendar-month');
  22353. calendar.$months = $months;
  22354. calendar.setMonthsTranslate(monthsTranslate);
  22355. calendar.emit(
  22356. 'local::monthAdd calendarMonthAdd',
  22357. calendar,
  22358. dir === 'next' ? $months.eq($months.length - 1)[0] : $months.eq(0)[0]
  22359. );
  22360. calendar.emit(
  22361. 'local::monthYearChangeEnd calendarMonthYearChangeEnd',
  22362. calendar,
  22363. currentYear,
  22364. currentMonth
  22365. );
  22366. };
  22367. Calendar.prototype.setMonthsTranslate = function setMonthsTranslate (translate) {
  22368. var calendar = this;
  22369. var $months = calendar.$months;
  22370. var isH = calendar.isHorizontal;
  22371. var inverter = calendar.inverter;
  22372. // eslint-disable-next-line
  22373. translate = translate || calendar.monthsTranslate || 0;
  22374. if (typeof calendar.monthsTranslate === 'undefined') {
  22375. calendar.monthsTranslate = translate;
  22376. }
  22377. $months.removeClass('calendar-month-current calendar-month-prev calendar-month-next');
  22378. var prevMonthTranslate = -(translate + 1) * 100 * inverter;
  22379. var currentMonthTranslate = -translate * 100 * inverter;
  22380. var nextMonthTranslate = -(translate - 1) * 100 * inverter;
  22381. $months.eq(0)
  22382. .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
  22383. .addClass('calendar-month-prev');
  22384. $months.eq(1)
  22385. .transform(("translate3d(" + (isH ? currentMonthTranslate : 0) + "%, " + (isH ? 0 : currentMonthTranslate) + "%, 0)"))
  22386. .addClass('calendar-month-current');
  22387. $months.eq(2)
  22388. .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
  22389. .addClass('calendar-month-next');
  22390. };
  22391. Calendar.prototype.nextMonth = function nextMonth (transition) {
  22392. var calendar = this;
  22393. var params = calendar.params;
  22394. var $wrapperEl = calendar.$wrapperEl;
  22395. var inverter = calendar.inverter;
  22396. var isH = calendar.isHorizontal;
  22397. if (typeof transition === 'undefined' || typeof transition === 'object') {
  22398. transition = ''; // eslint-disable-line
  22399. if (!params.animate) { transition = 0; } // eslint-disable-line
  22400. }
  22401. var nextMonth = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-month'), 10);
  22402. var nextYear = parseInt(calendar.$months.eq(calendar.$months.length - 1).attr('data-year'), 10);
  22403. var nextDate = new Date(nextYear, nextMonth);
  22404. var nextDateTime = nextDate.getTime();
  22405. var transitionEndCallback = !calendar.animating;
  22406. if (params.maxDate) {
  22407. if (nextDateTime > new Date(params.maxDate).getTime()) {
  22408. calendar.resetMonth();
  22409. return;
  22410. }
  22411. }
  22412. calendar.monthsTranslate -= 1;
  22413. if (nextMonth === calendar.currentMonth) {
  22414. var nextMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
  22415. var nextMonthHtml = $(calendar.renderMonth(nextDateTime, 'next'))
  22416. .transform(("translate3d(" + (isH ? nextMonthTranslate : 0) + "%, " + (isH ? 0 : nextMonthTranslate) + "%, 0)"))
  22417. .addClass('calendar-month-next');
  22418. $wrapperEl.append(nextMonthHtml[0]);
  22419. calendar.$months = $wrapperEl.find('.calendar-month');
  22420. calendar.emit(
  22421. 'local::monthAdd calendarMonthAdd',
  22422. calendar.$months.eq(calendar.$months.length - 1)[0]
  22423. );
  22424. }
  22425. calendar.animating = true;
  22426. calendar.onMonthChangeStart('next');
  22427. var translate = (calendar.monthsTranslate * 100) * inverter;
  22428. $wrapperEl.transition(transition).transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
  22429. if (transitionEndCallback) {
  22430. $wrapperEl.transitionEnd(function () {
  22431. calendar.onMonthChangeEnd('next');
  22432. });
  22433. }
  22434. if (!params.animate) {
  22435. calendar.onMonthChangeEnd('next');
  22436. }
  22437. };
  22438. Calendar.prototype.prevMonth = function prevMonth (transition) {
  22439. var calendar = this;
  22440. var params = calendar.params;
  22441. var $wrapperEl = calendar.$wrapperEl;
  22442. var inverter = calendar.inverter;
  22443. var isH = calendar.isHorizontal;
  22444. if (typeof transition === 'undefined' || typeof transition === 'object') {
  22445. transition = ''; // eslint-disable-line
  22446. if (!params.animate) { transition = 0; } // eslint-disable-line
  22447. }
  22448. var prevMonth = parseInt(calendar.$months.eq(0).attr('data-month'), 10);
  22449. var prevYear = parseInt(calendar.$months.eq(0).attr('data-year'), 10);
  22450. var prevDate = new Date(prevYear, prevMonth + 1, -1);
  22451. var prevDateTime = prevDate.getTime();
  22452. var transitionEndCallback = !calendar.animating;
  22453. if (params.minDate) {
  22454. var minDate = new Date(params.minDate);
  22455. minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);
  22456. if (prevDateTime < minDate.getTime()) {
  22457. calendar.resetMonth();
  22458. return;
  22459. }
  22460. }
  22461. calendar.monthsTranslate += 1;
  22462. if (prevMonth === calendar.currentMonth) {
  22463. var prevMonthTranslate = -(calendar.monthsTranslate) * 100 * inverter;
  22464. var prevMonthHtml = $(calendar.renderMonth(prevDateTime, 'prev'))
  22465. .transform(("translate3d(" + (isH ? prevMonthTranslate : 0) + "%, " + (isH ? 0 : prevMonthTranslate) + "%, 0)"))
  22466. .addClass('calendar-month-prev');
  22467. $wrapperEl.prepend(prevMonthHtml[0]);
  22468. calendar.$months = $wrapperEl.find('.calendar-month');
  22469. calendar.emit(
  22470. 'local::monthAdd calendarMonthAdd',
  22471. calendar.$months.eq(0)[0]
  22472. );
  22473. }
  22474. calendar.animating = true;
  22475. calendar.onMonthChangeStart('prev');
  22476. var translate = (calendar.monthsTranslate * 100) * inverter;
  22477. $wrapperEl
  22478. .transition(transition)
  22479. .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
  22480. if (transitionEndCallback) {
  22481. $wrapperEl.transitionEnd(function () {
  22482. calendar.onMonthChangeEnd('prev');
  22483. });
  22484. }
  22485. if (!params.animate) {
  22486. calendar.onMonthChangeEnd('prev');
  22487. }
  22488. };
  22489. Calendar.prototype.resetMonth = function resetMonth (transition) {
  22490. if ( transition === void 0 ) transition = '';
  22491. var calendar = this;
  22492. var $wrapperEl = calendar.$wrapperEl;
  22493. var inverter = calendar.inverter;
  22494. var isH = calendar.isHorizontal;
  22495. var monthsTranslate = calendar.monthsTranslate;
  22496. var translate = (monthsTranslate * 100) * inverter;
  22497. $wrapperEl
  22498. .transition(transition)
  22499. .transform(("translate3d(" + (isH ? translate : 0) + "%, " + (isH ? 0 : translate) + "%, 0)"));
  22500. };
  22501. // eslint-disable-next-line
  22502. Calendar.prototype.setYearMonth = function setYearMonth (year, month, transition) {
  22503. var calendar = this;
  22504. var params = calendar.params;
  22505. var isH = calendar.isHorizontal;
  22506. var $wrapperEl = calendar.$wrapperEl;
  22507. var inverter = calendar.inverter;
  22508. // eslint-disable-next-line
  22509. if (typeof year === 'undefined') { year = calendar.currentYear; }
  22510. // eslint-disable-next-line
  22511. if (typeof month === 'undefined') { month = calendar.currentMonth; }
  22512. if (typeof transition === 'undefined' || typeof transition === 'object') {
  22513. // eslint-disable-next-line
  22514. transition = '';
  22515. // eslint-disable-next-line
  22516. if (!params.animate) { transition = 0; }
  22517. }
  22518. var targetDate;
  22519. if (year < calendar.currentYear) {
  22520. targetDate = new Date(year, month + 1, -1).getTime();
  22521. } else {
  22522. targetDate = new Date(year, month).getTime();
  22523. }
  22524. if (params.maxDate && targetDate > new Date(params.maxDate).getTime()) {
  22525. return false;
  22526. }
  22527. if (params.minDate) {
  22528. var minDate = new Date(params.minDate);
  22529. minDate = new Date(minDate.getFullYear(), minDate.getMonth(), 1);
  22530. if (targetDate < minDate.getTime()) {
  22531. return false;
  22532. }
  22533. }
  22534. var currentDate = new Date(calendar.currentYear, calendar.currentMonth).getTime();
  22535. var dir = targetDate > currentDate ? 'next' : 'prev';
  22536. var newMonthHTML = calendar.renderMonth(new Date(year, month));
  22537. calendar.monthsTranslate = calendar.monthsTranslate || 0;
  22538. var prevTranslate = calendar.monthsTranslate;
  22539. var monthTranslate;
  22540. var transitionEndCallback = !calendar.animating && transition !== 0;
  22541. if (targetDate > currentDate) {
  22542. // To next
  22543. calendar.monthsTranslate -= 1;
  22544. if (!calendar.animating) { calendar.$months.eq(calendar.$months.length - 1).remove(); }
  22545. $wrapperEl.append(newMonthHTML);
  22546. calendar.$months = $wrapperEl.find('.calendar-month');
  22547. monthTranslate = -(prevTranslate - 1) * 100 * inverter;
  22548. calendar.$months
  22549. .eq(calendar.$months.length - 1)
  22550. .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
  22551. .addClass('calendar-month-next');
  22552. } else {
  22553. // To prev
  22554. calendar.monthsTranslate += 1;
  22555. if (!calendar.animating) { calendar.$months.eq(0).remove(); }
  22556. $wrapperEl.prepend(newMonthHTML);
  22557. calendar.$months = $wrapperEl.find('.calendar-month');
  22558. monthTranslate = -(prevTranslate + 1) * 100 * inverter;
  22559. calendar.$months
  22560. .eq(0)
  22561. .transform(("translate3d(" + (isH ? monthTranslate : 0) + "%, " + (isH ? 0 : monthTranslate) + "%, 0)"))
  22562. .addClass('calendar-month-prev');
  22563. }
  22564. calendar.emit(
  22565. 'local::monthAdd calendarMonthAdd',
  22566. dir === 'next'
  22567. ? calendar.$months.eq(calendar.$months.length - 1)[0]
  22568. : calendar.$months.eq(0)[0]
  22569. );
  22570. calendar.animating = true;
  22571. calendar.onMonthChangeStart(dir);
  22572. var wrapperTranslate = (calendar.monthsTranslate * 100) * inverter;
  22573. $wrapperEl
  22574. .transition(transition)
  22575. .transform(("translate3d(" + (isH ? wrapperTranslate : 0) + "%, " + (isH ? 0 : wrapperTranslate) + "%, 0)"));
  22576. if (transitionEndCallback) {
  22577. $wrapperEl.transitionEnd(function () {
  22578. calendar.onMonthChangeEnd(dir, true);
  22579. });
  22580. }
  22581. if (!params.animate || transition === 0) {
  22582. calendar.onMonthChangeEnd(dir, true);
  22583. }
  22584. };
  22585. Calendar.prototype.nextYear = function nextYear () {
  22586. var calendar = this;
  22587. calendar.setYearMonth(calendar.currentYear + 1);
  22588. };
  22589. Calendar.prototype.prevYear = function prevYear () {
  22590. var calendar = this;
  22591. calendar.setYearMonth(calendar.currentYear - 1);
  22592. };
  22593. // eslint-disable-next-line
  22594. Calendar.prototype.dateInRange = function dateInRange (dayDate, range) {
  22595. var match = false;
  22596. var i;
  22597. if (!range) { return false; }
  22598. if (Array.isArray(range)) {
  22599. for (i = 0; i < range.length; i += 1) {
  22600. if (range[i].from || range[i].to) {
  22601. if (range[i].from && range[i].to) {
  22602. if ((dayDate <= new Date(range[i].to).getTime()) && (dayDate >= new Date(range[i].from).getTime())) {
  22603. match = true;
  22604. }
  22605. } else if (range[i].from) {
  22606. if (dayDate >= new Date(range[i].from).getTime()) {
  22607. match = true;
  22608. }
  22609. } else if (range[i].to) {
  22610. if (dayDate <= new Date(range[i].to).getTime()) {
  22611. match = true;
  22612. }
  22613. }
  22614. } else if (range[i].date) {
  22615. if (dayDate === new Date(range[i].date).getTime()) {
  22616. match = true;
  22617. }
  22618. } else if (dayDate === new Date(range[i]).getTime()) {
  22619. match = true;
  22620. }
  22621. }
  22622. } else if (range.from || range.to) {
  22623. if (range.from && range.to) {
  22624. if ((dayDate <= new Date(range.to).getTime()) && (dayDate >= new Date(range.from).getTime())) {
  22625. match = true;
  22626. }
  22627. } else if (range.from) {
  22628. if (dayDate >= new Date(range.from).getTime()) {
  22629. match = true;
  22630. }
  22631. } else if (range.to) {
  22632. if (dayDate <= new Date(range.to).getTime()) {
  22633. match = true;
  22634. }
  22635. }
  22636. } else if (range.date) {
  22637. match = dayDate === new Date(range.date).getTime();
  22638. } else if (typeof range === 'function') {
  22639. match = range(new Date(dayDate));
  22640. }
  22641. return match;
  22642. };
  22643. // eslint-disable-next-line
  22644. Calendar.prototype.daysInMonth = function daysInMonth (date) {
  22645. var d = new Date(date);
  22646. return new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();
  22647. };
  22648. Calendar.prototype.renderMonths = function renderMonths (date) {
  22649. var calendar = this;
  22650. if (calendar.params.renderMonths) {
  22651. return calendar.params.renderMonths.call(calendar, date);
  22652. }
  22653. return ("\n <div class=\"calendar-months-wrapper\">\n " + (calendar.renderMonth(date, 'prev')) + "\n " + (calendar.renderMonth(date)) + "\n " + (calendar.renderMonth(date, 'next')) + "\n </div>\n ").trim();
  22654. };
  22655. Calendar.prototype.renderMonth = function renderMonth (d, offset) {
  22656. var calendar = this;
  22657. var params = calendar.params;
  22658. var value = calendar.value;
  22659. if (params.renderMonth) {
  22660. return params.renderMonth.call(calendar, d, offset);
  22661. }
  22662. var date = new Date(d);
  22663. var year = date.getFullYear();
  22664. var month = date.getMonth();
  22665. var localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter.format(date));
  22666. if (localeMonth < 0) { localeMonth = month; }
  22667. var localeYear = calendar.yearFormatter.format(date);
  22668. if (offset === 'next') {
  22669. if (month === 11) { date = new Date(year + 1, 0); }
  22670. else { date = new Date(year, month + 1, 1); }
  22671. }
  22672. if (offset === 'prev') {
  22673. if (month === 0) { date = new Date(year - 1, 11); }
  22674. else { date = new Date(year, month - 1, 1); }
  22675. }
  22676. if (offset === 'next' || offset === 'prev') {
  22677. month = date.getMonth();
  22678. year = date.getFullYear();
  22679. localeMonth = calendar.monthNames.indexOf(calendar.monthFormatter.format(date));
  22680. if (localeMonth < 0) { localeMonth = month; }
  22681. localeYear = calendar.yearFormatter.format(date);
  22682. }
  22683. var currentValues = [];
  22684. var today = new Date().setHours(0, 0, 0, 0);
  22685. var minDate = params.minDate ? new Date(params.minDate).getTime() : null;
  22686. var maxDate = params.maxDate ? new Date(params.maxDate).getTime() : null;
  22687. var rows = 6;
  22688. var cols = 7;
  22689. var daysInPrevMonth = calendar.daysInMonth(new Date(date.getFullYear(), date.getMonth()).getTime() - (10 * 24 * 60 * 60 * 1000));
  22690. var daysInMonth = calendar.daysInMonth(date);
  22691. var minDayNumber = params.firstDay === 6 ? 0 : 1;
  22692. var monthHtml = '';
  22693. var dayIndex = 0 + (params.firstDay - 1);
  22694. var disabled;
  22695. var hasEvents;
  22696. var firstDayOfMonthIndex = new Date(date.getFullYear(), date.getMonth()).getDay();
  22697. if (firstDayOfMonthIndex === 0) { firstDayOfMonthIndex = 7; }
  22698. if (value && value.length) {
  22699. for (var i = 0; i < value.length; i += 1) {
  22700. currentValues.push(new Date(value[i]).setHours(0, 0, 0, 0));
  22701. }
  22702. }
  22703. for (var row = 1; row <= rows; row += 1) {
  22704. var rowHtml = '';
  22705. var loop = function ( col ) {
  22706. dayIndex += 1;
  22707. var dayDate = (void 0);
  22708. var dayNumber = dayIndex - firstDayOfMonthIndex;
  22709. var addClass = '';
  22710. if (row === 1 && col === 1 && dayNumber > minDayNumber && params.firstDay !== 1) {
  22711. dayIndex -= 7;
  22712. dayNumber = dayIndex - firstDayOfMonthIndex;
  22713. }
  22714. var weekDayIndex = ((col - 1) + params.firstDay > 6)
  22715. ? ((col - 1 - 7) + params.firstDay)
  22716. : ((col - 1) + params.firstDay);
  22717. if (dayNumber < 0) {
  22718. dayNumber = daysInPrevMonth + dayNumber + 1;
  22719. addClass += ' calendar-day-prev';
  22720. dayDate = new Date(month - 1 < 0 ? year - 1 : year, month - 1 < 0 ? 11 : month - 1, dayNumber).getTime();
  22721. } else {
  22722. dayNumber += 1;
  22723. if (dayNumber > daysInMonth) {
  22724. dayNumber -= daysInMonth;
  22725. addClass += ' calendar-day-next';
  22726. dayDate = new Date(month + 1 > 11 ? year + 1 : year, month + 1 > 11 ? 0 : month + 1, dayNumber).getTime();
  22727. } else {
  22728. dayDate = new Date(year, month, dayNumber).getTime();
  22729. }
  22730. }
  22731. // Today
  22732. if (dayDate === today) { addClass += ' calendar-day-today'; }
  22733. // Selected
  22734. if (params.rangePicker && currentValues.length === 2) {
  22735. if (dayDate >= currentValues[0] && dayDate <= currentValues[1]) { addClass += ' calendar-day-selected'; }
  22736. } else if (currentValues.indexOf(dayDate) >= 0) { addClass += ' calendar-day-selected'; }
  22737. // Weekend
  22738. if (params.weekendDays.indexOf(weekDayIndex) >= 0) {
  22739. addClass += ' calendar-day-weekend';
  22740. }
  22741. // Events
  22742. var eventsHtml = '';
  22743. hasEvents = false;
  22744. if (params.events) {
  22745. if (calendar.dateInRange(dayDate, params.events)) {
  22746. hasEvents = true;
  22747. }
  22748. }
  22749. if (hasEvents) {
  22750. addClass += ' calendar-day-has-events';
  22751. eventsHtml = "\n <span class=\"calendar-day-events\">\n <span class=\"calendar-day-event\"></span>\n </span>\n ";
  22752. if (Array.isArray(params.events)) {
  22753. var eventDots = [];
  22754. params.events.forEach(function (ev) {
  22755. var color = ev.color || '';
  22756. if (eventDots.indexOf(color) < 0 && calendar.dateInRange(dayDate, ev)) {
  22757. eventDots.push(color);
  22758. }
  22759. });
  22760. eventsHtml = "\n <span class=\"calendar-day-events\">\n " + (eventDots.map(function (color) { return ("\n <span class=\"calendar-day-event\" style=\"" + (color ? ("background-color: " + color) : '') + "\"></span>\n ").trim(); }).join('')) + "\n </span>\n ";
  22761. }
  22762. }
  22763. // Custom Ranges
  22764. if (params.rangesClasses) {
  22765. for (var k = 0; k < params.rangesClasses.length; k += 1) {
  22766. if (calendar.dateInRange(dayDate, params.rangesClasses[k].range)) {
  22767. addClass += " " + (params.rangesClasses[k].cssClass);
  22768. }
  22769. }
  22770. }
  22771. // Disabled
  22772. disabled = false;
  22773. if ((minDate && dayDate < minDate) || (maxDate && dayDate > maxDate)) {
  22774. disabled = true;
  22775. }
  22776. if (params.disabled) {
  22777. if (calendar.dateInRange(dayDate, params.disabled)) {
  22778. disabled = true;
  22779. }
  22780. }
  22781. if (disabled) {
  22782. addClass += ' calendar-day-disabled';
  22783. }
  22784. dayDate = new Date(dayDate);
  22785. var dayYear = dayDate.getFullYear();
  22786. var dayMonth = dayDate.getMonth();
  22787. var dayNumberDisplay = calendar.dayFormatter.format(dayDate);
  22788. rowHtml += ("\n <div data-year=\"" + dayYear + "\" data-month=\"" + dayMonth + "\" data-day=\"" + dayNumber + "\" class=\"calendar-day" + addClass + "\" data-date=\"" + dayYear + "-" + dayMonth + "-" + dayNumber + "\">\n <span class=\"calendar-day-number\">" + dayNumberDisplay + eventsHtml + "</span>\n </div>").trim();
  22789. };
  22790. for (var col = 1; col <= cols; col += 1) loop( col );
  22791. monthHtml += "<div class=\"calendar-row\">" + rowHtml + "</div>";
  22792. }
  22793. monthHtml = "<div class=\"calendar-month\" data-year=\"" + year + "\" data-month=\"" + month + "\" data-locale-year=\"" + localeYear + "\" data-locale-month=\"" + localeMonth + "\">" + monthHtml + "</div>";
  22794. return monthHtml;
  22795. };
  22796. Calendar.prototype.renderWeekHeader = function renderWeekHeader () {
  22797. var calendar = this;
  22798. if (calendar.params.renderWeekHeader) {
  22799. return calendar.params.renderWeekHeader.call(calendar);
  22800. }
  22801. var params = calendar.params;
  22802. var weekDaysHtml = '';
  22803. for (var i = 0; i < 7; i += 1) {
  22804. var dayIndex = (i + params.firstDay > 6)
  22805. ? ((i - 7) + params.firstDay)
  22806. : (i + params.firstDay);
  22807. var dayName = calendar.dayNamesShort[dayIndex];
  22808. weekDaysHtml += "<div class=\"calendar-week-day\">" + dayName + "</div>";
  22809. }
  22810. return ("\n <div class=\"calendar-week-header\">\n " + weekDaysHtml + "\n </div>\n ").trim();
  22811. };
  22812. Calendar.prototype.renderMonthSelector = function renderMonthSelector () {
  22813. var calendar = this;
  22814. if (calendar.params.renderMonthSelector) {
  22815. return calendar.params.renderMonthSelector.call(calendar);
  22816. }
  22817. return ("\n <div class=\"calendar-month-selector\">\n <a class=\"link icon-only calendar-prev-month-button\">\n <i class=\"icon icon-prev\"></i>\n </a>\n " + (calendar.params.monthPicker ? "\n <a class=\"current-month-value link\"></a>\n " : "\n <span class=\"current-month-value\"></span>\n ") + "\n <a class=\"link icon-only calendar-next-month-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ").trim();
  22818. };
  22819. Calendar.prototype.renderMonthPicker = function renderMonthPicker () {
  22820. var calendar = this;
  22821. var localeMonth = parseInt(calendar.$el.find('.calendar-month-current').attr('data-locale-month'), 10);
  22822. return ("\n <div class=\"calendar-month-picker\">\n " + (calendar.monthNames.map(function (m, index) { return ("\n <div class=\"calendar-month-picker-item " + (localeMonth === index ? 'calendar-month-picker-item-current' : '') + "\">\n <span>" + m + "</span>\n </div>\n "); }).join('')) + "\n </div>\n ");
  22823. };
  22824. Calendar.prototype.renderYearSelector = function renderYearSelector () {
  22825. var calendar = this;
  22826. if (calendar.params.renderYearSelector) {
  22827. return calendar.params.renderYearSelector.call(calendar);
  22828. }
  22829. return ("\n <div class=\"calendar-year-selector\">\n <a class=\"link icon-only calendar-prev-year-button\">\n <i class=\"icon icon-prev\"></i>\n </a>\n " + (calendar.params.yearPicker ? "\n <a class=\"current-year-value link\"></a>\n " : "\n <span class=\"current-year-value\"></span>\n ") + "\n <a class=\"link icon-only calendar-next-year-button\">\n <i class=\"icon icon-next\"></i>\n </a>\n </div>\n ").trim();
  22830. };
  22831. Calendar.prototype.renderYearPicker = function renderYearPicker () {
  22832. var calendar = this;
  22833. var currentYear = calendar.currentYear;
  22834. var yearMin = calendar.params.yearPickerMin || new Date().getFullYear() - 100;
  22835. if (calendar.params.minDate) {
  22836. yearMin = Math.max(yearMin, new Date(calendar.params.minDate).getFullYear());
  22837. }
  22838. var yearMax = calendar.params.yearPickerMax || new Date().getFullYear() + 100;
  22839. if (calendar.params.maxDate) {
  22840. yearMax = Math.min(yearMax, new Date(calendar.params.maxDate).getFullYear());
  22841. }
  22842. var years = [];
  22843. for (var i = yearMin; i <= yearMax; i += 1) {
  22844. years.push(i);
  22845. }
  22846. return ("\n <div class=\"calendar-year-picker\">\n " + (years.map(function (year) { return ("\n <div data-year=\"" + year + "\" class=\"calendar-year-picker-item " + (year === currentYear ? 'calendar-year-picker-item-current' : '') + "\">\n <span>" + (calendar.yearFormatter.format(new Date().setFullYear(year))) + "</span>\n </div>\n "); }).join('')) + "\n </div>\n ");
  22847. };
  22848. // eslint-disable-next-line
  22849. Calendar.prototype.renderTimeSelector = function renderTimeSelector () {
  22850. var calendar = this;
  22851. var value = calendar.value && calendar.value[0];
  22852. var timeString;
  22853. if (value) { timeString = calendar.timeSelectorFormatter.format(value); }
  22854. return ("\n <div class=\"calendar-time-selector\"><a class=\"link\">" + (timeString || calendar.params.timePickerPlaceholder) + "</a></div>\n ");
  22855. };
  22856. Calendar.prototype.renderHeader = function renderHeader () {
  22857. var calendar = this;
  22858. if (calendar.params.renderHeader) {
  22859. return calendar.params.renderHeader.call(calendar);
  22860. }
  22861. return ("\n <div class=\"calendar-header\">\n <div class=\"calendar-selected-date\">" + (calendar.params.headerPlaceholder) + "</div>\n </div>\n ").trim();
  22862. };
  22863. Calendar.prototype.renderFooter = function renderFooter () {
  22864. var calendar = this;
  22865. var app = calendar.app;
  22866. if (calendar.params.renderFooter) {
  22867. return calendar.params.renderFooter.call(calendar);
  22868. }
  22869. return ("\n <div class=\"calendar-footer\">\n <a class=\"" + (app.theme === 'md' ? 'button' : 'link') + " calendar-close sheet-close popover-close\">" + (calendar.params.toolbarCloseText) + "</a>\n </div>\n ").trim();
  22870. };
  22871. Calendar.prototype.renderToolbar = function renderToolbar () {
  22872. var calendar = this;
  22873. if (calendar.params.renderToolbar) {
  22874. return calendar.params.renderToolbar.call(calendar, calendar);
  22875. }
  22876. return ("\n <div class=\"toolbar toolbar-top no-shadow\">\n <div class=\"toolbar-inner\">\n " + (calendar.params.monthSelector ? calendar.renderMonthSelector() : '') + "\n " + (calendar.params.yearSelector ? calendar.renderYearSelector() : '') + "\n </div>\n </div>\n ").trim();
  22877. };
  22878. // eslint-disable-next-line
  22879. Calendar.prototype.renderInline = function renderInline () {
  22880. var calendar = this;
  22881. var ref = calendar.params;
  22882. var cssClass = ref.cssClass;
  22883. var toolbar = ref.toolbar;
  22884. var header = ref.header;
  22885. var footer = ref.footer;
  22886. var rangePicker = ref.rangePicker;
  22887. var weekHeader = ref.weekHeader;
  22888. var value = calendar.value;
  22889. var hasTimePicker = calendar.hasTimePicker;
  22890. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  22891. var inlineHtml = ("\n <div class=\"calendar calendar-inline " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (hasTimePicker ? calendar.renderTimeSelector() : '') + "\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
  22892. return inlineHtml;
  22893. };
  22894. Calendar.prototype.renderCustomModal = function renderCustomModal () {
  22895. var calendar = this;
  22896. var ref = calendar.params;
  22897. var cssClass = ref.cssClass;
  22898. var toolbar = ref.toolbar;
  22899. var header = ref.header;
  22900. var footer = ref.footer;
  22901. var rangePicker = ref.rangePicker;
  22902. var weekHeader = ref.weekHeader;
  22903. var value = calendar.value;
  22904. var hasTimePicker = calendar.hasTimePicker;
  22905. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  22906. var sheetHtml = ("\n <div class=\"calendar calendar-modal " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (hasTimePicker ? calendar.renderTimeSelector() : '') + "\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
  22907. return sheetHtml;
  22908. };
  22909. Calendar.prototype.renderSheet = function renderSheet () {
  22910. var calendar = this;
  22911. var ref = calendar.params;
  22912. var cssClass = ref.cssClass;
  22913. var toolbar = ref.toolbar;
  22914. var header = ref.header;
  22915. var footer = ref.footer;
  22916. var rangePicker = ref.rangePicker;
  22917. var weekHeader = ref.weekHeader;
  22918. var value = calendar.value;
  22919. var hasTimePicker = calendar.hasTimePicker;
  22920. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  22921. var sheetHtml = ("\n <div class=\"sheet-modal calendar calendar-sheet " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"sheet-modal-inner calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (hasTimePicker ? calendar.renderTimeSelector() : '') + "\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n ").trim();
  22922. return sheetHtml;
  22923. };
  22924. Calendar.prototype.renderPopover = function renderPopover () {
  22925. var calendar = this;
  22926. var ref = calendar.params;
  22927. var cssClass = ref.cssClass;
  22928. var toolbar = ref.toolbar;
  22929. var header = ref.header;
  22930. var footer = ref.footer;
  22931. var rangePicker = ref.rangePicker;
  22932. var weekHeader = ref.weekHeader;
  22933. var value = calendar.value;
  22934. var hasTimePicker = calendar.hasTimePicker;
  22935. var date = value && value.length ? value[0] : new Date().setHours(0, 0, 0);
  22936. var popoverHtml = ("\n <div class=\"popover calendar-popover\">\n <div class=\"popover-inner\">\n <div class=\"calendar " + (rangePicker ? 'calendar-range' : '') + " " + (cssClass || '') + "\">\n " + (header ? calendar.renderHeader() : '') + "\n " + (toolbar ? calendar.renderToolbar() : '') + "\n " + (weekHeader ? calendar.renderWeekHeader() : '') + "\n <div class=\"calendar-months\">\n " + (calendar.renderMonths(date)) + "\n </div>\n " + (hasTimePicker ? calendar.renderTimeSelector() : '') + "\n " + (footer ? calendar.renderFooter() : '') + "\n </div>\n </div>\n </div>\n ").trim();
  22937. return popoverHtml;
  22938. };
  22939. Calendar.prototype.render = function render () {
  22940. var calendar = this;
  22941. var params = calendar.params;
  22942. if (params.render) { return params.render.call(calendar); }
  22943. if (!calendar.inline) {
  22944. var modalType = params.openIn;
  22945. if (modalType === 'auto') { modalType = calendar.isPopover() ? 'popover' : 'sheet'; }
  22946. if (modalType === 'popover') { return calendar.renderPopover(); }
  22947. if (modalType === 'sheet') { return calendar.renderSheet(); }
  22948. return calendar.renderCustomModal();
  22949. }
  22950. return calendar.renderInline();
  22951. };
  22952. Calendar.prototype.openTimePicker = function openTimePicker () {
  22953. var calendar = this;
  22954. var $el = calendar.$el;
  22955. var app = calendar.app;
  22956. if (!$el || !$el.length) { return; }
  22957. $el.append('<div class="calendar-time-picker"></div>');
  22958. var hoursArr = [];
  22959. var minutesArr = [];
  22960. for (var i = 0; i <= 23; i += 1) { hoursArr.push(i); }
  22961. for (var i$1 = 0; i$1 <= 59; i$1 += 1) { minutesArr.push(i$1); }
  22962. var value;
  22963. if (calendar.value && calendar.value.length) {
  22964. value = [calendar.value[0].getHours(), calendar.value[0].getMinutes()];
  22965. } else {
  22966. value = [new Date().getHours(), new Date().getMinutes()];
  22967. }
  22968. calendar.timePickerInstance = app.picker.create({
  22969. containerEl: $el.find('.calendar-time-picker'),
  22970. value: value,
  22971. toolbar: true,
  22972. rotateEffect: false,
  22973. toolbarCloseText: calendar.params.toolbarCloseText,
  22974. cols: [
  22975. {
  22976. values: hoursArr,
  22977. },
  22978. {
  22979. divider: true,
  22980. content: ':',
  22981. },
  22982. {
  22983. values: minutesArr,
  22984. displayValues: minutesArr.map(function (m) { return (m < 10 ? ("0" + m) : m); }),
  22985. } ],
  22986. });
  22987. calendar.timePickerInstance.$el.find('.toolbar a').removeClass('sheet-close popover-close').addClass('calendar-time-picker-close');
  22988. };
  22989. Calendar.prototype.closeTimePicker = function closeTimePicker () {
  22990. var calendar = this;
  22991. if (calendar.timePickerInstance) {
  22992. var ref = calendar.timePickerInstance.value.map(function (v) { return parseInt(v, 10); });
  22993. var hours = ref[0];
  22994. var minutes = ref[1];
  22995. var value = calendar.value && calendar.value.length && calendar.value[0];
  22996. if (!value) {
  22997. value = new Date();
  22998. value.setHours(hours, minutes, 0, 0);
  22999. } else {
  23000. value = new Date(value);
  23001. value.setHours(hours, minutes);
  23002. }
  23003. calendar.setValue([value]);
  23004. calendar.timePickerInstance.close();
  23005. calendar.timePickerInstance.destroy();
  23006. delete calendar.timePickerInstance;
  23007. }
  23008. if (calendar.$el && calendar.$el.length) {
  23009. calendar.$el.find('.calendar-time-picker').remove();
  23010. }
  23011. };
  23012. Calendar.prototype.onOpen = function onOpen () {
  23013. var calendar = this;
  23014. var initialized = calendar.initialized;
  23015. var $el = calendar.$el;
  23016. var app = calendar.app;
  23017. var $inputEl = calendar.$inputEl;
  23018. var inline = calendar.inline;
  23019. var value = calendar.value;
  23020. var params = calendar.params;
  23021. calendar.closing = false;
  23022. calendar.opened = true;
  23023. calendar.opening = true;
  23024. // Init main events
  23025. calendar.attachCalendarEvents();
  23026. var updateValue = !value && params.value;
  23027. // Set value
  23028. if (!initialized) {
  23029. if (value) { calendar.setValue(value, 0); }
  23030. else if (params.value) {
  23031. calendar.setValue(calendar.normalizeValues(params.value), 0);
  23032. }
  23033. } else if (value) {
  23034. calendar.setValue(value, 0);
  23035. }
  23036. // Update current month and year
  23037. calendar.updateCurrentMonthYear();
  23038. // Set initial translate
  23039. calendar.monthsTranslate = 0;
  23040. calendar.setMonthsTranslate();
  23041. // Update input value
  23042. if (updateValue) { calendar.updateValue(); }
  23043. else if (params.header && value) {
  23044. calendar.updateValue(true);
  23045. }
  23046. // Extra focus
  23047. if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
  23048. $inputEl.trigger('focus');
  23049. }
  23050. calendar.initialized = true;
  23051. calendar.$months.each(function (index, monthEl) {
  23052. calendar.emit('local::monthAdd calendarMonthAdd', monthEl);
  23053. });
  23054. // Trigger events
  23055. if ($el) {
  23056. $el.trigger('calendar:open');
  23057. }
  23058. if ($inputEl) {
  23059. $inputEl.trigger('calendar:open');
  23060. }
  23061. calendar.emit('local::open calendarOpen', calendar);
  23062. };
  23063. Calendar.prototype.onOpened = function onOpened () {
  23064. var calendar = this;
  23065. calendar.opening = false;
  23066. if (calendar.$el) {
  23067. calendar.$el.trigger('calendar:opened');
  23068. }
  23069. if (calendar.$inputEl) {
  23070. calendar.$inputEl.trigger('calendar:opened');
  23071. }
  23072. calendar.emit('local::opened calendarOpened', calendar);
  23073. };
  23074. Calendar.prototype.onClose = function onClose () {
  23075. var calendar = this;
  23076. var app = calendar.app;
  23077. calendar.opening = false;
  23078. calendar.closing = true;
  23079. if (calendar.$inputEl) {
  23080. if (app.theme === 'md') {
  23081. calendar.$inputEl.trigger('blur');
  23082. } else {
  23083. var validate = calendar.$inputEl.attr('validate');
  23084. var required = calendar.$inputEl.attr('required');
  23085. if (validate && required) {
  23086. app.input.validate(calendar.$inputEl);
  23087. }
  23088. }
  23089. }
  23090. if (calendar.detachCalendarEvents) {
  23091. calendar.detachCalendarEvents();
  23092. }
  23093. if (calendar.$el) {
  23094. calendar.$el.trigger('calendar:close');
  23095. }
  23096. if (calendar.$inputEl) {
  23097. calendar.$inputEl.trigger('calendar:close');
  23098. }
  23099. calendar.emit('local::close calendarClose', calendar);
  23100. };
  23101. Calendar.prototype.onClosed = function onClosed () {
  23102. var calendar = this;
  23103. calendar.opened = false;
  23104. calendar.closing = false;
  23105. if (!calendar.inline) {
  23106. Utils.nextTick(function () {
  23107. if (calendar.modal && calendar.modal.el && calendar.modal.destroy) {
  23108. if (!calendar.params.routableModals) {
  23109. calendar.modal.destroy();
  23110. }
  23111. }
  23112. delete calendar.modal;
  23113. });
  23114. }
  23115. if (calendar.timePickerInstance) {
  23116. if (calendar.timePickerInstance.destroy) { calendar.timePickerInstance.destroy(); }
  23117. delete calendar.timePickerInstance;
  23118. }
  23119. if (calendar.$el) {
  23120. calendar.$el.trigger('calendar:closed');
  23121. }
  23122. if (calendar.$inputEl) {
  23123. calendar.$inputEl.trigger('calendar:closed');
  23124. }
  23125. calendar.emit('local::closed calendarClosed', calendar);
  23126. };
  23127. Calendar.prototype.open = function open () {
  23128. var obj;
  23129. var calendar = this;
  23130. var app = calendar.app;
  23131. var opened = calendar.opened;
  23132. var inline = calendar.inline;
  23133. var $inputEl = calendar.$inputEl;
  23134. var params = calendar.params;
  23135. if (opened) { return; }
  23136. if (inline) {
  23137. calendar.$el = $(calendar.render());
  23138. calendar.$el[0].f7Calendar = calendar;
  23139. calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
  23140. calendar.$months = calendar.$wrapperEl.find('.calendar-month');
  23141. calendar.$containerEl.append(calendar.$el);
  23142. calendar.onOpen();
  23143. calendar.onOpened();
  23144. return;
  23145. }
  23146. var modalType = params.openIn;
  23147. if (modalType === 'auto') {
  23148. modalType = calendar.isPopover() ? 'popover' : 'sheet';
  23149. }
  23150. var modalContent = calendar.render();
  23151. var modalParams = {
  23152. targetEl: $inputEl,
  23153. scrollToEl: params.scrollToInput ? $inputEl : undefined,
  23154. content: modalContent,
  23155. backdrop: params.backdrop === true || (modalType === 'popover' && app.params.popover.backdrop !== false && params.backdrop !== false),
  23156. closeByBackdropClick: params.closeByBackdropClick,
  23157. on: {
  23158. open: function open() {
  23159. var modal = this;
  23160. calendar.modal = modal;
  23161. calendar.$el = modalType === 'popover' ? modal.$el.find('.calendar') : modal.$el;
  23162. calendar.$wrapperEl = calendar.$el.find('.calendar-months-wrapper');
  23163. calendar.$months = calendar.$wrapperEl.find('.calendar-month');
  23164. calendar.$el[0].f7Calendar = calendar;
  23165. if (modalType === 'customModal') {
  23166. $(calendar.$el).find('.calendar-close').once('click', function () {
  23167. calendar.close();
  23168. });
  23169. }
  23170. calendar.onOpen();
  23171. },
  23172. opened: function opened() { calendar.onOpened(); },
  23173. close: function close() { calendar.onClose(); },
  23174. closed: function closed() { calendar.onClosed(); },
  23175. },
  23176. };
  23177. if (modalType === 'sheet') {
  23178. modalParams.push = params.sheetPush;
  23179. modalParams.swipeToClose = params.sheetSwipeToClose;
  23180. }
  23181. if (params.routableModals && calendar.view) {
  23182. calendar.view.router.navigate({
  23183. url: calendar.url,
  23184. route: ( obj = {
  23185. path: calendar.url
  23186. }, obj[modalType] = modalParams, obj ),
  23187. });
  23188. } else {
  23189. calendar.modal = app[modalType].create(modalParams);
  23190. calendar.modal.open();
  23191. }
  23192. };
  23193. Calendar.prototype.close = function close () {
  23194. var calendar = this;
  23195. var opened = calendar.opened;
  23196. var inline = calendar.inline;
  23197. if (!opened) { return; }
  23198. if (inline) {
  23199. calendar.onClose();
  23200. calendar.onClosed();
  23201. return;
  23202. }
  23203. if (calendar.params.routableModals && calendar.view) {
  23204. calendar.view.router.back();
  23205. } else {
  23206. calendar.modal.close();
  23207. }
  23208. };
  23209. Calendar.prototype.init = function init () {
  23210. var calendar = this;
  23211. calendar.initInput();
  23212. if (calendar.inline) {
  23213. calendar.open();
  23214. calendar.emit('local::init calendarInit', calendar);
  23215. return;
  23216. }
  23217. if (!calendar.initialized && calendar.params.value) {
  23218. calendar.setValue(calendar.normalizeValues(calendar.params.value));
  23219. }
  23220. // Attach input Events
  23221. if (calendar.$inputEl) {
  23222. calendar.attachInputEvents();
  23223. }
  23224. if (calendar.params.closeByOutsideClick) {
  23225. calendar.attachHtmlEvents();
  23226. }
  23227. calendar.emit('local::init calendarInit', calendar);
  23228. };
  23229. Calendar.prototype.destroy = function destroy () {
  23230. var calendar = this;
  23231. if (calendar.destroyed) { return; }
  23232. var $el = calendar.$el;
  23233. calendar.emit('local::beforeDestroy calendarBeforeDestroy', calendar);
  23234. if ($el) { $el.trigger('calendar:beforedestroy'); }
  23235. calendar.close();
  23236. // Detach Events
  23237. if (calendar.$inputEl) {
  23238. calendar.detachInputEvents();
  23239. }
  23240. if (calendar.params.closeByOutsideClick) {
  23241. calendar.detachHtmlEvents();
  23242. }
  23243. if (calendar.timePickerInstance) {
  23244. if (calendar.timePickerInstance.destroy) { calendar.timePickerInstance.destroy(); }
  23245. delete calendar.timePickerInstance;
  23246. }
  23247. if ($el && $el.length) { delete calendar.$el[0].f7Calendar; }
  23248. Utils.deleteProps(calendar);
  23249. calendar.destroyed = true;
  23250. };
  23251. Object.defineProperties( Calendar.prototype, prototypeAccessors );
  23252. return Calendar;
  23253. }(Framework7Class));
  23254. var Calendar$1 = {
  23255. name: 'calendar',
  23256. static: {
  23257. Calendar: Calendar,
  23258. },
  23259. create: function create() {
  23260. var app = this;
  23261. app.calendar = ConstructorMethods({
  23262. defaultSelector: '.calendar',
  23263. constructor: Calendar,
  23264. app: app,
  23265. domProp: 'f7Calendar',
  23266. });
  23267. app.calendar.close = function close(el) {
  23268. if ( el === void 0 ) el = '.calendar';
  23269. var $el = $(el);
  23270. if ($el.length === 0) { return; }
  23271. var calendar = $el[0].f7Calendar;
  23272. if (!calendar || (calendar && !calendar.opened)) { return; }
  23273. calendar.close();
  23274. };
  23275. },
  23276. params: {
  23277. calendar: {
  23278. // Calendar settings
  23279. dateFormat: undefined,
  23280. monthNames: 'auto',
  23281. monthNamesShort: 'auto',
  23282. dayNames: 'auto',
  23283. dayNamesShort: 'auto',
  23284. locale: undefined,
  23285. firstDay: 1, // First day of the week, Monday
  23286. weekendDays: [0, 6], // Sunday and Saturday
  23287. multiple: false,
  23288. rangePicker: false,
  23289. rangePickerMinDays: 1, // when calendar is used as rangePicker
  23290. rangePickerMaxDays: 0, // when calendar is used as rangePicker, 0 means unlimited
  23291. direction: 'horizontal', // or 'vertical'
  23292. minDate: null,
  23293. maxDate: null,
  23294. disabled: null, // dates range of disabled days
  23295. events: null, // dates range of days with events
  23296. rangesClasses: null, // array with custom classes date ranges
  23297. touchMove: true,
  23298. animate: true,
  23299. closeOnSelect: false,
  23300. monthSelector: true,
  23301. monthPicker: true,
  23302. yearSelector: true,
  23303. yearPicker: true,
  23304. yearPickerMin: undefined,
  23305. yearPickerMax: undefined,
  23306. timePicker: false,
  23307. timePickerFormat: { hour: 'numeric', minute: 'numeric' },
  23308. timePickerPlaceholder: 'Select time',
  23309. weekHeader: true,
  23310. value: null,
  23311. // Common opener settings
  23312. containerEl: null,
  23313. openIn: 'auto', // or 'popover' or 'sheet' or 'customModal'
  23314. sheetPush: false,
  23315. sheetSwipeToClose: undefined,
  23316. formatValue: null,
  23317. inputEl: null,
  23318. inputReadOnly: true,
  23319. closeByOutsideClick: true,
  23320. scrollToInput: true,
  23321. header: false,
  23322. headerPlaceholder: 'Select date',
  23323. toolbar: true,
  23324. toolbarCloseText: 'Done',
  23325. footer: false,
  23326. cssClass: null,
  23327. routableModals: true,
  23328. view: null,
  23329. url: 'date/',
  23330. backdrop: null,
  23331. closeByBackdropClick: true,
  23332. // Render functions
  23333. renderWeekHeader: null,
  23334. renderMonths: null,
  23335. renderMonth: null,
  23336. renderMonthSelector: null,
  23337. renderYearSelector: null,
  23338. renderHeader: null,
  23339. renderFooter: null,
  23340. renderToolbar: null,
  23341. renderInline: null,
  23342. renderPopover: null,
  23343. renderSheet: null,
  23344. render: null,
  23345. },
  23346. },
  23347. };
  23348. function pickerColumn (colEl, updateItems) {
  23349. var picker = this;
  23350. var app = picker.app;
  23351. var $colEl = $(colEl);
  23352. var colIndex = $colEl.index();
  23353. var col = picker.cols[colIndex];
  23354. if (col.divider) { return; }
  23355. col.$el = $colEl;
  23356. col.el = $colEl[0];
  23357. col.$itemsEl = col.$el.find('.picker-items');
  23358. col.items = col.$itemsEl.find('.picker-item');
  23359. var itemHeight;
  23360. var itemsHeight;
  23361. var minTranslate;
  23362. var maxTranslate;
  23363. var animationFrameId;
  23364. function updateDuringScroll() {
  23365. animationFrameId = Utils.requestAnimationFrame(function () {
  23366. col.updateItems(undefined, undefined, 0);
  23367. updateDuringScroll();
  23368. });
  23369. }
  23370. col.replaceValues = function replaceColValues(values, displayValues) {
  23371. col.detachEvents();
  23372. col.values = values;
  23373. col.displayValues = displayValues;
  23374. col.$itemsEl.html(picker.renderColumn(col, true));
  23375. col.items = col.$itemsEl.find('.picker-item');
  23376. col.calcSize();
  23377. col.setValue(col.values[0], 0, true);
  23378. col.attachEvents();
  23379. };
  23380. col.calcSize = function calcColSize() {
  23381. if (picker.params.rotateEffect) {
  23382. col.$el.removeClass('picker-column-absolute');
  23383. if (!col.width) { col.$el.css({ width: '' }); }
  23384. }
  23385. var colWidth = 0;
  23386. var colHeight = col.$el[0].offsetHeight;
  23387. itemHeight = col.items[0].offsetHeight;
  23388. itemsHeight = itemHeight * col.items.length;
  23389. minTranslate = ((colHeight / 2) - itemsHeight) + (itemHeight / 2);
  23390. maxTranslate = (colHeight / 2) - (itemHeight / 2);
  23391. if (col.width) {
  23392. colWidth = col.width;
  23393. if (parseInt(colWidth, 10) === colWidth) { colWidth += 'px'; }
  23394. col.$el.css({ width: colWidth });
  23395. }
  23396. if (picker.params.rotateEffect) {
  23397. if (!col.width) {
  23398. col.items.each(function (index, itemEl) {
  23399. var item = $(itemEl).children('span');
  23400. colWidth = Math.max(colWidth, item[0].offsetWidth);
  23401. });
  23402. col.$el.css({ width: ((colWidth + 2) + "px") });
  23403. }
  23404. col.$el.addClass('picker-column-absolute');
  23405. }
  23406. };
  23407. col.setValue = function setColValue(newValue, transition, valueCallbacks) {
  23408. if ( transition === void 0 ) transition = '';
  23409. var newActiveIndex = col.$itemsEl.find((".picker-item[data-picker-value=\"" + newValue + "\"]")).index();
  23410. if (typeof newActiveIndex === 'undefined' || newActiveIndex === -1) {
  23411. return;
  23412. }
  23413. var newTranslate = (-newActiveIndex * itemHeight) + maxTranslate;
  23414. // Update wrapper
  23415. col.$itemsEl.transition(transition);
  23416. col.$itemsEl.transform(("translate3d(0," + newTranslate + "px,0)"));
  23417. // Watch items
  23418. if (picker.params.updateValuesOnMomentum && col.activeIndex && col.activeIndex !== newActiveIndex) {
  23419. Utils.cancelAnimationFrame(animationFrameId);
  23420. col.$itemsEl.transitionEnd(function () {
  23421. Utils.cancelAnimationFrame(animationFrameId);
  23422. });
  23423. updateDuringScroll();
  23424. }
  23425. // Update items
  23426. col.updateItems(newActiveIndex, newTranslate, transition, valueCallbacks);
  23427. };
  23428. col.updateItems = function updateColItems(activeIndex, translate, transition, valueCallbacks) {
  23429. if (typeof translate === 'undefined') {
  23430. // eslint-disable-next-line
  23431. translate = Utils.getTranslate(col.$itemsEl[0], 'y');
  23432. }
  23433. // eslint-disable-next-line
  23434. if (typeof activeIndex === 'undefined') { activeIndex = -Math.round((translate - maxTranslate) / itemHeight); }
  23435. // eslint-disable-next-line
  23436. if (activeIndex < 0) { activeIndex = 0; }
  23437. // eslint-disable-next-line
  23438. if (activeIndex >= col.items.length) { activeIndex = col.items.length - 1; }
  23439. var previousActiveIndex = col.activeIndex;
  23440. col.activeIndex = activeIndex;
  23441. col.$itemsEl.find('.picker-item-selected').removeClass('picker-item-selected');
  23442. col.items.transition(transition);
  23443. var selectedItem = col.items.eq(activeIndex).addClass('picker-item-selected').transform('');
  23444. // Set 3D rotate effect
  23445. if (picker.params.rotateEffect) {
  23446. col.items.each(function (index, itemEl) {
  23447. var $itemEl = $(itemEl);
  23448. var itemOffsetTop = $itemEl.index() * itemHeight;
  23449. var translateOffset = maxTranslate - translate;
  23450. var itemOffset = itemOffsetTop - translateOffset;
  23451. var percentage = itemOffset / itemHeight;
  23452. var itemsFit = Math.ceil(col.height / itemHeight / 2) + 1;
  23453. var angle = (-18 * percentage);
  23454. if (angle > 180) { angle = 180; }
  23455. if (angle < -180) { angle = -180; }
  23456. if (Math.abs(percentage) > itemsFit) {
  23457. $itemEl.addClass('picker-item-far');
  23458. } else {
  23459. $itemEl.removeClass('picker-item-far');
  23460. }
  23461. $itemEl.transform(("translate3d(0, " + (-translate + maxTranslate) + "px, " + (picker.needsOriginFix ? -110 : 0) + "px) rotateX(" + angle + "deg)"));
  23462. });
  23463. }
  23464. if (valueCallbacks || typeof valueCallbacks === 'undefined') {
  23465. // Update values
  23466. col.value = selectedItem.attr('data-picker-value');
  23467. col.displayValue = col.displayValues ? col.displayValues[activeIndex] : col.value;
  23468. // On change callback
  23469. if (previousActiveIndex !== activeIndex) {
  23470. if (col.onChange) {
  23471. col.onChange(picker, col.value, col.displayValue);
  23472. }
  23473. picker.updateValue();
  23474. }
  23475. }
  23476. };
  23477. var allowItemClick = true;
  23478. var isTouched;
  23479. var isMoved;
  23480. var touchStartY;
  23481. var touchCurrentY;
  23482. var touchStartTime;
  23483. var touchEndTime;
  23484. var startTranslate;
  23485. var returnTo;
  23486. var currentTranslate;
  23487. var prevTranslate;
  23488. var velocityTranslate;
  23489. function handleTouchStart(e) {
  23490. if (isMoved || isTouched) { return; }
  23491. e.preventDefault();
  23492. isTouched = true;
  23493. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  23494. touchCurrentY = touchStartY;
  23495. touchStartTime = (new Date()).getTime();
  23496. allowItemClick = true;
  23497. startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
  23498. currentTranslate = startTranslate;
  23499. }
  23500. function handleTouchMove(e) {
  23501. if (!isTouched) { return; }
  23502. e.preventDefault();
  23503. allowItemClick = false;
  23504. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  23505. if (!isMoved) {
  23506. // First move
  23507. Utils.cancelAnimationFrame(animationFrameId);
  23508. isMoved = true;
  23509. startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
  23510. currentTranslate = startTranslate;
  23511. col.$itemsEl.transition(0);
  23512. }
  23513. var diff = touchCurrentY - touchStartY;
  23514. currentTranslate = startTranslate + diff;
  23515. returnTo = undefined;
  23516. // Normalize translate
  23517. if (currentTranslate < minTranslate) {
  23518. currentTranslate = minTranslate - (Math.pow( (minTranslate - currentTranslate), 0.8 ));
  23519. returnTo = 'min';
  23520. }
  23521. if (currentTranslate > maxTranslate) {
  23522. currentTranslate = maxTranslate + (Math.pow( (currentTranslate - maxTranslate), 0.8 ));
  23523. returnTo = 'max';
  23524. }
  23525. // Transform wrapper
  23526. col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px,0)"));
  23527. // Update items
  23528. col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnTouchmove);
  23529. // Calc velocity
  23530. velocityTranslate = currentTranslate - prevTranslate || currentTranslate;
  23531. prevTranslate = currentTranslate;
  23532. }
  23533. function handleTouchEnd() {
  23534. if (!isTouched || !isMoved) {
  23535. isTouched = false;
  23536. isMoved = false;
  23537. return;
  23538. }
  23539. isTouched = false;
  23540. isMoved = false;
  23541. col.$itemsEl.transition('');
  23542. if (returnTo) {
  23543. if (returnTo === 'min') {
  23544. col.$itemsEl.transform(("translate3d(0," + minTranslate + "px,0)"));
  23545. } else {
  23546. col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)"));
  23547. }
  23548. }
  23549. touchEndTime = new Date().getTime();
  23550. var newTranslate;
  23551. if (touchEndTime - touchStartTime > 300) {
  23552. newTranslate = currentTranslate;
  23553. } else {
  23554. newTranslate = currentTranslate + (velocityTranslate * picker.params.momentumRatio);
  23555. }
  23556. newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
  23557. // Active Index
  23558. var activeIndex = Math.round(Math.abs(((newTranslate - maxTranslate) / itemHeight)));
  23559. // Normalize translate
  23560. if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
  23561. // Transform wrapper
  23562. col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px,0)"));
  23563. // Update items
  23564. col.updateItems(activeIndex, newTranslate, '', true);
  23565. // Watch items
  23566. if (picker.params.updateValuesOnMomentum) {
  23567. updateDuringScroll();
  23568. col.$itemsEl.transitionEnd(function () {
  23569. Utils.cancelAnimationFrame(animationFrameId);
  23570. });
  23571. }
  23572. // Allow click
  23573. setTimeout(function () {
  23574. allowItemClick = true;
  23575. }, 100);
  23576. }
  23577. var mousewheelTimeout;
  23578. function handleMouseWheel(e) {
  23579. var deltaX = e.deltaX;
  23580. var deltaY = e.deltaY;
  23581. if (Math.abs(deltaX) > Math.abs(deltaY)) { return; }
  23582. clearTimeout(mousewheelTimeout);
  23583. e.preventDefault();
  23584. Utils.cancelAnimationFrame(animationFrameId);
  23585. startTranslate = Utils.getTranslate(col.$itemsEl[0], 'y');
  23586. col.$itemsEl.transition(0);
  23587. currentTranslate = startTranslate - deltaY;
  23588. returnTo = undefined;
  23589. // Normalize translate
  23590. if (currentTranslate < minTranslate) {
  23591. currentTranslate = minTranslate;
  23592. returnTo = 'min';
  23593. }
  23594. if (currentTranslate > maxTranslate) {
  23595. currentTranslate = maxTranslate;
  23596. returnTo = 'max';
  23597. }
  23598. // Transform wrapper
  23599. col.$itemsEl.transform(("translate3d(0," + currentTranslate + "px,0)"));
  23600. // Update items
  23601. col.updateItems(undefined, currentTranslate, 0, picker.params.updateValuesOnMousewheel);
  23602. // On end
  23603. mousewheelTimeout = setTimeout(function () {
  23604. col.$itemsEl.transition('');
  23605. if (returnTo) {
  23606. if (returnTo === 'min') {
  23607. col.$itemsEl.transform(("translate3d(0," + minTranslate + "px,0)"));
  23608. } else {
  23609. col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)"));
  23610. }
  23611. }
  23612. touchEndTime = new Date().getTime();
  23613. var newTranslate = currentTranslate;
  23614. newTranslate = Math.max(Math.min(newTranslate, maxTranslate), minTranslate);
  23615. // Active Index
  23616. var activeIndex = Math.round(Math.abs(((newTranslate - maxTranslate) / itemHeight)));
  23617. // Normalize translate
  23618. if (!picker.params.freeMode) { newTranslate = (-activeIndex * itemHeight) + maxTranslate; }
  23619. // Transform wrapper
  23620. col.$itemsEl.transform(("translate3d(0," + (parseInt(newTranslate, 10)) + "px,0)"));
  23621. // Update items
  23622. col.updateItems(activeIndex, newTranslate, '', true);
  23623. }, 200);
  23624. }
  23625. function handleClick() {
  23626. if (!allowItemClick) { return; }
  23627. Utils.cancelAnimationFrame(animationFrameId);
  23628. var value = $(this).attr('data-picker-value');
  23629. col.setValue(value);
  23630. }
  23631. var activeListener = app.support.passiveListener ? { passive: false, capture: false } : false;
  23632. col.attachEvents = function attachColEvents() {
  23633. col.$el.on(app.touchEvents.start, handleTouchStart, activeListener);
  23634. app.on('touchmove:active', handleTouchMove);
  23635. app.on('touchend:passive', handleTouchEnd);
  23636. if (picker.params.mousewheel) {
  23637. col.$el.on('wheel', handleMouseWheel);
  23638. }
  23639. col.items.on('click', handleClick);
  23640. };
  23641. col.detachEvents = function detachColEvents() {
  23642. col.$el.off(app.touchEvents.start, handleTouchStart, activeListener);
  23643. app.off('touchmove:active', handleTouchMove);
  23644. app.off('touchend:passive', handleTouchEnd);
  23645. if (picker.params.mousewheel) {
  23646. col.$el.off('wheel', handleMouseWheel);
  23647. }
  23648. col.items.off('click', handleClick);
  23649. };
  23650. col.init = function initCol() {
  23651. col.calcSize();
  23652. col.$itemsEl.transform(("translate3d(0," + maxTranslate + "px,0)")).transition(0);
  23653. if (colIndex === 0) { col.$el.addClass('picker-column-first'); }
  23654. if (colIndex === picker.cols.length - 1) { col.$el.addClass('picker-column-last'); }
  23655. // Update items on init
  23656. if (updateItems) { col.updateItems(0, maxTranslate, 0); }
  23657. col.attachEvents();
  23658. };
  23659. col.destroy = function destroyCol() {
  23660. col.detachEvents();
  23661. };
  23662. col.init();
  23663. }
  23664. var Picker = /*@__PURE__*/(function (Framework7Class) {
  23665. function Picker(app, params) {
  23666. if ( params === void 0 ) params = {};
  23667. Framework7Class.call(this, params, [app]);
  23668. var picker = this;
  23669. picker.params = Utils.extend({}, app.params.picker, params);
  23670. var $containerEl;
  23671. if (picker.params.containerEl) {
  23672. $containerEl = $(picker.params.containerEl);
  23673. if ($containerEl.length === 0) { return picker; }
  23674. }
  23675. var $inputEl;
  23676. if (picker.params.inputEl) {
  23677. $inputEl = $(picker.params.inputEl);
  23678. }
  23679. var $scrollToEl = picker.params.scrollToInput ? $inputEl : undefined;
  23680. if (picker.params.scrollToEl) {
  23681. var scrollToEl = $(picker.params.scrollToEl);
  23682. if (scrollToEl.length > 0) {
  23683. $scrollToEl = scrollToEl;
  23684. }
  23685. }
  23686. Utils.extend(picker, {
  23687. app: app,
  23688. $containerEl: $containerEl,
  23689. containerEl: $containerEl && $containerEl[0],
  23690. inline: $containerEl && $containerEl.length > 0,
  23691. needsOriginFix: app.device.ios || ((win.navigator.userAgent.toLowerCase().indexOf('safari') >= 0 && win.navigator.userAgent.toLowerCase().indexOf('chrome') < 0) && !app.device.android),
  23692. cols: [],
  23693. $inputEl: $inputEl,
  23694. inputEl: $inputEl && $inputEl[0],
  23695. $scrollToEl: $scrollToEl,
  23696. initialized: false,
  23697. opened: false,
  23698. url: picker.params.url,
  23699. });
  23700. function onResize() {
  23701. picker.resizeCols();
  23702. }
  23703. function onInputClick() {
  23704. picker.open();
  23705. }
  23706. function onInputFocus(e) {
  23707. e.preventDefault();
  23708. }
  23709. function onHtmlClick(e) {
  23710. if (picker.destroyed || !picker.params) { return; }
  23711. var $targetEl = $(e.target);
  23712. if (picker.isPopover()) { return; }
  23713. if (!picker.opened || picker.closing) { return; }
  23714. if ($targetEl.closest('[class*="backdrop"]').length) { return; }
  23715. if ($inputEl && $inputEl.length > 0) {
  23716. if ($targetEl[0] !== $inputEl[0] && $targetEl.closest('.sheet-modal').length === 0) {
  23717. picker.close();
  23718. }
  23719. } else if ($(e.target).closest('.sheet-modal').length === 0) {
  23720. picker.close();
  23721. }
  23722. }
  23723. // Events
  23724. Utils.extend(picker, {
  23725. attachResizeEvent: function attachResizeEvent() {
  23726. app.on('resize', onResize);
  23727. },
  23728. detachResizeEvent: function detachResizeEvent() {
  23729. app.off('resize', onResize);
  23730. },
  23731. attachInputEvents: function attachInputEvents() {
  23732. picker.$inputEl.on('click', onInputClick);
  23733. if (picker.params.inputReadOnly) {
  23734. picker.$inputEl.on('focus mousedown', onInputFocus);
  23735. if (picker.$inputEl[0]) {
  23736. picker.$inputEl[0].f7ValidateReadonly = true;
  23737. }
  23738. }
  23739. },
  23740. detachInputEvents: function detachInputEvents() {
  23741. picker.$inputEl.off('click', onInputClick);
  23742. if (picker.params.inputReadOnly) {
  23743. picker.$inputEl.off('focus mousedown', onInputFocus);
  23744. if (picker.$inputEl[0]) {
  23745. delete picker.$inputEl[0].f7ValidateReadonly;
  23746. }
  23747. }
  23748. },
  23749. attachHtmlEvents: function attachHtmlEvents() {
  23750. app.on('click', onHtmlClick);
  23751. },
  23752. detachHtmlEvents: function detachHtmlEvents() {
  23753. app.off('click', onHtmlClick);
  23754. },
  23755. });
  23756. picker.init();
  23757. return picker;
  23758. }
  23759. if ( Framework7Class ) Picker.__proto__ = Framework7Class;
  23760. Picker.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  23761. Picker.prototype.constructor = Picker;
  23762. var prototypeAccessors = { view: { configurable: true } };
  23763. prototypeAccessors.view.get = function () {
  23764. var ref = this;
  23765. var app = ref.app;
  23766. var params = ref.params;
  23767. var $inputEl = ref.$inputEl;
  23768. var view;
  23769. if (params.view) {
  23770. view = params.view;
  23771. } else if ($inputEl) {
  23772. view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
  23773. }
  23774. if (!view) { view = app.views.main; }
  23775. return view;
  23776. };
  23777. Picker.prototype.initInput = function initInput () {
  23778. var picker = this;
  23779. if (!picker.$inputEl) { return; }
  23780. if (picker.params.inputReadOnly) { picker.$inputEl.prop('readOnly', true); }
  23781. };
  23782. Picker.prototype.resizeCols = function resizeCols () {
  23783. var picker = this;
  23784. if (!picker.opened) { return; }
  23785. for (var i = 0; i < picker.cols.length; i += 1) {
  23786. if (!picker.cols[i].divider) {
  23787. picker.cols[i].calcSize();
  23788. picker.cols[i].setValue(picker.cols[i].value, 0, false);
  23789. }
  23790. }
  23791. };
  23792. Picker.prototype.isPopover = function isPopover () {
  23793. var picker = this;
  23794. var app = picker.app;
  23795. var modal = picker.modal;
  23796. var params = picker.params;
  23797. if (params.openIn === 'sheet') { return false; }
  23798. if (modal && modal.type !== 'popover') { return false; }
  23799. if (!picker.inline && picker.inputEl) {
  23800. if (params.openIn === 'popover') { return true; }
  23801. if (app.device.ios) {
  23802. return !!app.device.ipad;
  23803. }
  23804. if (app.width >= 768) {
  23805. return true;
  23806. }
  23807. if (app.device.desktop && app.theme === 'aurora') {
  23808. return true;
  23809. }
  23810. }
  23811. return false;
  23812. };
  23813. Picker.prototype.formatValue = function formatValue () {
  23814. var picker = this;
  23815. var value = picker.value;
  23816. var displayValue = picker.displayValue;
  23817. if (picker.params.formatValue) {
  23818. return picker.params.formatValue.call(picker, value, displayValue);
  23819. }
  23820. return value.join(' ');
  23821. };
  23822. Picker.prototype.setValue = function setValue (values, transition) {
  23823. var picker = this;
  23824. var valueIndex = 0;
  23825. if (picker.cols.length === 0) {
  23826. picker.value = values;
  23827. picker.updateValue(values);
  23828. return;
  23829. }
  23830. for (var i = 0; i < picker.cols.length; i += 1) {
  23831. if (picker.cols[i] && !picker.cols[i].divider) {
  23832. picker.cols[i].setValue(values[valueIndex], transition);
  23833. valueIndex += 1;
  23834. }
  23835. }
  23836. };
  23837. Picker.prototype.getValue = function getValue () {
  23838. var picker = this;
  23839. return picker.value;
  23840. };
  23841. Picker.prototype.updateValue = function updateValue (forceValues) {
  23842. var picker = this;
  23843. var newValue = forceValues || [];
  23844. var newDisplayValue = [];
  23845. var column;
  23846. if (picker.cols.length === 0) {
  23847. var noDividerColumns = picker.params.cols.filter(function (c) { return !c.divider; });
  23848. for (var i = 0; i < noDividerColumns.length; i += 1) {
  23849. column = noDividerColumns[i];
  23850. if (column.displayValues !== undefined && column.values !== undefined && column.values.indexOf(newValue[i]) !== -1) {
  23851. newDisplayValue.push(column.displayValues[column.values.indexOf(newValue[i])]);
  23852. } else {
  23853. newDisplayValue.push(newValue[i]);
  23854. }
  23855. }
  23856. } else {
  23857. for (var i$1 = 0; i$1 < picker.cols.length; i$1 += 1) {
  23858. if (!picker.cols[i$1].divider) {
  23859. newValue.push(picker.cols[i$1].value);
  23860. newDisplayValue.push(picker.cols[i$1].displayValue);
  23861. }
  23862. }
  23863. }
  23864. if (newValue.indexOf(undefined) >= 0) {
  23865. return;
  23866. }
  23867. picker.value = newValue;
  23868. picker.displayValue = newDisplayValue;
  23869. picker.emit('local::change pickerChange', picker, picker.value, picker.displayValue);
  23870. if (picker.inputEl) {
  23871. picker.$inputEl.val(picker.formatValue());
  23872. picker.$inputEl.trigger('change');
  23873. }
  23874. };
  23875. Picker.prototype.initColumn = function initColumn (colEl, updateItems) {
  23876. var picker = this;
  23877. pickerColumn.call(picker, colEl, updateItems);
  23878. };
  23879. // eslint-disable-next-line
  23880. Picker.prototype.destroyColumn = function destroyColumn (colEl) {
  23881. var picker = this;
  23882. var $colEl = $(colEl);
  23883. var index = $colEl.index();
  23884. if (picker.cols[index] && picker.cols[index].destroy) {
  23885. picker.cols[index].destroy();
  23886. }
  23887. };
  23888. Picker.prototype.renderToolbar = function renderToolbar () {
  23889. var picker = this;
  23890. if (picker.params.renderToolbar) { return picker.params.renderToolbar.call(picker, picker); }
  23891. return ("\n <div class=\"toolbar toolbar-top no-shadow\">\n <div class=\"toolbar-inner\">\n <div class=\"left\"></div>\n <div class=\"right\">\n <a class=\"link sheet-close popover-close\">" + (picker.params.toolbarCloseText) + "</a>\n </div>\n </div>\n </div>\n ").trim();
  23892. };
  23893. // eslint-disable-next-line
  23894. Picker.prototype.renderColumn = function renderColumn (col, onlyItems) {
  23895. var colClasses = "picker-column " + (col.textAlign ? ("picker-column-" + (col.textAlign)) : '') + " " + (col.cssClass || '');
  23896. var columnHtml;
  23897. var columnItemsHtml;
  23898. if (col.divider) {
  23899. columnHtml = "\n <div class=\"" + colClasses + " picker-column-divider\">" + (col.content) + "</div>\n ";
  23900. } else {
  23901. columnItemsHtml = col.values.map(function (value, index) { return ("\n <div class=\"picker-item\" data-picker-value=\"" + value + "\">\n <span>" + (col.displayValues ? col.displayValues[index] : value) + "</span>\n </div>\n "); }).join('');
  23902. columnHtml = "\n <div class=\"" + colClasses + "\">\n <div class=\"picker-items\">" + columnItemsHtml + "</div>\n </div>\n ";
  23903. }
  23904. return onlyItems ? columnItemsHtml.trim() : columnHtml.trim();
  23905. };
  23906. Picker.prototype.renderInline = function renderInline () {
  23907. var picker = this;
  23908. var ref = picker.params;
  23909. var rotateEffect = ref.rotateEffect;
  23910. var cssClass = ref.cssClass;
  23911. var toolbar = ref.toolbar;
  23912. var inlineHtml = ("\n <div class=\"picker picker-inline " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div class=\"picker-columns\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div class=\"picker-center-highlight\"></div>\n </div>\n </div>\n ").trim();
  23913. return inlineHtml;
  23914. };
  23915. Picker.prototype.renderSheet = function renderSheet () {
  23916. var picker = this;
  23917. var ref = picker.params;
  23918. var rotateEffect = ref.rotateEffect;
  23919. var cssClass = ref.cssClass;
  23920. var toolbar = ref.toolbar;
  23921. var sheetHtml = ("\n <div class=\"sheet-modal picker picker-sheet " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div class=\"sheet-modal-inner picker-columns\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div class=\"picker-center-highlight\"></div>\n </div>\n </div>\n ").trim();
  23922. return sheetHtml;
  23923. };
  23924. Picker.prototype.renderPopover = function renderPopover () {
  23925. var picker = this;
  23926. var ref = picker.params;
  23927. var rotateEffect = ref.rotateEffect;
  23928. var cssClass = ref.cssClass;
  23929. var toolbar = ref.toolbar;
  23930. var popoverHtml = ("\n <div class=\"popover picker-popover\">\n <div class=\"popover-inner\">\n <div class=\"picker " + (rotateEffect ? 'picker-3d' : '') + " " + (cssClass || '') + "\">\n " + (toolbar ? picker.renderToolbar() : '') + "\n <div class=\"picker-columns\">\n " + (picker.cols.map(function (col) { return picker.renderColumn(col); }).join('')) + "\n <div class=\"picker-center-highlight\"></div>\n </div>\n </div>\n </div>\n </div>\n ").trim();
  23931. return popoverHtml;
  23932. };
  23933. Picker.prototype.render = function render () {
  23934. var picker = this;
  23935. if (picker.params.render) { return picker.params.render.call(picker); }
  23936. if (!picker.inline) {
  23937. if (picker.isPopover()) { return picker.renderPopover(); }
  23938. return picker.renderSheet();
  23939. }
  23940. return picker.renderInline();
  23941. };
  23942. Picker.prototype.onOpen = function onOpen () {
  23943. var picker = this;
  23944. var initialized = picker.initialized;
  23945. var $el = picker.$el;
  23946. var app = picker.app;
  23947. var $inputEl = picker.$inputEl;
  23948. var inline = picker.inline;
  23949. var value = picker.value;
  23950. var params = picker.params;
  23951. picker.opened = true;
  23952. picker.closing = false;
  23953. picker.opening = true;
  23954. // Init main events
  23955. picker.attachResizeEvent();
  23956. // Init cols
  23957. $el.find('.picker-column').each(function (index, colEl) {
  23958. var updateItems = true;
  23959. if (
  23960. (!initialized && params.value)
  23961. || (initialized && value)
  23962. ) {
  23963. updateItems = false;
  23964. }
  23965. picker.initColumn(colEl, updateItems);
  23966. });
  23967. // Set value
  23968. if (!initialized) {
  23969. if (value) { picker.setValue(value, 0); }
  23970. else if (params.value) {
  23971. picker.setValue(params.value, 0);
  23972. }
  23973. } else if (value) {
  23974. picker.setValue(value, 0);
  23975. }
  23976. // Extra focus
  23977. if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
  23978. $inputEl.trigger('focus');
  23979. }
  23980. picker.initialized = true;
  23981. // Trigger events
  23982. if ($el) {
  23983. $el.trigger('picker:open');
  23984. }
  23985. if ($inputEl) {
  23986. $inputEl.trigger('picker:open');
  23987. }
  23988. picker.emit('local::open pickerOpen', picker);
  23989. };
  23990. Picker.prototype.onOpened = function onOpened () {
  23991. var picker = this;
  23992. picker.opening = false;
  23993. if (picker.$el) {
  23994. picker.$el.trigger('picker:opened');
  23995. }
  23996. if (picker.$inputEl) {
  23997. picker.$inputEl.trigger('picker:opened');
  23998. }
  23999. picker.emit('local::opened pickerOpened', picker);
  24000. };
  24001. Picker.prototype.onClose = function onClose () {
  24002. var picker = this;
  24003. var app = picker.app;
  24004. picker.opening = false;
  24005. picker.closing = true;
  24006. // Detach events
  24007. picker.detachResizeEvent();
  24008. picker.cols.forEach(function (col) {
  24009. if (col.destroy) { col.destroy(); }
  24010. });
  24011. if (picker.$inputEl) {
  24012. if (app.theme === 'md') {
  24013. picker.$inputEl.trigger('blur');
  24014. } else {
  24015. var validate = picker.$inputEl.attr('validate');
  24016. var required = picker.$inputEl.attr('required');
  24017. if (validate && required) {
  24018. app.input.validate(picker.$inputEl);
  24019. }
  24020. }
  24021. }
  24022. if (picker.$el) {
  24023. picker.$el.trigger('picker:close');
  24024. }
  24025. if (picker.$inputEl) {
  24026. picker.$inputEl.trigger('picker:close');
  24027. }
  24028. picker.emit('local::close pickerClose', picker);
  24029. };
  24030. Picker.prototype.onClosed = function onClosed () {
  24031. var picker = this;
  24032. picker.opened = false;
  24033. picker.closing = false;
  24034. if (!picker.inline) {
  24035. Utils.nextTick(function () {
  24036. if (picker.modal && picker.modal.el && picker.modal.destroy) {
  24037. if (!picker.params.routableModals) {
  24038. picker.modal.destroy();
  24039. }
  24040. }
  24041. delete picker.modal;
  24042. });
  24043. }
  24044. if (picker.$el) {
  24045. picker.$el.trigger('picker:closed');
  24046. }
  24047. if (picker.$inputEl) {
  24048. picker.$inputEl.trigger('picker:closed');
  24049. }
  24050. picker.emit('local::closed pickerClosed', picker);
  24051. };
  24052. Picker.prototype.open = function open () {
  24053. var obj;
  24054. var picker = this;
  24055. var app = picker.app;
  24056. var opened = picker.opened;
  24057. var inline = picker.inline;
  24058. var $inputEl = picker.$inputEl;
  24059. var $scrollToEl = picker.$scrollToEl;
  24060. var params = picker.params;
  24061. if (opened) { return; }
  24062. if (picker.cols.length === 0 && params.cols.length) {
  24063. params.cols.forEach(function (col) {
  24064. picker.cols.push(col);
  24065. });
  24066. }
  24067. if (inline) {
  24068. picker.$el = $(picker.render());
  24069. picker.$el[0].f7Picker = picker;
  24070. picker.$containerEl.append(picker.$el);
  24071. picker.onOpen();
  24072. picker.onOpened();
  24073. return;
  24074. }
  24075. var isPopover = picker.isPopover();
  24076. var modalType = isPopover ? 'popover' : 'sheet';
  24077. var modalParams = {
  24078. targetEl: $inputEl,
  24079. scrollToEl: $scrollToEl,
  24080. content: picker.render(),
  24081. backdrop: typeof params.backdrop !== 'undefined' ? params.backdrop : isPopover,
  24082. on: {
  24083. open: function open() {
  24084. var modal = this;
  24085. picker.modal = modal;
  24086. picker.$el = isPopover ? modal.$el.find('.picker') : modal.$el;
  24087. picker.$el[0].f7Picker = picker;
  24088. picker.onOpen();
  24089. },
  24090. opened: function opened() { picker.onOpened(); },
  24091. close: function close() { picker.onClose(); },
  24092. closed: function closed() { picker.onClosed(); },
  24093. },
  24094. };
  24095. if (modalType === 'sheet') {
  24096. modalParams.push = params.sheetPush;
  24097. modalParams.swipeToClose = params.sheetSwipeToClose;
  24098. }
  24099. if (params.routableModals && picker.view) {
  24100. picker.view.router.navigate({
  24101. url: picker.url,
  24102. route: ( obj = {
  24103. path: picker.url
  24104. }, obj[modalType] = modalParams, obj ),
  24105. });
  24106. } else {
  24107. picker.modal = app[modalType].create(modalParams);
  24108. picker.modal.open();
  24109. }
  24110. };
  24111. Picker.prototype.close = function close () {
  24112. var picker = this;
  24113. var opened = picker.opened;
  24114. var inline = picker.inline;
  24115. if (!opened) { return; }
  24116. if (inline) {
  24117. picker.onClose();
  24118. picker.onClosed();
  24119. return;
  24120. }
  24121. if (picker.params.routableModals && picker.view) {
  24122. picker.view.router.back();
  24123. } else {
  24124. picker.modal.close();
  24125. }
  24126. };
  24127. Picker.prototype.init = function init () {
  24128. var picker = this;
  24129. picker.initInput();
  24130. if (picker.inline) {
  24131. picker.open();
  24132. picker.emit('local::init pickerInit', picker);
  24133. return;
  24134. }
  24135. if (!picker.initialized && picker.params.value) {
  24136. picker.setValue(picker.params.value);
  24137. }
  24138. // Attach input Events
  24139. if (picker.$inputEl) {
  24140. picker.attachInputEvents();
  24141. }
  24142. if (picker.params.closeByOutsideClick) {
  24143. picker.attachHtmlEvents();
  24144. }
  24145. picker.emit('local::init pickerInit', picker);
  24146. };
  24147. Picker.prototype.destroy = function destroy () {
  24148. var picker = this;
  24149. if (picker.destroyed) { return; }
  24150. var $el = picker.$el;
  24151. picker.emit('local::beforeDestroy pickerBeforeDestroy', picker);
  24152. if ($el) { $el.trigger('picker:beforedestroy'); }
  24153. picker.close();
  24154. // Detach Events
  24155. if (picker.$inputEl) {
  24156. picker.detachInputEvents();
  24157. }
  24158. if (picker.params.closeByOutsideClick) {
  24159. picker.detachHtmlEvents();
  24160. }
  24161. if ($el && $el.length) { delete picker.$el[0].f7Picker; }
  24162. Utils.deleteProps(picker);
  24163. picker.destroyed = true;
  24164. };
  24165. Object.defineProperties( Picker.prototype, prototypeAccessors );
  24166. return Picker;
  24167. }(Framework7Class));
  24168. var Picker$1 = {
  24169. name: 'picker',
  24170. static: {
  24171. Picker: Picker,
  24172. },
  24173. create: function create() {
  24174. var app = this;
  24175. app.picker = ConstructorMethods({
  24176. defaultSelector: '.picker',
  24177. constructor: Picker,
  24178. app: app,
  24179. domProp: 'f7Picker',
  24180. });
  24181. app.picker.close = function close(el) {
  24182. if ( el === void 0 ) el = '.picker';
  24183. var $el = $(el);
  24184. if ($el.length === 0) { return; }
  24185. var picker = $el[0].f7Picker;
  24186. if (!picker || (picker && !picker.opened)) { return; }
  24187. picker.close();
  24188. };
  24189. },
  24190. params: {
  24191. picker: {
  24192. // Picker settings
  24193. updateValuesOnMomentum: false,
  24194. updateValuesOnTouchmove: true,
  24195. updateValuesOnMousewheel: true,
  24196. mousewheel: true,
  24197. rotateEffect: false,
  24198. momentumRatio: 7,
  24199. freeMode: false,
  24200. cols: [],
  24201. // Common opener settings
  24202. containerEl: null,
  24203. openIn: 'auto', // or 'popover' or 'sheet'
  24204. sheetPush: false,
  24205. sheetSwipeToClose: undefined,
  24206. backdrop: undefined, // uses Popover or Sheet defaults
  24207. formatValue: null,
  24208. inputEl: null,
  24209. inputReadOnly: true,
  24210. closeByOutsideClick: true,
  24211. scrollToInput: true,
  24212. scrollToEl: undefined,
  24213. toolbar: true,
  24214. toolbarCloseText: 'Done',
  24215. cssClass: null,
  24216. routableModals: true,
  24217. view: null,
  24218. url: 'select/',
  24219. // Render functions
  24220. renderToolbar: null,
  24221. render: null,
  24222. },
  24223. },
  24224. };
  24225. var InfiniteScroll = {
  24226. handleScroll: function handleScroll(el, e) {
  24227. var app = this;
  24228. var $el = $(el);
  24229. var scrollTop = $el[0].scrollTop;
  24230. var scrollHeight = $el[0].scrollHeight;
  24231. var height = $el[0].offsetHeight;
  24232. var distance = $el[0].getAttribute('data-infinite-distance');
  24233. var virtualListContainer = $el.find('.virtual-list');
  24234. var virtualList;
  24235. var onTop = $el.hasClass('infinite-scroll-top');
  24236. if (!distance) { distance = 50; }
  24237. if (typeof distance === 'string' && distance.indexOf('%') >= 0) {
  24238. distance = (parseInt(distance, 10) / 100) * height;
  24239. }
  24240. if (distance > height) { distance = height; }
  24241. if (onTop) {
  24242. if (scrollTop < distance) {
  24243. $el.trigger('infinite', e);
  24244. app.emit('infinite', $el[0], e);
  24245. }
  24246. } else if (scrollTop + height >= scrollHeight - distance) {
  24247. if (virtualListContainer.length > 0) {
  24248. virtualList = virtualListContainer.eq(-1)[0].f7VirtualList;
  24249. if (virtualList && !virtualList.reachEnd && !virtualList.params.updatableScroll) {
  24250. return;
  24251. }
  24252. }
  24253. $el.trigger('infinite', e);
  24254. app.emit('infinite', $el[0], e);
  24255. }
  24256. },
  24257. create: function create(el) {
  24258. var $el = $(el);
  24259. var app = this;
  24260. function scrollHandler(e) {
  24261. app.infiniteScroll.handle(this, e);
  24262. }
  24263. $el.each(function (index, element) {
  24264. element.f7InfiniteScrollHandler = scrollHandler;
  24265. element.addEventListener('scroll', element.f7InfiniteScrollHandler);
  24266. });
  24267. },
  24268. destroy: function destroy(el) {
  24269. var $el = $(el);
  24270. $el.each(function (index, element) {
  24271. element.removeEventListener('scroll', element.f7InfiniteScrollHandler);
  24272. delete element.f7InfiniteScrollHandler;
  24273. });
  24274. },
  24275. };
  24276. var InfiniteScroll$1 = {
  24277. name: 'infiniteScroll',
  24278. create: function create() {
  24279. var app = this;
  24280. Utils.extend(app, {
  24281. infiniteScroll: {
  24282. handle: InfiniteScroll.handleScroll.bind(app),
  24283. create: InfiniteScroll.create.bind(app),
  24284. destroy: InfiniteScroll.destroy.bind(app),
  24285. },
  24286. });
  24287. },
  24288. on: {
  24289. tabMounted: function tabMounted(tabEl) {
  24290. var app = this;
  24291. var $tabEl = $(tabEl);
  24292. var $isEls = $tabEl.find('.infinite-scroll-content');
  24293. if ($tabEl.is('.infinite-scroll-content')) { $isEls.add($tabEl); }
  24294. $isEls.each(function (index, el) {
  24295. app.infiniteScroll.create(el);
  24296. });
  24297. },
  24298. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  24299. var $tabEl = $(tabEl);
  24300. var app = this;
  24301. var $isEls = $tabEl.find('.infinite-scroll-content');
  24302. if ($tabEl.is('.infinite-scroll-content')) { $isEls.add($tabEl); }
  24303. $isEls.each(function (index, el) {
  24304. app.infiniteScroll.destroy(el);
  24305. });
  24306. },
  24307. pageInit: function pageInit(page) {
  24308. var app = this;
  24309. page.$el.find('.infinite-scroll-content').each(function (index, el) {
  24310. app.infiniteScroll.create(el);
  24311. });
  24312. },
  24313. pageBeforeRemove: function pageBeforeRemove(page) {
  24314. var app = this;
  24315. page.$el.find('.infinite-scroll-content').each(function (index, el) {
  24316. app.infiniteScroll.destroy(el);
  24317. });
  24318. },
  24319. },
  24320. };
  24321. var PullToRefresh = /*@__PURE__*/(function (Framework7Class) {
  24322. function PullToRefresh(app, el) {
  24323. Framework7Class.call(this, {}, [app]);
  24324. var ptr = this;
  24325. var $el = $(el);
  24326. var $preloaderEl = $el.find('.ptr-preloader');
  24327. ptr.$el = $el;
  24328. ptr.el = $el[0];
  24329. ptr.app = app;
  24330. ptr.bottom = ptr.$el.hasClass('ptr-bottom');
  24331. // Extend defaults with modules params
  24332. ptr.useModulesParams({});
  24333. var isMaterial = app.theme === 'md';
  24334. var isIos = app.theme === 'ios';
  24335. var isAurora = app.theme === 'aurora';
  24336. // Done
  24337. ptr.done = function done() {
  24338. var $transitionTarget = isMaterial ? $preloaderEl : $el;
  24339. $transitionTarget.transitionEnd(function () {
  24340. $el.removeClass('ptr-transitioning ptr-pull-up ptr-pull-down ptr-closing');
  24341. $el.trigger('ptr:done');
  24342. ptr.emit('local::done ptrDone', $el[0]);
  24343. });
  24344. $el.removeClass('ptr-refreshing').addClass('ptr-transitioning ptr-closing');
  24345. return ptr;
  24346. };
  24347. ptr.refresh = function refresh() {
  24348. if ($el.hasClass('ptr-refreshing')) { return ptr; }
  24349. $el.addClass('ptr-transitioning ptr-refreshing');
  24350. $el.trigger('ptr:refresh', ptr.done);
  24351. ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
  24352. return ptr;
  24353. };
  24354. // Mousewheel
  24355. ptr.mousewheel = $el.attr('data-ptr-mousewheel') === 'true';
  24356. // Events handling
  24357. var touchId;
  24358. var isTouched;
  24359. var isMoved;
  24360. var touchesStart = {};
  24361. var isScrolling;
  24362. var touchesDiff;
  24363. var refresh = false;
  24364. var useTranslate = false;
  24365. var forceUseTranslate = false;
  24366. var startTranslate = 0;
  24367. var translate;
  24368. var scrollTop;
  24369. var wasScrolled;
  24370. var triggerDistance;
  24371. var dynamicTriggerDistance;
  24372. var pullStarted;
  24373. var hasNavbar = false;
  24374. var scrollHeight;
  24375. var offsetHeight;
  24376. var maxScrollTop;
  24377. var $pageEl = $el.parents('.page');
  24378. if ($pageEl.find('.navbar').length > 0 || $pageEl.parents('.view').children('.navbars').length > 0) { hasNavbar = true; }
  24379. if ($pageEl.hasClass('no-navbar')) { hasNavbar = false; }
  24380. if (!ptr.bottom) {
  24381. var pageNavbarEl = app.navbar.getElByPage($pageEl[0]);
  24382. if (pageNavbarEl) {
  24383. var $pageNavbarEl = $(pageNavbarEl);
  24384. var isLargeTransparent = $pageNavbarEl.hasClass('navbar-large-transparent')
  24385. || (
  24386. $pageNavbarEl.hasClass('navbar-large')
  24387. && $pageNavbarEl.hasClass('navbar-transparent')
  24388. );
  24389. var isTransparent = $pageNavbarEl.hasClass('navbar-transparent') && !$pageNavbarEl.hasClass('navbar-large');
  24390. if (isLargeTransparent) {
  24391. $el.addClass('ptr-with-navbar-large-transparent');
  24392. } else if (isTransparent) {
  24393. $el.addClass('ptr-with-navbar-transparent');
  24394. }
  24395. }
  24396. }
  24397. if (!hasNavbar && !ptr.bottom) { $el.addClass('ptr-no-navbar'); }
  24398. // Define trigger distance
  24399. if ($el.attr('data-ptr-distance')) {
  24400. dynamicTriggerDistance = true;
  24401. } else if (isMaterial) {
  24402. triggerDistance = 66;
  24403. } else if (isIos) {
  24404. triggerDistance = 44;
  24405. } else if (isAurora) {
  24406. triggerDistance = 38;
  24407. }
  24408. function handleTouchStart(e) {
  24409. if (isTouched) {
  24410. if (Device.os === 'android') {
  24411. if ('targetTouches' in e && e.targetTouches.length > 1) { return; }
  24412. } else { return; }
  24413. }
  24414. if ($el.hasClass('ptr-refreshing')) {
  24415. return;
  24416. }
  24417. if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) { return; }
  24418. isMoved = false;
  24419. pullStarted = false;
  24420. isTouched = true;
  24421. isScrolling = undefined;
  24422. wasScrolled = undefined;
  24423. if (e.type === 'touchstart') { touchId = e.targetTouches[0].identifier; }
  24424. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  24425. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  24426. }
  24427. function handleTouchMove(e) {
  24428. if (!isTouched) { return; }
  24429. var pageX;
  24430. var pageY;
  24431. var touch;
  24432. if (e.type === 'touchmove') {
  24433. if (touchId && e.touches) {
  24434. for (var i = 0; i < e.touches.length; i += 1) {
  24435. if (e.touches[i].identifier === touchId) {
  24436. touch = e.touches[i];
  24437. }
  24438. }
  24439. }
  24440. if (!touch) { touch = e.targetTouches[0]; }
  24441. pageX = touch.pageX;
  24442. pageY = touch.pageY;
  24443. } else {
  24444. pageX = e.pageX;
  24445. pageY = e.pageY;
  24446. }
  24447. if (!pageX || !pageY) { return; }
  24448. if (typeof isScrolling === 'undefined') {
  24449. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) > Math.abs(pageX - touchesStart.x));
  24450. }
  24451. if (!isScrolling) {
  24452. isTouched = false;
  24453. return;
  24454. }
  24455. scrollTop = $el[0].scrollTop;
  24456. if (!isMoved) {
  24457. $el.removeClass('ptr-transitioning');
  24458. var targetIsScrollable;
  24459. scrollHeight = $el[0].scrollHeight;
  24460. offsetHeight = $el[0].offsetHeight;
  24461. if (ptr.bottom) {
  24462. maxScrollTop = scrollHeight - offsetHeight;
  24463. }
  24464. if (scrollTop > scrollHeight) {
  24465. isTouched = false;
  24466. return;
  24467. }
  24468. var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
  24469. if ($ptrWatchScrollable.length) {
  24470. $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
  24471. if (ptrScrollableEl === el) { return; }
  24472. if (
  24473. (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
  24474. && $(ptrScrollableEl).css('overflow') === 'auto'
  24475. && (
  24476. (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
  24477. || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
  24478. )
  24479. ) {
  24480. targetIsScrollable = true;
  24481. }
  24482. });
  24483. }
  24484. if (targetIsScrollable) {
  24485. isTouched = false;
  24486. return;
  24487. }
  24488. if (dynamicTriggerDistance) {
  24489. triggerDistance = $el.attr('data-ptr-distance');
  24490. if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
  24491. }
  24492. startTranslate = $el.hasClass('ptr-refreshing') ? triggerDistance : 0;
  24493. if (scrollHeight === offsetHeight || Device.os !== 'ios' || isMaterial) {
  24494. useTranslate = true;
  24495. } else {
  24496. useTranslate = false;
  24497. }
  24498. forceUseTranslate = false;
  24499. }
  24500. isMoved = true;
  24501. touchesDiff = pageY - touchesStart.y;
  24502. if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
  24503. var ptrStarted = ptr.bottom
  24504. ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
  24505. : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
  24506. if (ptrStarted) {
  24507. // iOS 8 fix
  24508. if (Device.os === 'ios' && parseInt(Device.osVersion.split('.')[0], 10) > 7) {
  24509. if (!ptr.bottom && scrollTop === 0 && !wasScrolled) { useTranslate = true; }
  24510. if (ptr.bottom && scrollTop === maxScrollTop && !wasScrolled) { useTranslate = true; }
  24511. }
  24512. if (!useTranslate && ptr.bottom && !isMaterial) {
  24513. $el.css('-webkit-overflow-scrolling', 'auto');
  24514. $el.scrollTop(maxScrollTop);
  24515. forceUseTranslate = true;
  24516. }
  24517. if (useTranslate || forceUseTranslate) {
  24518. if (e.cancelable) {
  24519. e.preventDefault();
  24520. }
  24521. translate = (ptr.bottom ? -1 * (Math.pow( Math.abs(touchesDiff), 0.85 )) : Math.pow( touchesDiff, 0.85 )) + startTranslate;
  24522. if (isMaterial) {
  24523. $preloaderEl.transform(("translate3d(0," + translate + "px,0)"))
  24524. .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg)"));
  24525. } else {
  24526. // eslint-disable-next-line
  24527. if (ptr.bottom) {
  24528. $el.children().transform(("translate3d(0," + translate + "px,0)"));
  24529. } else {
  24530. $el.transform(("translate3d(0," + translate + "px,0)"));
  24531. }
  24532. }
  24533. }
  24534. if (((useTranslate || forceUseTranslate) && (Math.pow( Math.abs(touchesDiff), 0.85 )) > triggerDistance) || (!useTranslate && Math.abs(touchesDiff) >= triggerDistance * 2)) {
  24535. refresh = true;
  24536. $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
  24537. } else {
  24538. refresh = false;
  24539. $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
  24540. }
  24541. if (!pullStarted) {
  24542. $el.trigger('ptr:pullstart');
  24543. ptr.emit('local::pullStart ptrPullStart', $el[0]);
  24544. pullStarted = true;
  24545. }
  24546. $el.trigger('ptr:pullmove', {
  24547. event: e,
  24548. scrollTop: scrollTop,
  24549. translate: translate,
  24550. touchesDiff: touchesDiff,
  24551. });
  24552. ptr.emit('local::pullMove ptrPullMove', $el[0], {
  24553. event: e,
  24554. scrollTop: scrollTop,
  24555. translate: translate,
  24556. touchesDiff: touchesDiff,
  24557. });
  24558. } else {
  24559. pullStarted = false;
  24560. $el.removeClass('ptr-pull-up ptr-pull-down');
  24561. refresh = false;
  24562. }
  24563. }
  24564. function handleTouchEnd(e) {
  24565. if (e.type === 'touchend' && e.changedTouches && e.changedTouches.length > 0 && touchId) {
  24566. if (e.changedTouches[0].identifier !== touchId) {
  24567. isTouched = false;
  24568. isScrolling = false;
  24569. isMoved = false;
  24570. touchId = null;
  24571. return;
  24572. }
  24573. }
  24574. if (!isTouched || !isMoved) {
  24575. isTouched = false;
  24576. isMoved = false;
  24577. return;
  24578. }
  24579. if (translate) {
  24580. $el.addClass('ptr-transitioning');
  24581. translate = 0;
  24582. }
  24583. if (isMaterial) {
  24584. $preloaderEl.transform('')
  24585. .find('.ptr-arrow').transform('');
  24586. } else {
  24587. // eslint-disable-next-line
  24588. if (ptr.bottom) {
  24589. $el.children().transform('');
  24590. } else {
  24591. $el.transform('');
  24592. }
  24593. }
  24594. if (!useTranslate && ptr.bottom && !isMaterial) {
  24595. $el.css('-webkit-overflow-scrolling', '');
  24596. }
  24597. if (refresh) {
  24598. $el.addClass('ptr-refreshing');
  24599. $el.trigger('ptr:refresh', ptr.done);
  24600. ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
  24601. } else {
  24602. $el.removeClass('ptr-pull-down');
  24603. }
  24604. isTouched = false;
  24605. isMoved = false;
  24606. if (pullStarted) {
  24607. $el.trigger('ptr:pullend');
  24608. ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
  24609. }
  24610. }
  24611. var mousewheelTimeout;
  24612. var mousewheelMoved;
  24613. var mousewheelAllow = true;
  24614. var mousewheelTranslate = 0;
  24615. function handleMouseWheelRelease() {
  24616. mousewheelAllow = true;
  24617. mousewheelMoved = false;
  24618. mousewheelTranslate = 0;
  24619. if (translate) {
  24620. $el.addClass('ptr-transitioning');
  24621. translate = 0;
  24622. }
  24623. if (isMaterial) {
  24624. $preloaderEl.transform('')
  24625. .find('.ptr-arrow').transform('');
  24626. } else {
  24627. // eslint-disable-next-line
  24628. if (ptr.bottom) {
  24629. $el.children().transform('');
  24630. } else {
  24631. $el.transform('');
  24632. }
  24633. }
  24634. if (refresh) {
  24635. $el.addClass('ptr-refreshing');
  24636. $el.trigger('ptr:refresh', ptr.done);
  24637. ptr.emit('local::refresh ptrRefresh', $el[0], ptr.done);
  24638. } else {
  24639. $el.removeClass('ptr-pull-down');
  24640. }
  24641. if (pullStarted) {
  24642. $el.trigger('ptr:pullend');
  24643. ptr.emit('local::pullEnd ptrPullEnd', $el[0]);
  24644. }
  24645. }
  24646. function handleMouseWheel(e) {
  24647. if (!mousewheelAllow) { return; }
  24648. var deltaX = e.deltaX;
  24649. var deltaY = e.deltaY;
  24650. if (Math.abs(deltaX) > Math.abs(deltaY)) { return; }
  24651. if ($el.hasClass('ptr-refreshing')) {
  24652. return;
  24653. }
  24654. if ($(e.target).closest('.sortable-handler, .ptr-ignore, .card-expandable.card-opened').length) { return; }
  24655. clearTimeout(mousewheelTimeout);
  24656. scrollTop = $el[0].scrollTop;
  24657. if (!mousewheelMoved) {
  24658. $el.removeClass('ptr-transitioning');
  24659. var targetIsScrollable;
  24660. scrollHeight = $el[0].scrollHeight;
  24661. offsetHeight = $el[0].offsetHeight;
  24662. if (ptr.bottom) {
  24663. maxScrollTop = scrollHeight - offsetHeight;
  24664. }
  24665. if (scrollTop > scrollHeight) {
  24666. mousewheelAllow = false;
  24667. return;
  24668. }
  24669. var $ptrWatchScrollable = $(e.target).closest('.ptr-watch-scroll');
  24670. if ($ptrWatchScrollable.length) {
  24671. $ptrWatchScrollable.each(function (ptrScrollableIndex, ptrScrollableEl) {
  24672. if (ptrScrollableEl === el) { return; }
  24673. if (
  24674. (ptrScrollableEl.scrollHeight > ptrScrollableEl.offsetHeight)
  24675. && $(ptrScrollableEl).css('overflow') === 'auto'
  24676. && (
  24677. (!ptr.bottom && ptrScrollableEl.scrollTop > 0)
  24678. || (ptr.bottom && ptrScrollableEl.scrollTop < ptrScrollableEl.scrollHeight - ptrScrollableEl.offsetHeight)
  24679. )
  24680. ) {
  24681. targetIsScrollable = true;
  24682. }
  24683. });
  24684. }
  24685. if (targetIsScrollable) {
  24686. mousewheelAllow = false;
  24687. return;
  24688. }
  24689. if (dynamicTriggerDistance) {
  24690. triggerDistance = $el.attr('data-ptr-distance');
  24691. if (triggerDistance.indexOf('%') >= 0) { triggerDistance = (scrollHeight * parseInt(triggerDistance, 10)) / 100; }
  24692. }
  24693. }
  24694. isMoved = true;
  24695. mousewheelTranslate -= deltaY;
  24696. touchesDiff = mousewheelTranslate; // pageY - touchesStart.y;
  24697. if (typeof wasScrolled === 'undefined' && (ptr.bottom ? scrollTop !== maxScrollTop : scrollTop !== 0)) { wasScrolled = true; }
  24698. var ptrStarted = ptr.bottom
  24699. ? (touchesDiff < 0 && scrollTop >= maxScrollTop) || scrollTop > maxScrollTop
  24700. : (touchesDiff > 0 && scrollTop <= 0) || scrollTop < 0;
  24701. if (ptrStarted) {
  24702. if (e.cancelable) {
  24703. e.preventDefault();
  24704. }
  24705. translate = touchesDiff;
  24706. if (Math.abs(translate) > triggerDistance) {
  24707. translate = triggerDistance + (Math.pow( (Math.abs(translate) - triggerDistance), 0.7 ));
  24708. if (ptr.bottom) { translate = -translate; }
  24709. }
  24710. if (isMaterial) {
  24711. $preloaderEl.transform(("translate3d(0," + translate + "px,0)"))
  24712. .find('.ptr-arrow').transform(("rotate(" + ((180 * (Math.abs(touchesDiff) / 66)) + 100) + "deg)"));
  24713. } else {
  24714. // eslint-disable-next-line
  24715. if (ptr.bottom) {
  24716. $el.children().transform(("translate3d(0," + translate + "px,0)"));
  24717. } else {
  24718. $el.transform(("translate3d(0," + translate + "px,0)"));
  24719. }
  24720. }
  24721. if (Math.abs(translate) > triggerDistance) {
  24722. refresh = true;
  24723. $el.addClass('ptr-pull-up').removeClass('ptr-pull-down');
  24724. } else {
  24725. refresh = false;
  24726. $el.removeClass('ptr-pull-up').addClass('ptr-pull-down');
  24727. }
  24728. if (!pullStarted) {
  24729. $el.trigger('ptr:pullstart');
  24730. ptr.emit('local::pullStart ptrPullStart', $el[0]);
  24731. pullStarted = true;
  24732. }
  24733. $el.trigger('ptr:pullmove', {
  24734. event: e,
  24735. scrollTop: scrollTop,
  24736. translate: translate,
  24737. touchesDiff: touchesDiff,
  24738. });
  24739. ptr.emit('local::pullMove ptrPullMove', $el[0], {
  24740. event: e,
  24741. scrollTop: scrollTop,
  24742. translate: translate,
  24743. touchesDiff: touchesDiff,
  24744. });
  24745. } else {
  24746. pullStarted = false;
  24747. $el.removeClass('ptr-pull-up ptr-pull-down');
  24748. refresh = false;
  24749. }
  24750. mousewheelTimeout = setTimeout(handleMouseWheelRelease, 300);
  24751. }
  24752. if (!$pageEl.length || !$el.length) { return ptr; }
  24753. $el[0].f7PullToRefresh = ptr;
  24754. // Events
  24755. ptr.attachEvents = function attachEvents() {
  24756. var passive = Support.passiveListener ? { passive: true } : false;
  24757. $el.on(app.touchEvents.start, handleTouchStart, passive);
  24758. app.on('touchmove:active', handleTouchMove);
  24759. app.on('touchend:passive', handleTouchEnd);
  24760. if (ptr.mousewheel && !ptr.bottom) {
  24761. $el.on('wheel', handleMouseWheel);
  24762. }
  24763. };
  24764. ptr.detachEvents = function detachEvents() {
  24765. var passive = Support.passiveListener ? { passive: true } : false;
  24766. $el.off(app.touchEvents.start, handleTouchStart, passive);
  24767. app.off('touchmove:active', handleTouchMove);
  24768. app.off('touchend:passive', handleTouchEnd);
  24769. if (ptr.mousewheel && !ptr.bottom) {
  24770. $el.off('wheel', handleMouseWheel);
  24771. }
  24772. };
  24773. // Install Modules
  24774. ptr.useModules();
  24775. // Init
  24776. ptr.init();
  24777. return ptr;
  24778. }
  24779. if ( Framework7Class ) PullToRefresh.__proto__ = Framework7Class;
  24780. PullToRefresh.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  24781. PullToRefresh.prototype.constructor = PullToRefresh;
  24782. PullToRefresh.prototype.init = function init () {
  24783. var ptr = this;
  24784. ptr.attachEvents();
  24785. };
  24786. PullToRefresh.prototype.destroy = function destroy () {
  24787. var ptr = this;
  24788. ptr.emit('local::beforeDestroy ptrBeforeDestroy', ptr);
  24789. ptr.$el.trigger('ptr:beforedestroy');
  24790. delete ptr.el.f7PullToRefresh;
  24791. ptr.detachEvents();
  24792. Utils.deleteProps(ptr);
  24793. ptr = null;
  24794. };
  24795. return PullToRefresh;
  24796. }(Framework7Class));
  24797. var PullToRefresh$1 = {
  24798. name: 'pullToRefresh',
  24799. create: function create() {
  24800. var app = this;
  24801. app.ptr = Utils.extend(
  24802. ConstructorMethods({
  24803. defaultSelector: '.ptr-content',
  24804. constructor: PullToRefresh,
  24805. app: app,
  24806. domProp: 'f7PullToRefresh',
  24807. }),
  24808. {
  24809. done: function done(el) {
  24810. var ptr = app.ptr.get(el);
  24811. if (ptr) { return ptr.done(); }
  24812. return undefined;
  24813. },
  24814. refresh: function refresh(el) {
  24815. var ptr = app.ptr.get(el);
  24816. if (ptr) { return ptr.refresh(); }
  24817. return undefined;
  24818. },
  24819. }
  24820. );
  24821. },
  24822. static: {
  24823. PullToRefresh: PullToRefresh,
  24824. },
  24825. on: {
  24826. tabMounted: function tabMounted(tabEl) {
  24827. var app = this;
  24828. var $tabEl = $(tabEl);
  24829. var $ptrEls = $tabEl.find('.ptr-content');
  24830. if ($tabEl.is('.ptr-content')) { $ptrEls.add($tabEl); }
  24831. $ptrEls.each(function (index, el) {
  24832. app.ptr.create(el);
  24833. });
  24834. },
  24835. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  24836. var $tabEl = $(tabEl);
  24837. var app = this;
  24838. var $ptrEls = $tabEl.find('.ptr-content');
  24839. if ($tabEl.is('.ptr-content')) { $ptrEls.add($tabEl); }
  24840. $ptrEls.each(function (index, el) {
  24841. app.ptr.destroy(el);
  24842. });
  24843. },
  24844. pageInit: function pageInit(page) {
  24845. var app = this;
  24846. page.$el.find('.ptr-content').each(function (index, el) {
  24847. app.ptr.create(el);
  24848. });
  24849. },
  24850. pageBeforeRemove: function pageBeforeRemove(page) {
  24851. var app = this;
  24852. page.$el.find('.ptr-content').each(function (index, el) {
  24853. app.ptr.destroy(el);
  24854. });
  24855. },
  24856. },
  24857. };
  24858. var Lazy = {
  24859. destroy: function destroy(pageEl) {
  24860. var $pageEl = $(pageEl).closest('.page');
  24861. if (!$pageEl.length) { return; }
  24862. if ($pageEl[0].f7LazyDestroy) {
  24863. $pageEl[0].f7LazyDestroy();
  24864. }
  24865. },
  24866. create: function create(pageEl) {
  24867. var app = this;
  24868. var $pageEl = $(pageEl).closest('.page').eq(0);
  24869. // Lazy images
  24870. var $lazyLoadImages = $pageEl.find('.lazy');
  24871. if ($lazyLoadImages.length === 0 && !$pageEl.hasClass('lazy')) { return; }
  24872. // Placeholder
  24873. var placeholderSrc = app.params.lazy.placeholder;
  24874. if (placeholderSrc !== false) {
  24875. $lazyLoadImages.each(function (index, lazyEl) {
  24876. if ($(lazyEl).attr('data-src') && !$(lazyEl).attr('src')) { $(lazyEl).attr('src', placeholderSrc); }
  24877. });
  24878. }
  24879. // load image
  24880. var imagesSequence = [];
  24881. var imageIsLoading = false;
  24882. function onImageComplete(lazyEl) {
  24883. if (imagesSequence.indexOf(lazyEl) >= 0) {
  24884. imagesSequence.splice(imagesSequence.indexOf(lazyEl), 1);
  24885. }
  24886. imageIsLoading = false;
  24887. if (app.params.lazy.sequential && imagesSequence.length > 0) {
  24888. imageIsLoading = true;
  24889. app.lazy.loadImage(imagesSequence[0], onImageComplete);
  24890. }
  24891. }
  24892. function observerCallback(entries, observer) {
  24893. entries.forEach(function (entry) {
  24894. if (entry.isIntersecting) {
  24895. if (app.params.lazy.sequential && imageIsLoading) {
  24896. if (imagesSequence.indexOf(entry.target) < 0) { imagesSequence.push(entry.target); }
  24897. return;
  24898. }
  24899. // Load image
  24900. imageIsLoading = true;
  24901. app.lazy.loadImage(entry.target, onImageComplete);
  24902. // Detach
  24903. observer.unobserve(entry.target);
  24904. }
  24905. });
  24906. }
  24907. if (app.params.lazy.observer && Support.intersectionObserver) {
  24908. var observer = $pageEl[0].f7LazyObserver;
  24909. if (!observer) {
  24910. observer = new win.IntersectionObserver(observerCallback, {
  24911. root: $pageEl[0],
  24912. });
  24913. }
  24914. $lazyLoadImages.each(function (index, el) {
  24915. if (el.f7LazyObserverAdded) { return; }
  24916. el.f7LazyObserverAdded = true;
  24917. observer.observe(el);
  24918. });
  24919. if (!$pageEl[0].f7LazyDestroy) {
  24920. $pageEl[0].f7LazyDestroy = function () {
  24921. observer.disconnect();
  24922. delete $pageEl[0].f7LazyDestroy;
  24923. delete $pageEl[0].f7LazyObserver;
  24924. };
  24925. }
  24926. return;
  24927. }
  24928. function lazyHandler() {
  24929. app.lazy.load($pageEl, function (lazyEl) {
  24930. if (app.params.lazy.sequential && imageIsLoading) {
  24931. if (imagesSequence.indexOf(lazyEl) < 0) { imagesSequence.push(lazyEl); }
  24932. return;
  24933. }
  24934. imageIsLoading = true;
  24935. app.lazy.loadImage(lazyEl, onImageComplete);
  24936. });
  24937. }
  24938. function attachEvents() {
  24939. $pageEl[0].f7LazyAttached = true;
  24940. $pageEl.on('lazy', lazyHandler);
  24941. $pageEl.on('scroll', lazyHandler, true);
  24942. $pageEl.find('.tab').on('tab:mounted tab:show', lazyHandler);
  24943. app.on('resize', lazyHandler);
  24944. }
  24945. function detachEvents() {
  24946. $pageEl[0].f7LazyAttached = false;
  24947. delete $pageEl[0].f7LazyAttached;
  24948. $pageEl.off('lazy', lazyHandler);
  24949. $pageEl.off('scroll', lazyHandler, true);
  24950. $pageEl.find('.tab').off('tab:mounted tab:show', lazyHandler);
  24951. app.off('resize', lazyHandler);
  24952. }
  24953. // Store detach function
  24954. if (!$pageEl[0].f7LazyDestroy) {
  24955. $pageEl[0].f7LazyDestroy = detachEvents;
  24956. }
  24957. // Attach events
  24958. if (!$pageEl[0].f7LazyAttached) {
  24959. attachEvents();
  24960. }
  24961. // Run loader on page load/init
  24962. lazyHandler();
  24963. },
  24964. isInViewport: function isInViewport(lazyEl) {
  24965. var app = this;
  24966. var rect = lazyEl.getBoundingClientRect();
  24967. var threshold = app.params.lazy.threshold || 0;
  24968. return (
  24969. rect.top >= (0 - threshold)
  24970. && rect.left >= (0 - threshold)
  24971. && rect.top <= (app.height + threshold)
  24972. && rect.left <= (app.width + threshold)
  24973. );
  24974. },
  24975. loadImage: function loadImage(imageEl, callback) {
  24976. var app = this;
  24977. var $imageEl = $(imageEl);
  24978. var bg = $imageEl.attr('data-background');
  24979. var src = bg || $imageEl.attr('data-src');
  24980. function onLoad() {
  24981. $imageEl.removeClass('lazy').addClass('lazy-loaded');
  24982. if (bg) {
  24983. $imageEl.css('background-image', ("url(" + src + ")"));
  24984. } else if (src) {
  24985. $imageEl.attr('src', src);
  24986. }
  24987. if (callback) { callback(imageEl); }
  24988. $imageEl.trigger('lazy:loaded');
  24989. app.emit('lazyLoaded', $imageEl[0]);
  24990. }
  24991. if (!src) {
  24992. $imageEl.trigger('lazy:load');
  24993. app.emit('lazyLoad', $imageEl[0]);
  24994. onLoad();
  24995. return;
  24996. }
  24997. function onError() {
  24998. $imageEl.removeClass('lazy').addClass('lazy-loaded');
  24999. if (bg) {
  25000. $imageEl.css('background-image', ("url(" + (app.params.lazy.placeholder || '') + ")"));
  25001. } else {
  25002. $imageEl.attr('src', app.params.lazy.placeholder || '');
  25003. }
  25004. if (callback) { callback(imageEl); }
  25005. $imageEl.trigger('lazy:error');
  25006. app.emit('lazyError', $imageEl[0]);
  25007. }
  25008. var image = new win.Image();
  25009. image.onload = onLoad;
  25010. image.onerror = onError;
  25011. image.src = src;
  25012. $imageEl.removeAttr('data-src').removeAttr('data-background');
  25013. // Add loaded callback and events
  25014. $imageEl.trigger('lazy:load');
  25015. app.emit('lazyLoad', $imageEl[0]);
  25016. },
  25017. load: function load(pageEl, callback) {
  25018. var app = this;
  25019. var $pageEl = $(pageEl);
  25020. if (!$pageEl.hasClass('page')) { $pageEl = $pageEl.parents('.page').eq(0); }
  25021. if ($pageEl.length === 0) {
  25022. return;
  25023. }
  25024. $pageEl.find('.lazy').each(function (index, lazyEl) {
  25025. var $lazyEl = $(lazyEl);
  25026. if ($lazyEl.parents('.tab:not(.tab-active)').length > 0) {
  25027. return;
  25028. }
  25029. if (app.lazy.isInViewport(lazyEl)) {
  25030. if (callback) { callback(lazyEl); }
  25031. else { app.lazy.loadImage(lazyEl); }
  25032. }
  25033. });
  25034. },
  25035. };
  25036. var Lazy$1 = {
  25037. name: 'lazy',
  25038. params: {
  25039. lazy: {
  25040. placeholder: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEXCwsK592mkAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==',
  25041. threshold: 0,
  25042. sequential: true,
  25043. observer: true,
  25044. },
  25045. },
  25046. create: function create() {
  25047. var app = this;
  25048. Utils.extend(app, {
  25049. lazy: {
  25050. create: Lazy.create.bind(app),
  25051. destroy: Lazy.destroy.bind(app),
  25052. loadImage: Lazy.loadImage.bind(app),
  25053. load: Lazy.load.bind(app),
  25054. isInViewport: Lazy.isInViewport.bind(app),
  25055. },
  25056. });
  25057. },
  25058. on: {
  25059. pageInit: function pageInit(page) {
  25060. var app = this;
  25061. if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
  25062. app.lazy.create(page.$el);
  25063. }
  25064. },
  25065. pageAfterIn: function pageAfterIn(page) {
  25066. var app = this;
  25067. if (app.params.lazy.observer && Support.intersectionObserver) { return; }
  25068. if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
  25069. app.lazy.create(page.$el);
  25070. }
  25071. },
  25072. pageBeforeRemove: function pageBeforeRemove(page) {
  25073. var app = this;
  25074. if (page.$el.find('.lazy').length > 0 || page.$el.hasClass('lazy')) {
  25075. app.lazy.destroy(page.$el);
  25076. }
  25077. },
  25078. tabMounted: function tabMounted(tabEl) {
  25079. var app = this;
  25080. var $tabEl = $(tabEl);
  25081. if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
  25082. app.lazy.create($tabEl);
  25083. }
  25084. },
  25085. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  25086. var app = this;
  25087. if (app.params.lazy.observer && Support.intersectionObserver) { return; }
  25088. var $tabEl = $(tabEl);
  25089. if ($tabEl.find('.lazy').length > 0 || $tabEl.hasClass('lazy')) {
  25090. app.lazy.destroy($tabEl);
  25091. }
  25092. },
  25093. },
  25094. };
  25095. var DataTable = /*@__PURE__*/(function (Framework7Class) {
  25096. function DataTable(app, params) {
  25097. if ( params === void 0 ) params = {};
  25098. Framework7Class.call(this, params, [app]);
  25099. var table = this;
  25100. var defaults = {
  25101. };
  25102. // Extend defaults with modules params
  25103. table.useModulesParams(defaults);
  25104. table.params = Utils.extend(defaults, params);
  25105. // El
  25106. var $el = $(table.params.el);
  25107. if ($el.length === 0) { return undefined; }
  25108. table.$el = $el;
  25109. table.el = $el[0];
  25110. if (table.$el[0].f7DataTable) {
  25111. var instance = table.$el[0].f7DataTable;
  25112. table.destroy();
  25113. return instance;
  25114. }
  25115. table.$el[0].f7DataTable = table;
  25116. Utils.extend(table, {
  25117. collapsible: $el.hasClass('data-table-collapsible'),
  25118. // Headers
  25119. $headerEl: $el.find('.data-table-header'),
  25120. $headerSelectedEl: $el.find('.data-table-header-selected'),
  25121. });
  25122. // Events
  25123. function handleChange(e) {
  25124. if (e.detail && e.detail.sentByF7DataTable) {
  25125. // Scripted event, don't do anything
  25126. return;
  25127. }
  25128. var $inputEl = $(this);
  25129. var checked = $inputEl[0].checked;
  25130. var columnIndex = $inputEl.parents('td,th').index();
  25131. if ($inputEl.parents('thead').length > 0) {
  25132. if (columnIndex === 0) {
  25133. $el
  25134. .find('tbody tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
  25135. }
  25136. $el
  25137. .find(("tbody tr td:nth-child(" + (columnIndex + 1) + ") input"))
  25138. .prop('checked', checked)
  25139. .trigger('change', { sentByF7DataTable: true });
  25140. $inputEl.prop('indeterminate', false);
  25141. } else {
  25142. if (columnIndex === 0) {
  25143. $inputEl.parents('tr')[checked ? 'addClass' : 'removeClass']('data-table-row-selected');
  25144. }
  25145. var checkedRows = $el.find(("tbody .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]:checked")).length;
  25146. var totalRows = $el.find('tbody tr').length;
  25147. var $headCheckboxEl = $el.find(("thead .checkbox-cell:nth-child(" + (columnIndex + 1) + ") input[type=\"checkbox\"]"));
  25148. if (!checked) {
  25149. $headCheckboxEl.prop('checked', false);
  25150. } else if (checkedRows === totalRows) {
  25151. $headCheckboxEl.prop('checked', true).trigger('change', { sentByF7DataTable: true });
  25152. }
  25153. $headCheckboxEl.prop('indeterminate', checkedRows > 0 && checkedRows < totalRows);
  25154. }
  25155. table.checkSelectedHeader();
  25156. }
  25157. function handleSortableClick() {
  25158. var $cellEl = $(this);
  25159. var isActive = $cellEl.hasClass('sortable-cell-active');
  25160. var currentSort = $cellEl.hasClass('sortable-desc') ? 'desc' : 'asc';
  25161. var newSort;
  25162. if (isActive) {
  25163. newSort = currentSort === 'desc' ? 'asc' : 'desc';
  25164. $cellEl.removeClass('sortable-desc sortable-asc').addClass(("sortable-" + newSort));
  25165. } else {
  25166. $el.find('thead .sortable-cell-active').removeClass('sortable-cell-active');
  25167. $cellEl.addClass('sortable-cell-active');
  25168. newSort = currentSort;
  25169. }
  25170. $cellEl.trigger('datatable:sort', newSort);
  25171. table.emit('local::sort dataTableSort', table, newSort);
  25172. }
  25173. table.attachEvents = function attachEvents() {
  25174. table.$el.on('change', '.checkbox-cell input[type="checkbox"]', handleChange);
  25175. table.$el.find('thead .sortable-cell').on('click', handleSortableClick);
  25176. };
  25177. table.detachEvents = function detachEvents() {
  25178. table.$el.off('change', '.checkbox-cell input[type="checkbox"]', handleChange);
  25179. table.$el.find('thead .sortable-cell').off('click', handleSortableClick);
  25180. };
  25181. // Install Modules
  25182. table.useModules();
  25183. // Init
  25184. table.init();
  25185. return table;
  25186. }
  25187. if ( Framework7Class ) DataTable.__proto__ = Framework7Class;
  25188. DataTable.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  25189. DataTable.prototype.constructor = DataTable;
  25190. DataTable.prototype.setCollapsibleLabels = function setCollapsibleLabels () {
  25191. var table = this;
  25192. if (!table.collapsible) { return; }
  25193. table.$el.find('tbody td:not(.checkbox-cell)').each(function (index, el) {
  25194. var $el = $(el);
  25195. var elIndex = $el.index();
  25196. var collpsibleTitle = $el.attr('data-collapsible-title');
  25197. if (!collpsibleTitle && collpsibleTitle !== '') {
  25198. $el.attr('data-collapsible-title', table.$el.find('thead th').eq(elIndex).text());
  25199. }
  25200. });
  25201. };
  25202. DataTable.prototype.checkSelectedHeader = function checkSelectedHeader () {
  25203. var table = this;
  25204. if (table.$headerEl.length > 0 && table.$headerSelectedEl.length > 0) {
  25205. var checkedItems = table.$el.find('tbody .checkbox-cell input:checked').length;
  25206. table.$el[checkedItems > 0 ? 'addClass' : 'removeClass']('data-table-has-checked');
  25207. table.$headerSelectedEl.find('.data-table-selected-count').text(checkedItems);
  25208. }
  25209. };
  25210. DataTable.prototype.init = function init () {
  25211. var table = this;
  25212. table.attachEvents();
  25213. table.setCollapsibleLabels();
  25214. table.checkSelectedHeader();
  25215. };
  25216. DataTable.prototype.destroy = function destroy () {
  25217. var table = this;
  25218. table.$el.trigger('datatable:beforedestroy');
  25219. table.emit('local::beforeDestroy dataTableBeforeDestroy', table);
  25220. table.attachEvents();
  25221. if (table.$el[0]) {
  25222. table.$el[0].f7DataTable = null;
  25223. delete table.$el[0].f7DataTable;
  25224. }
  25225. Utils.deleteProps(table);
  25226. table = null;
  25227. };
  25228. return DataTable;
  25229. }(Framework7Class));
  25230. var DataTable$1 = {
  25231. name: 'dataTable',
  25232. static: {
  25233. DataTable: DataTable,
  25234. },
  25235. create: function create() {
  25236. var app = this;
  25237. app.dataTable = ConstructorMethods({
  25238. defaultSelector: '.data-table',
  25239. constructor: DataTable,
  25240. app: app,
  25241. domProp: 'f7DataTable',
  25242. });
  25243. },
  25244. on: {
  25245. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  25246. var app = this;
  25247. $(tabEl).find('.data-table-init').each(function (index, tableEl) {
  25248. app.dataTable.destroy(tableEl);
  25249. });
  25250. },
  25251. tabMounted: function tabMounted(tabEl) {
  25252. var app = this;
  25253. $(tabEl).find('.data-table-init').each(function (index, tableEl) {
  25254. app.dataTable.create({ el: tableEl });
  25255. });
  25256. },
  25257. pageBeforeRemove: function pageBeforeRemove(page) {
  25258. var app = this;
  25259. page.$el.find('.data-table-init').each(function (index, tableEl) {
  25260. app.dataTable.destroy(tableEl);
  25261. });
  25262. },
  25263. pageInit: function pageInit(page) {
  25264. var app = this;
  25265. page.$el.find('.data-table-init').each(function (index, tableEl) {
  25266. app.dataTable.create({ el: tableEl });
  25267. });
  25268. },
  25269. },
  25270. vnode: {
  25271. 'data-table-init': {
  25272. insert: function insert(vnode) {
  25273. var app = this;
  25274. var tableEl = vnode.elm;
  25275. app.dataTable.create({ el: tableEl });
  25276. },
  25277. destroy: function destroy(vnode) {
  25278. var app = this;
  25279. var tableEl = vnode.elm;
  25280. app.dataTable.destroy(tableEl);
  25281. },
  25282. },
  25283. },
  25284. };
  25285. var Fab = {
  25286. morphOpen: function morphOpen(fabEl, targetEl) {
  25287. var app = this;
  25288. var $fabEl = $(fabEl);
  25289. var $targetEl = $(targetEl);
  25290. if ($targetEl.length === 0) { return; }
  25291. $targetEl.transition(0).addClass('fab-morph-target-visible');
  25292. var target = {
  25293. width: $targetEl[0].offsetWidth,
  25294. height: $targetEl[0].offsetHeight,
  25295. offset: $targetEl.offset(),
  25296. borderRadius: $targetEl.css('border-radius'),
  25297. zIndex: $targetEl.css('z-index'),
  25298. };
  25299. var fab = {
  25300. width: $fabEl[0].offsetWidth,
  25301. height: $fabEl[0].offsetHeight,
  25302. offset: $fabEl.offset(),
  25303. translateX: Utils.getTranslate($fabEl[0], 'x'),
  25304. translateY: Utils.getTranslate($fabEl[0], 'y'),
  25305. };
  25306. $fabEl[0].f7FabMorphData = {
  25307. $targetEl: $targetEl,
  25308. target: target,
  25309. fab: fab,
  25310. };
  25311. var diffX = (fab.offset.left + (fab.width / 2))
  25312. - (target.offset.left + (target.width / 2))
  25313. - fab.translateX;
  25314. var diffY = (fab.offset.top + (fab.height / 2))
  25315. - (target.offset.top + (target.height / 2))
  25316. - fab.translateY;
  25317. var scaleX = target.width / fab.width;
  25318. var scaleY = target.height / fab.height;
  25319. var borderRadius = Math.ceil(parseInt(target.borderRadius, 10) / Math.max(scaleX, scaleY));
  25320. if (borderRadius > 0) { borderRadius += 2; }
  25321. $fabEl[0].f7FabMorphResizeHandler = function resizeHandler() {
  25322. $fabEl.transition(0).transform('');
  25323. $targetEl.transition(0);
  25324. target.width = $targetEl[0].offsetWidth;
  25325. target.height = $targetEl[0].offsetHeight;
  25326. target.offset = $targetEl.offset();
  25327. fab.offset = $fabEl.offset();
  25328. var diffXNew = (fab.offset.left + (fab.width / 2))
  25329. - (target.offset.left + (target.width / 2))
  25330. - fab.translateX;
  25331. var diffYNew = (fab.offset.top + (fab.height / 2))
  25332. - (target.offset.top + (target.height / 2))
  25333. - fab.translateY;
  25334. var scaleXNew = target.width / fab.width;
  25335. var scaleYNew = target.height / fab.height;
  25336. $fabEl.transform(("translate3d(" + (-diffXNew) + "px, " + (-diffYNew) + "px, 0) scale(" + scaleXNew + ", " + scaleYNew + ")"));
  25337. };
  25338. $targetEl
  25339. .css('opacity', 0)
  25340. .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  25341. $fabEl
  25342. .addClass('fab-opened')
  25343. .css('z-index', target.zIndex - 1)
  25344. .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
  25345. $fabEl.transitionEnd(function () {
  25346. $targetEl.transition('');
  25347. Utils.nextFrame(function () {
  25348. $targetEl.css('opacity', 1).transform('scale(1,1)');
  25349. $fabEl
  25350. .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0) scale(" + scaleX + ", " + scaleY + ")"))
  25351. .css('border-radius', (borderRadius + "px"))
  25352. .css('box-shadow', 'none')
  25353. .css('opacity', '0');
  25354. });
  25355. app.on('resize', $fabEl[0].f7FabMorphResizeHandler);
  25356. if ($targetEl.parents('.page-content').length > 0) {
  25357. $targetEl.parents('.page-content').on('scroll', $fabEl[0].f7FabMorphResizeHandler);
  25358. }
  25359. });
  25360. },
  25361. morphClose: function morphClose(fabEl) {
  25362. var app = this;
  25363. var $fabEl = $(fabEl);
  25364. var morphData = $fabEl[0].f7FabMorphData;
  25365. if (!morphData) { return; }
  25366. var $targetEl = morphData.$targetEl;
  25367. var target = morphData.target;
  25368. var fab = morphData.fab;
  25369. if ($targetEl.length === 0) { return; }
  25370. var diffX = (fab.offset.left + (fab.width / 2))
  25371. - (target.offset.left + (target.width / 2))
  25372. - fab.translateX;
  25373. var diffY = (fab.offset.top + (fab.height / 2))
  25374. - (target.offset.top + (target.height / 2))
  25375. - fab.translateY;
  25376. var scaleX = target.width / fab.width;
  25377. var scaleY = target.height / fab.height;
  25378. app.off('resize', $fabEl[0].f7FabMorphResizeHandler);
  25379. if ($targetEl.parents('.page-content').length > 0) {
  25380. $targetEl.parents('.page-content').off('scroll', $fabEl[0].f7FabMorphResizeHandler);
  25381. }
  25382. $targetEl
  25383. .css('opacity', 0)
  25384. .transform(("scale(" + (1 / scaleX) + ", " + (1 / scaleY) + ")"));
  25385. $fabEl
  25386. .transition('')
  25387. .css('box-shadow', '')
  25388. .css('border-radius', '')
  25389. .css('opacity', '1')
  25390. .transform(("translate3d(" + (-diffX) + "px, " + (-diffY) + "px, 0)"));
  25391. $fabEl.transitionEnd(function () {
  25392. $fabEl
  25393. .css('z-index', '')
  25394. .removeClass('fab-opened')
  25395. .transform('');
  25396. Utils.nextFrame(function () {
  25397. $fabEl.transitionEnd(function () {
  25398. $targetEl
  25399. .removeClass('fab-morph-target-visible')
  25400. .css('opacity', '')
  25401. .transform('')
  25402. .transition('');
  25403. });
  25404. });
  25405. });
  25406. },
  25407. open: function open(fabEl, targetEl) {
  25408. var app = this;
  25409. var $fabEl = $(fabEl).eq(0);
  25410. var $buttonsEl = $fabEl.find('.fab-buttons');
  25411. if (!$fabEl.length) { return; }
  25412. if ($fabEl.hasClass('fab-opened')) { return; }
  25413. if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
  25414. if (app.fab.openedEl) {
  25415. if (app.fab.openedEl === $fabEl[0]) { return; }
  25416. app.fab.close(app.fab.openedEl);
  25417. }
  25418. app.fab.openedEl = $fabEl[0];
  25419. if ($fabEl.hasClass('fab-morph')) {
  25420. app.fab.morphOpen($fabEl, targetEl || $fabEl.attr('data-morph-to'));
  25421. } else {
  25422. $fabEl.addClass('fab-opened');
  25423. }
  25424. $fabEl.siblings('.fab-backdrop').addClass('backdrop-in');
  25425. $fabEl.trigger('fab:open');
  25426. },
  25427. close: function close(fabEl) {
  25428. if ( fabEl === void 0 ) fabEl = '.fab-opened';
  25429. var app = this;
  25430. var $fabEl = $(fabEl).eq(0);
  25431. var $buttonsEl = $fabEl.find('.fab-buttons');
  25432. if (!$fabEl.length) { return; }
  25433. if (!$fabEl.hasClass('fab-opened')) { return; }
  25434. if (!$buttonsEl.length && !$fabEl.hasClass('fab-morph')) { return; }
  25435. app.fab.openedEl = null;
  25436. if ($fabEl.hasClass('fab-morph')) {
  25437. app.fab.morphClose($fabEl);
  25438. } else {
  25439. $fabEl.removeClass('fab-opened');
  25440. }
  25441. $fabEl.siblings('.fab-backdrop').removeClass('backdrop-in');
  25442. $fabEl.trigger('fab:close');
  25443. },
  25444. toggle: function toggle(fabEl) {
  25445. var app = this;
  25446. var $fabEl = $(fabEl);
  25447. if (!$fabEl.hasClass('fab-opened')) { app.fab.open(fabEl); }
  25448. else { app.fab.close(fabEl); }
  25449. },
  25450. };
  25451. var Fab$1 = {
  25452. name: 'fab',
  25453. create: function create() {
  25454. var app = this;
  25455. Utils.extend(app, {
  25456. fab: {
  25457. openedEl: null,
  25458. morphOpen: Fab.morphOpen.bind(app),
  25459. morphClose: Fab.morphClose.bind(app),
  25460. open: Fab.open.bind(app),
  25461. close: Fab.close.bind(app),
  25462. toggle: Fab.toggle.bind(app),
  25463. },
  25464. });
  25465. },
  25466. clicks: {
  25467. '.fab > a': function open($clickedEl) {
  25468. var app = this;
  25469. app.fab.toggle($clickedEl.parents('.fab'));
  25470. },
  25471. '.fab-open': function open($clickedEl, data) {
  25472. if ( data === void 0 ) data = {};
  25473. var app = this;
  25474. app.fab.open(data.fab);
  25475. },
  25476. '.fab-close': function close($clickedEl, data) {
  25477. if ( data === void 0 ) data = {};
  25478. var app = this;
  25479. app.fab.close(data.fab);
  25480. },
  25481. '.fab-backdrop': function close() {
  25482. var app = this;
  25483. app.fab.close();
  25484. },
  25485. },
  25486. };
  25487. var Searchbar = /*@__PURE__*/(function (FrameworkClass) {
  25488. function Searchbar(app, params) {
  25489. if ( params === void 0 ) params = {};
  25490. FrameworkClass.call(this, params, [app]);
  25491. var sb = this;
  25492. var defaults = {
  25493. el: undefined,
  25494. inputEl: undefined,
  25495. inputEvents: 'change input compositionend',
  25496. disableButton: true,
  25497. disableButtonEl: undefined,
  25498. backdropEl: undefined,
  25499. searchContainer: undefined, // container to search, HTMLElement or CSS selector
  25500. searchItem: 'li', // single item selector, CSS selector
  25501. searchIn: undefined, // where to search in item, CSS selector
  25502. searchGroup: '.list-group',
  25503. searchGroupTitle: '.item-divider, .list-group-title',
  25504. ignore: '.searchbar-ignore',
  25505. foundEl: '.searchbar-found',
  25506. notFoundEl: '.searchbar-not-found',
  25507. hideOnEnableEl: '.searchbar-hide-on-enable',
  25508. hideOnSearchEl: '.searchbar-hide-on-search',
  25509. backdrop: undefined,
  25510. removeDiacritics: true,
  25511. customSearch: false,
  25512. hideDividers: true,
  25513. hideGroups: true,
  25514. disableOnBackdropClick: true,
  25515. expandable: false,
  25516. inline: false,
  25517. };
  25518. // Extend defaults with modules params
  25519. sb.useModulesParams(defaults);
  25520. sb.params = Utils.extend(defaults, params);
  25521. var $el = $(sb.params.el);
  25522. if ($el.length === 0) { return sb; }
  25523. if ($el[0].f7Searchbar) { return $el[0].f7Searchbar; }
  25524. $el[0].f7Searchbar = sb;
  25525. var $pageEl;
  25526. var $navbarEl = $el.parents('.navbar');
  25527. if ($el.parents('.page').length > 0) {
  25528. $pageEl = $el.parents('.page');
  25529. } else if ($navbarEl.length > 0) {
  25530. $pageEl = $(app.navbar.getPageByEl($navbarEl[0]));
  25531. if (!$pageEl.length) {
  25532. var $currentPageEl = $el.parents('.view').find('.page-current');
  25533. if ($currentPageEl[0] && $currentPageEl[0].f7Page && $currentPageEl[0].f7Page.navbarEl === $navbarEl[0]) {
  25534. $pageEl = $currentPageEl;
  25535. }
  25536. }
  25537. }
  25538. var $foundEl;
  25539. if (params.foundEl) {
  25540. $foundEl = $(params.foundEl);
  25541. } else if (typeof sb.params.foundEl === 'string' && $pageEl) {
  25542. $foundEl = $pageEl.find(sb.params.foundEl);
  25543. }
  25544. var $notFoundEl;
  25545. if (params.notFoundEl) {
  25546. $notFoundEl = $(params.notFoundEl);
  25547. } else if (typeof sb.params.notFoundEl === 'string' && $pageEl) {
  25548. $notFoundEl = $pageEl.find(sb.params.notFoundEl);
  25549. }
  25550. var $hideOnEnableEl;
  25551. if (params.hideOnEnableEl) {
  25552. $hideOnEnableEl = $(params.hideOnEnableEl);
  25553. } else if (typeof sb.params.hideOnEnableEl === 'string' && $pageEl) {
  25554. $hideOnEnableEl = $pageEl.find(sb.params.hideOnEnableEl);
  25555. }
  25556. var $hideOnSearchEl;
  25557. if (params.hideOnSearchEl) {
  25558. $hideOnSearchEl = $(params.hideOnSearchEl);
  25559. } else if (typeof sb.params.hideOnSearchEl === 'string' && $pageEl) {
  25560. $hideOnSearchEl = $pageEl.find(sb.params.hideOnSearchEl);
  25561. }
  25562. var expandable = sb.params.expandable || $el.hasClass('searchbar-expandable');
  25563. var inline = sb.params.inline || $el.hasClass('searchbar-inline');
  25564. if (typeof sb.params.backdrop === 'undefined') {
  25565. if (!inline) { sb.params.backdrop = app.theme !== 'aurora'; }
  25566. else { sb.params.backdrop = false; }
  25567. }
  25568. var $backdropEl;
  25569. if (sb.params.backdrop) {
  25570. if (sb.params.backdropEl) {
  25571. $backdropEl = $(sb.params.backdropEl);
  25572. } else if ($pageEl && $pageEl.length > 0) {
  25573. $backdropEl = $pageEl.find('.searchbar-backdrop');
  25574. } else {
  25575. $backdropEl = $el.siblings('.searchbar-backdrop');
  25576. }
  25577. if ($backdropEl.length === 0) {
  25578. $backdropEl = $('<div class="searchbar-backdrop"></div>');
  25579. if ($pageEl && $pageEl.length) {
  25580. if ($el.parents($pageEl).length > 0 && $navbarEl && $el.parents($navbarEl).length === 0) {
  25581. $backdropEl.insertBefore($el);
  25582. } else {
  25583. $backdropEl.insertBefore($pageEl.find('.page-content').eq(0));
  25584. }
  25585. } else {
  25586. $backdropEl.insertBefore($el);
  25587. }
  25588. }
  25589. }
  25590. var $searchContainer;
  25591. if (sb.params.searchContainer) {
  25592. $searchContainer = $(sb.params.searchContainer);
  25593. }
  25594. var $inputEl;
  25595. if (sb.params.inputEl) {
  25596. $inputEl = $(sb.params.inputEl);
  25597. } else {
  25598. $inputEl = $el.find('input[type="search"]').eq(0);
  25599. }
  25600. var $disableButtonEl;
  25601. if (sb.params.disableButton) {
  25602. if (sb.params.disableButtonEl) {
  25603. $disableButtonEl = $(sb.params.disableButtonEl);
  25604. } else {
  25605. $disableButtonEl = $el.find('.searchbar-disable-button');
  25606. }
  25607. }
  25608. Utils.extend(sb, {
  25609. app: app,
  25610. view: app.views.get($el.parents('.view')),
  25611. $el: $el,
  25612. el: $el[0],
  25613. $backdropEl: $backdropEl,
  25614. backdropEl: $backdropEl && $backdropEl[0],
  25615. $searchContainer: $searchContainer,
  25616. searchContainer: $searchContainer && $searchContainer[0],
  25617. $inputEl: $inputEl,
  25618. inputEl: $inputEl[0],
  25619. $disableButtonEl: $disableButtonEl,
  25620. disableButtonEl: $disableButtonEl && $disableButtonEl[0],
  25621. disableButtonHasMargin: false,
  25622. $pageEl: $pageEl,
  25623. pageEl: $pageEl && $pageEl[0],
  25624. $navbarEl: $navbarEl,
  25625. navbarEl: $navbarEl && $navbarEl[0],
  25626. $foundEl: $foundEl,
  25627. foundEl: $foundEl && $foundEl[0],
  25628. $notFoundEl: $notFoundEl,
  25629. notFoundEl: $notFoundEl && $notFoundEl[0],
  25630. $hideOnEnableEl: $hideOnEnableEl,
  25631. hideOnEnableEl: $hideOnEnableEl && $hideOnEnableEl[0],
  25632. $hideOnSearchEl: $hideOnSearchEl,
  25633. hideOnSearchEl: $hideOnSearchEl && $hideOnSearchEl[0],
  25634. previousQuery: '',
  25635. query: '',
  25636. isVirtualList: $searchContainer && $searchContainer.hasClass('virtual-list'),
  25637. virtualList: undefined,
  25638. enabled: false,
  25639. expandable: expandable,
  25640. inline: inline,
  25641. });
  25642. // Events
  25643. function preventSubmit(e) {
  25644. e.preventDefault();
  25645. }
  25646. function onInputFocus(e) {
  25647. sb.enable(e);
  25648. sb.$el.addClass('searchbar-focused');
  25649. }
  25650. function onInputBlur() {
  25651. sb.$el.removeClass('searchbar-focused');
  25652. if (app.theme === 'aurora' && (!$disableButtonEl || !$disableButtonEl.length || !sb.params.disableButton) && !sb.query) {
  25653. sb.disable();
  25654. }
  25655. }
  25656. function onInputChange() {
  25657. var value = sb.$inputEl.val().trim();
  25658. if (
  25659. (
  25660. (sb.$searchContainer && sb.$searchContainer.length > 0)
  25661. && (sb.params.searchIn || sb.isVirtualList || sb.params.searchIn === sb.params.searchItem)
  25662. )
  25663. || sb.params.customSearch
  25664. ) {
  25665. sb.search(value, true);
  25666. }
  25667. }
  25668. function onInputClear(e, previousValue) {
  25669. sb.$el.trigger('searchbar:clear', previousValue);
  25670. sb.emit('local::clear searchbarClear', sb, previousValue);
  25671. }
  25672. function disableOnClick(e) {
  25673. sb.disable(e);
  25674. }
  25675. function onPageBeforeOut() {
  25676. if (!sb || (sb && !sb.$el)) { return; }
  25677. if (sb.enabled) {
  25678. sb.$el.removeClass('searchbar-enabled');
  25679. if (sb.expandable) {
  25680. sb.$el.parents('.navbar').removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition');
  25681. }
  25682. }
  25683. }
  25684. function onPageBeforeIn() {
  25685. if (!sb || (sb && !sb.$el)) { return; }
  25686. if (sb.enabled) {
  25687. sb.$el.addClass('searchbar-enabled');
  25688. if (sb.expandable) {
  25689. sb.$el.parents('.navbar').addClass('with-searchbar-expandable-enabled-no-transition');
  25690. }
  25691. }
  25692. }
  25693. sb.attachEvents = function attachEvents() {
  25694. $el.on('submit', preventSubmit);
  25695. if (sb.params.disableButton) {
  25696. sb.$disableButtonEl.on('click', disableOnClick);
  25697. }
  25698. if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
  25699. sb.$backdropEl.on('click', disableOnClick);
  25700. }
  25701. if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
  25702. sb.$pageEl.on('page:beforeout', onPageBeforeOut);
  25703. sb.$pageEl.on('page:beforein', onPageBeforeIn);
  25704. }
  25705. sb.$inputEl.on('focus', onInputFocus);
  25706. sb.$inputEl.on('blur', onInputBlur);
  25707. sb.$inputEl.on(sb.params.inputEvents, onInputChange);
  25708. sb.$inputEl.on('input:clear', onInputClear);
  25709. };
  25710. sb.detachEvents = function detachEvents() {
  25711. $el.off('submit', preventSubmit);
  25712. if (sb.params.disableButton) {
  25713. sb.$disableButtonEl.off('click', disableOnClick);
  25714. }
  25715. if (sb.params.disableOnBackdropClick && sb.$backdropEl) {
  25716. sb.$backdropEl.off('click', disableOnClick);
  25717. }
  25718. if (sb.expandable && app.theme === 'ios' && sb.view && $navbarEl.length && sb.$pageEl) {
  25719. sb.$pageEl.off('page:beforeout', onPageBeforeOut);
  25720. sb.$pageEl.off('page:beforein', onPageBeforeIn);
  25721. }
  25722. sb.$inputEl.off('focus', onInputFocus);
  25723. sb.$inputEl.off('blur', onInputBlur);
  25724. sb.$inputEl.off(sb.params.inputEvents, onInputChange);
  25725. sb.$inputEl.off('input:clear', onInputClear);
  25726. };
  25727. // Install Modules
  25728. sb.useModules();
  25729. // Init
  25730. sb.init();
  25731. return sb;
  25732. }
  25733. if ( FrameworkClass ) Searchbar.__proto__ = FrameworkClass;
  25734. Searchbar.prototype = Object.create( FrameworkClass && FrameworkClass.prototype );
  25735. Searchbar.prototype.constructor = Searchbar;
  25736. Searchbar.prototype.clear = function clear (e) {
  25737. var sb = this;
  25738. if (!sb.query && e && $(e.target).hasClass('searchbar-clear')) {
  25739. sb.disable();
  25740. return sb;
  25741. }
  25742. var previousQuery = sb.value;
  25743. sb.$inputEl.val('').trigger('change').focus();
  25744. sb.$el.trigger('searchbar:clear', previousQuery);
  25745. sb.emit('local::clear searchbarClear', sb, previousQuery);
  25746. return sb;
  25747. };
  25748. Searchbar.prototype.setDisableButtonMargin = function setDisableButtonMargin () {
  25749. var sb = this;
  25750. if (sb.expandable) { return; }
  25751. var app = sb.app;
  25752. sb.$disableButtonEl.transition(0).show();
  25753. sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
  25754. /* eslint no-underscore-dangle: ["error", { "allow": ["_clientLeft"] }] */
  25755. sb._clientLeft = sb.$disableButtonEl[0].clientLeft;
  25756. sb.$disableButtonEl.transition('');
  25757. sb.disableButtonHasMargin = true;
  25758. };
  25759. Searchbar.prototype.enable = function enable (setFocus) {
  25760. var sb = this;
  25761. if (sb.enabled) { return sb; }
  25762. var app = sb.app;
  25763. sb.enabled = true;
  25764. function enable() {
  25765. if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch) && !sb.$el.hasClass('searchbar-enabled') && !sb.query) {
  25766. sb.backdropShow();
  25767. }
  25768. sb.$el.addClass('searchbar-enabled');
  25769. if (!sb.$disableButtonEl || (sb.$disableButtonEl && sb.$disableButtonEl.length === 0)) {
  25770. sb.$el.addClass('searchbar-enabled-no-disable-button');
  25771. }
  25772. if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
  25773. if (!sb.disableButtonHasMargin) {
  25774. sb.setDisableButtonMargin();
  25775. }
  25776. sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), '0px');
  25777. }
  25778. if (sb.expandable) {
  25779. var $navbarEl = sb.$el.parents('.navbar');
  25780. if ($navbarEl.hasClass('navbar-large') && sb.$pageEl) {
  25781. var $pageContentEl = sb.$pageEl.find('.page-content');
  25782. var $titleLargeEl = $navbarEl.find('.title-large');
  25783. $pageContentEl.addClass('with-searchbar-expandable-enabled');
  25784. if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length && $pageContentEl.length) {
  25785. $pageContentEl.transition(0);
  25786. $pageContentEl[0].scrollTop -= $titleLargeEl[0].offsetHeight;
  25787. setTimeout(function () {
  25788. $pageContentEl.transition('');
  25789. }, 200);
  25790. }
  25791. }
  25792. if (app.theme === 'md' && $navbarEl.length) {
  25793. $navbarEl.addClass('with-searchbar-expandable-enabled');
  25794. } else {
  25795. $navbarEl.addClass('with-searchbar-expandable-enabled');
  25796. if ($navbarEl.hasClass('navbar-large')) {
  25797. $navbarEl.addClass('navbar-large-collapsed');
  25798. }
  25799. }
  25800. }
  25801. if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.addClass('hidden-by-searchbar'); }
  25802. sb.$el.trigger('searchbar:enable');
  25803. sb.emit('local::enable searchbarEnable', sb);
  25804. }
  25805. var needsFocus = false;
  25806. if (setFocus === true) {
  25807. if (doc.activeElement !== sb.inputEl) {
  25808. needsFocus = true;
  25809. }
  25810. }
  25811. var isIos = app.device.ios && app.theme === 'ios';
  25812. if (isIos) {
  25813. if (sb.expandable) {
  25814. if (needsFocus) { sb.$inputEl.focus(); }
  25815. enable();
  25816. } else {
  25817. if (needsFocus) { sb.$inputEl.focus(); }
  25818. if (setFocus && (setFocus.type === 'focus' || setFocus === true)) {
  25819. Utils.nextTick(function () {
  25820. enable();
  25821. }, 400);
  25822. } else {
  25823. enable();
  25824. }
  25825. }
  25826. } else {
  25827. if (needsFocus) { sb.$inputEl.focus(); }
  25828. if (app.theme === 'md' && sb.expandable) {
  25829. sb.$el.parents('.page, .view, .navbar-inner, .navbar').scrollLeft(app.rtl ? 100 : 0);
  25830. }
  25831. enable();
  25832. }
  25833. return sb;
  25834. };
  25835. Searchbar.prototype.disable = function disable () {
  25836. var sb = this;
  25837. if (!sb.enabled) { return sb; }
  25838. var app = sb.app;
  25839. sb.$inputEl.val('').trigger('change');
  25840. sb.$el.removeClass('searchbar-enabled searchbar-focused searchbar-enabled-no-disable-button');
  25841. if (sb.expandable) {
  25842. var $navbarEl = sb.$el.parents('.navbar');
  25843. var $pageContentEl = sb.$pageEl && sb.$pageEl.find('.page-content');
  25844. if ($navbarEl.hasClass('navbar-large') && $pageContentEl.length) {
  25845. var $titleLargeEl = $navbarEl.find('.title-large');
  25846. sb.$el.transitionEnd(function () {
  25847. $pageContentEl.removeClass('with-searchbar-expandable-closing');
  25848. });
  25849. if ($navbarEl.hasClass('navbar-large') && $navbarEl.hasClass('navbar-large-collapsed') && $titleLargeEl.length) {
  25850. var scrollTop = $pageContentEl[0].scrollTop;
  25851. var titleLargeHeight = $titleLargeEl[0].offsetHeight;
  25852. if (scrollTop > titleLargeHeight) {
  25853. $pageContentEl.transition(0);
  25854. $pageContentEl[0].scrollTop = scrollTop + titleLargeHeight;
  25855. setTimeout(function () {
  25856. $pageContentEl.transition('');
  25857. }, 200);
  25858. }
  25859. }
  25860. $pageContentEl.removeClass('with-searchbar-expandable-enabled').addClass('with-searchbar-expandable-closing');
  25861. }
  25862. if (app.theme === 'md' && $navbarEl.length) {
  25863. $navbarEl
  25864. .removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition')
  25865. .addClass('with-searchbar-expandable-closing');
  25866. sb.$el.transitionEnd(function () {
  25867. $navbarEl.removeClass('with-searchbar-expandable-closing');
  25868. });
  25869. } else {
  25870. $navbarEl
  25871. .removeClass('with-searchbar-expandable-enabled with-searchbar-expandable-enabled-no-transition')
  25872. .addClass('with-searchbar-expandable-closing');
  25873. sb.$el.transitionEnd(function () {
  25874. $navbarEl.removeClass('with-searchbar-expandable-closing');
  25875. });
  25876. if (sb.$pageEl) {
  25877. sb.$pageEl.find('.page-content').trigger('scroll');
  25878. }
  25879. }
  25880. }
  25881. if (!sb.expandable && sb.$disableButtonEl && sb.$disableButtonEl.length > 0 && app.theme !== 'md') {
  25882. sb.$disableButtonEl.css(("margin-" + (app.rtl ? 'left' : 'right')), ((-sb.disableButtonEl.offsetWidth) + "px"));
  25883. }
  25884. if (sb.$backdropEl && ((sb.$searchContainer && sb.$searchContainer.length) || sb.params.customSearch)) {
  25885. sb.backdropHide();
  25886. }
  25887. sb.enabled = false;
  25888. sb.$inputEl.blur();
  25889. if (sb.$hideOnEnableEl) { sb.$hideOnEnableEl.removeClass('hidden-by-searchbar'); }
  25890. sb.$el.trigger('searchbar:disable');
  25891. sb.emit('local::disable searchbarDisable', sb);
  25892. return sb;
  25893. };
  25894. Searchbar.prototype.toggle = function toggle () {
  25895. var sb = this;
  25896. if (sb.enabled) { sb.disable(); }
  25897. else { sb.enable(true); }
  25898. return sb;
  25899. };
  25900. Searchbar.prototype.backdropShow = function backdropShow () {
  25901. var sb = this;
  25902. if (sb.$backdropEl) {
  25903. sb.$backdropEl.addClass('searchbar-backdrop-in');
  25904. }
  25905. return sb;
  25906. };
  25907. Searchbar.prototype.backdropHide = function backdropHide () {
  25908. var sb = this;
  25909. if (sb.$backdropEl) {
  25910. sb.$backdropEl.removeClass('searchbar-backdrop-in');
  25911. }
  25912. return sb;
  25913. };
  25914. Searchbar.prototype.search = function search (query, internal) {
  25915. var sb = this;
  25916. sb.previousQuery = sb.query || '';
  25917. if (query === sb.previousQuery) { return sb; }
  25918. if (!internal) {
  25919. if (!sb.enabled) {
  25920. sb.enable();
  25921. }
  25922. sb.$inputEl.val(query);
  25923. sb.$inputEl.trigger('input');
  25924. }
  25925. sb.query = query;
  25926. sb.value = query;
  25927. var $searchContainer = sb.$searchContainer;
  25928. var $el = sb.$el;
  25929. var $foundEl = sb.$foundEl;
  25930. var $notFoundEl = sb.$notFoundEl;
  25931. var $hideOnSearchEl = sb.$hideOnSearchEl;
  25932. var isVirtualList = sb.isVirtualList;
  25933. // Hide on search element
  25934. if (query.length > 0 && $hideOnSearchEl) {
  25935. $hideOnSearchEl.addClass('hidden-by-searchbar');
  25936. } else if ($hideOnSearchEl) {
  25937. $hideOnSearchEl.removeClass('hidden-by-searchbar');
  25938. }
  25939. // Add active/inactive classes on overlay
  25940. if (
  25941. ($searchContainer && $searchContainer.length && $el.hasClass('searchbar-enabled'))
  25942. || (sb.params.customSearch && $el.hasClass('searchbar-enabled'))
  25943. ) {
  25944. if (query.length === 0) {
  25945. sb.backdropShow();
  25946. } else {
  25947. sb.backdropHide();
  25948. }
  25949. }
  25950. if (sb.params.customSearch) {
  25951. $el.trigger('searchbar:search', { query: query, previousQuery: sb.previousQuery });
  25952. sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
  25953. return sb;
  25954. }
  25955. var foundItems = [];
  25956. var vlQuery;
  25957. if (isVirtualList) {
  25958. sb.virtualList = $searchContainer[0].f7VirtualList;
  25959. if (query.trim() === '') {
  25960. sb.virtualList.resetFilter();
  25961. if ($notFoundEl) { $notFoundEl.hide(); }
  25962. if ($foundEl) { $foundEl.show(); }
  25963. $el.trigger('searchbar:search', { query: query, previousQuery: sb.previousQuery });
  25964. sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery);
  25965. return sb;
  25966. }
  25967. vlQuery = sb.params.removeDiacritics ? Utils.removeDiacritics(query) : query;
  25968. if (sb.virtualList.params.searchAll) {
  25969. foundItems = sb.virtualList.params.searchAll(vlQuery, sb.virtualList.items) || [];
  25970. } else if (sb.virtualList.params.searchByItem) {
  25971. for (var i = 0; i < sb.virtualList.items.length; i += 1) {
  25972. if (sb.virtualList.params.searchByItem(vlQuery, sb.virtualList.params.items[i], i)) {
  25973. foundItems.push(i);
  25974. }
  25975. }
  25976. }
  25977. } else {
  25978. var values;
  25979. if (sb.params.removeDiacritics) { values = Utils.removeDiacritics(query.trim().toLowerCase()).split(' '); }
  25980. else {
  25981. values = query.trim().toLowerCase().split(' ');
  25982. }
  25983. $searchContainer.find(sb.params.searchItem).removeClass('hidden-by-searchbar').each(function (itemIndex, itemEl) {
  25984. var $itemEl = $(itemEl);
  25985. var compareWithText = [];
  25986. var $searchIn = sb.params.searchIn ? $itemEl.find(sb.params.searchIn) : $itemEl;
  25987. if (sb.params.searchIn === sb.params.searchItem) {
  25988. $searchIn = $itemEl;
  25989. }
  25990. $searchIn.each(function (searchInIndex, searchInEl) {
  25991. var itemText = $(searchInEl).text().trim().toLowerCase();
  25992. if (sb.params.removeDiacritics) { itemText = Utils.removeDiacritics(itemText); }
  25993. compareWithText.push(itemText);
  25994. });
  25995. compareWithText = compareWithText.join(' ');
  25996. var wordsMatch = 0;
  25997. for (var i = 0; i < values.length; i += 1) {
  25998. if (compareWithText.indexOf(values[i]) >= 0) { wordsMatch += 1; }
  25999. }
  26000. if (wordsMatch !== values.length && !(sb.params.ignore && $itemEl.is(sb.params.ignore))) {
  26001. $itemEl.addClass('hidden-by-searchbar');
  26002. } else {
  26003. foundItems.push($itemEl[0]);
  26004. }
  26005. });
  26006. if (sb.params.hideDividers) {
  26007. $searchContainer.find(sb.params.searchGroupTitle).each(function (titleIndex, titleEl) {
  26008. var $titleEl = $(titleEl);
  26009. var $nextElements = $titleEl.nextAll(sb.params.searchItem);
  26010. var hide = true;
  26011. for (var i = 0; i < $nextElements.length; i += 1) {
  26012. var $nextEl = $nextElements.eq(i);
  26013. if ($nextEl.is(sb.params.searchGroupTitle)) { break; }
  26014. if (!$nextEl.hasClass('hidden-by-searchbar')) {
  26015. hide = false;
  26016. }
  26017. }
  26018. var ignore = sb.params.ignore && $titleEl.is(sb.params.ignore);
  26019. if (hide && !ignore) { $titleEl.addClass('hidden-by-searchbar'); }
  26020. else { $titleEl.removeClass('hidden-by-searchbar'); }
  26021. });
  26022. }
  26023. if (sb.params.hideGroups) {
  26024. $searchContainer.find(sb.params.searchGroup).each(function (groupIndex, groupEl) {
  26025. var $groupEl = $(groupEl);
  26026. var ignore = sb.params.ignore && $groupEl.is(sb.params.ignore);
  26027. // eslint-disable-next-line
  26028. var notHidden = $groupEl.find(sb.params.searchItem).filter(function (index, el) {
  26029. return !$(el).hasClass('hidden-by-searchbar');
  26030. });
  26031. if (notHidden.length === 0 && !ignore) {
  26032. $groupEl.addClass('hidden-by-searchbar');
  26033. } else {
  26034. $groupEl.removeClass('hidden-by-searchbar');
  26035. }
  26036. });
  26037. }
  26038. }
  26039. if (foundItems.length === 0) {
  26040. if ($notFoundEl) { $notFoundEl.show(); }
  26041. if ($foundEl) { $foundEl.hide(); }
  26042. } else {
  26043. if ($notFoundEl) { $notFoundEl.hide(); }
  26044. if ($foundEl) { $foundEl.show(); }
  26045. }
  26046. if (isVirtualList && sb.virtualList) {
  26047. sb.virtualList.filterItems(foundItems);
  26048. }
  26049. $el.trigger('searchbar:search', { query: query, previousQuery: sb.previousQuery, foundItems: foundItems });
  26050. sb.emit('local::search searchbarSearch', sb, query, sb.previousQuery, foundItems);
  26051. return sb;
  26052. };
  26053. Searchbar.prototype.init = function init () {
  26054. var sb = this;
  26055. if (sb.expandable && sb.$el) { sb.$el.addClass('searchbar-expandable'); }
  26056. if (sb.inline && sb.$el) { sb.$el.addClass('searchbar-inline'); }
  26057. sb.attachEvents();
  26058. };
  26059. Searchbar.prototype.destroy = function destroy () {
  26060. var sb = this;
  26061. sb.emit('local::beforeDestroy searchbarBeforeDestroy', sb);
  26062. sb.$el.trigger('searchbar:beforedestroy');
  26063. sb.detachEvents();
  26064. if (sb.$el[0]) {
  26065. sb.$el[0].f7Searchbar = null;
  26066. delete sb.$el[0].f7Searchbar;
  26067. }
  26068. Utils.deleteProps(sb);
  26069. };
  26070. return Searchbar;
  26071. }(Framework7Class));
  26072. var Searchbar$1 = {
  26073. name: 'searchbar',
  26074. static: {
  26075. Searchbar: Searchbar,
  26076. },
  26077. create: function create() {
  26078. var app = this;
  26079. app.searchbar = ConstructorMethods({
  26080. defaultSelector: '.searchbar',
  26081. constructor: Searchbar,
  26082. app: app,
  26083. domProp: 'f7Searchbar',
  26084. addMethods: 'clear enable disable toggle search'.split(' '),
  26085. });
  26086. },
  26087. on: {
  26088. tabMounted: function tabMounted(tabEl) {
  26089. var app = this;
  26090. $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
  26091. var $searchbarEl = $(searchbarEl);
  26092. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  26093. });
  26094. },
  26095. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  26096. $(tabEl).find('.searchbar-init').each(function (index, searchbarEl) {
  26097. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  26098. searchbarEl.f7Searchbar.destroy();
  26099. }
  26100. });
  26101. },
  26102. pageInit: function pageInit(page) {
  26103. var app = this;
  26104. page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
  26105. var $searchbarEl = $(searchbarEl);
  26106. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  26107. });
  26108. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  26109. page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
  26110. var $searchbarEl = $(searchbarEl);
  26111. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  26112. });
  26113. }
  26114. },
  26115. pageBeforeRemove: function pageBeforeRemove(page) {
  26116. var app = this;
  26117. page.$el.find('.searchbar-init').each(function (index, searchbarEl) {
  26118. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  26119. searchbarEl.f7Searchbar.destroy();
  26120. }
  26121. });
  26122. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  26123. page.$navbarEl.find('.searchbar-init').each(function (index, searchbarEl) {
  26124. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  26125. searchbarEl.f7Searchbar.destroy();
  26126. }
  26127. });
  26128. }
  26129. },
  26130. },
  26131. clicks: {
  26132. '.searchbar-clear': function clear($clickedEl, data) {
  26133. if ( data === void 0 ) data = {};
  26134. var app = this;
  26135. var sb = app.searchbar.get(data.searchbar);
  26136. if (sb) { sb.clear(); }
  26137. },
  26138. '.searchbar-enable': function enable($clickedEl, data) {
  26139. if ( data === void 0 ) data = {};
  26140. var app = this;
  26141. var sb = app.searchbar.get(data.searchbar);
  26142. if (sb) { sb.enable(true); }
  26143. },
  26144. '.searchbar-disable': function disable($clickedEl, data) {
  26145. if ( data === void 0 ) data = {};
  26146. var app = this;
  26147. var sb = app.searchbar.get(data.searchbar);
  26148. if (sb) { sb.disable(); }
  26149. },
  26150. '.searchbar-toggle': function toggle($clickedEl, data) {
  26151. if ( data === void 0 ) data = {};
  26152. var app = this;
  26153. var sb = app.searchbar.get(data.searchbar);
  26154. if (sb) { sb.toggle(); }
  26155. },
  26156. },
  26157. vnode: {
  26158. 'searchbar-init': {
  26159. insert: function insert(vnode) {
  26160. var app = this;
  26161. var searchbarEl = vnode.elm;
  26162. var $searchbarEl = $(searchbarEl);
  26163. app.searchbar.create(Utils.extend($searchbarEl.dataset(), { el: searchbarEl }));
  26164. },
  26165. destroy: function destroy(vnode) {
  26166. var searchbarEl = vnode.elm;
  26167. if (searchbarEl.f7Searchbar && searchbarEl.f7Searchbar.destroy) {
  26168. searchbarEl.f7Searchbar.destroy();
  26169. }
  26170. },
  26171. },
  26172. },
  26173. };
  26174. var Messages = /*@__PURE__*/(function (Framework7Class) {
  26175. function Messages(app, params) {
  26176. if ( params === void 0 ) params = {};
  26177. Framework7Class.call(this, params, [app]);
  26178. var m = this;
  26179. var defaults = {
  26180. autoLayout: true,
  26181. messages: [],
  26182. newMessagesFirst: false,
  26183. scrollMessages: true,
  26184. scrollMessagesOnEdge: true,
  26185. firstMessageRule: undefined,
  26186. lastMessageRule: undefined,
  26187. tailMessageRule: undefined,
  26188. sameNameMessageRule: undefined,
  26189. sameHeaderMessageRule: undefined,
  26190. sameFooterMessageRule: undefined,
  26191. sameAvatarMessageRule: undefined,
  26192. customClassMessageRule: undefined,
  26193. renderMessage: undefined,
  26194. };
  26195. // Extend defaults with modules params
  26196. m.useModulesParams(defaults);
  26197. m.params = Utils.extend(defaults, params);
  26198. var $el = $(params.el).eq(0);
  26199. if ($el.length === 0) { return m; }
  26200. if ($el[0].f7Messages) { return $el[0].f7Messages; }
  26201. $el[0].f7Messages = m;
  26202. var $pageContentEl = $el.closest('.page-content').eq(0);
  26203. Utils.extend(m, {
  26204. messages: m.params.messages,
  26205. $el: $el,
  26206. el: $el[0],
  26207. $pageContentEl: $pageContentEl,
  26208. pageContentEl: $pageContentEl[0],
  26209. });
  26210. // Install Modules
  26211. m.useModules();
  26212. // Init
  26213. m.init();
  26214. return m;
  26215. }
  26216. if ( Framework7Class ) Messages.__proto__ = Framework7Class;
  26217. Messages.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  26218. Messages.prototype.constructor = Messages;
  26219. // eslint-disable-next-line
  26220. Messages.prototype.getMessageData = function getMessageData (messageEl) {
  26221. var $messageEl = $(messageEl);
  26222. var data = {
  26223. name: $messageEl.find('.message-name').html(),
  26224. header: $messageEl.find('.message-header').html(),
  26225. textHeader: $messageEl.find('.message-text-header').html(),
  26226. textFooter: $messageEl.find('.message-text-footer').html(),
  26227. footer: $messageEl.find('.message-footer').html(),
  26228. isTitle: $messageEl.hasClass('messages-title'),
  26229. type: $messageEl.hasClass('message-sent') ? 'sent' : 'received',
  26230. text: $messageEl.find('.message-text').html(),
  26231. image: $messageEl.find('.message-image').html(),
  26232. imageSrc: $messageEl.find('.message-image img').attr('src'),
  26233. typing: $messageEl.hasClass('message-typing'),
  26234. };
  26235. if (data.isTitle) {
  26236. data.text = $messageEl.html();
  26237. }
  26238. if (data.text && data.textHeader) {
  26239. data.text = data.text.replace(("<div class=\"message-text-header\">" + (data.textHeader) + "</div>"), '');
  26240. }
  26241. if (data.text && data.textFooter) {
  26242. data.text = data.text.replace(("<div class=\"message-text-footer\">" + (data.textFooter) + "</div>"), '');
  26243. }
  26244. var avatar = $messageEl.find('.message-avatar').css('background-image');
  26245. if (avatar === 'none' || avatar === '') { avatar = undefined; }
  26246. if (avatar && typeof avatar === 'string') {
  26247. avatar = avatar.replace('url(', '').replace(')', '').replace(/"/g, '').replace(/'/g, '');
  26248. } else {
  26249. avatar = undefined;
  26250. }
  26251. data.avatar = avatar;
  26252. return data;
  26253. };
  26254. Messages.prototype.getMessagesData = function getMessagesData () {
  26255. var m = this;
  26256. var data = [];
  26257. m.$el.find('.message, .messages-title').each(function (index, messageEl) {
  26258. data.push(m.getMessageData(messageEl));
  26259. });
  26260. return data;
  26261. };
  26262. Messages.prototype.renderMessage = function renderMessage (messageToRender) {
  26263. var m = this;
  26264. var message = Utils.extend({
  26265. type: 'sent',
  26266. attrs: {},
  26267. }, messageToRender);
  26268. if (m.params.renderMessage) {
  26269. return m.params.renderMessage.call(m, message);
  26270. }
  26271. if (message.isTitle) {
  26272. return ("<div class=\"messages-title\">" + (message.text) + "</div>");
  26273. }
  26274. var attrs = Object.keys(message.attrs).map(function (attr) { return (attr + "=\"" + (message.attrs[attr]) + "\""); }).join(' ');
  26275. return ("\n <div class=\"message message-" + (message.type) + " " + (message.isTyping ? 'message-typing' : '') + " " + (message.cssClass || '') + "\" " + attrs + ">\n " + (message.avatar ? ("\n <div class=\"message-avatar\" style=\"background-image:url(" + (message.avatar) + ")\"></div>\n ") : '') + "\n <div class=\"message-content\">\n " + (message.name ? ("<div class=\"message-name\">" + (message.name) + "</div>") : '') + "\n " + (message.header ? ("<div class=\"message-header\">" + (message.header) + "</div>") : '') + "\n <div class=\"message-bubble\">\n " + (message.textHeader ? ("<div class=\"message-text-header\">" + (message.textHeader) + "</div>") : '') + "\n " + (message.image ? ("<div class=\"message-image\">" + (message.image) + "</div>") : '') + "\n " + (message.imageSrc && !message.image ? ("<div class=\"message-image\"><img src=\"" + (message.imageSrc) + "\"></div>") : '') + "\n " + (message.text || message.isTyping ? ("<div class=\"message-text\">" + (message.text || '') + (message.isTyping ? '<div class="message-typing-indicator"><div></div><div></div><div></div></div>' : '') + "</div>") : '') + "\n " + (message.textFooter ? ("<div class=\"message-text-footer\">" + (message.textFooter) + "</div>") : '') + "\n </div>\n " + (message.footer ? ("<div class=\"message-footer\">" + (message.footer) + "</div>") : '') + "\n </div>\n </div>\n ");
  26276. };
  26277. Messages.prototype.renderMessages = function renderMessages (messagesToRender, method) {
  26278. if ( messagesToRender === void 0 ) messagesToRender = this.messages;
  26279. if ( method === void 0 ) method = this.params.newMessagesFirst ? 'prepend' : 'append';
  26280. var m = this;
  26281. var html = messagesToRender.map(function (message) { return m.renderMessage(message); }).join('');
  26282. m.$el[method](html);
  26283. };
  26284. Messages.prototype.isFirstMessage = function isFirstMessage () {
  26285. var ref;
  26286. var args = [], len = arguments.length;
  26287. while ( len-- ) args[ len ] = arguments[ len ];
  26288. var m = this;
  26289. if (m.params.firstMessageRule) { return (ref = m.params).firstMessageRule.apply(ref, args); }
  26290. return false;
  26291. };
  26292. Messages.prototype.isLastMessage = function isLastMessage () {
  26293. var ref;
  26294. var args = [], len = arguments.length;
  26295. while ( len-- ) args[ len ] = arguments[ len ];
  26296. var m = this;
  26297. if (m.params.lastMessageRule) { return (ref = m.params).lastMessageRule.apply(ref, args); }
  26298. return false;
  26299. };
  26300. Messages.prototype.isTailMessage = function isTailMessage () {
  26301. var ref;
  26302. var args = [], len = arguments.length;
  26303. while ( len-- ) args[ len ] = arguments[ len ];
  26304. var m = this;
  26305. if (m.params.tailMessageRule) { return (ref = m.params).tailMessageRule.apply(ref, args); }
  26306. return false;
  26307. };
  26308. Messages.prototype.isSameNameMessage = function isSameNameMessage () {
  26309. var ref;
  26310. var args = [], len = arguments.length;
  26311. while ( len-- ) args[ len ] = arguments[ len ];
  26312. var m = this;
  26313. if (m.params.sameNameMessageRule) { return (ref = m.params).sameNameMessageRule.apply(ref, args); }
  26314. return false;
  26315. };
  26316. Messages.prototype.isSameHeaderMessage = function isSameHeaderMessage () {
  26317. var ref;
  26318. var args = [], len = arguments.length;
  26319. while ( len-- ) args[ len ] = arguments[ len ];
  26320. var m = this;
  26321. if (m.params.sameHeaderMessageRule) { return (ref = m.params).sameHeaderMessageRule.apply(ref, args); }
  26322. return false;
  26323. };
  26324. Messages.prototype.isSameFooterMessage = function isSameFooterMessage () {
  26325. var ref;
  26326. var args = [], len = arguments.length;
  26327. while ( len-- ) args[ len ] = arguments[ len ];
  26328. var m = this;
  26329. if (m.params.sameFooterMessageRule) { return (ref = m.params).sameFooterMessageRule.apply(ref, args); }
  26330. return false;
  26331. };
  26332. Messages.prototype.isSameAvatarMessage = function isSameAvatarMessage () {
  26333. var ref;
  26334. var args = [], len = arguments.length;
  26335. while ( len-- ) args[ len ] = arguments[ len ];
  26336. var m = this;
  26337. if (m.params.sameAvatarMessageRule) { return (ref = m.params).sameAvatarMessageRule.apply(ref, args); }
  26338. return false;
  26339. };
  26340. Messages.prototype.isCustomClassMessage = function isCustomClassMessage () {
  26341. var ref;
  26342. var args = [], len = arguments.length;
  26343. while ( len-- ) args[ len ] = arguments[ len ];
  26344. var m = this;
  26345. if (m.params.customClassMessageRule) { return (ref = m.params).customClassMessageRule.apply(ref, args); }
  26346. return undefined;
  26347. };
  26348. Messages.prototype.layout = function layout () {
  26349. var m = this;
  26350. m.$el.find('.message, .messages-title').each(function (index, messageEl) {
  26351. var $messageEl = $(messageEl);
  26352. if (!m.messages) {
  26353. m.messages = m.getMessagesData();
  26354. }
  26355. var classes = [];
  26356. var message = m.messages[index];
  26357. var previousMessage = m.messages[index - 1];
  26358. var nextMessage = m.messages[index + 1];
  26359. if (m.isFirstMessage(message, previousMessage, nextMessage)) {
  26360. classes.push('message-first');
  26361. }
  26362. if (m.isLastMessage(message, previousMessage, nextMessage)) {
  26363. classes.push('message-last');
  26364. }
  26365. if (m.isTailMessage(message, previousMessage, nextMessage)) {
  26366. classes.push('message-tail');
  26367. }
  26368. if (m.isSameNameMessage(message, previousMessage, nextMessage)) {
  26369. classes.push('message-same-name');
  26370. }
  26371. if (m.isSameHeaderMessage(message, previousMessage, nextMessage)) {
  26372. classes.push('message-same-header');
  26373. }
  26374. if (m.isSameFooterMessage(message, previousMessage, nextMessage)) {
  26375. classes.push('message-same-footer');
  26376. }
  26377. if (m.isSameAvatarMessage(message, previousMessage, nextMessage)) {
  26378. classes.push('message-same-avatar');
  26379. }
  26380. var customMessageClasses = m.isCustomClassMessage(message, previousMessage, nextMessage);
  26381. if (customMessageClasses && customMessageClasses.length) {
  26382. if (typeof customMessageClasses === 'string') {
  26383. customMessageClasses = customMessageClasses.split(' ');
  26384. }
  26385. customMessageClasses.forEach(function (customClass) {
  26386. classes.push(customClass);
  26387. });
  26388. }
  26389. $messageEl.removeClass('message-first message-last message-tail message-same-name message-same-header message-same-footer message-same-avatar');
  26390. classes.forEach(function (className) {
  26391. $messageEl.addClass(className);
  26392. });
  26393. });
  26394. };
  26395. Messages.prototype.clear = function clear () {
  26396. var m = this;
  26397. m.messages = [];
  26398. m.$el.html('');
  26399. };
  26400. Messages.prototype.removeMessage = function removeMessage (messageToRemove, layout) {
  26401. if ( layout === void 0 ) layout = true;
  26402. var m = this;
  26403. // Index or El
  26404. var index;
  26405. var $el;
  26406. if (typeof messageToRemove === 'number') {
  26407. index = messageToRemove;
  26408. $el = m.$el.find('.message, .messages-title').eq(index);
  26409. } else if (m.messages && m.messages.indexOf(messageToRemove) >= 0) {
  26410. index = m.messages.indexOf(messageToRemove);
  26411. $el = m.$el.children().eq(index);
  26412. } else {
  26413. $el = $(messageToRemove);
  26414. index = $el.index();
  26415. }
  26416. if ($el.length === 0) {
  26417. return m;
  26418. }
  26419. $el.remove();
  26420. m.messages.splice(index, 1);
  26421. if (m.params.autoLayout && layout) { m.layout(); }
  26422. return m;
  26423. };
  26424. Messages.prototype.removeMessages = function removeMessages (messagesToRemove, layout) {
  26425. if ( layout === void 0 ) layout = true;
  26426. var m = this;
  26427. if (Array.isArray(messagesToRemove)) {
  26428. var messagesToRemoveEls = [];
  26429. messagesToRemove.forEach(function (messageToRemoveIndex) {
  26430. messagesToRemoveEls.push(m.$el.find('.message, .messages-title').eq(messageToRemoveIndex));
  26431. });
  26432. messagesToRemoveEls.forEach(function (messageToRemove) {
  26433. m.removeMessage(messageToRemove, false);
  26434. });
  26435. } else {
  26436. $(messagesToRemove).each(function (index, messageToRemove) {
  26437. m.removeMessage(messageToRemove, false);
  26438. });
  26439. }
  26440. if (m.params.autoLayout && layout) { m.layout(); }
  26441. return m;
  26442. };
  26443. Messages.prototype.addMessage = function addMessage () {
  26444. var assign, assign$1;
  26445. var args = [], len = arguments.length;
  26446. while ( len-- ) args[ len ] = arguments[ len ];
  26447. var m = this;
  26448. var messageToAdd;
  26449. var animate;
  26450. var method;
  26451. if (typeof args[1] === 'boolean') {
  26452. (assign = args, messageToAdd = assign[0], animate = assign[1], method = assign[2]);
  26453. } else {
  26454. (assign$1 = args, messageToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
  26455. }
  26456. if (typeof animate === 'undefined') {
  26457. animate = true;
  26458. }
  26459. if (typeof method === 'undefined') {
  26460. method = m.params.newMessagesFirst ? 'prepend' : 'append';
  26461. }
  26462. return m.addMessages([messageToAdd], animate, method);
  26463. };
  26464. Messages.prototype.addMessages = function addMessages () {
  26465. var assign, assign$1;
  26466. var args = [], len = arguments.length;
  26467. while ( len-- ) args[ len ] = arguments[ len ];
  26468. var m = this;
  26469. var messagesToAdd;
  26470. var animate;
  26471. var method;
  26472. if (typeof args[1] === 'boolean') {
  26473. (assign = args, messagesToAdd = assign[0], animate = assign[1], method = assign[2]);
  26474. } else {
  26475. (assign$1 = args, messagesToAdd = assign$1[0], method = assign$1[1], animate = assign$1[2]);
  26476. }
  26477. if (typeof animate === 'undefined') {
  26478. animate = true;
  26479. }
  26480. if (typeof method === 'undefined') {
  26481. method = m.params.newMessagesFirst ? 'prepend' : 'append';
  26482. }
  26483. // Define scroll positions before new messages added
  26484. var scrollHeightBefore = m.pageContentEl.scrollHeight;
  26485. var heightBefore = m.pageContentEl.offsetHeight;
  26486. var scrollBefore = m.pageContentEl.scrollTop;
  26487. // Add message to DOM and data
  26488. var messagesHTML = '';
  26489. var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
  26490. messagesToAdd.forEach(function (messageToAdd) {
  26491. if (typingMessage) {
  26492. if (method === 'append') {
  26493. m.messages.splice(m.messages.indexOf(typingMessage), 0, messageToAdd);
  26494. } else {
  26495. m.messages.splice(m.messages.indexOf(typingMessage) + 1, 0, messageToAdd);
  26496. }
  26497. } else {
  26498. m.messages[method === 'append' ? 'push' : 'unshift'](messageToAdd);
  26499. }
  26500. messagesHTML += m.renderMessage(messageToAdd);
  26501. });
  26502. var $messagesEls = $(messagesHTML);
  26503. if (animate) {
  26504. if (method === 'append' && !m.params.newMessagesFirst) {
  26505. $messagesEls.addClass('message-appear-from-bottom');
  26506. }
  26507. if (method === 'prepend' && m.params.newMessagesFirst) {
  26508. $messagesEls.addClass('message-appear-from-top');
  26509. }
  26510. }
  26511. if (typingMessage) {
  26512. if (method === 'append') {
  26513. $messagesEls.insertBefore(m.$el.find('.message-typing'));
  26514. } else {
  26515. $messagesEls.insertAfter(m.$el.find('.message-typing'));
  26516. }
  26517. } else {
  26518. m.$el[method]($messagesEls);
  26519. }
  26520. // Layout
  26521. if (m.params.autoLayout) { m.layout(); }
  26522. if (method === 'prepend' && !typingMessage) {
  26523. m.pageContentEl.scrollTop = scrollBefore + (m.pageContentEl.scrollHeight - scrollHeightBefore);
  26524. }
  26525. if (m.params.scrollMessages && ((method === 'append' && !m.params.newMessagesFirst) || (method === 'prepend' && m.params.newMessagesFirst && !typingMessage))) {
  26526. if (m.params.scrollMessagesOnEdge) {
  26527. var onEdge = false;
  26528. if (m.params.newMessagesFirst && scrollBefore === 0) {
  26529. onEdge = true;
  26530. }
  26531. if (!m.params.newMessagesFirst && (scrollBefore - (scrollHeightBefore - heightBefore) >= -10)) {
  26532. onEdge = true;
  26533. }
  26534. if (onEdge) { m.scroll(animate ? undefined : 0); }
  26535. } else {
  26536. m.scroll(animate ? undefined : 0);
  26537. }
  26538. }
  26539. return m;
  26540. };
  26541. Messages.prototype.showTyping = function showTyping (message) {
  26542. if ( message === void 0 ) message = {};
  26543. var m = this;
  26544. var typingMessage = m.messages.filter(function (el) { return el.isTyping; })[0];
  26545. if (typingMessage) {
  26546. m.removeMessage(m.messages.indexOf(typingMessage));
  26547. }
  26548. m.addMessage(Utils.extend({
  26549. type: 'received',
  26550. isTyping: true,
  26551. }, message));
  26552. return m;
  26553. };
  26554. Messages.prototype.hideTyping = function hideTyping () {
  26555. var m = this;
  26556. var typingMessageIndex;
  26557. var typingFound;
  26558. m.messages.forEach(function (message, index) {
  26559. if (message.isTyping) { typingMessageIndex = index; }
  26560. });
  26561. if (typeof typingMessageIndex !== 'undefined') {
  26562. if (m.$el.find('.message').eq(typingMessageIndex).hasClass('message-typing')) {
  26563. typingFound = true;
  26564. m.removeMessage(typingMessageIndex);
  26565. }
  26566. }
  26567. if (!typingFound) {
  26568. var $typingMessageEl = m.$el.find('.message-typing');
  26569. if ($typingMessageEl.length) {
  26570. m.removeMessage($typingMessageEl);
  26571. }
  26572. }
  26573. return m;
  26574. };
  26575. Messages.prototype.scroll = function scroll (duration, scrollTop) {
  26576. if ( duration === void 0 ) duration = 300;
  26577. var m = this;
  26578. var currentScroll = m.pageContentEl.scrollTop;
  26579. var newScrollTop;
  26580. if (typeof scrollTop !== 'undefined') { newScrollTop = scrollTop; }
  26581. else {
  26582. newScrollTop = m.params.newMessagesFirst ? 0 : m.pageContentEl.scrollHeight - m.pageContentEl.offsetHeight;
  26583. if (newScrollTop === currentScroll) { return m; }
  26584. }
  26585. m.$pageContentEl.scrollTop(newScrollTop, duration);
  26586. return m;
  26587. };
  26588. Messages.prototype.init = function init () {
  26589. var m = this;
  26590. if (!m.messages || m.messages.length === 0) {
  26591. m.messages = m.getMessagesData();
  26592. }
  26593. if (m.params.messages && m.params.messages.length) {
  26594. m.renderMessages();
  26595. }
  26596. if (m.params.autoLayout) { m.layout(); }
  26597. if (m.params.scrollMessages) { m.scroll(0); }
  26598. };
  26599. Messages.prototype.destroy = function destroy () {
  26600. var m = this;
  26601. m.emit('local::beforeDestroy messagesBeforeDestroy', m);
  26602. m.$el.trigger('messages:beforedestroy');
  26603. if (m.$el[0]) {
  26604. m.$el[0].f7Messages = null;
  26605. delete m.$el[0].f7Messages;
  26606. }
  26607. Utils.deleteProps(m);
  26608. };
  26609. return Messages;
  26610. }(Framework7Class));
  26611. var Messages$1 = {
  26612. name: 'messages',
  26613. static: {
  26614. Messages: Messages,
  26615. },
  26616. create: function create() {
  26617. var app = this;
  26618. app.messages = ConstructorMethods({
  26619. defaultSelector: '.messages',
  26620. constructor: Messages,
  26621. app: app,
  26622. domProp: 'f7Messages',
  26623. addMethods: 'renderMessages layout scroll clear removeMessage removeMessages addMessage addMessages'.split(' '),
  26624. });
  26625. },
  26626. on: {
  26627. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  26628. var app = this;
  26629. $(tabEl).find('.messages-init').each(function (index, messagesEl) {
  26630. app.messages.destroy(messagesEl);
  26631. });
  26632. },
  26633. tabMounted: function tabMounted(tabEl) {
  26634. var app = this;
  26635. $(tabEl).find('.messages-init').each(function (index, messagesEl) {
  26636. app.messages.create({ el: messagesEl });
  26637. });
  26638. },
  26639. pageBeforeRemove: function pageBeforeRemove(page) {
  26640. var app = this;
  26641. page.$el.find('.messages-init').each(function (index, messagesEl) {
  26642. app.messages.destroy(messagesEl);
  26643. });
  26644. },
  26645. pageInit: function pageInit(page) {
  26646. var app = this;
  26647. page.$el.find('.messages-init').each(function (index, messagesEl) {
  26648. app.messages.create({ el: messagesEl });
  26649. });
  26650. },
  26651. },
  26652. vnode: {
  26653. 'messages-init': {
  26654. insert: function insert(vnode) {
  26655. var app = this;
  26656. var messagesEl = vnode.elm;
  26657. app.messages.create({ el: messagesEl });
  26658. },
  26659. destroy: function destroy(vnode) {
  26660. var app = this;
  26661. var messagesEl = vnode.elm;
  26662. app.messages.destroy(messagesEl);
  26663. },
  26664. },
  26665. },
  26666. };
  26667. var Messagebar = /*@__PURE__*/(function (Framework7Class) {
  26668. function Messagebar(app, params) {
  26669. if ( params === void 0 ) params = {};
  26670. Framework7Class.call(this, params, [app]);
  26671. var messagebar = this;
  26672. var defaults = {
  26673. top: false,
  26674. topOffset: 0,
  26675. bottomOffset: 0,
  26676. attachments: [],
  26677. renderAttachments: undefined,
  26678. renderAttachment: undefined,
  26679. maxHeight: null,
  26680. resizePage: true,
  26681. };
  26682. // Extend defaults with modules params
  26683. messagebar.useModulesParams(defaults);
  26684. messagebar.params = Utils.extend(defaults, params);
  26685. // El
  26686. var $el = $(messagebar.params.el);
  26687. if ($el.length === 0) { return messagebar; }
  26688. if ($el[0].f7Messagebar) { return $el[0].f7Messagebar; }
  26689. $el[0].f7Messagebar = messagebar;
  26690. // Page and PageContent
  26691. var $pageEl = $el.parents('.page').eq(0);
  26692. var $pageContentEl = $pageEl.find('.page-content').eq(0);
  26693. // Area
  26694. var $areaEl = $el.find('.messagebar-area');
  26695. // Textarea
  26696. var $textareaEl;
  26697. if (messagebar.params.textareaEl) {
  26698. $textareaEl = $(messagebar.params.textareaEl);
  26699. } else {
  26700. $textareaEl = $el.find('textarea');
  26701. }
  26702. // Attachments & Library
  26703. var $attachmentsEl = $el.find('.messagebar-attachments');
  26704. var $sheetEl = $el.find('.messagebar-sheet');
  26705. if (messagebar.params.top) {
  26706. $el.addClass('messagebar-top');
  26707. }
  26708. Utils.extend(messagebar, {
  26709. $el: $el,
  26710. el: $el[0],
  26711. $areaEl: $areaEl,
  26712. areaEl: $areaEl[0],
  26713. $textareaEl: $textareaEl,
  26714. textareaEl: $textareaEl[0],
  26715. $attachmentsEl: $attachmentsEl,
  26716. attachmentsEl: $attachmentsEl[0],
  26717. attachmentsVisible: $attachmentsEl.hasClass('messagebar-attachments-visible'),
  26718. $sheetEl: $sheetEl,
  26719. sheetEl: $sheetEl[0],
  26720. sheetVisible: $sheetEl.hasClass('messagebar-sheet-visible'),
  26721. $pageEl: $pageEl,
  26722. pageEl: $pageEl[0],
  26723. $pageContentEl: $pageContentEl,
  26724. pageContentEl: $pageContentEl,
  26725. top: $el.hasClass('messagebar-top') || messagebar.params.top,
  26726. attachments: [],
  26727. });
  26728. // Events
  26729. function onAppResize() {
  26730. if (messagebar.params.resizePage) {
  26731. messagebar.resizePage();
  26732. }
  26733. }
  26734. function onSubmit(e) {
  26735. e.preventDefault();
  26736. }
  26737. function onAttachmentClick(e) {
  26738. var index = $(this).index();
  26739. if ($(e.target).closest('.messagebar-attachment-delete').length) {
  26740. $(this).trigger('messagebar:attachmentdelete', index);
  26741. messagebar.emit('local::attachmentDelete messagebarAttachmentDelete', messagebar, this, index);
  26742. } else {
  26743. $(this).trigger('messagebar:attachmentclick', index);
  26744. messagebar.emit('local::attachmentClick messagebarAttachmentClick', messagebar, this, index);
  26745. }
  26746. }
  26747. function onTextareaChange() {
  26748. messagebar.checkEmptyState();
  26749. messagebar.$el.trigger('messagebar:change');
  26750. messagebar.emit('local::change messagebarChange', messagebar);
  26751. }
  26752. function onTextareaFocus() {
  26753. messagebar.sheetHide();
  26754. messagebar.$el.addClass('messagebar-focused');
  26755. messagebar.$el.trigger('messagebar:focus');
  26756. messagebar.emit('local::focus messagebarFocus', messagebar);
  26757. }
  26758. function onTextareaBlur() {
  26759. messagebar.$el.removeClass('messagebar-focused');
  26760. messagebar.$el.trigger('messagebar:blur');
  26761. messagebar.emit('local::blur messagebarBlur', messagebar);
  26762. }
  26763. messagebar.attachEvents = function attachEvents() {
  26764. $el.on('textarea:resize', onAppResize);
  26765. $el.on('submit', onSubmit);
  26766. $el.on('click', '.messagebar-attachment', onAttachmentClick);
  26767. $textareaEl.on('change input', onTextareaChange);
  26768. $textareaEl.on('focus', onTextareaFocus);
  26769. $textareaEl.on('blur', onTextareaBlur);
  26770. app.on('resize', onAppResize);
  26771. };
  26772. messagebar.detachEvents = function detachEvents() {
  26773. $el.off('textarea:resize', onAppResize);
  26774. $el.off('submit', onSubmit);
  26775. $el.off('click', '.messagebar-attachment', onAttachmentClick);
  26776. $textareaEl.off('change input', onTextareaChange);
  26777. $textareaEl.off('focus', onTextareaFocus);
  26778. $textareaEl.off('blur', onTextareaBlur);
  26779. app.off('resize', onAppResize);
  26780. };
  26781. // Install Modules
  26782. messagebar.useModules();
  26783. // Init
  26784. messagebar.init();
  26785. return messagebar;
  26786. }
  26787. if ( Framework7Class ) Messagebar.__proto__ = Framework7Class;
  26788. Messagebar.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  26789. Messagebar.prototype.constructor = Messagebar;
  26790. Messagebar.prototype.focus = function focus () {
  26791. var messagebar = this;
  26792. messagebar.$textareaEl.focus();
  26793. return messagebar;
  26794. };
  26795. Messagebar.prototype.blur = function blur () {
  26796. var messagebar = this;
  26797. messagebar.$textareaEl.blur();
  26798. return messagebar;
  26799. };
  26800. Messagebar.prototype.clear = function clear () {
  26801. var messagebar = this;
  26802. messagebar.$textareaEl.val('').trigger('change');
  26803. return messagebar;
  26804. };
  26805. Messagebar.prototype.getValue = function getValue () {
  26806. var messagebar = this;
  26807. return messagebar.$textareaEl.val().trim();
  26808. };
  26809. Messagebar.prototype.setValue = function setValue (value) {
  26810. var messagebar = this;
  26811. messagebar.$textareaEl.val(value).trigger('change');
  26812. return messagebar;
  26813. };
  26814. Messagebar.prototype.setPlaceholder = function setPlaceholder (placeholder) {
  26815. var messagebar = this;
  26816. messagebar.$textareaEl.attr('placeholder', placeholder);
  26817. return messagebar;
  26818. };
  26819. Messagebar.prototype.resizePage = function resizePage () {
  26820. var messagebar = this;
  26821. var params = messagebar.params;
  26822. var $el = messagebar.$el;
  26823. var top = messagebar.top;
  26824. var $pageEl = messagebar.$pageEl;
  26825. var $pageContentEl = messagebar.$pageContentEl;
  26826. var $areaEl = messagebar.$areaEl;
  26827. var $textareaEl = messagebar.$textareaEl;
  26828. var $sheetEl = messagebar.$sheetEl;
  26829. var $attachmentsEl = messagebar.$attachmentsEl;
  26830. var elHeight = $el[0].offsetHeight;
  26831. var maxHeight = params.maxHeight;
  26832. if (top) ; else {
  26833. var currentPaddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  26834. var requiredPaddingBottom = elHeight + params.bottomOffset;
  26835. if (requiredPaddingBottom !== currentPaddingBottom && $pageContentEl.length) {
  26836. var currentPaddingTop = parseInt($pageContentEl.css('padding-top'), 10);
  26837. var pageScrollHeight = $pageContentEl[0].scrollHeight;
  26838. var pageOffsetHeight = $pageContentEl[0].offsetHeight;
  26839. var pageScrollTop = $pageContentEl[0].scrollTop;
  26840. var scrollOnBottom = (pageScrollTop === pageScrollHeight - pageOffsetHeight);
  26841. if (!maxHeight) {
  26842. maxHeight = $pageEl[0].offsetHeight - currentPaddingTop - $sheetEl.outerHeight() - $attachmentsEl.outerHeight() - parseInt($areaEl.css('margin-top'), 10) - parseInt($areaEl.css('margin-bottom'), 10);
  26843. }
  26844. $textareaEl.css('max-height', (maxHeight + "px"));
  26845. $pageContentEl.css('padding-bottom', (requiredPaddingBottom + "px"));
  26846. if (scrollOnBottom) {
  26847. $pageContentEl.scrollTop($pageContentEl[0].scrollHeight - pageOffsetHeight);
  26848. }
  26849. $el.trigger('messagebar:resizepage');
  26850. messagebar.emit('local::resizePage messagebarResizePage', messagebar);
  26851. }
  26852. }
  26853. };
  26854. Messagebar.prototype.checkEmptyState = function checkEmptyState () {
  26855. var messagebar = this;
  26856. var $el = messagebar.$el;
  26857. var $textareaEl = messagebar.$textareaEl;
  26858. var value = $textareaEl.val().trim();
  26859. if (value && value.length) {
  26860. $el.addClass('messagebar-with-value');
  26861. } else {
  26862. $el.removeClass('messagebar-with-value');
  26863. }
  26864. };
  26865. Messagebar.prototype.attachmentsCreate = function attachmentsCreate (innerHTML) {
  26866. if ( innerHTML === void 0 ) innerHTML = '';
  26867. var messagebar = this;
  26868. var $attachmentsEl = $(("<div class=\"messagebar-attachments\">" + innerHTML + "</div>"));
  26869. $attachmentsEl.insertBefore(messagebar.$textareaEl);
  26870. Utils.extend(messagebar, {
  26871. $attachmentsEl: $attachmentsEl,
  26872. attachmentsEl: $attachmentsEl[0],
  26873. });
  26874. return messagebar;
  26875. };
  26876. Messagebar.prototype.attachmentsShow = function attachmentsShow (innerHTML) {
  26877. if ( innerHTML === void 0 ) innerHTML = '';
  26878. var messagebar = this;
  26879. messagebar.$attachmentsEl = messagebar.$el.find('.messagebar-attachments');
  26880. if (messagebar.$attachmentsEl.length === 0) {
  26881. messagebar.attachmentsCreate(innerHTML);
  26882. }
  26883. messagebar.$el.addClass('messagebar-attachments-visible');
  26884. messagebar.attachmentsVisible = true;
  26885. if (messagebar.params.resizePage) {
  26886. messagebar.resizePage();
  26887. }
  26888. return messagebar;
  26889. };
  26890. Messagebar.prototype.attachmentsHide = function attachmentsHide () {
  26891. var messagebar = this;
  26892. messagebar.$el.removeClass('messagebar-attachments-visible');
  26893. messagebar.attachmentsVisible = false;
  26894. if (messagebar.params.resizePage) {
  26895. messagebar.resizePage();
  26896. }
  26897. return messagebar;
  26898. };
  26899. Messagebar.prototype.attachmentsToggle = function attachmentsToggle () {
  26900. var messagebar = this;
  26901. if (messagebar.attachmentsVisible) {
  26902. messagebar.attachmentsHide();
  26903. } else {
  26904. messagebar.attachmentsShow();
  26905. }
  26906. return messagebar;
  26907. };
  26908. Messagebar.prototype.renderAttachment = function renderAttachment (attachment) {
  26909. var messagebar = this;
  26910. if (messagebar.params.renderAttachment) {
  26911. return messagebar.params.renderAttachment.call(messagebar, attachment);
  26912. }
  26913. return ("\n <div class=\"messagebar-attachment\">\n <img src=\"" + attachment + "\">\n <span class=\"messagebar-attachment-delete\"></span>\n </div>\n ");
  26914. };
  26915. Messagebar.prototype.renderAttachments = function renderAttachments () {
  26916. var messagebar = this;
  26917. var html;
  26918. if (messagebar.params.renderAttachments) {
  26919. html = messagebar.params.renderAttachments.call(messagebar, messagebar.attachments);
  26920. } else {
  26921. html = "" + (messagebar.attachments.map(function (attachment) { return messagebar.renderAttachment(attachment); }).join(''));
  26922. }
  26923. if (messagebar.$attachmentsEl.length === 0) {
  26924. messagebar.attachmentsCreate(html);
  26925. } else {
  26926. messagebar.$attachmentsEl.html(html);
  26927. }
  26928. };
  26929. Messagebar.prototype.sheetCreate = function sheetCreate (innerHTML) {
  26930. if ( innerHTML === void 0 ) innerHTML = '';
  26931. var messagebar = this;
  26932. var $sheetEl = $(("<div class=\"messagebar-sheet\">" + innerHTML + "</div>"));
  26933. messagebar.$el.append($sheetEl);
  26934. Utils.extend(messagebar, {
  26935. $sheetEl: $sheetEl,
  26936. sheetEl: $sheetEl[0],
  26937. });
  26938. return messagebar;
  26939. };
  26940. Messagebar.prototype.sheetShow = function sheetShow (innerHTML) {
  26941. if ( innerHTML === void 0 ) innerHTML = '';
  26942. var messagebar = this;
  26943. messagebar.$sheetEl = messagebar.$el.find('.messagebar-sheet');
  26944. if (messagebar.$sheetEl.length === 0) {
  26945. messagebar.sheetCreate(innerHTML);
  26946. }
  26947. messagebar.$el.addClass('messagebar-sheet-visible');
  26948. messagebar.sheetVisible = true;
  26949. if (messagebar.params.resizePage) {
  26950. messagebar.resizePage();
  26951. }
  26952. return messagebar;
  26953. };
  26954. Messagebar.prototype.sheetHide = function sheetHide () {
  26955. var messagebar = this;
  26956. messagebar.$el.removeClass('messagebar-sheet-visible');
  26957. messagebar.sheetVisible = false;
  26958. if (messagebar.params.resizePage) {
  26959. messagebar.resizePage();
  26960. }
  26961. return messagebar;
  26962. };
  26963. Messagebar.prototype.sheetToggle = function sheetToggle () {
  26964. var messagebar = this;
  26965. if (messagebar.sheetVisible) {
  26966. messagebar.sheetHide();
  26967. } else {
  26968. messagebar.sheetShow();
  26969. }
  26970. return messagebar;
  26971. };
  26972. Messagebar.prototype.init = function init () {
  26973. var messagebar = this;
  26974. messagebar.attachEvents();
  26975. messagebar.checkEmptyState();
  26976. return messagebar;
  26977. };
  26978. Messagebar.prototype.destroy = function destroy () {
  26979. var messagebar = this;
  26980. messagebar.emit('local::beforeDestroy messagebarBeforeDestroy', messagebar);
  26981. messagebar.$el.trigger('messagebar:beforedestroy');
  26982. messagebar.detachEvents();
  26983. if (messagebar.$el[0]) {
  26984. messagebar.$el[0].f7Messagebar = null;
  26985. delete messagebar.$el[0].f7Messagebar;
  26986. }
  26987. Utils.deleteProps(messagebar);
  26988. };
  26989. return Messagebar;
  26990. }(Framework7Class));
  26991. var Messagebar$1 = {
  26992. name: 'messagebar',
  26993. static: {
  26994. Messagebar: Messagebar,
  26995. },
  26996. create: function create() {
  26997. var app = this;
  26998. app.messagebar = ConstructorMethods({
  26999. defaultSelector: '.messagebar',
  27000. constructor: Messagebar,
  27001. app: app,
  27002. domProp: 'f7Messagebar',
  27003. addMethods: 'clear getValue setValue setPlaceholder resizePage focus blur attachmentsCreate attachmentsShow attachmentsHide attachmentsToggle renderAttachments sheetCreate sheetShow sheetHide sheetToggle'.split(' '),
  27004. });
  27005. },
  27006. on: {
  27007. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  27008. var app = this;
  27009. $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
  27010. app.messagebar.destroy(messagebarEl);
  27011. });
  27012. },
  27013. tabMounted: function tabMounted(tabEl) {
  27014. var app = this;
  27015. $(tabEl).find('.messagebar-init').each(function (index, messagebarEl) {
  27016. app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
  27017. });
  27018. },
  27019. pageBeforeRemove: function pageBeforeRemove(page) {
  27020. var app = this;
  27021. page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
  27022. app.messagebar.destroy(messagebarEl);
  27023. });
  27024. },
  27025. pageInit: function pageInit(page) {
  27026. var app = this;
  27027. page.$el.find('.messagebar-init').each(function (index, messagebarEl) {
  27028. app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
  27029. });
  27030. },
  27031. },
  27032. vnode: {
  27033. 'messagebar-init': {
  27034. insert: function insert(vnode) {
  27035. var app = this;
  27036. var messagebarEl = vnode.elm;
  27037. app.messagebar.create(Utils.extend({ el: messagebarEl }, $(messagebarEl).dataset()));
  27038. },
  27039. destroy: function destroy(vnode) {
  27040. var app = this;
  27041. var messagebarEl = vnode.elm;
  27042. app.messagebar.destroy(messagebarEl);
  27043. },
  27044. },
  27045. },
  27046. };
  27047. function updateSize () {
  27048. var swiper = this;
  27049. var width;
  27050. var height;
  27051. var $el = swiper.$el;
  27052. if (typeof swiper.params.width !== 'undefined') {
  27053. width = swiper.params.width;
  27054. } else {
  27055. width = $el[0].clientWidth;
  27056. }
  27057. if (typeof swiper.params.height !== 'undefined') {
  27058. height = swiper.params.height;
  27059. } else {
  27060. height = $el[0].clientHeight;
  27061. }
  27062. if ((width === 0 && swiper.isHorizontal()) || (height === 0 && swiper.isVertical())) {
  27063. return;
  27064. }
  27065. // Subtract paddings
  27066. width = width - parseInt($el.css('padding-left'), 10) - parseInt($el.css('padding-right'), 10);
  27067. height = height - parseInt($el.css('padding-top'), 10) - parseInt($el.css('padding-bottom'), 10);
  27068. Utils.extend(swiper, {
  27069. width: width,
  27070. height: height,
  27071. size: swiper.isHorizontal() ? width : height,
  27072. });
  27073. }
  27074. function updateSlides () {
  27075. var swiper = this;
  27076. var params = swiper.params;
  27077. var $wrapperEl = swiper.$wrapperEl;
  27078. var swiperSize = swiper.size;
  27079. var rtl = swiper.rtlTranslate;
  27080. var wrongRTL = swiper.wrongRTL;
  27081. var isVirtual = swiper.virtual && params.virtual.enabled;
  27082. var previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
  27083. var slides = $wrapperEl.children(("." + (swiper.params.slideClass)));
  27084. var slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
  27085. var snapGrid = [];
  27086. var slidesGrid = [];
  27087. var slidesSizesGrid = [];
  27088. function slidesForMargin(slideIndex) {
  27089. if (!params.cssMode) { return true; }
  27090. if (slideIndex === slides.length - 1) {
  27091. return false;
  27092. }
  27093. return true;
  27094. }
  27095. var offsetBefore = params.slidesOffsetBefore;
  27096. if (typeof offsetBefore === 'function') {
  27097. offsetBefore = params.slidesOffsetBefore.call(swiper);
  27098. }
  27099. var offsetAfter = params.slidesOffsetAfter;
  27100. if (typeof offsetAfter === 'function') {
  27101. offsetAfter = params.slidesOffsetAfter.call(swiper);
  27102. }
  27103. var previousSnapGridLength = swiper.snapGrid.length;
  27104. var previousSlidesGridLength = swiper.snapGrid.length;
  27105. var spaceBetween = params.spaceBetween;
  27106. var slidePosition = -offsetBefore;
  27107. var prevSlideSize = 0;
  27108. var index = 0;
  27109. if (typeof swiperSize === 'undefined') {
  27110. return;
  27111. }
  27112. if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
  27113. spaceBetween = (parseFloat(spaceBetween.replace('%', '')) / 100) * swiperSize;
  27114. }
  27115. swiper.virtualSize = -spaceBetween;
  27116. // reset margins
  27117. if (rtl) { slides.css({ marginLeft: '', marginTop: '' }); }
  27118. else { slides.css({ marginRight: '', marginBottom: '' }); }
  27119. var slidesNumberEvenToRows;
  27120. if (params.slidesPerColumn > 1) {
  27121. if (Math.floor(slidesLength / params.slidesPerColumn) === slidesLength / swiper.params.slidesPerColumn) {
  27122. slidesNumberEvenToRows = slidesLength;
  27123. } else {
  27124. slidesNumberEvenToRows = Math.ceil(slidesLength / params.slidesPerColumn) * params.slidesPerColumn;
  27125. }
  27126. if (params.slidesPerView !== 'auto' && params.slidesPerColumnFill === 'row') {
  27127. slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, params.slidesPerView * params.slidesPerColumn);
  27128. }
  27129. }
  27130. // Calc slides
  27131. var slideSize;
  27132. var slidesPerColumn = params.slidesPerColumn;
  27133. var slidesPerRow = slidesNumberEvenToRows / slidesPerColumn;
  27134. var numFullColumns = Math.floor(slidesLength / params.slidesPerColumn);
  27135. for (var i = 0; i < slidesLength; i += 1) {
  27136. slideSize = 0;
  27137. var slide = slides.eq(i);
  27138. if (params.slidesPerColumn > 1) {
  27139. // Set slides order
  27140. var newSlideOrderIndex = (void 0);
  27141. var column = (void 0);
  27142. var row = (void 0);
  27143. if (params.slidesPerColumnFill === 'row' && params.slidesPerGroup > 1) {
  27144. var groupIndex = Math.floor(i / (params.slidesPerGroup * params.slidesPerColumn));
  27145. var slideIndexInGroup = i - params.slidesPerColumn * params.slidesPerGroup * groupIndex;
  27146. var columnsInGroup = groupIndex === 0
  27147. ? params.slidesPerGroup
  27148. : Math.min(Math.ceil((slidesLength - groupIndex * slidesPerColumn * params.slidesPerGroup) / slidesPerColumn), params.slidesPerGroup);
  27149. row = Math.floor(slideIndexInGroup / columnsInGroup);
  27150. column = (slideIndexInGroup - row * columnsInGroup) + groupIndex * params.slidesPerGroup;
  27151. newSlideOrderIndex = column + ((row * slidesNumberEvenToRows) / slidesPerColumn);
  27152. slide
  27153. .css({
  27154. '-webkit-box-ordinal-group': newSlideOrderIndex,
  27155. '-moz-box-ordinal-group': newSlideOrderIndex,
  27156. '-ms-flex-order': newSlideOrderIndex,
  27157. '-webkit-order': newSlideOrderIndex,
  27158. order: newSlideOrderIndex,
  27159. });
  27160. } else if (params.slidesPerColumnFill === 'column') {
  27161. column = Math.floor(i / slidesPerColumn);
  27162. row = i - (column * slidesPerColumn);
  27163. if (column > numFullColumns || (column === numFullColumns && row === slidesPerColumn - 1)) {
  27164. row += 1;
  27165. if (row >= slidesPerColumn) {
  27166. row = 0;
  27167. column += 1;
  27168. }
  27169. }
  27170. } else {
  27171. row = Math.floor(i / slidesPerRow);
  27172. column = i - (row * slidesPerRow);
  27173. }
  27174. slide.css(
  27175. ("margin-" + (swiper.isHorizontal() ? 'top' : 'left')),
  27176. (row !== 0 && params.spaceBetween) && (((params.spaceBetween) + "px"))
  27177. );
  27178. }
  27179. if (slide.css('display') === 'none') { continue; } // eslint-disable-line
  27180. if (params.slidesPerView === 'auto') {
  27181. var slideStyles = win.getComputedStyle(slide[0], null);
  27182. var currentTransform = slide[0].style.transform;
  27183. var currentWebKitTransform = slide[0].style.webkitTransform;
  27184. if (currentTransform) {
  27185. slide[0].style.transform = 'none';
  27186. }
  27187. if (currentWebKitTransform) {
  27188. slide[0].style.webkitTransform = 'none';
  27189. }
  27190. if (params.roundLengths) {
  27191. slideSize = swiper.isHorizontal()
  27192. ? slide.outerWidth(true)
  27193. : slide.outerHeight(true);
  27194. } else {
  27195. // eslint-disable-next-line
  27196. if (swiper.isHorizontal()) {
  27197. var width = parseFloat(slideStyles.getPropertyValue('width'));
  27198. var paddingLeft = parseFloat(slideStyles.getPropertyValue('padding-left'));
  27199. var paddingRight = parseFloat(slideStyles.getPropertyValue('padding-right'));
  27200. var marginLeft = parseFloat(slideStyles.getPropertyValue('margin-left'));
  27201. var marginRight = parseFloat(slideStyles.getPropertyValue('margin-right'));
  27202. var boxSizing = slideStyles.getPropertyValue('box-sizing');
  27203. if (boxSizing && boxSizing === 'border-box') {
  27204. slideSize = width + marginLeft + marginRight;
  27205. } else {
  27206. slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight;
  27207. }
  27208. } else {
  27209. var height = parseFloat(slideStyles.getPropertyValue('height'));
  27210. var paddingTop = parseFloat(slideStyles.getPropertyValue('padding-top'));
  27211. var paddingBottom = parseFloat(slideStyles.getPropertyValue('padding-bottom'));
  27212. var marginTop = parseFloat(slideStyles.getPropertyValue('margin-top'));
  27213. var marginBottom = parseFloat(slideStyles.getPropertyValue('margin-bottom'));
  27214. var boxSizing$1 = slideStyles.getPropertyValue('box-sizing');
  27215. if (boxSizing$1 && boxSizing$1 === 'border-box') {
  27216. slideSize = height + marginTop + marginBottom;
  27217. } else {
  27218. slideSize = height + paddingTop + paddingBottom + marginTop + marginBottom;
  27219. }
  27220. }
  27221. }
  27222. if (currentTransform) {
  27223. slide[0].style.transform = currentTransform;
  27224. }
  27225. if (currentWebKitTransform) {
  27226. slide[0].style.webkitTransform = currentWebKitTransform;
  27227. }
  27228. if (params.roundLengths) { slideSize = Math.floor(slideSize); }
  27229. } else {
  27230. slideSize = (swiperSize - ((params.slidesPerView - 1) * spaceBetween)) / params.slidesPerView;
  27231. if (params.roundLengths) { slideSize = Math.floor(slideSize); }
  27232. if (slides[i]) {
  27233. if (swiper.isHorizontal()) {
  27234. slides[i].style.width = slideSize + "px";
  27235. } else {
  27236. slides[i].style.height = slideSize + "px";
  27237. }
  27238. }
  27239. }
  27240. if (slides[i]) {
  27241. slides[i].swiperSlideSize = slideSize;
  27242. }
  27243. slidesSizesGrid.push(slideSize);
  27244. if (params.centeredSlides) {
  27245. slidePosition = slidePosition + (slideSize / 2) + (prevSlideSize / 2) + spaceBetween;
  27246. if (prevSlideSize === 0 && i !== 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
  27247. if (i === 0) { slidePosition = slidePosition - (swiperSize / 2) - spaceBetween; }
  27248. if (Math.abs(slidePosition) < 1 / 1000) { slidePosition = 0; }
  27249. if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
  27250. if ((index) % params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
  27251. slidesGrid.push(slidePosition);
  27252. } else {
  27253. if (params.roundLengths) { slidePosition = Math.floor(slidePosition); }
  27254. if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) { snapGrid.push(slidePosition); }
  27255. slidesGrid.push(slidePosition);
  27256. slidePosition = slidePosition + slideSize + spaceBetween;
  27257. }
  27258. swiper.virtualSize += slideSize + spaceBetween;
  27259. prevSlideSize = slideSize;
  27260. index += 1;
  27261. }
  27262. swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
  27263. var newSlidesGrid;
  27264. if (
  27265. rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
  27266. $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") });
  27267. }
  27268. if (params.setWrapperSize) {
  27269. if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  27270. else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  27271. }
  27272. if (params.slidesPerColumn > 1) {
  27273. swiper.virtualSize = (slideSize + params.spaceBetween) * slidesNumberEvenToRows;
  27274. swiper.virtualSize = Math.ceil(swiper.virtualSize / params.slidesPerColumn) - params.spaceBetween;
  27275. if (swiper.isHorizontal()) { $wrapperEl.css({ width: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  27276. else { $wrapperEl.css({ height: ((swiper.virtualSize + params.spaceBetween) + "px") }); }
  27277. if (params.centeredSlides) {
  27278. newSlidesGrid = [];
  27279. for (var i$1 = 0; i$1 < snapGrid.length; i$1 += 1) {
  27280. var slidesGridItem = snapGrid[i$1];
  27281. if (params.roundLengths) { slidesGridItem = Math.floor(slidesGridItem); }
  27282. if (snapGrid[i$1] < swiper.virtualSize + snapGrid[0]) { newSlidesGrid.push(slidesGridItem); }
  27283. }
  27284. snapGrid = newSlidesGrid;
  27285. }
  27286. }
  27287. // Remove last grid elements depending on width
  27288. if (!params.centeredSlides) {
  27289. newSlidesGrid = [];
  27290. for (var i$2 = 0; i$2 < snapGrid.length; i$2 += 1) {
  27291. var slidesGridItem$1 = snapGrid[i$2];
  27292. if (params.roundLengths) { slidesGridItem$1 = Math.floor(slidesGridItem$1); }
  27293. if (snapGrid[i$2] <= swiper.virtualSize - swiperSize) {
  27294. newSlidesGrid.push(slidesGridItem$1);
  27295. }
  27296. }
  27297. snapGrid = newSlidesGrid;
  27298. if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
  27299. snapGrid.push(swiper.virtualSize - swiperSize);
  27300. }
  27301. }
  27302. if (snapGrid.length === 0) { snapGrid = [0]; }
  27303. if (params.spaceBetween !== 0) {
  27304. if (swiper.isHorizontal()) {
  27305. if (rtl) { slides.filter(slidesForMargin).css({ marginLeft: (spaceBetween + "px") }); }
  27306. else { slides.filter(slidesForMargin).css({ marginRight: (spaceBetween + "px") }); }
  27307. } else { slides.filter(slidesForMargin).css({ marginBottom: (spaceBetween + "px") }); }
  27308. }
  27309. if (params.centeredSlides && params.centeredSlidesBounds) {
  27310. var allSlidesSize = 0;
  27311. slidesSizesGrid.forEach(function (slideSizeValue) {
  27312. allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
  27313. });
  27314. allSlidesSize -= params.spaceBetween;
  27315. var maxSnap = allSlidesSize - swiperSize;
  27316. snapGrid = snapGrid.map(function (snap) {
  27317. if (snap < 0) { return -offsetBefore; }
  27318. if (snap > maxSnap) { return maxSnap + offsetAfter; }
  27319. return snap;
  27320. });
  27321. }
  27322. if (params.centerInsufficientSlides) {
  27323. var allSlidesSize$1 = 0;
  27324. slidesSizesGrid.forEach(function (slideSizeValue) {
  27325. allSlidesSize$1 += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);
  27326. });
  27327. allSlidesSize$1 -= params.spaceBetween;
  27328. if (allSlidesSize$1 < swiperSize) {
  27329. var allSlidesOffset = (swiperSize - allSlidesSize$1) / 2;
  27330. snapGrid.forEach(function (snap, snapIndex) {
  27331. snapGrid[snapIndex] = snap - allSlidesOffset;
  27332. });
  27333. slidesGrid.forEach(function (snap, snapIndex) {
  27334. slidesGrid[snapIndex] = snap + allSlidesOffset;
  27335. });
  27336. }
  27337. }
  27338. Utils.extend(swiper, {
  27339. slides: slides,
  27340. snapGrid: snapGrid,
  27341. slidesGrid: slidesGrid,
  27342. slidesSizesGrid: slidesSizesGrid,
  27343. });
  27344. if (slidesLength !== previousSlidesLength) {
  27345. swiper.emit('slidesLengthChange');
  27346. }
  27347. if (snapGrid.length !== previousSnapGridLength) {
  27348. if (swiper.params.watchOverflow) { swiper.checkOverflow(); }
  27349. swiper.emit('snapGridLengthChange');
  27350. }
  27351. if (slidesGrid.length !== previousSlidesGridLength) {
  27352. swiper.emit('slidesGridLengthChange');
  27353. }
  27354. if (params.watchSlidesProgress || params.watchSlidesVisibility) {
  27355. swiper.updateSlidesOffset();
  27356. }
  27357. }
  27358. function updateAutoHeight (speed) {
  27359. var swiper = this;
  27360. var activeSlides = [];
  27361. var newHeight = 0;
  27362. var i;
  27363. if (typeof speed === 'number') {
  27364. swiper.setTransition(speed);
  27365. } else if (speed === true) {
  27366. swiper.setTransition(swiper.params.speed);
  27367. }
  27368. // Find slides currently in view
  27369. if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
  27370. if (swiper.params.centeredSlides) {
  27371. swiper.visibleSlides.each(function (index, slide) {
  27372. activeSlides.push(slide);
  27373. });
  27374. } else {
  27375. for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
  27376. var index = swiper.activeIndex + i;
  27377. if (index > swiper.slides.length) { break; }
  27378. activeSlides.push(swiper.slides.eq(index)[0]);
  27379. }
  27380. }
  27381. } else {
  27382. activeSlides.push(swiper.slides.eq(swiper.activeIndex)[0]);
  27383. }
  27384. // Find new height from highest slide in view
  27385. for (i = 0; i < activeSlides.length; i += 1) {
  27386. if (typeof activeSlides[i] !== 'undefined') {
  27387. var height = activeSlides[i].offsetHeight;
  27388. newHeight = height > newHeight ? height : newHeight;
  27389. }
  27390. }
  27391. // Update Height
  27392. if (newHeight) { swiper.$wrapperEl.css('height', (newHeight + "px")); }
  27393. }
  27394. function updateSlidesOffset () {
  27395. var swiper = this;
  27396. var slides = swiper.slides;
  27397. for (var i = 0; i < slides.length; i += 1) {
  27398. slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;
  27399. }
  27400. }
  27401. function updateSlidesProgress (translate) {
  27402. if ( translate === void 0 ) translate = (this && this.translate) || 0;
  27403. var swiper = this;
  27404. var params = swiper.params;
  27405. var slides = swiper.slides;
  27406. var rtl = swiper.rtlTranslate;
  27407. if (slides.length === 0) { return; }
  27408. if (typeof slides[0].swiperSlideOffset === 'undefined') { swiper.updateSlidesOffset(); }
  27409. var offsetCenter = -translate;
  27410. if (rtl) { offsetCenter = translate; }
  27411. // Visible Slides
  27412. slides.removeClass(params.slideVisibleClass);
  27413. swiper.visibleSlidesIndexes = [];
  27414. swiper.visibleSlides = [];
  27415. for (var i = 0; i < slides.length; i += 1) {
  27416. var slide = slides[i];
  27417. var slideProgress = (
  27418. (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0)) - slide.swiperSlideOffset
  27419. ) / (slide.swiperSlideSize + params.spaceBetween);
  27420. if (params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) {
  27421. var slideBefore = -(offsetCenter - slide.swiperSlideOffset);
  27422. var slideAfter = slideBefore + swiper.slidesSizesGrid[i];
  27423. var isVisible = (slideBefore >= 0 && slideBefore < swiper.size - 1)
  27424. || (slideAfter > 1 && slideAfter <= swiper.size)
  27425. || (slideBefore <= 0 && slideAfter >= swiper.size);
  27426. if (isVisible) {
  27427. swiper.visibleSlides.push(slide);
  27428. swiper.visibleSlidesIndexes.push(i);
  27429. slides.eq(i).addClass(params.slideVisibleClass);
  27430. }
  27431. }
  27432. slide.progress = rtl ? -slideProgress : slideProgress;
  27433. }
  27434. swiper.visibleSlides = $(swiper.visibleSlides);
  27435. }
  27436. function updateProgress (translate) {
  27437. var swiper = this;
  27438. if (typeof translate === 'undefined') {
  27439. var multiplier = swiper.rtlTranslate ? -1 : 1;
  27440. // eslint-disable-next-line
  27441. translate = (swiper && swiper.translate && (swiper.translate * multiplier)) || 0;
  27442. }
  27443. var params = swiper.params;
  27444. var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  27445. var progress = swiper.progress;
  27446. var isBeginning = swiper.isBeginning;
  27447. var isEnd = swiper.isEnd;
  27448. var wasBeginning = isBeginning;
  27449. var wasEnd = isEnd;
  27450. if (translatesDiff === 0) {
  27451. progress = 0;
  27452. isBeginning = true;
  27453. isEnd = true;
  27454. } else {
  27455. progress = (translate - swiper.minTranslate()) / (translatesDiff);
  27456. isBeginning = progress <= 0;
  27457. isEnd = progress >= 1;
  27458. }
  27459. Utils.extend(swiper, {
  27460. progress: progress,
  27461. isBeginning: isBeginning,
  27462. isEnd: isEnd,
  27463. });
  27464. if (params.watchSlidesProgress || params.watchSlidesVisibility || (params.centeredSlides && params.autoHeight)) { swiper.updateSlidesProgress(translate); }
  27465. if (isBeginning && !wasBeginning) {
  27466. swiper.emit('reachBeginning toEdge');
  27467. }
  27468. if (isEnd && !wasEnd) {
  27469. swiper.emit('reachEnd toEdge');
  27470. }
  27471. if ((wasBeginning && !isBeginning) || (wasEnd && !isEnd)) {
  27472. swiper.emit('fromEdge');
  27473. }
  27474. swiper.emit('progress', progress);
  27475. }
  27476. function updateSlidesClasses () {
  27477. var swiper = this;
  27478. var slides = swiper.slides;
  27479. var params = swiper.params;
  27480. var $wrapperEl = swiper.$wrapperEl;
  27481. var activeIndex = swiper.activeIndex;
  27482. var realIndex = swiper.realIndex;
  27483. var isVirtual = swiper.virtual && params.virtual.enabled;
  27484. slides.removeClass(((params.slideActiveClass) + " " + (params.slideNextClass) + " " + (params.slidePrevClass) + " " + (params.slideDuplicateActiveClass) + " " + (params.slideDuplicateNextClass) + " " + (params.slideDuplicatePrevClass)));
  27485. var activeSlide;
  27486. if (isVirtual) {
  27487. activeSlide = swiper.$wrapperEl.find(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + activeIndex + "\"]"));
  27488. } else {
  27489. activeSlide = slides.eq(activeIndex);
  27490. }
  27491. // Active classes
  27492. activeSlide.addClass(params.slideActiveClass);
  27493. if (params.loop) {
  27494. // Duplicate to all looped slides
  27495. if (activeSlide.hasClass(params.slideDuplicateClass)) {
  27496. $wrapperEl
  27497. .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + realIndex + "\"]"))
  27498. .addClass(params.slideDuplicateActiveClass);
  27499. } else {
  27500. $wrapperEl
  27501. .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]"))
  27502. .addClass(params.slideDuplicateActiveClass);
  27503. }
  27504. }
  27505. // Next Slide
  27506. var nextSlide = activeSlide.nextAll(("." + (params.slideClass))).eq(0).addClass(params.slideNextClass);
  27507. if (params.loop && nextSlide.length === 0) {
  27508. nextSlide = slides.eq(0);
  27509. nextSlide.addClass(params.slideNextClass);
  27510. }
  27511. // Prev Slide
  27512. var prevSlide = activeSlide.prevAll(("." + (params.slideClass))).eq(0).addClass(params.slidePrevClass);
  27513. if (params.loop && prevSlide.length === 0) {
  27514. prevSlide = slides.eq(-1);
  27515. prevSlide.addClass(params.slidePrevClass);
  27516. }
  27517. if (params.loop) {
  27518. // Duplicate to all looped slides
  27519. if (nextSlide.hasClass(params.slideDuplicateClass)) {
  27520. $wrapperEl
  27521. .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
  27522. .addClass(params.slideDuplicateNextClass);
  27523. } else {
  27524. $wrapperEl
  27525. .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (nextSlide.attr('data-swiper-slide-index')) + "\"]"))
  27526. .addClass(params.slideDuplicateNextClass);
  27527. }
  27528. if (prevSlide.hasClass(params.slideDuplicateClass)) {
  27529. $wrapperEl
  27530. .children(("." + (params.slideClass) + ":not(." + (params.slideDuplicateClass) + ")[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
  27531. .addClass(params.slideDuplicatePrevClass);
  27532. } else {
  27533. $wrapperEl
  27534. .children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + (prevSlide.attr('data-swiper-slide-index')) + "\"]"))
  27535. .addClass(params.slideDuplicatePrevClass);
  27536. }
  27537. }
  27538. }
  27539. function updateActiveIndex (newActiveIndex) {
  27540. var swiper = this;
  27541. var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  27542. var slidesGrid = swiper.slidesGrid;
  27543. var snapGrid = swiper.snapGrid;
  27544. var params = swiper.params;
  27545. var previousIndex = swiper.activeIndex;
  27546. var previousRealIndex = swiper.realIndex;
  27547. var previousSnapIndex = swiper.snapIndex;
  27548. var activeIndex = newActiveIndex;
  27549. var snapIndex;
  27550. if (typeof activeIndex === 'undefined') {
  27551. for (var i = 0; i < slidesGrid.length; i += 1) {
  27552. if (typeof slidesGrid[i + 1] !== 'undefined') {
  27553. if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - ((slidesGrid[i + 1] - slidesGrid[i]) / 2)) {
  27554. activeIndex = i;
  27555. } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
  27556. activeIndex = i + 1;
  27557. }
  27558. } else if (translate >= slidesGrid[i]) {
  27559. activeIndex = i;
  27560. }
  27561. }
  27562. // Normalize slideIndex
  27563. if (params.normalizeSlideIndex) {
  27564. if (activeIndex < 0 || typeof activeIndex === 'undefined') { activeIndex = 0; }
  27565. }
  27566. }
  27567. if (snapGrid.indexOf(translate) >= 0) {
  27568. snapIndex = snapGrid.indexOf(translate);
  27569. } else {
  27570. var skip = Math.min(params.slidesPerGroupSkip, activeIndex);
  27571. snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
  27572. }
  27573. if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
  27574. if (activeIndex === previousIndex) {
  27575. if (snapIndex !== previousSnapIndex) {
  27576. swiper.snapIndex = snapIndex;
  27577. swiper.emit('snapIndexChange');
  27578. }
  27579. return;
  27580. }
  27581. // Get real index
  27582. var realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);
  27583. Utils.extend(swiper, {
  27584. snapIndex: snapIndex,
  27585. realIndex: realIndex,
  27586. previousIndex: previousIndex,
  27587. activeIndex: activeIndex,
  27588. });
  27589. swiper.emit('activeIndexChange');
  27590. swiper.emit('snapIndexChange');
  27591. if (previousRealIndex !== realIndex) {
  27592. swiper.emit('realIndexChange');
  27593. }
  27594. if (swiper.initialized || swiper.params.runCallbacksOnInit) {
  27595. swiper.emit('slideChange');
  27596. }
  27597. }
  27598. function updateClickedSlide (e) {
  27599. var swiper = this;
  27600. var params = swiper.params;
  27601. var slide = $(e.target).closest(("." + (params.slideClass)))[0];
  27602. var slideFound = false;
  27603. if (slide) {
  27604. for (var i = 0; i < swiper.slides.length; i += 1) {
  27605. if (swiper.slides[i] === slide) { slideFound = true; }
  27606. }
  27607. }
  27608. if (slide && slideFound) {
  27609. swiper.clickedSlide = slide;
  27610. if (swiper.virtual && swiper.params.virtual.enabled) {
  27611. swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);
  27612. } else {
  27613. swiper.clickedIndex = $(slide).index();
  27614. }
  27615. } else {
  27616. swiper.clickedSlide = undefined;
  27617. swiper.clickedIndex = undefined;
  27618. return;
  27619. }
  27620. if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
  27621. swiper.slideToClickedSlide();
  27622. }
  27623. }
  27624. var update = {
  27625. updateSize: updateSize,
  27626. updateSlides: updateSlides,
  27627. updateAutoHeight: updateAutoHeight,
  27628. updateSlidesOffset: updateSlidesOffset,
  27629. updateSlidesProgress: updateSlidesProgress,
  27630. updateProgress: updateProgress,
  27631. updateSlidesClasses: updateSlidesClasses,
  27632. updateActiveIndex: updateActiveIndex,
  27633. updateClickedSlide: updateClickedSlide,
  27634. };
  27635. function getTranslate (axis) {
  27636. if ( axis === void 0 ) axis = this.isHorizontal() ? 'x' : 'y';
  27637. var swiper = this;
  27638. var params = swiper.params;
  27639. var rtl = swiper.rtlTranslate;
  27640. var translate = swiper.translate;
  27641. var $wrapperEl = swiper.$wrapperEl;
  27642. if (params.virtualTranslate) {
  27643. return rtl ? -translate : translate;
  27644. }
  27645. if (params.cssMode) {
  27646. return translate;
  27647. }
  27648. var currentTranslate = Utils.getTranslate($wrapperEl[0], axis);
  27649. if (rtl) { currentTranslate = -currentTranslate; }
  27650. return currentTranslate || 0;
  27651. }
  27652. function setTranslate (translate, byController) {
  27653. var swiper = this;
  27654. var rtl = swiper.rtlTranslate;
  27655. var params = swiper.params;
  27656. var $wrapperEl = swiper.$wrapperEl;
  27657. var wrapperEl = swiper.wrapperEl;
  27658. var progress = swiper.progress;
  27659. var x = 0;
  27660. var y = 0;
  27661. var z = 0;
  27662. if (swiper.isHorizontal()) {
  27663. x = rtl ? -translate : translate;
  27664. } else {
  27665. y = translate;
  27666. }
  27667. if (params.roundLengths) {
  27668. x = Math.floor(x);
  27669. y = Math.floor(y);
  27670. }
  27671. if (params.cssMode) {
  27672. wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
  27673. } else if (!params.virtualTranslate) {
  27674. $wrapperEl.transform(("translate3d(" + x + "px, " + y + "px, " + z + "px)"));
  27675. }
  27676. swiper.previousTranslate = swiper.translate;
  27677. swiper.translate = swiper.isHorizontal() ? x : y;
  27678. // Check if we need to update progress
  27679. var newProgress;
  27680. var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  27681. if (translatesDiff === 0) {
  27682. newProgress = 0;
  27683. } else {
  27684. newProgress = (translate - swiper.minTranslate()) / (translatesDiff);
  27685. }
  27686. if (newProgress !== progress) {
  27687. swiper.updateProgress(translate);
  27688. }
  27689. swiper.emit('setTranslate', swiper.translate, byController);
  27690. }
  27691. function minTranslate () {
  27692. return (-this.snapGrid[0]);
  27693. }
  27694. function maxTranslate () {
  27695. return (-this.snapGrid[this.snapGrid.length - 1]);
  27696. }
  27697. function translateTo (translate, speed, runCallbacks, translateBounds, internal) {
  27698. var obj;
  27699. if ( translate === void 0 ) translate = 0;
  27700. if ( speed === void 0 ) speed = this.params.speed;
  27701. if ( runCallbacks === void 0 ) runCallbacks = true;
  27702. if ( translateBounds === void 0 ) translateBounds = true;
  27703. var swiper = this;
  27704. var params = swiper.params;
  27705. var wrapperEl = swiper.wrapperEl;
  27706. if (swiper.animating && params.preventInteractionOnTransition) {
  27707. return false;
  27708. }
  27709. var minTranslate = swiper.minTranslate();
  27710. var maxTranslate = swiper.maxTranslate();
  27711. var newTranslate;
  27712. if (translateBounds && translate > minTranslate) { newTranslate = minTranslate; }
  27713. else if (translateBounds && translate < maxTranslate) { newTranslate = maxTranslate; }
  27714. else { newTranslate = translate; }
  27715. // Update progress
  27716. swiper.updateProgress(newTranslate);
  27717. if (params.cssMode) {
  27718. var isH = swiper.isHorizontal();
  27719. if (speed === 0) {
  27720. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
  27721. } else {
  27722. // eslint-disable-next-line
  27723. if (wrapperEl.scrollTo) {
  27724. wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = -newTranslate, obj.behavior = 'smooth', obj ));
  27725. } else {
  27726. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
  27727. }
  27728. }
  27729. return true;
  27730. }
  27731. if (speed === 0) {
  27732. swiper.setTransition(0);
  27733. swiper.setTranslate(newTranslate);
  27734. if (runCallbacks) {
  27735. swiper.emit('beforeTransitionStart', speed, internal);
  27736. swiper.emit('transitionEnd');
  27737. }
  27738. } else {
  27739. swiper.setTransition(speed);
  27740. swiper.setTranslate(newTranslate);
  27741. if (runCallbacks) {
  27742. swiper.emit('beforeTransitionStart', speed, internal);
  27743. swiper.emit('transitionStart');
  27744. }
  27745. if (!swiper.animating) {
  27746. swiper.animating = true;
  27747. if (!swiper.onTranslateToWrapperTransitionEnd) {
  27748. swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
  27749. if (!swiper || swiper.destroyed) { return; }
  27750. if (e.target !== this) { return; }
  27751. swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
  27752. swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
  27753. swiper.onTranslateToWrapperTransitionEnd = null;
  27754. delete swiper.onTranslateToWrapperTransitionEnd;
  27755. if (runCallbacks) {
  27756. swiper.emit('transitionEnd');
  27757. }
  27758. };
  27759. }
  27760. swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
  27761. swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);
  27762. }
  27763. }
  27764. return true;
  27765. }
  27766. var translate = {
  27767. getTranslate: getTranslate,
  27768. setTranslate: setTranslate,
  27769. minTranslate: minTranslate,
  27770. maxTranslate: maxTranslate,
  27771. translateTo: translateTo,
  27772. };
  27773. function setTransition (duration, byController) {
  27774. var swiper = this;
  27775. if (!swiper.params.cssMode) {
  27776. swiper.$wrapperEl.transition(duration);
  27777. }
  27778. swiper.emit('setTransition', duration, byController);
  27779. }
  27780. function transitionStart (runCallbacks, direction) {
  27781. if ( runCallbacks === void 0 ) runCallbacks = true;
  27782. var swiper = this;
  27783. var activeIndex = swiper.activeIndex;
  27784. var params = swiper.params;
  27785. var previousIndex = swiper.previousIndex;
  27786. if (params.cssMode) { return; }
  27787. if (params.autoHeight) {
  27788. swiper.updateAutoHeight();
  27789. }
  27790. var dir = direction;
  27791. if (!dir) {
  27792. if (activeIndex > previousIndex) { dir = 'next'; }
  27793. else if (activeIndex < previousIndex) { dir = 'prev'; }
  27794. else { dir = 'reset'; }
  27795. }
  27796. swiper.emit('transitionStart');
  27797. if (runCallbacks && activeIndex !== previousIndex) {
  27798. if (dir === 'reset') {
  27799. swiper.emit('slideResetTransitionStart');
  27800. return;
  27801. }
  27802. swiper.emit('slideChangeTransitionStart');
  27803. if (dir === 'next') {
  27804. swiper.emit('slideNextTransitionStart');
  27805. } else {
  27806. swiper.emit('slidePrevTransitionStart');
  27807. }
  27808. }
  27809. }
  27810. function transitionEnd$1 (runCallbacks, direction) {
  27811. if ( runCallbacks === void 0 ) runCallbacks = true;
  27812. var swiper = this;
  27813. var activeIndex = swiper.activeIndex;
  27814. var previousIndex = swiper.previousIndex;
  27815. var params = swiper.params;
  27816. swiper.animating = false;
  27817. if (params.cssMode) { return; }
  27818. swiper.setTransition(0);
  27819. var dir = direction;
  27820. if (!dir) {
  27821. if (activeIndex > previousIndex) { dir = 'next'; }
  27822. else if (activeIndex < previousIndex) { dir = 'prev'; }
  27823. else { dir = 'reset'; }
  27824. }
  27825. swiper.emit('transitionEnd');
  27826. if (runCallbacks && activeIndex !== previousIndex) {
  27827. if (dir === 'reset') {
  27828. swiper.emit('slideResetTransitionEnd');
  27829. return;
  27830. }
  27831. swiper.emit('slideChangeTransitionEnd');
  27832. if (dir === 'next') {
  27833. swiper.emit('slideNextTransitionEnd');
  27834. } else {
  27835. swiper.emit('slidePrevTransitionEnd');
  27836. }
  27837. }
  27838. }
  27839. var transition$1 = {
  27840. setTransition: setTransition,
  27841. transitionStart: transitionStart,
  27842. transitionEnd: transitionEnd$1,
  27843. };
  27844. function slideTo (index, speed, runCallbacks, internal) {
  27845. var obj;
  27846. if ( index === void 0 ) index = 0;
  27847. if ( speed === void 0 ) speed = this.params.speed;
  27848. if ( runCallbacks === void 0 ) runCallbacks = true;
  27849. var swiper = this;
  27850. var slideIndex = index;
  27851. if (slideIndex < 0) { slideIndex = 0; }
  27852. var params = swiper.params;
  27853. var snapGrid = swiper.snapGrid;
  27854. var slidesGrid = swiper.slidesGrid;
  27855. var previousIndex = swiper.previousIndex;
  27856. var activeIndex = swiper.activeIndex;
  27857. var rtl = swiper.rtlTranslate;
  27858. var wrapperEl = swiper.wrapperEl;
  27859. if (swiper.animating && params.preventInteractionOnTransition) {
  27860. return false;
  27861. }
  27862. var skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
  27863. var snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
  27864. if (snapIndex >= snapGrid.length) { snapIndex = snapGrid.length - 1; }
  27865. if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {
  27866. swiper.emit('beforeSlideChangeStart');
  27867. }
  27868. var translate = -snapGrid[snapIndex];
  27869. // Update progress
  27870. swiper.updateProgress(translate);
  27871. // Normalize slideIndex
  27872. if (params.normalizeSlideIndex) {
  27873. for (var i = 0; i < slidesGrid.length; i += 1) {
  27874. if (-Math.floor(translate * 100) >= Math.floor(slidesGrid[i] * 100)) {
  27875. slideIndex = i;
  27876. }
  27877. }
  27878. }
  27879. // Directions locks
  27880. if (swiper.initialized && slideIndex !== activeIndex) {
  27881. if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {
  27882. return false;
  27883. }
  27884. if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
  27885. if ((activeIndex || 0) !== slideIndex) { return false; }
  27886. }
  27887. }
  27888. var direction;
  27889. if (slideIndex > activeIndex) { direction = 'next'; }
  27890. else if (slideIndex < activeIndex) { direction = 'prev'; }
  27891. else { direction = 'reset'; }
  27892. // Update Index
  27893. if ((rtl && -translate === swiper.translate) || (!rtl && translate === swiper.translate)) {
  27894. swiper.updateActiveIndex(slideIndex);
  27895. // Update Height
  27896. if (params.autoHeight) {
  27897. swiper.updateAutoHeight();
  27898. }
  27899. swiper.updateSlidesClasses();
  27900. if (params.effect !== 'slide') {
  27901. swiper.setTranslate(translate);
  27902. }
  27903. if (direction !== 'reset') {
  27904. swiper.transitionStart(runCallbacks, direction);
  27905. swiper.transitionEnd(runCallbacks, direction);
  27906. }
  27907. return false;
  27908. }
  27909. if (params.cssMode) {
  27910. var isH = swiper.isHorizontal();
  27911. var t = -translate;
  27912. if (rtl) {
  27913. t = wrapperEl.scrollWidth - wrapperEl.offsetWidth - t;
  27914. }
  27915. if (speed === 0) {
  27916. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
  27917. } else {
  27918. // eslint-disable-next-line
  27919. if (wrapperEl.scrollTo) {
  27920. wrapperEl.scrollTo(( obj = {}, obj[isH ? 'left' : 'top'] = t, obj.behavior = 'smooth', obj ));
  27921. } else {
  27922. wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
  27923. }
  27924. }
  27925. return true;
  27926. }
  27927. if (speed === 0) {
  27928. swiper.setTransition(0);
  27929. swiper.setTranslate(translate);
  27930. swiper.updateActiveIndex(slideIndex);
  27931. swiper.updateSlidesClasses();
  27932. swiper.emit('beforeTransitionStart', speed, internal);
  27933. swiper.transitionStart(runCallbacks, direction);
  27934. swiper.transitionEnd(runCallbacks, direction);
  27935. } else {
  27936. swiper.setTransition(speed);
  27937. swiper.setTranslate(translate);
  27938. swiper.updateActiveIndex(slideIndex);
  27939. swiper.updateSlidesClasses();
  27940. swiper.emit('beforeTransitionStart', speed, internal);
  27941. swiper.transitionStart(runCallbacks, direction);
  27942. if (!swiper.animating) {
  27943. swiper.animating = true;
  27944. if (!swiper.onSlideToWrapperTransitionEnd) {
  27945. swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
  27946. if (!swiper || swiper.destroyed) { return; }
  27947. if (e.target !== this) { return; }
  27948. swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
  27949. swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
  27950. swiper.onSlideToWrapperTransitionEnd = null;
  27951. delete swiper.onSlideToWrapperTransitionEnd;
  27952. swiper.transitionEnd(runCallbacks, direction);
  27953. };
  27954. }
  27955. swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
  27956. swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);
  27957. }
  27958. }
  27959. return true;
  27960. }
  27961. function slideToLoop (index, speed, runCallbacks, internal) {
  27962. if ( index === void 0 ) index = 0;
  27963. if ( speed === void 0 ) speed = this.params.speed;
  27964. if ( runCallbacks === void 0 ) runCallbacks = true;
  27965. var swiper = this;
  27966. var newIndex = index;
  27967. if (swiper.params.loop) {
  27968. newIndex += swiper.loopedSlides;
  27969. }
  27970. return swiper.slideTo(newIndex, speed, runCallbacks, internal);
  27971. }
  27972. /* eslint no-unused-vars: "off" */
  27973. function slideNext (speed, runCallbacks, internal) {
  27974. if ( speed === void 0 ) speed = this.params.speed;
  27975. if ( runCallbacks === void 0 ) runCallbacks = true;
  27976. var swiper = this;
  27977. var params = swiper.params;
  27978. var animating = swiper.animating;
  27979. var increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup;
  27980. if (params.loop) {
  27981. if (animating) { return false; }
  27982. swiper.loopFix();
  27983. // eslint-disable-next-line
  27984. swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
  27985. }
  27986. return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
  27987. }
  27988. /* eslint no-unused-vars: "off" */
  27989. function slidePrev (speed, runCallbacks, internal) {
  27990. if ( speed === void 0 ) speed = this.params.speed;
  27991. if ( runCallbacks === void 0 ) runCallbacks = true;
  27992. var swiper = this;
  27993. var params = swiper.params;
  27994. var animating = swiper.animating;
  27995. var snapGrid = swiper.snapGrid;
  27996. var slidesGrid = swiper.slidesGrid;
  27997. var rtlTranslate = swiper.rtlTranslate;
  27998. if (params.loop) {
  27999. if (animating) { return false; }
  28000. swiper.loopFix();
  28001. // eslint-disable-next-line
  28002. swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
  28003. }
  28004. var translate = rtlTranslate ? swiper.translate : -swiper.translate;
  28005. function normalize(val) {
  28006. if (val < 0) { return -Math.floor(Math.abs(val)); }
  28007. return Math.floor(val);
  28008. }
  28009. var normalizedTranslate = normalize(translate);
  28010. var normalizedSnapGrid = snapGrid.map(function (val) { return normalize(val); });
  28011. var normalizedSlidesGrid = slidesGrid.map(function (val) { return normalize(val); });
  28012. var currentSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate)];
  28013. var prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
  28014. if (typeof prevSnap === 'undefined' && params.cssMode) {
  28015. snapGrid.forEach(function (snap) {
  28016. if (!prevSnap && normalizedTranslate >= snap) { prevSnap = snap; }
  28017. });
  28018. }
  28019. var prevIndex;
  28020. if (typeof prevSnap !== 'undefined') {
  28021. prevIndex = slidesGrid.indexOf(prevSnap);
  28022. if (prevIndex < 0) { prevIndex = swiper.activeIndex - 1; }
  28023. }
  28024. return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
  28025. }
  28026. /* eslint no-unused-vars: "off" */
  28027. function slideReset (speed, runCallbacks, internal) {
  28028. if ( speed === void 0 ) speed = this.params.speed;
  28029. if ( runCallbacks === void 0 ) runCallbacks = true;
  28030. var swiper = this;
  28031. return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
  28032. }
  28033. /* eslint no-unused-vars: "off" */
  28034. function slideToClosest (speed, runCallbacks, internal, threshold) {
  28035. if ( speed === void 0 ) speed = this.params.speed;
  28036. if ( runCallbacks === void 0 ) runCallbacks = true;
  28037. if ( threshold === void 0 ) threshold = 0.5;
  28038. var swiper = this;
  28039. var index = swiper.activeIndex;
  28040. var skip = Math.min(swiper.params.slidesPerGroupSkip, index);
  28041. var snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
  28042. var translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
  28043. if (translate >= swiper.snapGrid[snapIndex]) {
  28044. // The current translate is on or after the current snap index, so the choice
  28045. // is between the current index and the one after it.
  28046. var currentSnap = swiper.snapGrid[snapIndex];
  28047. var nextSnap = swiper.snapGrid[snapIndex + 1];
  28048. if ((translate - currentSnap) > (nextSnap - currentSnap) * threshold) {
  28049. index += swiper.params.slidesPerGroup;
  28050. }
  28051. } else {
  28052. // The current translate is before the current snap index, so the choice
  28053. // is between the current index and the one before it.
  28054. var prevSnap = swiper.snapGrid[snapIndex - 1];
  28055. var currentSnap$1 = swiper.snapGrid[snapIndex];
  28056. if ((translate - prevSnap) <= (currentSnap$1 - prevSnap) * threshold) {
  28057. index -= swiper.params.slidesPerGroup;
  28058. }
  28059. }
  28060. index = Math.max(index, 0);
  28061. index = Math.min(index, swiper.slidesGrid.length - 1);
  28062. return swiper.slideTo(index, speed, runCallbacks, internal);
  28063. }
  28064. function slideToClickedSlide () {
  28065. var swiper = this;
  28066. var params = swiper.params;
  28067. var $wrapperEl = swiper.$wrapperEl;
  28068. var slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
  28069. var slideToIndex = swiper.clickedIndex;
  28070. var realIndex;
  28071. if (params.loop) {
  28072. if (swiper.animating) { return; }
  28073. realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);
  28074. if (params.centeredSlides) {
  28075. if (
  28076. (slideToIndex < swiper.loopedSlides - (slidesPerView / 2))
  28077. || (slideToIndex > (swiper.slides.length - swiper.loopedSlides) + (slidesPerView / 2))
  28078. ) {
  28079. swiper.loopFix();
  28080. slideToIndex = $wrapperEl
  28081. .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
  28082. .eq(0)
  28083. .index();
  28084. Utils.nextTick(function () {
  28085. swiper.slideTo(slideToIndex);
  28086. });
  28087. } else {
  28088. swiper.slideTo(slideToIndex);
  28089. }
  28090. } else if (slideToIndex > swiper.slides.length - slidesPerView) {
  28091. swiper.loopFix();
  28092. slideToIndex = $wrapperEl
  28093. .children(("." + (params.slideClass) + "[data-swiper-slide-index=\"" + realIndex + "\"]:not(." + (params.slideDuplicateClass) + ")"))
  28094. .eq(0)
  28095. .index();
  28096. Utils.nextTick(function () {
  28097. swiper.slideTo(slideToIndex);
  28098. });
  28099. } else {
  28100. swiper.slideTo(slideToIndex);
  28101. }
  28102. } else {
  28103. swiper.slideTo(slideToIndex);
  28104. }
  28105. }
  28106. var slide = {
  28107. slideTo: slideTo,
  28108. slideToLoop: slideToLoop,
  28109. slideNext: slideNext,
  28110. slidePrev: slidePrev,
  28111. slideReset: slideReset,
  28112. slideToClosest: slideToClosest,
  28113. slideToClickedSlide: slideToClickedSlide,
  28114. };
  28115. function loopCreate () {
  28116. var swiper = this;
  28117. var params = swiper.params;
  28118. var $wrapperEl = swiper.$wrapperEl;
  28119. // Remove duplicated slides
  28120. $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass))).remove();
  28121. var slides = $wrapperEl.children(("." + (params.slideClass)));
  28122. if (params.loopFillGroupWithBlank) {
  28123. var blankSlidesNum = params.slidesPerGroup - (slides.length % params.slidesPerGroup);
  28124. if (blankSlidesNum !== params.slidesPerGroup) {
  28125. for (var i = 0; i < blankSlidesNum; i += 1) {
  28126. var blankNode = $(doc.createElement('div')).addClass(((params.slideClass) + " " + (params.slideBlankClass)));
  28127. $wrapperEl.append(blankNode);
  28128. }
  28129. slides = $wrapperEl.children(("." + (params.slideClass)));
  28130. }
  28131. }
  28132. if (params.slidesPerView === 'auto' && !params.loopedSlides) { params.loopedSlides = slides.length; }
  28133. swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));
  28134. swiper.loopedSlides += params.loopAdditionalSlides;
  28135. if (swiper.loopedSlides > slides.length) {
  28136. swiper.loopedSlides = slides.length;
  28137. }
  28138. var prependSlides = [];
  28139. var appendSlides = [];
  28140. slides.each(function (index, el) {
  28141. var slide = $(el);
  28142. if (index < swiper.loopedSlides) { appendSlides.push(el); }
  28143. if (index < slides.length && index >= slides.length - swiper.loopedSlides) { prependSlides.push(el); }
  28144. slide.attr('data-swiper-slide-index', index);
  28145. });
  28146. for (var i$1 = 0; i$1 < appendSlides.length; i$1 += 1) {
  28147. $wrapperEl.append($(appendSlides[i$1].cloneNode(true)).addClass(params.slideDuplicateClass));
  28148. }
  28149. for (var i$2 = prependSlides.length - 1; i$2 >= 0; i$2 -= 1) {
  28150. $wrapperEl.prepend($(prependSlides[i$2].cloneNode(true)).addClass(params.slideDuplicateClass));
  28151. }
  28152. }
  28153. function loopFix () {
  28154. var swiper = this;
  28155. swiper.emit('beforeLoopFix');
  28156. var activeIndex = swiper.activeIndex;
  28157. var slides = swiper.slides;
  28158. var loopedSlides = swiper.loopedSlides;
  28159. var allowSlidePrev = swiper.allowSlidePrev;
  28160. var allowSlideNext = swiper.allowSlideNext;
  28161. var snapGrid = swiper.snapGrid;
  28162. var rtl = swiper.rtlTranslate;
  28163. var newIndex;
  28164. swiper.allowSlidePrev = true;
  28165. swiper.allowSlideNext = true;
  28166. var snapTranslate = -snapGrid[activeIndex];
  28167. var diff = snapTranslate - swiper.getTranslate();
  28168. // Fix For Negative Oversliding
  28169. if (activeIndex < loopedSlides) {
  28170. newIndex = (slides.length - (loopedSlides * 3)) + activeIndex;
  28171. newIndex += loopedSlides;
  28172. var slideChanged = swiper.slideTo(newIndex, 0, false, true);
  28173. if (slideChanged && diff !== 0) {
  28174. swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
  28175. }
  28176. } else if (activeIndex >= slides.length - loopedSlides) {
  28177. // Fix For Positive Oversliding
  28178. newIndex = -slides.length + activeIndex + loopedSlides;
  28179. newIndex += loopedSlides;
  28180. var slideChanged$1 = swiper.slideTo(newIndex, 0, false, true);
  28181. if (slideChanged$1 && diff !== 0) {
  28182. swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);
  28183. }
  28184. }
  28185. swiper.allowSlidePrev = allowSlidePrev;
  28186. swiper.allowSlideNext = allowSlideNext;
  28187. swiper.emit('loopFix');
  28188. }
  28189. function loopDestroy () {
  28190. var swiper = this;
  28191. var $wrapperEl = swiper.$wrapperEl;
  28192. var params = swiper.params;
  28193. var slides = swiper.slides;
  28194. $wrapperEl.children(("." + (params.slideClass) + "." + (params.slideDuplicateClass) + ",." + (params.slideClass) + "." + (params.slideBlankClass))).remove();
  28195. slides.removeAttr('data-swiper-slide-index');
  28196. }
  28197. var loop = {
  28198. loopCreate: loopCreate,
  28199. loopFix: loopFix,
  28200. loopDestroy: loopDestroy,
  28201. };
  28202. function setGrabCursor (moving) {
  28203. var swiper = this;
  28204. if (Support.touch || !swiper.params.simulateTouch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
  28205. var el = swiper.el;
  28206. el.style.cursor = 'move';
  28207. el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';
  28208. el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';
  28209. el.style.cursor = moving ? 'grabbing' : 'grab';
  28210. }
  28211. function unsetGrabCursor () {
  28212. var swiper = this;
  28213. if (Support.touch || (swiper.params.watchOverflow && swiper.isLocked) || swiper.params.cssMode) { return; }
  28214. swiper.el.style.cursor = '';
  28215. }
  28216. var grabCursor = {
  28217. setGrabCursor: setGrabCursor,
  28218. unsetGrabCursor: unsetGrabCursor,
  28219. };
  28220. function appendSlide (slides) {
  28221. var swiper = this;
  28222. var $wrapperEl = swiper.$wrapperEl;
  28223. var params = swiper.params;
  28224. if (params.loop) {
  28225. swiper.loopDestroy();
  28226. }
  28227. if (typeof slides === 'object' && 'length' in slides) {
  28228. for (var i = 0; i < slides.length; i += 1) {
  28229. if (slides[i]) { $wrapperEl.append(slides[i]); }
  28230. }
  28231. } else {
  28232. $wrapperEl.append(slides);
  28233. }
  28234. if (params.loop) {
  28235. swiper.loopCreate();
  28236. }
  28237. if (!(params.observer && Support.observer)) {
  28238. swiper.update();
  28239. }
  28240. }
  28241. function prependSlide (slides) {
  28242. var swiper = this;
  28243. var params = swiper.params;
  28244. var $wrapperEl = swiper.$wrapperEl;
  28245. var activeIndex = swiper.activeIndex;
  28246. if (params.loop) {
  28247. swiper.loopDestroy();
  28248. }
  28249. var newActiveIndex = activeIndex + 1;
  28250. if (typeof slides === 'object' && 'length' in slides) {
  28251. for (var i = 0; i < slides.length; i += 1) {
  28252. if (slides[i]) { $wrapperEl.prepend(slides[i]); }
  28253. }
  28254. newActiveIndex = activeIndex + slides.length;
  28255. } else {
  28256. $wrapperEl.prepend(slides);
  28257. }
  28258. if (params.loop) {
  28259. swiper.loopCreate();
  28260. }
  28261. if (!(params.observer && Support.observer)) {
  28262. swiper.update();
  28263. }
  28264. swiper.slideTo(newActiveIndex, 0, false);
  28265. }
  28266. function addSlide (index, slides) {
  28267. var swiper = this;
  28268. var $wrapperEl = swiper.$wrapperEl;
  28269. var params = swiper.params;
  28270. var activeIndex = swiper.activeIndex;
  28271. var activeIndexBuffer = activeIndex;
  28272. if (params.loop) {
  28273. activeIndexBuffer -= swiper.loopedSlides;
  28274. swiper.loopDestroy();
  28275. swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
  28276. }
  28277. var baseLength = swiper.slides.length;
  28278. if (index <= 0) {
  28279. swiper.prependSlide(slides);
  28280. return;
  28281. }
  28282. if (index >= baseLength) {
  28283. swiper.appendSlide(slides);
  28284. return;
  28285. }
  28286. var newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
  28287. var slidesBuffer = [];
  28288. for (var i = baseLength - 1; i >= index; i -= 1) {
  28289. var currentSlide = swiper.slides.eq(i);
  28290. currentSlide.remove();
  28291. slidesBuffer.unshift(currentSlide);
  28292. }
  28293. if (typeof slides === 'object' && 'length' in slides) {
  28294. for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
  28295. if (slides[i$1]) { $wrapperEl.append(slides[i$1]); }
  28296. }
  28297. newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
  28298. } else {
  28299. $wrapperEl.append(slides);
  28300. }
  28301. for (var i$2 = 0; i$2 < slidesBuffer.length; i$2 += 1) {
  28302. $wrapperEl.append(slidesBuffer[i$2]);
  28303. }
  28304. if (params.loop) {
  28305. swiper.loopCreate();
  28306. }
  28307. if (!(params.observer && Support.observer)) {
  28308. swiper.update();
  28309. }
  28310. if (params.loop) {
  28311. swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
  28312. } else {
  28313. swiper.slideTo(newActiveIndex, 0, false);
  28314. }
  28315. }
  28316. function removeSlide (slidesIndexes) {
  28317. var swiper = this;
  28318. var params = swiper.params;
  28319. var $wrapperEl = swiper.$wrapperEl;
  28320. var activeIndex = swiper.activeIndex;
  28321. var activeIndexBuffer = activeIndex;
  28322. if (params.loop) {
  28323. activeIndexBuffer -= swiper.loopedSlides;
  28324. swiper.loopDestroy();
  28325. swiper.slides = $wrapperEl.children(("." + (params.slideClass)));
  28326. }
  28327. var newActiveIndex = activeIndexBuffer;
  28328. var indexToRemove;
  28329. if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
  28330. for (var i = 0; i < slidesIndexes.length; i += 1) {
  28331. indexToRemove = slidesIndexes[i];
  28332. if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
  28333. if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
  28334. }
  28335. newActiveIndex = Math.max(newActiveIndex, 0);
  28336. } else {
  28337. indexToRemove = slidesIndexes;
  28338. if (swiper.slides[indexToRemove]) { swiper.slides.eq(indexToRemove).remove(); }
  28339. if (indexToRemove < newActiveIndex) { newActiveIndex -= 1; }
  28340. newActiveIndex = Math.max(newActiveIndex, 0);
  28341. }
  28342. if (params.loop) {
  28343. swiper.loopCreate();
  28344. }
  28345. if (!(params.observer && Support.observer)) {
  28346. swiper.update();
  28347. }
  28348. if (params.loop) {
  28349. swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
  28350. } else {
  28351. swiper.slideTo(newActiveIndex, 0, false);
  28352. }
  28353. }
  28354. function removeAllSlides () {
  28355. var swiper = this;
  28356. var slidesIndexes = [];
  28357. for (var i = 0; i < swiper.slides.length; i += 1) {
  28358. slidesIndexes.push(i);
  28359. }
  28360. swiper.removeSlide(slidesIndexes);
  28361. }
  28362. var manipulation = {
  28363. appendSlide: appendSlide,
  28364. prependSlide: prependSlide,
  28365. addSlide: addSlide,
  28366. removeSlide: removeSlide,
  28367. removeAllSlides: removeAllSlides,
  28368. };
  28369. function onTouchStart (event) {
  28370. var swiper = this;
  28371. var data = swiper.touchEventsData;
  28372. var params = swiper.params;
  28373. var touches = swiper.touches;
  28374. if (swiper.animating && params.preventInteractionOnTransition) {
  28375. return;
  28376. }
  28377. var e = event;
  28378. if (e.originalEvent) { e = e.originalEvent; }
  28379. var $targetEl = $(e.target);
  28380. if (params.touchEventsTarget === 'wrapper') {
  28381. if (!$targetEl.closest(swiper.wrapperEl).length) { return; }
  28382. }
  28383. data.isTouchEvent = e.type === 'touchstart';
  28384. if (!data.isTouchEvent && 'which' in e && e.which === 3) { return; }
  28385. if (!data.isTouchEvent && 'button' in e && e.button > 0) { return; }
  28386. if (data.isTouched && data.isMoved) { return; }
  28387. if (params.noSwiping && $targetEl.closest(params.noSwipingSelector ? params.noSwipingSelector : ("." + (params.noSwipingClass)))[0]) {
  28388. swiper.allowClick = true;
  28389. return;
  28390. }
  28391. if (params.swipeHandler) {
  28392. if (!$targetEl.closest(params.swipeHandler)[0]) { return; }
  28393. }
  28394. touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  28395. touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  28396. var startX = touches.currentX;
  28397. var startY = touches.currentY;
  28398. // Do NOT start if iOS edge swipe is detected. Otherwise iOS app (UIWebView) cannot swipe-to-go-back anymore
  28399. var edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;
  28400. var edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;
  28401. if (
  28402. edgeSwipeDetection
  28403. && ((startX <= edgeSwipeThreshold)
  28404. || (startX >= win.screen.width - edgeSwipeThreshold))
  28405. ) {
  28406. return;
  28407. }
  28408. Utils.extend(data, {
  28409. isTouched: true,
  28410. isMoved: false,
  28411. allowTouchCallbacks: true,
  28412. isScrolling: undefined,
  28413. startMoving: undefined,
  28414. });
  28415. touches.startX = startX;
  28416. touches.startY = startY;
  28417. data.touchStartTime = Utils.now();
  28418. swiper.allowClick = true;
  28419. swiper.updateSize();
  28420. swiper.swipeDirection = undefined;
  28421. if (params.threshold > 0) { data.allowThresholdMove = false; }
  28422. if (e.type !== 'touchstart') {
  28423. var preventDefault = true;
  28424. if ($targetEl.is(data.formElements)) { preventDefault = false; }
  28425. if (
  28426. doc.activeElement
  28427. && $(doc.activeElement).is(data.formElements)
  28428. && doc.activeElement !== $targetEl[0]
  28429. ) {
  28430. doc.activeElement.blur();
  28431. }
  28432. var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
  28433. if (params.touchStartForcePreventDefault || shouldPreventDefault) {
  28434. e.preventDefault();
  28435. }
  28436. }
  28437. swiper.emit('touchStart', e);
  28438. }
  28439. function onTouchMove (event) {
  28440. var swiper = this;
  28441. var data = swiper.touchEventsData;
  28442. var params = swiper.params;
  28443. var touches = swiper.touches;
  28444. var rtl = swiper.rtlTranslate;
  28445. var e = event;
  28446. if (e.originalEvent) { e = e.originalEvent; }
  28447. if (!data.isTouched) {
  28448. if (data.startMoving && data.isScrolling) {
  28449. swiper.emit('touchMoveOpposite', e);
  28450. }
  28451. return;
  28452. }
  28453. if (data.isTouchEvent && e.type !== 'touchmove') { return; }
  28454. var targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);
  28455. var pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;
  28456. var pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;
  28457. if (e.preventedByNestedSwiper) {
  28458. touches.startX = pageX;
  28459. touches.startY = pageY;
  28460. return;
  28461. }
  28462. if (!swiper.allowTouchMove) {
  28463. // isMoved = true;
  28464. swiper.allowClick = false;
  28465. if (data.isTouched) {
  28466. Utils.extend(touches, {
  28467. startX: pageX,
  28468. startY: pageY,
  28469. currentX: pageX,
  28470. currentY: pageY,
  28471. });
  28472. data.touchStartTime = Utils.now();
  28473. }
  28474. return;
  28475. }
  28476. if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {
  28477. if (swiper.isVertical()) {
  28478. // Vertical
  28479. if (
  28480. (pageY < touches.startY && swiper.translate <= swiper.maxTranslate())
  28481. || (pageY > touches.startY && swiper.translate >= swiper.minTranslate())
  28482. ) {
  28483. data.isTouched = false;
  28484. data.isMoved = false;
  28485. return;
  28486. }
  28487. } else if (
  28488. (pageX < touches.startX && swiper.translate <= swiper.maxTranslate())
  28489. || (pageX > touches.startX && swiper.translate >= swiper.minTranslate())
  28490. ) {
  28491. return;
  28492. }
  28493. }
  28494. if (data.isTouchEvent && doc.activeElement) {
  28495. if (e.target === doc.activeElement && $(e.target).is(data.formElements)) {
  28496. data.isMoved = true;
  28497. swiper.allowClick = false;
  28498. return;
  28499. }
  28500. }
  28501. if (data.allowTouchCallbacks) {
  28502. swiper.emit('touchMove', e);
  28503. }
  28504. if (e.targetTouches && e.targetTouches.length > 1) { return; }
  28505. touches.currentX = pageX;
  28506. touches.currentY = pageY;
  28507. var diffX = touches.currentX - touches.startX;
  28508. var diffY = touches.currentY - touches.startY;
  28509. if (swiper.params.threshold && Math.sqrt((Math.pow( diffX, 2 )) + (Math.pow( diffY, 2 ))) < swiper.params.threshold) { return; }
  28510. if (typeof data.isScrolling === 'undefined') {
  28511. var touchAngle;
  28512. if ((swiper.isHorizontal() && touches.currentY === touches.startY) || (swiper.isVertical() && touches.currentX === touches.startX)) {
  28513. data.isScrolling = false;
  28514. } else {
  28515. // eslint-disable-next-line
  28516. if ((diffX * diffX) + (diffY * diffY) >= 25) {
  28517. touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;
  28518. data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : (90 - touchAngle > params.touchAngle);
  28519. }
  28520. }
  28521. }
  28522. if (data.isScrolling) {
  28523. swiper.emit('touchMoveOpposite', e);
  28524. }
  28525. if (typeof data.startMoving === 'undefined') {
  28526. if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
  28527. data.startMoving = true;
  28528. }
  28529. }
  28530. if (data.isScrolling) {
  28531. data.isTouched = false;
  28532. return;
  28533. }
  28534. if (!data.startMoving) {
  28535. return;
  28536. }
  28537. swiper.allowClick = false;
  28538. if (!params.cssMode && e.cancelable) {
  28539. e.preventDefault();
  28540. }
  28541. if (params.touchMoveStopPropagation && !params.nested) {
  28542. e.stopPropagation();
  28543. }
  28544. if (!data.isMoved) {
  28545. if (params.loop) {
  28546. swiper.loopFix();
  28547. }
  28548. data.startTranslate = swiper.getTranslate();
  28549. swiper.setTransition(0);
  28550. if (swiper.animating) {
  28551. swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');
  28552. }
  28553. data.allowMomentumBounce = false;
  28554. // Grab Cursor
  28555. if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
  28556. swiper.setGrabCursor(true);
  28557. }
  28558. swiper.emit('sliderFirstMove', e);
  28559. }
  28560. swiper.emit('sliderMove', e);
  28561. data.isMoved = true;
  28562. var diff = swiper.isHorizontal() ? diffX : diffY;
  28563. touches.diff = diff;
  28564. diff *= params.touchRatio;
  28565. if (rtl) { diff = -diff; }
  28566. swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
  28567. data.currentTranslate = diff + data.startTranslate;
  28568. var disableParentSwiper = true;
  28569. var resistanceRatio = params.resistanceRatio;
  28570. if (params.touchReleaseOnEdges) {
  28571. resistanceRatio = 0;
  28572. }
  28573. if ((diff > 0 && data.currentTranslate > swiper.minTranslate())) {
  28574. disableParentSwiper = false;
  28575. if (params.resistance) { data.currentTranslate = (swiper.minTranslate() - 1) + (Math.pow( (-swiper.minTranslate() + data.startTranslate + diff), resistanceRatio )); }
  28576. } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {
  28577. disableParentSwiper = false;
  28578. if (params.resistance) { data.currentTranslate = (swiper.maxTranslate() + 1) - (Math.pow( (swiper.maxTranslate() - data.startTranslate - diff), resistanceRatio )); }
  28579. }
  28580. if (disableParentSwiper) {
  28581. e.preventedByNestedSwiper = true;
  28582. }
  28583. // Directions locks
  28584. if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
  28585. data.currentTranslate = data.startTranslate;
  28586. }
  28587. if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
  28588. data.currentTranslate = data.startTranslate;
  28589. }
  28590. // Threshold
  28591. if (params.threshold > 0) {
  28592. if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
  28593. if (!data.allowThresholdMove) {
  28594. data.allowThresholdMove = true;
  28595. touches.startX = touches.currentX;
  28596. touches.startY = touches.currentY;
  28597. data.currentTranslate = data.startTranslate;
  28598. touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
  28599. return;
  28600. }
  28601. } else {
  28602. data.currentTranslate = data.startTranslate;
  28603. return;
  28604. }
  28605. }
  28606. if (!params.followFinger || params.cssMode) { return; }
  28607. // Update active index in free mode
  28608. if (params.freeMode || params.watchSlidesProgress || params.watchSlidesVisibility) {
  28609. swiper.updateActiveIndex();
  28610. swiper.updateSlidesClasses();
  28611. }
  28612. if (params.freeMode) {
  28613. // Velocity
  28614. if (data.velocities.length === 0) {
  28615. data.velocities.push({
  28616. position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
  28617. time: data.touchStartTime,
  28618. });
  28619. }
  28620. data.velocities.push({
  28621. position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
  28622. time: Utils.now(),
  28623. });
  28624. }
  28625. // Update progress
  28626. swiper.updateProgress(data.currentTranslate);
  28627. // Update translate
  28628. swiper.setTranslate(data.currentTranslate);
  28629. }
  28630. function onTouchEnd (event) {
  28631. var swiper = this;
  28632. var data = swiper.touchEventsData;
  28633. var params = swiper.params;
  28634. var touches = swiper.touches;
  28635. var rtl = swiper.rtlTranslate;
  28636. var $wrapperEl = swiper.$wrapperEl;
  28637. var slidesGrid = swiper.slidesGrid;
  28638. var snapGrid = swiper.snapGrid;
  28639. var e = event;
  28640. if (e.originalEvent) { e = e.originalEvent; }
  28641. if (data.allowTouchCallbacks) {
  28642. swiper.emit('touchEnd', e);
  28643. }
  28644. data.allowTouchCallbacks = false;
  28645. if (!data.isTouched) {
  28646. if (data.isMoved && params.grabCursor) {
  28647. swiper.setGrabCursor(false);
  28648. }
  28649. data.isMoved = false;
  28650. data.startMoving = false;
  28651. return;
  28652. }
  28653. // Return Grab Cursor
  28654. if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
  28655. swiper.setGrabCursor(false);
  28656. }
  28657. // Time diff
  28658. var touchEndTime = Utils.now();
  28659. var timeDiff = touchEndTime - data.touchStartTime;
  28660. // Tap, doubleTap, Click
  28661. if (swiper.allowClick) {
  28662. swiper.updateClickedSlide(e);
  28663. swiper.emit('tap click', e);
  28664. if (timeDiff < 300 && (touchEndTime - data.lastClickTime) < 300) {
  28665. swiper.emit('doubleTap doubleClick', e);
  28666. }
  28667. }
  28668. data.lastClickTime = Utils.now();
  28669. Utils.nextTick(function () {
  28670. if (!swiper.destroyed) { swiper.allowClick = true; }
  28671. });
  28672. if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {
  28673. data.isTouched = false;
  28674. data.isMoved = false;
  28675. data.startMoving = false;
  28676. return;
  28677. }
  28678. data.isTouched = false;
  28679. data.isMoved = false;
  28680. data.startMoving = false;
  28681. var currentPos;
  28682. if (params.followFinger) {
  28683. currentPos = rtl ? swiper.translate : -swiper.translate;
  28684. } else {
  28685. currentPos = -data.currentTranslate;
  28686. }
  28687. if (params.cssMode) {
  28688. return;
  28689. }
  28690. if (params.freeMode) {
  28691. if (currentPos < -swiper.minTranslate()) {
  28692. swiper.slideTo(swiper.activeIndex);
  28693. return;
  28694. }
  28695. if (currentPos > -swiper.maxTranslate()) {
  28696. if (swiper.slides.length < snapGrid.length) {
  28697. swiper.slideTo(snapGrid.length - 1);
  28698. } else {
  28699. swiper.slideTo(swiper.slides.length - 1);
  28700. }
  28701. return;
  28702. }
  28703. if (params.freeModeMomentum) {
  28704. if (data.velocities.length > 1) {
  28705. var lastMoveEvent = data.velocities.pop();
  28706. var velocityEvent = data.velocities.pop();
  28707. var distance = lastMoveEvent.position - velocityEvent.position;
  28708. var time = lastMoveEvent.time - velocityEvent.time;
  28709. swiper.velocity = distance / time;
  28710. swiper.velocity /= 2;
  28711. if (Math.abs(swiper.velocity) < params.freeModeMinimumVelocity) {
  28712. swiper.velocity = 0;
  28713. }
  28714. // this implies that the user stopped moving a finger then released.
  28715. // There would be no events with distance zero, so the last event is stale.
  28716. if (time > 150 || (Utils.now() - lastMoveEvent.time) > 300) {
  28717. swiper.velocity = 0;
  28718. }
  28719. } else {
  28720. swiper.velocity = 0;
  28721. }
  28722. swiper.velocity *= params.freeModeMomentumVelocityRatio;
  28723. data.velocities.length = 0;
  28724. var momentumDuration = 1000 * params.freeModeMomentumRatio;
  28725. var momentumDistance = swiper.velocity * momentumDuration;
  28726. var newPosition = swiper.translate + momentumDistance;
  28727. if (rtl) { newPosition = -newPosition; }
  28728. var doBounce = false;
  28729. var afterBouncePosition;
  28730. var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeModeMomentumBounceRatio;
  28731. var needsLoopFix;
  28732. if (newPosition < swiper.maxTranslate()) {
  28733. if (params.freeModeMomentumBounce) {
  28734. if (newPosition + swiper.maxTranslate() < -bounceAmount) {
  28735. newPosition = swiper.maxTranslate() - bounceAmount;
  28736. }
  28737. afterBouncePosition = swiper.maxTranslate();
  28738. doBounce = true;
  28739. data.allowMomentumBounce = true;
  28740. } else {
  28741. newPosition = swiper.maxTranslate();
  28742. }
  28743. if (params.loop && params.centeredSlides) { needsLoopFix = true; }
  28744. } else if (newPosition > swiper.minTranslate()) {
  28745. if (params.freeModeMomentumBounce) {
  28746. if (newPosition - swiper.minTranslate() > bounceAmount) {
  28747. newPosition = swiper.minTranslate() + bounceAmount;
  28748. }
  28749. afterBouncePosition = swiper.minTranslate();
  28750. doBounce = true;
  28751. data.allowMomentumBounce = true;
  28752. } else {
  28753. newPosition = swiper.minTranslate();
  28754. }
  28755. if (params.loop && params.centeredSlides) { needsLoopFix = true; }
  28756. } else if (params.freeModeSticky) {
  28757. var nextSlide;
  28758. for (var j = 0; j < snapGrid.length; j += 1) {
  28759. if (snapGrid[j] > -newPosition) {
  28760. nextSlide = j;
  28761. break;
  28762. }
  28763. }
  28764. if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
  28765. newPosition = snapGrid[nextSlide];
  28766. } else {
  28767. newPosition = snapGrid[nextSlide - 1];
  28768. }
  28769. newPosition = -newPosition;
  28770. }
  28771. if (needsLoopFix) {
  28772. swiper.once('transitionEnd', function () {
  28773. swiper.loopFix();
  28774. });
  28775. }
  28776. // Fix duration
  28777. if (swiper.velocity !== 0) {
  28778. if (rtl) {
  28779. momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
  28780. } else {
  28781. momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
  28782. }
  28783. if (params.freeModeSticky) {
  28784. // If freeModeSticky is active and the user ends a swipe with a slow-velocity
  28785. // event, then durations can be 20+ seconds to slide one (or zero!) slides.
  28786. // It's easy to see this when simulating touch with mouse events. To fix this,
  28787. // limit single-slide swipes to the default slide duration. This also has the
  28788. // nice side effect of matching slide speed if the user stopped moving before
  28789. // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
  28790. // For faster swipes, also apply limits (albeit higher ones).
  28791. var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
  28792. var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
  28793. if (moveDistance < currentSlideSize) {
  28794. momentumDuration = params.speed;
  28795. } else if (moveDistance < 2 * currentSlideSize) {
  28796. momentumDuration = params.speed * 1.5;
  28797. } else {
  28798. momentumDuration = params.speed * 2.5;
  28799. }
  28800. }
  28801. } else if (params.freeModeSticky) {
  28802. swiper.slideToClosest();
  28803. return;
  28804. }
  28805. if (params.freeModeMomentumBounce && doBounce) {
  28806. swiper.updateProgress(afterBouncePosition);
  28807. swiper.setTransition(momentumDuration);
  28808. swiper.setTranslate(newPosition);
  28809. swiper.transitionStart(true, swiper.swipeDirection);
  28810. swiper.animating = true;
  28811. $wrapperEl.transitionEnd(function () {
  28812. if (!swiper || swiper.destroyed || !data.allowMomentumBounce) { return; }
  28813. swiper.emit('momentumBounce');
  28814. swiper.setTransition(params.speed);
  28815. setTimeout(function () {
  28816. swiper.setTranslate(afterBouncePosition);
  28817. $wrapperEl.transitionEnd(function () {
  28818. if (!swiper || swiper.destroyed) { return; }
  28819. swiper.transitionEnd();
  28820. });
  28821. }, 0);
  28822. });
  28823. } else if (swiper.velocity) {
  28824. swiper.updateProgress(newPosition);
  28825. swiper.setTransition(momentumDuration);
  28826. swiper.setTranslate(newPosition);
  28827. swiper.transitionStart(true, swiper.swipeDirection);
  28828. if (!swiper.animating) {
  28829. swiper.animating = true;
  28830. $wrapperEl.transitionEnd(function () {
  28831. if (!swiper || swiper.destroyed) { return; }
  28832. swiper.transitionEnd();
  28833. });
  28834. }
  28835. } else {
  28836. swiper.updateProgress(newPosition);
  28837. }
  28838. swiper.updateActiveIndex();
  28839. swiper.updateSlidesClasses();
  28840. } else if (params.freeModeSticky) {
  28841. swiper.slideToClosest();
  28842. return;
  28843. }
  28844. if (!params.freeModeMomentum || timeDiff >= params.longSwipesMs) {
  28845. swiper.updateProgress();
  28846. swiper.updateActiveIndex();
  28847. swiper.updateSlidesClasses();
  28848. }
  28849. return;
  28850. }
  28851. // Find current slide
  28852. var stopIndex = 0;
  28853. var groupSize = swiper.slidesSizesGrid[0];
  28854. for (var i = 0; i < slidesGrid.length; i += (i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup)) {
  28855. var increment$1 = (i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
  28856. if (typeof slidesGrid[i + increment$1] !== 'undefined') {
  28857. if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment$1]) {
  28858. stopIndex = i;
  28859. groupSize = slidesGrid[i + increment$1] - slidesGrid[i];
  28860. }
  28861. } else if (currentPos >= slidesGrid[i]) {
  28862. stopIndex = i;
  28863. groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
  28864. }
  28865. }
  28866. // Find current slide size
  28867. var ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
  28868. var increment = (stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup);
  28869. if (timeDiff > params.longSwipesMs) {
  28870. // Long touches
  28871. if (!params.longSwipes) {
  28872. swiper.slideTo(swiper.activeIndex);
  28873. return;
  28874. }
  28875. if (swiper.swipeDirection === 'next') {
  28876. if (ratio >= params.longSwipesRatio) { swiper.slideTo(stopIndex + increment); }
  28877. else { swiper.slideTo(stopIndex); }
  28878. }
  28879. if (swiper.swipeDirection === 'prev') {
  28880. if (ratio > (1 - params.longSwipesRatio)) { swiper.slideTo(stopIndex + increment); }
  28881. else { swiper.slideTo(stopIndex); }
  28882. }
  28883. } else {
  28884. // Short swipes
  28885. if (!params.shortSwipes) {
  28886. swiper.slideTo(swiper.activeIndex);
  28887. return;
  28888. }
  28889. var isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
  28890. if (!isNavButtonTarget) {
  28891. if (swiper.swipeDirection === 'next') {
  28892. swiper.slideTo(stopIndex + increment);
  28893. }
  28894. if (swiper.swipeDirection === 'prev') {
  28895. swiper.slideTo(stopIndex);
  28896. }
  28897. } else if (e.target === swiper.navigation.nextEl) {
  28898. swiper.slideTo(stopIndex + increment);
  28899. } else {
  28900. swiper.slideTo(stopIndex);
  28901. }
  28902. }
  28903. }
  28904. function onResize () {
  28905. var swiper = this;
  28906. var params = swiper.params;
  28907. var el = swiper.el;
  28908. if (el && el.offsetWidth === 0) { return; }
  28909. // Breakpoints
  28910. if (params.breakpoints) {
  28911. swiper.setBreakpoint();
  28912. }
  28913. // Save locks
  28914. var allowSlideNext = swiper.allowSlideNext;
  28915. var allowSlidePrev = swiper.allowSlidePrev;
  28916. var snapGrid = swiper.snapGrid;
  28917. // Disable locks on resize
  28918. swiper.allowSlideNext = true;
  28919. swiper.allowSlidePrev = true;
  28920. swiper.updateSize();
  28921. swiper.updateSlides();
  28922. swiper.updateSlidesClasses();
  28923. if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
  28924. swiper.slideTo(swiper.slides.length - 1, 0, false, true);
  28925. } else {
  28926. swiper.slideTo(swiper.activeIndex, 0, false, true);
  28927. }
  28928. if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
  28929. swiper.autoplay.run();
  28930. }
  28931. // Return locks after resize
  28932. swiper.allowSlidePrev = allowSlidePrev;
  28933. swiper.allowSlideNext = allowSlideNext;
  28934. if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
  28935. swiper.checkOverflow();
  28936. }
  28937. }
  28938. function onClick (e) {
  28939. var swiper = this;
  28940. if (!swiper.allowClick) {
  28941. if (swiper.params.preventClicks) { e.preventDefault(); }
  28942. if (swiper.params.preventClicksPropagation && swiper.animating) {
  28943. e.stopPropagation();
  28944. e.stopImmediatePropagation();
  28945. }
  28946. }
  28947. }
  28948. function onScroll () {
  28949. var swiper = this;
  28950. var wrapperEl = swiper.wrapperEl;
  28951. var rtlTranslate = swiper.rtlTranslate;
  28952. swiper.previousTranslate = swiper.translate;
  28953. if (swiper.isHorizontal()) {
  28954. if (rtlTranslate) {
  28955. swiper.translate = ((wrapperEl.scrollWidth - wrapperEl.offsetWidth) - wrapperEl.scrollLeft);
  28956. } else {
  28957. swiper.translate = -wrapperEl.scrollLeft;
  28958. }
  28959. } else {
  28960. swiper.translate = -wrapperEl.scrollTop;
  28961. }
  28962. // eslint-disable-next-line
  28963. if (swiper.translate === -0) { swiper.translate = 0; }
  28964. swiper.updateActiveIndex();
  28965. swiper.updateSlidesClasses();
  28966. var newProgress;
  28967. var translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
  28968. if (translatesDiff === 0) {
  28969. newProgress = 0;
  28970. } else {
  28971. newProgress = (swiper.translate - swiper.minTranslate()) / (translatesDiff);
  28972. }
  28973. if (newProgress !== swiper.progress) {
  28974. swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
  28975. }
  28976. swiper.emit('setTranslate', swiper.translate, false);
  28977. }
  28978. var dummyEventAttached = false;
  28979. function dummyEventListener() {}
  28980. function attachEvents() {
  28981. var swiper = this;
  28982. var params = swiper.params;
  28983. var touchEvents = swiper.touchEvents;
  28984. var el = swiper.el;
  28985. var wrapperEl = swiper.wrapperEl;
  28986. swiper.onTouchStart = onTouchStart.bind(swiper);
  28987. swiper.onTouchMove = onTouchMove.bind(swiper);
  28988. swiper.onTouchEnd = onTouchEnd.bind(swiper);
  28989. if (params.cssMode) {
  28990. swiper.onScroll = onScroll.bind(swiper);
  28991. }
  28992. swiper.onClick = onClick.bind(swiper);
  28993. var capture = !!params.nested;
  28994. // Touch Events
  28995. if (!Support.touch && Support.pointerEvents) {
  28996. el.addEventListener(touchEvents.start, swiper.onTouchStart, false);
  28997. doc.addEventListener(touchEvents.move, swiper.onTouchMove, capture);
  28998. doc.addEventListener(touchEvents.end, swiper.onTouchEnd, false);
  28999. } else {
  29000. if (Support.touch) {
  29001. var passiveListener = touchEvents.start === 'touchstart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  29002. el.addEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
  29003. el.addEventListener(touchEvents.move, swiper.onTouchMove, Support.passiveListener ? { passive: false, capture: capture } : capture);
  29004. el.addEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
  29005. if (touchEvents.cancel) {
  29006. el.addEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
  29007. }
  29008. if (!dummyEventAttached) {
  29009. doc.addEventListener('touchstart', dummyEventListener);
  29010. dummyEventAttached = true;
  29011. }
  29012. }
  29013. if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
  29014. el.addEventListener('mousedown', swiper.onTouchStart, false);
  29015. doc.addEventListener('mousemove', swiper.onTouchMove, capture);
  29016. doc.addEventListener('mouseup', swiper.onTouchEnd, false);
  29017. }
  29018. }
  29019. // Prevent Links Clicks
  29020. if (params.preventClicks || params.preventClicksPropagation) {
  29021. el.addEventListener('click', swiper.onClick, true);
  29022. }
  29023. if (params.cssMode) {
  29024. wrapperEl.addEventListener('scroll', swiper.onScroll);
  29025. }
  29026. // Resize handler
  29027. if (params.updateOnWindowResize) {
  29028. swiper.on((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize, true);
  29029. } else {
  29030. swiper.on('observerUpdate', onResize, true);
  29031. }
  29032. }
  29033. function detachEvents() {
  29034. var swiper = this;
  29035. var params = swiper.params;
  29036. var touchEvents = swiper.touchEvents;
  29037. var el = swiper.el;
  29038. var wrapperEl = swiper.wrapperEl;
  29039. var capture = !!params.nested;
  29040. // Touch Events
  29041. if (!Support.touch && Support.pointerEvents) {
  29042. el.removeEventListener(touchEvents.start, swiper.onTouchStart, false);
  29043. doc.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
  29044. doc.removeEventListener(touchEvents.end, swiper.onTouchEnd, false);
  29045. } else {
  29046. if (Support.touch) {
  29047. var passiveListener = touchEvents.start === 'onTouchStart' && Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  29048. el.removeEventListener(touchEvents.start, swiper.onTouchStart, passiveListener);
  29049. el.removeEventListener(touchEvents.move, swiper.onTouchMove, capture);
  29050. el.removeEventListener(touchEvents.end, swiper.onTouchEnd, passiveListener);
  29051. if (touchEvents.cancel) {
  29052. el.removeEventListener(touchEvents.cancel, swiper.onTouchEnd, passiveListener);
  29053. }
  29054. }
  29055. if ((params.simulateTouch && !Device.ios && !Device.android) || (params.simulateTouch && !Support.touch && Device.ios)) {
  29056. el.removeEventListener('mousedown', swiper.onTouchStart, false);
  29057. doc.removeEventListener('mousemove', swiper.onTouchMove, capture);
  29058. doc.removeEventListener('mouseup', swiper.onTouchEnd, false);
  29059. }
  29060. }
  29061. // Prevent Links Clicks
  29062. if (params.preventClicks || params.preventClicksPropagation) {
  29063. el.removeEventListener('click', swiper.onClick, true);
  29064. }
  29065. if (params.cssMode) {
  29066. wrapperEl.removeEventListener('scroll', swiper.onScroll);
  29067. }
  29068. // Resize handler
  29069. swiper.off((Device.ios || Device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate'), onResize);
  29070. }
  29071. var events = {
  29072. attachEvents: attachEvents,
  29073. detachEvents: detachEvents,
  29074. };
  29075. function setBreakpoint () {
  29076. var swiper = this;
  29077. var activeIndex = swiper.activeIndex;
  29078. var initialized = swiper.initialized;
  29079. var loopedSlides = swiper.loopedSlides; if ( loopedSlides === void 0 ) loopedSlides = 0;
  29080. var params = swiper.params;
  29081. var $el = swiper.$el;
  29082. var breakpoints = params.breakpoints;
  29083. if (!breakpoints || (breakpoints && Object.keys(breakpoints).length === 0)) { return; }
  29084. // Get breakpoint for window width and update parameters
  29085. var breakpoint = swiper.getBreakpoint(breakpoints);
  29086. if (breakpoint && swiper.currentBreakpoint !== breakpoint) {
  29087. var breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
  29088. if (breakpointOnlyParams) {
  29089. ['slidesPerView', 'spaceBetween', 'slidesPerGroup', 'slidesPerGroupSkip', 'slidesPerColumn'].forEach(function (param) {
  29090. var paramValue = breakpointOnlyParams[param];
  29091. if (typeof paramValue === 'undefined') { return; }
  29092. if (param === 'slidesPerView' && (paramValue === 'AUTO' || paramValue === 'auto')) {
  29093. breakpointOnlyParams[param] = 'auto';
  29094. } else if (param === 'slidesPerView') {
  29095. breakpointOnlyParams[param] = parseFloat(paramValue);
  29096. } else {
  29097. breakpointOnlyParams[param] = parseInt(paramValue, 10);
  29098. }
  29099. });
  29100. }
  29101. var breakpointParams = breakpointOnlyParams || swiper.originalParams;
  29102. var wasMultiRow = params.slidesPerColumn > 1;
  29103. var isMultiRow = breakpointParams.slidesPerColumn > 1;
  29104. if (wasMultiRow && !isMultiRow) {
  29105. $el.removeClass(((params.containerModifierClass) + "multirow " + (params.containerModifierClass) + "multirow-column"));
  29106. } else if (!wasMultiRow && isMultiRow) {
  29107. $el.addClass(((params.containerModifierClass) + "multirow"));
  29108. if (breakpointParams.slidesPerColumnFill === 'column') {
  29109. $el.addClass(((params.containerModifierClass) + "multirow-column"));
  29110. }
  29111. }
  29112. var directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
  29113. var needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
  29114. if (directionChanged && initialized) {
  29115. swiper.changeDirection();
  29116. }
  29117. Utils.extend(swiper.params, breakpointParams);
  29118. Utils.extend(swiper, {
  29119. allowTouchMove: swiper.params.allowTouchMove,
  29120. allowSlideNext: swiper.params.allowSlideNext,
  29121. allowSlidePrev: swiper.params.allowSlidePrev,
  29122. });
  29123. swiper.currentBreakpoint = breakpoint;
  29124. if (needsReLoop && initialized) {
  29125. swiper.loopDestroy();
  29126. swiper.loopCreate();
  29127. swiper.updateSlides();
  29128. swiper.slideTo((activeIndex - loopedSlides) + swiper.loopedSlides, 0, false);
  29129. }
  29130. swiper.emit('breakpoint', breakpointParams);
  29131. }
  29132. }
  29133. function getBreakpoint (breakpoints) {
  29134. // Get breakpoint for window width
  29135. if (!breakpoints) { return undefined; }
  29136. var breakpoint = false;
  29137. var points = Object.keys(breakpoints).map(function (point) {
  29138. if (typeof point === 'string' && point.indexOf('@') === 0) {
  29139. var minRatio = parseFloat(point.substr(1));
  29140. var value = win.innerHeight * minRatio;
  29141. return { value: value, point: point };
  29142. }
  29143. return { value: point, point: point };
  29144. });
  29145. points.sort(function (a, b) { return parseInt(a.value, 10) - parseInt(b.value, 10); });
  29146. for (var i = 0; i < points.length; i += 1) {
  29147. var ref = points[i];
  29148. var point = ref.point;
  29149. var value = ref.value;
  29150. if (value <= win.innerWidth) {
  29151. breakpoint = point;
  29152. }
  29153. }
  29154. return breakpoint || 'max';
  29155. }
  29156. var breakpoints = { setBreakpoint: setBreakpoint, getBreakpoint: getBreakpoint };
  29157. function addClasses () {
  29158. var swiper = this;
  29159. var classNames = swiper.classNames;
  29160. var params = swiper.params;
  29161. var rtl = swiper.rtl;
  29162. var $el = swiper.$el;
  29163. var suffixes = [];
  29164. suffixes.push('initialized');
  29165. suffixes.push(params.direction);
  29166. if (params.freeMode) {
  29167. suffixes.push('free-mode');
  29168. }
  29169. if (params.autoHeight) {
  29170. suffixes.push('autoheight');
  29171. }
  29172. if (rtl) {
  29173. suffixes.push('rtl');
  29174. }
  29175. if (params.slidesPerColumn > 1) {
  29176. suffixes.push('multirow');
  29177. if (params.slidesPerColumnFill === 'column') {
  29178. suffixes.push('multirow-column');
  29179. }
  29180. }
  29181. if (Device.android) {
  29182. suffixes.push('android');
  29183. }
  29184. if (Device.ios) {
  29185. suffixes.push('ios');
  29186. }
  29187. if (params.cssMode) {
  29188. suffixes.push('css-mode');
  29189. }
  29190. suffixes.forEach(function (suffix) {
  29191. classNames.push(params.containerModifierClass + suffix);
  29192. });
  29193. $el.addClass(classNames.join(' '));
  29194. }
  29195. function removeClasses () {
  29196. var swiper = this;
  29197. var $el = swiper.$el;
  29198. var classNames = swiper.classNames;
  29199. $el.removeClass(classNames.join(' '));
  29200. }
  29201. var classes = { addClasses: addClasses, removeClasses: removeClasses };
  29202. function loadImage (imageEl, src, srcset, sizes, checkForComplete, callback) {
  29203. var image;
  29204. function onReady() {
  29205. if (callback) { callback(); }
  29206. }
  29207. var isPicture = $(imageEl).parent('picture')[0];
  29208. if (!isPicture && (!imageEl.complete || !checkForComplete)) {
  29209. if (src) {
  29210. image = new win.Image();
  29211. image.onload = onReady;
  29212. image.onerror = onReady;
  29213. if (sizes) {
  29214. image.sizes = sizes;
  29215. }
  29216. if (srcset) {
  29217. image.srcset = srcset;
  29218. }
  29219. if (src) {
  29220. image.src = src;
  29221. }
  29222. } else {
  29223. onReady();
  29224. }
  29225. } else {
  29226. // image already loaded...
  29227. onReady();
  29228. }
  29229. }
  29230. function preloadImages () {
  29231. var swiper = this;
  29232. swiper.imagesToLoad = swiper.$el.find('img');
  29233. function onReady() {
  29234. if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) { return; }
  29235. if (swiper.imagesLoaded !== undefined) { swiper.imagesLoaded += 1; }
  29236. if (swiper.imagesLoaded === swiper.imagesToLoad.length) {
  29237. if (swiper.params.updateOnImagesReady) { swiper.update(); }
  29238. swiper.emit('imagesReady');
  29239. }
  29240. }
  29241. for (var i = 0; i < swiper.imagesToLoad.length; i += 1) {
  29242. var imageEl = swiper.imagesToLoad[i];
  29243. swiper.loadImage(
  29244. imageEl,
  29245. imageEl.currentSrc || imageEl.getAttribute('src'),
  29246. imageEl.srcset || imageEl.getAttribute('srcset'),
  29247. imageEl.sizes || imageEl.getAttribute('sizes'),
  29248. true,
  29249. onReady
  29250. );
  29251. }
  29252. }
  29253. var images = {
  29254. loadImage: loadImage,
  29255. preloadImages: preloadImages,
  29256. };
  29257. function checkOverflow() {
  29258. var swiper = this;
  29259. var params = swiper.params;
  29260. var wasLocked = swiper.isLocked;
  29261. var lastSlidePosition = swiper.slides.length > 0 && (params.slidesOffsetBefore + (params.spaceBetween * (swiper.slides.length - 1)) + ((swiper.slides[0]).offsetWidth) * swiper.slides.length);
  29262. if (params.slidesOffsetBefore && params.slidesOffsetAfter && lastSlidePosition) {
  29263. swiper.isLocked = lastSlidePosition <= swiper.size;
  29264. } else {
  29265. swiper.isLocked = swiper.snapGrid.length === 1;
  29266. }
  29267. swiper.allowSlideNext = !swiper.isLocked;
  29268. swiper.allowSlidePrev = !swiper.isLocked;
  29269. // events
  29270. if (wasLocked !== swiper.isLocked) { swiper.emit(swiper.isLocked ? 'lock' : 'unlock'); }
  29271. if (wasLocked && wasLocked !== swiper.isLocked) {
  29272. swiper.isEnd = false;
  29273. swiper.navigation.update();
  29274. }
  29275. }
  29276. var checkOverflow$1 = { checkOverflow: checkOverflow };
  29277. var defaults = {
  29278. init: true,
  29279. direction: 'horizontal',
  29280. touchEventsTarget: 'container',
  29281. initialSlide: 0,
  29282. speed: 300,
  29283. cssMode: false,
  29284. updateOnWindowResize: true,
  29285. //
  29286. preventInteractionOnTransition: false,
  29287. // To support iOS's swipe-to-go-back gesture (when being used in-app, with UIWebView).
  29288. edgeSwipeDetection: false,
  29289. edgeSwipeThreshold: 20,
  29290. // Free mode
  29291. freeMode: false,
  29292. freeModeMomentum: true,
  29293. freeModeMomentumRatio: 1,
  29294. freeModeMomentumBounce: true,
  29295. freeModeMomentumBounceRatio: 1,
  29296. freeModeMomentumVelocityRatio: 1,
  29297. freeModeSticky: false,
  29298. freeModeMinimumVelocity: 0.02,
  29299. // Autoheight
  29300. autoHeight: false,
  29301. // Set wrapper width
  29302. setWrapperSize: false,
  29303. // Virtual Translate
  29304. virtualTranslate: false,
  29305. // Effects
  29306. effect: 'slide', // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
  29307. // Breakpoints
  29308. breakpoints: undefined,
  29309. // Slides grid
  29310. spaceBetween: 0,
  29311. slidesPerView: 1,
  29312. slidesPerColumn: 1,
  29313. slidesPerColumnFill: 'column',
  29314. slidesPerGroup: 1,
  29315. slidesPerGroupSkip: 0,
  29316. centeredSlides: false,
  29317. centeredSlidesBounds: false,
  29318. slidesOffsetBefore: 0, // in px
  29319. slidesOffsetAfter: 0, // in px
  29320. normalizeSlideIndex: true,
  29321. centerInsufficientSlides: false,
  29322. // Disable swiper and hide navigation when container not overflow
  29323. watchOverflow: false,
  29324. // Round length
  29325. roundLengths: false,
  29326. // Touches
  29327. touchRatio: 1,
  29328. touchAngle: 45,
  29329. simulateTouch: true,
  29330. shortSwipes: true,
  29331. longSwipes: true,
  29332. longSwipesRatio: 0.5,
  29333. longSwipesMs: 300,
  29334. followFinger: true,
  29335. allowTouchMove: true,
  29336. threshold: 0,
  29337. touchMoveStopPropagation: false,
  29338. touchStartPreventDefault: true,
  29339. touchStartForcePreventDefault: false,
  29340. touchReleaseOnEdges: false,
  29341. // Unique Navigation Elements
  29342. uniqueNavElements: true,
  29343. // Resistance
  29344. resistance: true,
  29345. resistanceRatio: 0.85,
  29346. // Progress
  29347. watchSlidesProgress: false,
  29348. watchSlidesVisibility: false,
  29349. // Cursor
  29350. grabCursor: false,
  29351. // Clicks
  29352. preventClicks: true,
  29353. preventClicksPropagation: true,
  29354. slideToClickedSlide: false,
  29355. // Images
  29356. preloadImages: true,
  29357. updateOnImagesReady: true,
  29358. // loop
  29359. loop: false,
  29360. loopAdditionalSlides: 0,
  29361. loopedSlides: null,
  29362. loopFillGroupWithBlank: false,
  29363. // Swiping/no swiping
  29364. allowSlidePrev: true,
  29365. allowSlideNext: true,
  29366. swipeHandler: null, // '.swipe-handler',
  29367. noSwiping: true,
  29368. noSwipingClass: 'swiper-no-swiping',
  29369. noSwipingSelector: null,
  29370. // Passive Listeners
  29371. passiveListeners: true,
  29372. // NS
  29373. containerModifierClass: 'swiper-container-', // NEW
  29374. slideClass: 'swiper-slide',
  29375. slideBlankClass: 'swiper-slide-invisible-blank',
  29376. slideActiveClass: 'swiper-slide-active',
  29377. slideDuplicateActiveClass: 'swiper-slide-duplicate-active',
  29378. slideVisibleClass: 'swiper-slide-visible',
  29379. slideDuplicateClass: 'swiper-slide-duplicate',
  29380. slideNextClass: 'swiper-slide-next',
  29381. slideDuplicateNextClass: 'swiper-slide-duplicate-next',
  29382. slidePrevClass: 'swiper-slide-prev',
  29383. slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',
  29384. wrapperClass: 'swiper-wrapper',
  29385. // Callbacks
  29386. runCallbacksOnInit: true,
  29387. };
  29388. /* eslint no-param-reassign: "off" */
  29389. var prototypes = {
  29390. update: update,
  29391. translate: translate,
  29392. transition: transition$1,
  29393. slide: slide,
  29394. loop: loop,
  29395. grabCursor: grabCursor,
  29396. manipulation: manipulation,
  29397. events: events,
  29398. breakpoints: breakpoints,
  29399. checkOverflow: checkOverflow$1,
  29400. classes: classes,
  29401. images: images,
  29402. };
  29403. var extendedDefaults = {};
  29404. var Swiper = /*@__PURE__*/(function (SwiperClass) {
  29405. function Swiper() {
  29406. var assign;
  29407. var args = [], len = arguments.length;
  29408. while ( len-- ) args[ len ] = arguments[ len ];
  29409. var el;
  29410. var params;
  29411. if (args.length === 1 && args[0].constructor && args[0].constructor === Object) {
  29412. params = args[0];
  29413. } else {
  29414. (assign = args, el = assign[0], params = assign[1]);
  29415. }
  29416. if (!params) { params = {}; }
  29417. params = Utils.extend({}, params);
  29418. if (el && !params.el) { params.el = el; }
  29419. SwiperClass.call(this, params);
  29420. Object.keys(prototypes).forEach(function (prototypeGroup) {
  29421. Object.keys(prototypes[prototypeGroup]).forEach(function (protoMethod) {
  29422. if (!Swiper.prototype[protoMethod]) {
  29423. Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
  29424. }
  29425. });
  29426. });
  29427. // Swiper Instance
  29428. var swiper = this;
  29429. if (typeof swiper.modules === 'undefined') {
  29430. swiper.modules = {};
  29431. }
  29432. Object.keys(swiper.modules).forEach(function (moduleName) {
  29433. var module = swiper.modules[moduleName];
  29434. if (module.params) {
  29435. var moduleParamName = Object.keys(module.params)[0];
  29436. var moduleParams = module.params[moduleParamName];
  29437. if (typeof moduleParams !== 'object' || moduleParams === null) { return; }
  29438. if (!(moduleParamName in params && 'enabled' in moduleParams)) { return; }
  29439. if (params[moduleParamName] === true) {
  29440. params[moduleParamName] = { enabled: true };
  29441. }
  29442. if (
  29443. typeof params[moduleParamName] === 'object'
  29444. && !('enabled' in params[moduleParamName])
  29445. ) {
  29446. params[moduleParamName].enabled = true;
  29447. }
  29448. if (!params[moduleParamName]) { params[moduleParamName] = { enabled: false }; }
  29449. }
  29450. });
  29451. // Extend defaults with modules params
  29452. var swiperParams = Utils.extend({}, defaults);
  29453. swiper.useModulesParams(swiperParams);
  29454. // Extend defaults with passed params
  29455. swiper.params = Utils.extend({}, swiperParams, extendedDefaults, params);
  29456. swiper.originalParams = Utils.extend({}, swiper.params);
  29457. swiper.passedParams = Utils.extend({}, params);
  29458. // Save Dom lib
  29459. swiper.$ = $;
  29460. // Find el
  29461. var $el = $(swiper.params.el);
  29462. el = $el[0];
  29463. if (!el) {
  29464. return undefined;
  29465. }
  29466. if ($el.length > 1) {
  29467. var swipers = [];
  29468. $el.each(function (index, containerEl) {
  29469. var newParams = Utils.extend({}, params, { el: containerEl });
  29470. swipers.push(new Swiper(newParams));
  29471. });
  29472. return swipers;
  29473. }
  29474. el.swiper = swiper;
  29475. $el.data('swiper', swiper);
  29476. // Find Wrapper
  29477. var $wrapperEl;
  29478. if (el && el.shadowRoot && el.shadowRoot.querySelector) {
  29479. $wrapperEl = $(el.shadowRoot.querySelector(("." + (swiper.params.wrapperClass))));
  29480. // Children needs to return slot items
  29481. $wrapperEl.children = function (options) { return $el.children(options); };
  29482. } else {
  29483. $wrapperEl = $el.children(("." + (swiper.params.wrapperClass)));
  29484. }
  29485. // Extend Swiper
  29486. Utils.extend(swiper, {
  29487. $el: $el,
  29488. el: el,
  29489. $wrapperEl: $wrapperEl,
  29490. wrapperEl: $wrapperEl[0],
  29491. // Classes
  29492. classNames: [],
  29493. // Slides
  29494. slides: $(),
  29495. slidesGrid: [],
  29496. snapGrid: [],
  29497. slidesSizesGrid: [],
  29498. // isDirection
  29499. isHorizontal: function isHorizontal() {
  29500. return swiper.params.direction === 'horizontal';
  29501. },
  29502. isVertical: function isVertical() {
  29503. return swiper.params.direction === 'vertical';
  29504. },
  29505. // RTL
  29506. rtl: (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
  29507. rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),
  29508. wrongRTL: $wrapperEl.css('display') === '-webkit-box',
  29509. // Indexes
  29510. activeIndex: 0,
  29511. realIndex: 0,
  29512. //
  29513. isBeginning: true,
  29514. isEnd: false,
  29515. // Props
  29516. translate: 0,
  29517. previousTranslate: 0,
  29518. progress: 0,
  29519. velocity: 0,
  29520. animating: false,
  29521. // Locks
  29522. allowSlideNext: swiper.params.allowSlideNext,
  29523. allowSlidePrev: swiper.params.allowSlidePrev,
  29524. // Touch Events
  29525. touchEvents: (function touchEvents() {
  29526. var touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
  29527. var desktop = ['mousedown', 'mousemove', 'mouseup'];
  29528. if (Support.pointerEvents) {
  29529. desktop = ['pointerdown', 'pointermove', 'pointerup'];
  29530. }
  29531. swiper.touchEventsTouch = {
  29532. start: touch[0],
  29533. move: touch[1],
  29534. end: touch[2],
  29535. cancel: touch[3],
  29536. };
  29537. swiper.touchEventsDesktop = {
  29538. start: desktop[0],
  29539. move: desktop[1],
  29540. end: desktop[2],
  29541. };
  29542. return Support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;
  29543. }()),
  29544. touchEventsData: {
  29545. isTouched: undefined,
  29546. isMoved: undefined,
  29547. allowTouchCallbacks: undefined,
  29548. touchStartTime: undefined,
  29549. isScrolling: undefined,
  29550. currentTranslate: undefined,
  29551. startTranslate: undefined,
  29552. allowThresholdMove: undefined,
  29553. // Form elements to match
  29554. formElements: 'input, select, option, textarea, button, video, label',
  29555. // Last click time
  29556. lastClickTime: Utils.now(),
  29557. clickTimeout: undefined,
  29558. // Velocities
  29559. velocities: [],
  29560. allowMomentumBounce: undefined,
  29561. isTouchEvent: undefined,
  29562. startMoving: undefined,
  29563. },
  29564. // Clicks
  29565. allowClick: true,
  29566. // Touches
  29567. allowTouchMove: swiper.params.allowTouchMove,
  29568. touches: {
  29569. startX: 0,
  29570. startY: 0,
  29571. currentX: 0,
  29572. currentY: 0,
  29573. diff: 0,
  29574. },
  29575. // Images
  29576. imagesToLoad: [],
  29577. imagesLoaded: 0,
  29578. });
  29579. // Install Modules
  29580. swiper.useModules();
  29581. // Init
  29582. if (swiper.params.init) {
  29583. swiper.init();
  29584. }
  29585. // Return app instance
  29586. return swiper;
  29587. }
  29588. if ( SwiperClass ) Swiper.__proto__ = SwiperClass;
  29589. Swiper.prototype = Object.create( SwiperClass && SwiperClass.prototype );
  29590. Swiper.prototype.constructor = Swiper;
  29591. var staticAccessors = { extendedDefaults: { configurable: true },defaults: { configurable: true },Class: { configurable: true },$: { configurable: true } };
  29592. Swiper.prototype.slidesPerViewDynamic = function slidesPerViewDynamic () {
  29593. var swiper = this;
  29594. var params = swiper.params;
  29595. var slides = swiper.slides;
  29596. var slidesGrid = swiper.slidesGrid;
  29597. var swiperSize = swiper.size;
  29598. var activeIndex = swiper.activeIndex;
  29599. var spv = 1;
  29600. if (params.centeredSlides) {
  29601. var slideSize = slides[activeIndex].swiperSlideSize;
  29602. var breakLoop;
  29603. for (var i = activeIndex + 1; i < slides.length; i += 1) {
  29604. if (slides[i] && !breakLoop) {
  29605. slideSize += slides[i].swiperSlideSize;
  29606. spv += 1;
  29607. if (slideSize > swiperSize) { breakLoop = true; }
  29608. }
  29609. }
  29610. for (var i$1 = activeIndex - 1; i$1 >= 0; i$1 -= 1) {
  29611. if (slides[i$1] && !breakLoop) {
  29612. slideSize += slides[i$1].swiperSlideSize;
  29613. spv += 1;
  29614. if (slideSize > swiperSize) { breakLoop = true; }
  29615. }
  29616. }
  29617. } else {
  29618. for (var i$2 = activeIndex + 1; i$2 < slides.length; i$2 += 1) {
  29619. if (slidesGrid[i$2] - slidesGrid[activeIndex] < swiperSize) {
  29620. spv += 1;
  29621. }
  29622. }
  29623. }
  29624. return spv;
  29625. };
  29626. Swiper.prototype.update = function update () {
  29627. var swiper = this;
  29628. if (!swiper || swiper.destroyed) { return; }
  29629. var snapGrid = swiper.snapGrid;
  29630. var params = swiper.params;
  29631. // Breakpoints
  29632. if (params.breakpoints) {
  29633. swiper.setBreakpoint();
  29634. }
  29635. swiper.updateSize();
  29636. swiper.updateSlides();
  29637. swiper.updateProgress();
  29638. swiper.updateSlidesClasses();
  29639. function setTranslate() {
  29640. var translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
  29641. var newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
  29642. swiper.setTranslate(newTranslate);
  29643. swiper.updateActiveIndex();
  29644. swiper.updateSlidesClasses();
  29645. }
  29646. var translated;
  29647. if (swiper.params.freeMode) {
  29648. setTranslate();
  29649. if (swiper.params.autoHeight) {
  29650. swiper.updateAutoHeight();
  29651. }
  29652. } else {
  29653. if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {
  29654. translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);
  29655. } else {
  29656. translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
  29657. }
  29658. if (!translated) {
  29659. setTranslate();
  29660. }
  29661. }
  29662. if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
  29663. swiper.checkOverflow();
  29664. }
  29665. swiper.emit('update');
  29666. };
  29667. Swiper.prototype.changeDirection = function changeDirection (newDirection, needUpdate) {
  29668. if ( needUpdate === void 0 ) needUpdate = true;
  29669. var swiper = this;
  29670. var currentDirection = swiper.params.direction;
  29671. if (!newDirection) {
  29672. // eslint-disable-next-line
  29673. newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
  29674. }
  29675. if ((newDirection === currentDirection) || (newDirection !== 'horizontal' && newDirection !== 'vertical')) {
  29676. return swiper;
  29677. }
  29678. swiper.$el
  29679. .removeClass(("" + (swiper.params.containerModifierClass) + currentDirection))
  29680. .addClass(("" + (swiper.params.containerModifierClass) + newDirection));
  29681. swiper.params.direction = newDirection;
  29682. swiper.slides.each(function (slideIndex, slideEl) {
  29683. if (newDirection === 'vertical') {
  29684. slideEl.style.width = '';
  29685. } else {
  29686. slideEl.style.height = '';
  29687. }
  29688. });
  29689. swiper.emit('changeDirection');
  29690. if (needUpdate) { swiper.update(); }
  29691. return swiper;
  29692. };
  29693. Swiper.prototype.init = function init () {
  29694. var swiper = this;
  29695. if (swiper.initialized) { return; }
  29696. swiper.emit('beforeInit');
  29697. // Set breakpoint
  29698. if (swiper.params.breakpoints) {
  29699. swiper.setBreakpoint();
  29700. }
  29701. // Add Classes
  29702. swiper.addClasses();
  29703. // Create loop
  29704. if (swiper.params.loop) {
  29705. swiper.loopCreate();
  29706. }
  29707. // Update size
  29708. swiper.updateSize();
  29709. // Update slides
  29710. swiper.updateSlides();
  29711. if (swiper.params.watchOverflow) {
  29712. swiper.checkOverflow();
  29713. }
  29714. // Set Grab Cursor
  29715. if (swiper.params.grabCursor) {
  29716. swiper.setGrabCursor();
  29717. }
  29718. if (swiper.params.preloadImages) {
  29719. swiper.preloadImages();
  29720. }
  29721. // Slide To Initial Slide
  29722. if (swiper.params.loop) {
  29723. swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit);
  29724. } else {
  29725. swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit);
  29726. }
  29727. // Attach events
  29728. swiper.attachEvents();
  29729. // Init Flag
  29730. swiper.initialized = true;
  29731. // Emit
  29732. swiper.emit('init');
  29733. };
  29734. Swiper.prototype.destroy = function destroy (deleteInstance, cleanStyles) {
  29735. if ( deleteInstance === void 0 ) deleteInstance = true;
  29736. if ( cleanStyles === void 0 ) cleanStyles = true;
  29737. var swiper = this;
  29738. var params = swiper.params;
  29739. var $el = swiper.$el;
  29740. var $wrapperEl = swiper.$wrapperEl;
  29741. var slides = swiper.slides;
  29742. if (typeof swiper.params === 'undefined' || swiper.destroyed) {
  29743. return null;
  29744. }
  29745. swiper.emit('beforeDestroy');
  29746. // Init Flag
  29747. swiper.initialized = false;
  29748. // Detach events
  29749. swiper.detachEvents();
  29750. // Destroy loop
  29751. if (params.loop) {
  29752. swiper.loopDestroy();
  29753. }
  29754. // Cleanup styles
  29755. if (cleanStyles) {
  29756. swiper.removeClasses();
  29757. $el.removeAttr('style');
  29758. $wrapperEl.removeAttr('style');
  29759. if (slides && slides.length) {
  29760. slides
  29761. .removeClass([
  29762. params.slideVisibleClass,
  29763. params.slideActiveClass,
  29764. params.slideNextClass,
  29765. params.slidePrevClass ].join(' '))
  29766. .removeAttr('style')
  29767. .removeAttr('data-swiper-slide-index');
  29768. }
  29769. }
  29770. swiper.emit('destroy');
  29771. // Detach emitter events
  29772. Object.keys(swiper.eventsListeners).forEach(function (eventName) {
  29773. swiper.off(eventName);
  29774. });
  29775. if (deleteInstance !== false) {
  29776. swiper.$el[0].swiper = null;
  29777. swiper.$el.data('swiper', null);
  29778. Utils.deleteProps(swiper);
  29779. }
  29780. swiper.destroyed = true;
  29781. return null;
  29782. };
  29783. Swiper.extendDefaults = function extendDefaults (newDefaults) {
  29784. Utils.extend(extendedDefaults, newDefaults);
  29785. };
  29786. staticAccessors.extendedDefaults.get = function () {
  29787. return extendedDefaults;
  29788. };
  29789. staticAccessors.defaults.get = function () {
  29790. return defaults;
  29791. };
  29792. staticAccessors.Class.get = function () {
  29793. return SwiperClass;
  29794. };
  29795. staticAccessors.$.get = function () {
  29796. return $;
  29797. };
  29798. Object.defineProperties( Swiper, staticAccessors );
  29799. return Swiper;
  29800. }(Framework7Class));
  29801. var Device$1 = {
  29802. name: 'device',
  29803. proto: {
  29804. device: Device,
  29805. },
  29806. static: {
  29807. device: Device,
  29808. },
  29809. };
  29810. var Support$1 = {
  29811. name: 'support',
  29812. proto: {
  29813. support: Support,
  29814. },
  29815. static: {
  29816. support: Support,
  29817. },
  29818. };
  29819. var Browser = (function Browser() {
  29820. function isSafari() {
  29821. var ua = win.navigator.userAgent.toLowerCase();
  29822. return (ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0);
  29823. }
  29824. return {
  29825. isEdge: !!win.navigator.userAgent.match(/Edge/g),
  29826. isSafari: isSafari(),
  29827. isUiWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(win.navigator.userAgent),
  29828. };
  29829. }());
  29830. var Browser$1 = {
  29831. name: 'browser',
  29832. proto: {
  29833. browser: Browser,
  29834. },
  29835. static: {
  29836. browser: Browser,
  29837. },
  29838. };
  29839. var Resize = {
  29840. name: 'resize',
  29841. create: function create() {
  29842. var swiper = this;
  29843. Utils.extend(swiper, {
  29844. resize: {
  29845. resizeHandler: function resizeHandler() {
  29846. if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
  29847. swiper.emit('beforeResize');
  29848. swiper.emit('resize');
  29849. },
  29850. orientationChangeHandler: function orientationChangeHandler() {
  29851. if (!swiper || swiper.destroyed || !swiper.initialized) { return; }
  29852. swiper.emit('orientationchange');
  29853. },
  29854. },
  29855. });
  29856. },
  29857. on: {
  29858. init: function init() {
  29859. var swiper = this;
  29860. // Emit resize
  29861. win.addEventListener('resize', swiper.resize.resizeHandler);
  29862. // Emit orientationchange
  29863. win.addEventListener('orientationchange', swiper.resize.orientationChangeHandler);
  29864. },
  29865. destroy: function destroy() {
  29866. var swiper = this;
  29867. win.removeEventListener('resize', swiper.resize.resizeHandler);
  29868. win.removeEventListener('orientationchange', swiper.resize.orientationChangeHandler);
  29869. },
  29870. },
  29871. };
  29872. var Observer = {
  29873. func: win.MutationObserver || win.WebkitMutationObserver,
  29874. attach: function attach(target, options) {
  29875. if ( options === void 0 ) options = {};
  29876. var swiper = this;
  29877. var ObserverFunc = Observer.func;
  29878. var observer = new ObserverFunc(function (mutations) {
  29879. // The observerUpdate event should only be triggered
  29880. // once despite the number of mutations. Additional
  29881. // triggers are redundant and are very costly
  29882. if (mutations.length === 1) {
  29883. swiper.emit('observerUpdate', mutations[0]);
  29884. return;
  29885. }
  29886. var observerUpdate = function observerUpdate() {
  29887. swiper.emit('observerUpdate', mutations[0]);
  29888. };
  29889. if (win.requestAnimationFrame) {
  29890. win.requestAnimationFrame(observerUpdate);
  29891. } else {
  29892. win.setTimeout(observerUpdate, 0);
  29893. }
  29894. });
  29895. observer.observe(target, {
  29896. attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
  29897. childList: typeof options.childList === 'undefined' ? true : options.childList,
  29898. characterData: typeof options.characterData === 'undefined' ? true : options.characterData,
  29899. });
  29900. swiper.observer.observers.push(observer);
  29901. },
  29902. init: function init() {
  29903. var swiper = this;
  29904. if (!Support.observer || !swiper.params.observer) { return; }
  29905. if (swiper.params.observeParents) {
  29906. var containerParents = swiper.$el.parents();
  29907. for (var i = 0; i < containerParents.length; i += 1) {
  29908. swiper.observer.attach(containerParents[i]);
  29909. }
  29910. }
  29911. // Observe container
  29912. swiper.observer.attach(swiper.$el[0], { childList: swiper.params.observeSlideChildren });
  29913. // Observe wrapper
  29914. swiper.observer.attach(swiper.$wrapperEl[0], { attributes: false });
  29915. },
  29916. destroy: function destroy() {
  29917. var swiper = this;
  29918. swiper.observer.observers.forEach(function (observer) {
  29919. observer.disconnect();
  29920. });
  29921. swiper.observer.observers = [];
  29922. },
  29923. };
  29924. var Observer$1 = {
  29925. name: 'observer',
  29926. params: {
  29927. observer: false,
  29928. observeParents: false,
  29929. observeSlideChildren: false,
  29930. },
  29931. create: function create() {
  29932. var swiper = this;
  29933. Utils.extend(swiper, {
  29934. observer: {
  29935. init: Observer.init.bind(swiper),
  29936. attach: Observer.attach.bind(swiper),
  29937. destroy: Observer.destroy.bind(swiper),
  29938. observers: [],
  29939. },
  29940. });
  29941. },
  29942. on: {
  29943. init: function init() {
  29944. var swiper = this;
  29945. swiper.observer.init();
  29946. },
  29947. destroy: function destroy() {
  29948. var swiper = this;
  29949. swiper.observer.destroy();
  29950. },
  29951. },
  29952. };
  29953. var Virtual = {
  29954. update: function update(force) {
  29955. var swiper = this;
  29956. var ref = swiper.params;
  29957. var slidesPerView = ref.slidesPerView;
  29958. var slidesPerGroup = ref.slidesPerGroup;
  29959. var centeredSlides = ref.centeredSlides;
  29960. var ref$1 = swiper.params.virtual;
  29961. var addSlidesBefore = ref$1.addSlidesBefore;
  29962. var addSlidesAfter = ref$1.addSlidesAfter;
  29963. var ref$2 = swiper.virtual;
  29964. var previousFrom = ref$2.from;
  29965. var previousTo = ref$2.to;
  29966. var slides = ref$2.slides;
  29967. var previousSlidesGrid = ref$2.slidesGrid;
  29968. var renderSlide = ref$2.renderSlide;
  29969. var previousOffset = ref$2.offset;
  29970. swiper.updateActiveIndex();
  29971. var activeIndex = swiper.activeIndex || 0;
  29972. var offsetProp;
  29973. if (swiper.rtlTranslate) { offsetProp = 'right'; }
  29974. else { offsetProp = swiper.isHorizontal() ? 'left' : 'top'; }
  29975. var slidesAfter;
  29976. var slidesBefore;
  29977. if (centeredSlides) {
  29978. slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
  29979. slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
  29980. } else {
  29981. slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesBefore;
  29982. slidesBefore = slidesPerGroup + addSlidesAfter;
  29983. }
  29984. var from = Math.max((activeIndex || 0) - slidesBefore, 0);
  29985. var to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
  29986. var offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
  29987. Utils.extend(swiper.virtual, {
  29988. from: from,
  29989. to: to,
  29990. offset: offset,
  29991. slidesGrid: swiper.slidesGrid,
  29992. });
  29993. function onRendered() {
  29994. swiper.updateSlides();
  29995. swiper.updateProgress();
  29996. swiper.updateSlidesClasses();
  29997. if (swiper.lazy && swiper.params.lazy.enabled) {
  29998. swiper.lazy.load();
  29999. }
  30000. }
  30001. if (previousFrom === from && previousTo === to && !force) {
  30002. if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
  30003. swiper.slides.css(offsetProp, (offset + "px"));
  30004. }
  30005. swiper.updateProgress();
  30006. return;
  30007. }
  30008. if (swiper.params.virtual.renderExternal) {
  30009. swiper.params.virtual.renderExternal.call(swiper, {
  30010. offset: offset,
  30011. from: from,
  30012. to: to,
  30013. slides: (function getSlides() {
  30014. var slidesToRender = [];
  30015. for (var i = from; i <= to; i += 1) {
  30016. slidesToRender.push(slides[i]);
  30017. }
  30018. return slidesToRender;
  30019. }()),
  30020. });
  30021. onRendered();
  30022. return;
  30023. }
  30024. var prependIndexes = [];
  30025. var appendIndexes = [];
  30026. if (force) {
  30027. swiper.$wrapperEl.find(("." + (swiper.params.slideClass))).remove();
  30028. } else {
  30029. for (var i = previousFrom; i <= previousTo; i += 1) {
  30030. if (i < from || i > to) {
  30031. swiper.$wrapperEl.find(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + i + "\"]")).remove();
  30032. }
  30033. }
  30034. }
  30035. for (var i$1 = 0; i$1 < slides.length; i$1 += 1) {
  30036. if (i$1 >= from && i$1 <= to) {
  30037. if (typeof previousTo === 'undefined' || force) {
  30038. appendIndexes.push(i$1);
  30039. } else {
  30040. if (i$1 > previousTo) { appendIndexes.push(i$1); }
  30041. if (i$1 < previousFrom) { prependIndexes.push(i$1); }
  30042. }
  30043. }
  30044. }
  30045. appendIndexes.forEach(function (index) {
  30046. swiper.$wrapperEl.append(renderSlide(slides[index], index));
  30047. });
  30048. prependIndexes.sort(function (a, b) { return b - a; }).forEach(function (index) {
  30049. swiper.$wrapperEl.prepend(renderSlide(slides[index], index));
  30050. });
  30051. swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, (offset + "px"));
  30052. onRendered();
  30053. },
  30054. renderSlide: function renderSlide(slide, index) {
  30055. var swiper = this;
  30056. var params = swiper.params.virtual;
  30057. if (params.cache && swiper.virtual.cache[index]) {
  30058. return swiper.virtual.cache[index];
  30059. }
  30060. var $slideEl = params.renderSlide
  30061. ? $(params.renderSlide.call(swiper, slide, index))
  30062. : $(("<div class=\"" + (swiper.params.slideClass) + "\" data-swiper-slide-index=\"" + index + "\">" + slide + "</div>"));
  30063. if (!$slideEl.attr('data-swiper-slide-index')) { $slideEl.attr('data-swiper-slide-index', index); }
  30064. if (params.cache) { swiper.virtual.cache[index] = $slideEl; }
  30065. return $slideEl;
  30066. },
  30067. appendSlide: function appendSlide(slides) {
  30068. var swiper = this;
  30069. if (typeof slides === 'object' && 'length' in slides) {
  30070. for (var i = 0; i < slides.length; i += 1) {
  30071. if (slides[i]) { swiper.virtual.slides.push(slides[i]); }
  30072. }
  30073. } else {
  30074. swiper.virtual.slides.push(slides);
  30075. }
  30076. swiper.virtual.update(true);
  30077. },
  30078. prependSlide: function prependSlide(slides) {
  30079. var swiper = this;
  30080. var activeIndex = swiper.activeIndex;
  30081. var newActiveIndex = activeIndex + 1;
  30082. var numberOfNewSlides = 1;
  30083. if (Array.isArray(slides)) {
  30084. for (var i = 0; i < slides.length; i += 1) {
  30085. if (slides[i]) { swiper.virtual.slides.unshift(slides[i]); }
  30086. }
  30087. newActiveIndex = activeIndex + slides.length;
  30088. numberOfNewSlides = slides.length;
  30089. } else {
  30090. swiper.virtual.slides.unshift(slides);
  30091. }
  30092. if (swiper.params.virtual.cache) {
  30093. var cache = swiper.virtual.cache;
  30094. var newCache = {};
  30095. Object.keys(cache).forEach(function (cachedIndex) {
  30096. var $cachedEl = cache[cachedIndex];
  30097. var cachedElIndex = $cachedEl.attr('data-swiper-slide-index');
  30098. if (cachedElIndex) {
  30099. $cachedEl.attr('data-swiper-slide-index', parseInt(cachedElIndex, 10) + 1);
  30100. }
  30101. newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = $cachedEl;
  30102. });
  30103. swiper.virtual.cache = newCache;
  30104. }
  30105. swiper.virtual.update(true);
  30106. swiper.slideTo(newActiveIndex, 0);
  30107. },
  30108. removeSlide: function removeSlide(slidesIndexes) {
  30109. var swiper = this;
  30110. if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) { return; }
  30111. var activeIndex = swiper.activeIndex;
  30112. if (Array.isArray(slidesIndexes)) {
  30113. for (var i = slidesIndexes.length - 1; i >= 0; i -= 1) {
  30114. swiper.virtual.slides.splice(slidesIndexes[i], 1);
  30115. if (swiper.params.virtual.cache) {
  30116. delete swiper.virtual.cache[slidesIndexes[i]];
  30117. }
  30118. if (slidesIndexes[i] < activeIndex) { activeIndex -= 1; }
  30119. activeIndex = Math.max(activeIndex, 0);
  30120. }
  30121. } else {
  30122. swiper.virtual.slides.splice(slidesIndexes, 1);
  30123. if (swiper.params.virtual.cache) {
  30124. delete swiper.virtual.cache[slidesIndexes];
  30125. }
  30126. if (slidesIndexes < activeIndex) { activeIndex -= 1; }
  30127. activeIndex = Math.max(activeIndex, 0);
  30128. }
  30129. swiper.virtual.update(true);
  30130. swiper.slideTo(activeIndex, 0);
  30131. },
  30132. removeAllSlides: function removeAllSlides() {
  30133. var swiper = this;
  30134. swiper.virtual.slides = [];
  30135. if (swiper.params.virtual.cache) {
  30136. swiper.virtual.cache = {};
  30137. }
  30138. swiper.virtual.update(true);
  30139. swiper.slideTo(0, 0);
  30140. },
  30141. };
  30142. var Virtual$1 = {
  30143. name: 'virtual',
  30144. params: {
  30145. virtual: {
  30146. enabled: false,
  30147. slides: [],
  30148. cache: true,
  30149. renderSlide: null,
  30150. renderExternal: null,
  30151. addSlidesBefore: 0,
  30152. addSlidesAfter: 0,
  30153. },
  30154. },
  30155. create: function create() {
  30156. var swiper = this;
  30157. Utils.extend(swiper, {
  30158. virtual: {
  30159. update: Virtual.update.bind(swiper),
  30160. appendSlide: Virtual.appendSlide.bind(swiper),
  30161. prependSlide: Virtual.prependSlide.bind(swiper),
  30162. removeSlide: Virtual.removeSlide.bind(swiper),
  30163. removeAllSlides: Virtual.removeAllSlides.bind(swiper),
  30164. renderSlide: Virtual.renderSlide.bind(swiper),
  30165. slides: swiper.params.virtual.slides,
  30166. cache: {},
  30167. },
  30168. });
  30169. },
  30170. on: {
  30171. beforeInit: function beforeInit() {
  30172. var swiper = this;
  30173. if (!swiper.params.virtual.enabled) { return; }
  30174. swiper.classNames.push(((swiper.params.containerModifierClass) + "virtual"));
  30175. var overwriteParams = {
  30176. watchSlidesProgress: true,
  30177. };
  30178. Utils.extend(swiper.params, overwriteParams);
  30179. Utils.extend(swiper.originalParams, overwriteParams);
  30180. if (!swiper.params.initialSlide) {
  30181. swiper.virtual.update();
  30182. }
  30183. },
  30184. setTranslate: function setTranslate() {
  30185. var swiper = this;
  30186. if (!swiper.params.virtual.enabled) { return; }
  30187. swiper.virtual.update();
  30188. },
  30189. },
  30190. };
  30191. var Keyboard = {
  30192. handle: function handle(event) {
  30193. var swiper = this;
  30194. var rtl = swiper.rtlTranslate;
  30195. var e = event;
  30196. if (e.originalEvent) { e = e.originalEvent; } // jquery fix
  30197. var kc = e.keyCode || e.charCode;
  30198. // Directions locks
  30199. if (!swiper.allowSlideNext && ((swiper.isHorizontal() && kc === 39) || (swiper.isVertical() && kc === 40) || kc === 34)) {
  30200. return false;
  30201. }
  30202. if (!swiper.allowSlidePrev && ((swiper.isHorizontal() && kc === 37) || (swiper.isVertical() && kc === 38) || kc === 33)) {
  30203. return false;
  30204. }
  30205. if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
  30206. return undefined;
  30207. }
  30208. if (doc.activeElement && doc.activeElement.nodeName && (doc.activeElement.nodeName.toLowerCase() === 'input' || doc.activeElement.nodeName.toLowerCase() === 'textarea')) {
  30209. return undefined;
  30210. }
  30211. if (swiper.params.keyboard.onlyInViewport && (kc === 33 || kc === 34 || kc === 37 || kc === 39 || kc === 38 || kc === 40)) {
  30212. var inView = false;
  30213. // Check that swiper should be inside of visible area of window
  30214. if (swiper.$el.parents(("." + (swiper.params.slideClass))).length > 0 && swiper.$el.parents(("." + (swiper.params.slideActiveClass))).length === 0) {
  30215. return undefined;
  30216. }
  30217. var windowWidth = win.innerWidth;
  30218. var windowHeight = win.innerHeight;
  30219. var swiperOffset = swiper.$el.offset();
  30220. if (rtl) { swiperOffset.left -= swiper.$el[0].scrollLeft; }
  30221. var swiperCoord = [
  30222. [swiperOffset.left, swiperOffset.top],
  30223. [swiperOffset.left + swiper.width, swiperOffset.top],
  30224. [swiperOffset.left, swiperOffset.top + swiper.height],
  30225. [swiperOffset.left + swiper.width, swiperOffset.top + swiper.height] ];
  30226. for (var i = 0; i < swiperCoord.length; i += 1) {
  30227. var point = swiperCoord[i];
  30228. if (
  30229. point[0] >= 0 && point[0] <= windowWidth
  30230. && point[1] >= 0 && point[1] <= windowHeight
  30231. ) {
  30232. inView = true;
  30233. }
  30234. }
  30235. if (!inView) { return undefined; }
  30236. }
  30237. if (swiper.isHorizontal()) {
  30238. if (kc === 33 || kc === 34 || kc === 37 || kc === 39) {
  30239. if (e.preventDefault) { e.preventDefault(); }
  30240. else { e.returnValue = false; }
  30241. }
  30242. if (((kc === 34 || kc === 39) && !rtl) || ((kc === 33 || kc === 37) && rtl)) { swiper.slideNext(); }
  30243. if (((kc === 33 || kc === 37) && !rtl) || ((kc === 34 || kc === 39) && rtl)) { swiper.slidePrev(); }
  30244. } else {
  30245. if (kc === 33 || kc === 34 || kc === 38 || kc === 40) {
  30246. if (e.preventDefault) { e.preventDefault(); }
  30247. else { e.returnValue = false; }
  30248. }
  30249. if (kc === 34 || kc === 40) { swiper.slideNext(); }
  30250. if (kc === 33 || kc === 38) { swiper.slidePrev(); }
  30251. }
  30252. swiper.emit('keyPress', kc);
  30253. return undefined;
  30254. },
  30255. enable: function enable() {
  30256. var swiper = this;
  30257. if (swiper.keyboard.enabled) { return; }
  30258. $(doc).on('keydown', swiper.keyboard.handle);
  30259. swiper.keyboard.enabled = true;
  30260. },
  30261. disable: function disable() {
  30262. var swiper = this;
  30263. if (!swiper.keyboard.enabled) { return; }
  30264. $(doc).off('keydown', swiper.keyboard.handle);
  30265. swiper.keyboard.enabled = false;
  30266. },
  30267. };
  30268. var Keyboard$1 = {
  30269. name: 'keyboard',
  30270. params: {
  30271. keyboard: {
  30272. enabled: false,
  30273. onlyInViewport: true,
  30274. },
  30275. },
  30276. create: function create() {
  30277. var swiper = this;
  30278. Utils.extend(swiper, {
  30279. keyboard: {
  30280. enabled: false,
  30281. enable: Keyboard.enable.bind(swiper),
  30282. disable: Keyboard.disable.bind(swiper),
  30283. handle: Keyboard.handle.bind(swiper),
  30284. },
  30285. });
  30286. },
  30287. on: {
  30288. init: function init() {
  30289. var swiper = this;
  30290. if (swiper.params.keyboard.enabled) {
  30291. swiper.keyboard.enable();
  30292. }
  30293. },
  30294. destroy: function destroy() {
  30295. var swiper = this;
  30296. if (swiper.keyboard.enabled) {
  30297. swiper.keyboard.disable();
  30298. }
  30299. },
  30300. },
  30301. };
  30302. function isEventSupported() {
  30303. var eventName = 'onwheel';
  30304. var isSupported = eventName in doc;
  30305. if (!isSupported) {
  30306. var element = doc.createElement('div');
  30307. element.setAttribute(eventName, 'return;');
  30308. isSupported = typeof element[eventName] === 'function';
  30309. }
  30310. if (!isSupported
  30311. && doc.implementation
  30312. && doc.implementation.hasFeature
  30313. // always returns true in newer browsers as per the standard.
  30314. // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
  30315. && doc.implementation.hasFeature('', '') !== true
  30316. ) {
  30317. // This is the only way to test support for the `wheel` event in IE9+.
  30318. isSupported = doc.implementation.hasFeature('Events.wheel', '3.0');
  30319. }
  30320. return isSupported;
  30321. }
  30322. var Mousewheel = {
  30323. lastScrollTime: Utils.now(),
  30324. lastEventBeforeSnap: undefined,
  30325. recentWheelEvents: [],
  30326. event: function event() {
  30327. if (win.navigator.userAgent.indexOf('firefox') > -1) { return 'DOMMouseScroll'; }
  30328. return isEventSupported() ? 'wheel' : 'mousewheel';
  30329. },
  30330. normalize: function normalize(e) {
  30331. // Reasonable defaults
  30332. var PIXEL_STEP = 10;
  30333. var LINE_HEIGHT = 40;
  30334. var PAGE_HEIGHT = 800;
  30335. var sX = 0;
  30336. var sY = 0; // spinX, spinY
  30337. var pX = 0;
  30338. var pY = 0; // pixelX, pixelY
  30339. // Legacy
  30340. if ('detail' in e) {
  30341. sY = e.detail;
  30342. }
  30343. if ('wheelDelta' in e) {
  30344. sY = -e.wheelDelta / 120;
  30345. }
  30346. if ('wheelDeltaY' in e) {
  30347. sY = -e.wheelDeltaY / 120;
  30348. }
  30349. if ('wheelDeltaX' in e) {
  30350. sX = -e.wheelDeltaX / 120;
  30351. }
  30352. // side scrolling on FF with DOMMouseScroll
  30353. if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
  30354. sX = sY;
  30355. sY = 0;
  30356. }
  30357. pX = sX * PIXEL_STEP;
  30358. pY = sY * PIXEL_STEP;
  30359. if ('deltaY' in e) {
  30360. pY = e.deltaY;
  30361. }
  30362. if ('deltaX' in e) {
  30363. pX = e.deltaX;
  30364. }
  30365. if (e.shiftKey && !pX) { // if user scrolls with shift he wants horizontal scroll
  30366. pX = pY;
  30367. pY = 0;
  30368. }
  30369. if ((pX || pY) && e.deltaMode) {
  30370. if (e.deltaMode === 1) { // delta in LINE units
  30371. pX *= LINE_HEIGHT;
  30372. pY *= LINE_HEIGHT;
  30373. } else { // delta in PAGE units
  30374. pX *= PAGE_HEIGHT;
  30375. pY *= PAGE_HEIGHT;
  30376. }
  30377. }
  30378. // Fall-back if spin cannot be determined
  30379. if (pX && !sX) {
  30380. sX = (pX < 1) ? -1 : 1;
  30381. }
  30382. if (pY && !sY) {
  30383. sY = (pY < 1) ? -1 : 1;
  30384. }
  30385. return {
  30386. spinX: sX,
  30387. spinY: sY,
  30388. pixelX: pX,
  30389. pixelY: pY,
  30390. };
  30391. },
  30392. handleMouseEnter: function handleMouseEnter() {
  30393. var swiper = this;
  30394. swiper.mouseEntered = true;
  30395. },
  30396. handleMouseLeave: function handleMouseLeave() {
  30397. var swiper = this;
  30398. swiper.mouseEntered = false;
  30399. },
  30400. handle: function handle(event) {
  30401. var e = event;
  30402. var swiper = this;
  30403. var params = swiper.params.mousewheel;
  30404. if (swiper.params.cssMode) {
  30405. e.preventDefault();
  30406. }
  30407. var target = swiper.$el;
  30408. if (swiper.params.mousewheel.eventsTarged !== 'container') {
  30409. target = $(swiper.params.mousewheel.eventsTarged);
  30410. }
  30411. if (!swiper.mouseEntered && !target[0].contains(e.target) && !params.releaseOnEdges) { return true; }
  30412. if (e.originalEvent) { e = e.originalEvent; } // jquery fix
  30413. var delta = 0;
  30414. var rtlFactor = swiper.rtlTranslate ? -1 : 1;
  30415. var data = Mousewheel.normalize(e);
  30416. if (params.forceToAxis) {
  30417. if (swiper.isHorizontal()) {
  30418. if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) { delta = data.pixelX * rtlFactor; }
  30419. else { return true; }
  30420. } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) { delta = data.pixelY; }
  30421. else { return true; }
  30422. } else {
  30423. delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
  30424. }
  30425. if (delta === 0) { return true; }
  30426. if (params.invert) { delta = -delta; }
  30427. if (!swiper.params.freeMode) {
  30428. // Register the new event in a variable which stores the relevant data
  30429. var newEvent = {
  30430. time: Utils.now(),
  30431. delta: Math.abs(delta),
  30432. direction: Math.sign(delta),
  30433. raw: event,
  30434. };
  30435. // Keep the most recent events
  30436. var recentWheelEvents = swiper.mousewheel.recentWheelEvents;
  30437. if (recentWheelEvents.length >= 2) {
  30438. recentWheelEvents.shift(); // only store the last N events
  30439. }
  30440. var prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
  30441. recentWheelEvents.push(newEvent);
  30442. // If there is at least one previous recorded event:
  30443. // If direction has changed or
  30444. // if the scroll is quicker than the previous one:
  30445. // Animate the slider.
  30446. // Else (this is the first time the wheel is moved):
  30447. // Animate the slider.
  30448. if (prevEvent) {
  30449. if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
  30450. swiper.mousewheel.animateSlider(newEvent);
  30451. }
  30452. } else {
  30453. swiper.mousewheel.animateSlider(newEvent);
  30454. }
  30455. // If it's time to release the scroll:
  30456. // Return now so you don't hit the preventDefault.
  30457. if (swiper.mousewheel.releaseScroll(newEvent)) {
  30458. return true;
  30459. }
  30460. } else {
  30461. // Freemode or scrollContainer:
  30462. // If we recently snapped after a momentum scroll, then ignore wheel events
  30463. // to give time for the deceleration to finish. Stop ignoring after 500 msecs
  30464. // or if it's a new scroll (larger delta or inverse sign as last event before
  30465. // an end-of-momentum snap).
  30466. var newEvent$1 = { time: Utils.now(), delta: Math.abs(delta), direction: Math.sign(delta) };
  30467. var ref = swiper.mousewheel;
  30468. var lastEventBeforeSnap = ref.lastEventBeforeSnap;
  30469. var ignoreWheelEvents = lastEventBeforeSnap
  30470. && newEvent$1.time < lastEventBeforeSnap.time + 500
  30471. && newEvent$1.delta <= lastEventBeforeSnap.delta
  30472. && newEvent$1.direction === lastEventBeforeSnap.direction;
  30473. if (!ignoreWheelEvents) {
  30474. swiper.mousewheel.lastEventBeforeSnap = undefined;
  30475. if (swiper.params.loop) {
  30476. swiper.loopFix();
  30477. }
  30478. var position = swiper.getTranslate() + (delta * params.sensitivity);
  30479. var wasBeginning = swiper.isBeginning;
  30480. var wasEnd = swiper.isEnd;
  30481. if (position >= swiper.minTranslate()) { position = swiper.minTranslate(); }
  30482. if (position <= swiper.maxTranslate()) { position = swiper.maxTranslate(); }
  30483. swiper.setTransition(0);
  30484. swiper.setTranslate(position);
  30485. swiper.updateProgress();
  30486. swiper.updateActiveIndex();
  30487. swiper.updateSlidesClasses();
  30488. if ((!wasBeginning && swiper.isBeginning) || (!wasEnd && swiper.isEnd)) {
  30489. swiper.updateSlidesClasses();
  30490. }
  30491. if (swiper.params.freeModeSticky) {
  30492. // When wheel scrolling starts with sticky (aka snap) enabled, then detect
  30493. // the end of a momentum scroll by storing recent (N=15?) wheel events.
  30494. // 1. do all N events have decreasing or same (absolute value) delta?
  30495. // 2. did all N events arrive in the last M (M=500?) msecs?
  30496. // 3. does the earliest event have an (absolute value) delta that's
  30497. // at least P (P=1?) larger than the most recent event's delta?
  30498. // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
  30499. // If 1-4 are "yes" then we're near the end of a momuntum scroll deceleration.
  30500. // Snap immediately and ignore remaining wheel events in this scroll.
  30501. // See comment above for "remaining wheel events in this scroll" determination.
  30502. // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
  30503. clearTimeout(swiper.mousewheel.timeout);
  30504. swiper.mousewheel.timeout = undefined;
  30505. var recentWheelEvents$1 = swiper.mousewheel.recentWheelEvents;
  30506. if (recentWheelEvents$1.length >= 15) {
  30507. recentWheelEvents$1.shift(); // only store the last N events
  30508. }
  30509. var prevEvent$1 = recentWheelEvents$1.length ? recentWheelEvents$1[recentWheelEvents$1.length - 1] : undefined;
  30510. var firstEvent = recentWheelEvents$1[0];
  30511. recentWheelEvents$1.push(newEvent$1);
  30512. if (prevEvent$1 && (newEvent$1.delta > prevEvent$1.delta || newEvent$1.direction !== prevEvent$1.direction)) {
  30513. // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
  30514. recentWheelEvents$1.splice(0);
  30515. } else if (recentWheelEvents$1.length >= 15
  30516. && newEvent$1.time - firstEvent.time < 500
  30517. && firstEvent.delta - newEvent$1.delta >= 1
  30518. && newEvent$1.delta <= 6
  30519. ) {
  30520. // We're at the end of the deceleration of a momentum scroll, so there's no need
  30521. // to wait for more events. Snap ASAP on the next tick.
  30522. // Also, because there's some remaining momentum we'll bias the snap in the
  30523. // direction of the ongoing scroll because it's better UX for the scroll to snap
  30524. // in the same direction as the scroll instead of reversing to snap. Therefore,
  30525. // if it's already scrolled more than 20% in the current direction, keep going.
  30526. var snapToThreshold = delta > 0 ? 0.8 : 0.2;
  30527. swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
  30528. recentWheelEvents$1.splice(0);
  30529. swiper.mousewheel.timeout = Utils.nextTick(function () {
  30530. swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
  30531. }, 0); // no delay; move on next tick
  30532. }
  30533. if (!swiper.mousewheel.timeout) {
  30534. // if we get here, then we haven't detected the end of a momentum scroll, so
  30535. // we'll consider a scroll "complete" when there haven't been any wheel events
  30536. // for 500ms.
  30537. swiper.mousewheel.timeout = Utils.nextTick(function () {
  30538. var snapToThreshold = 0.5;
  30539. swiper.mousewheel.lastEventBeforeSnap = newEvent$1;
  30540. recentWheelEvents$1.splice(0);
  30541. swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
  30542. }, 500);
  30543. }
  30544. }
  30545. // Emit event
  30546. if (!ignoreWheelEvents) { swiper.emit('scroll', e); }
  30547. // Stop autoplay
  30548. if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) { swiper.autoplay.stop(); }
  30549. // Return page scroll on edge positions
  30550. if (position === swiper.minTranslate() || position === swiper.maxTranslate()) { return true; }
  30551. }
  30552. }
  30553. if (e.preventDefault) { e.preventDefault(); }
  30554. else { e.returnValue = false; }
  30555. return false;
  30556. },
  30557. animateSlider: function animateSlider(newEvent) {
  30558. var swiper = this;
  30559. // If the movement is NOT big enough and
  30560. // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
  30561. // Don't go any further (avoid insignificant scroll movement).
  30562. if (newEvent.delta >= 6 && Utils.now() - swiper.mousewheel.lastScrollTime < 60) {
  30563. // Return false as a default
  30564. return true;
  30565. }
  30566. // If user is scrolling towards the end:
  30567. // If the slider hasn't hit the latest slide or
  30568. // if the slider is a loop and
  30569. // if the slider isn't moving right now:
  30570. // Go to next slide and
  30571. // emit a scroll event.
  30572. // Else (the user is scrolling towards the beginning) and
  30573. // if the slider hasn't hit the first slide or
  30574. // if the slider is a loop and
  30575. // if the slider isn't moving right now:
  30576. // Go to prev slide and
  30577. // emit a scroll event.
  30578. if (newEvent.direction < 0) {
  30579. if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
  30580. swiper.slideNext();
  30581. swiper.emit('scroll', newEvent.raw);
  30582. }
  30583. } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
  30584. swiper.slidePrev();
  30585. swiper.emit('scroll', newEvent.raw);
  30586. }
  30587. // If you got here is because an animation has been triggered so store the current time
  30588. swiper.mousewheel.lastScrollTime = (new win.Date()).getTime();
  30589. // Return false as a default
  30590. return false;
  30591. },
  30592. releaseScroll: function releaseScroll(newEvent) {
  30593. var swiper = this;
  30594. var params = swiper.params.mousewheel;
  30595. if (newEvent.direction < 0) {
  30596. if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
  30597. // Return true to animate scroll on edges
  30598. return true;
  30599. }
  30600. } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
  30601. // Return true to animate scroll on edges
  30602. return true;
  30603. }
  30604. return false;
  30605. },
  30606. enable: function enable() {
  30607. var swiper = this;
  30608. var event = Mousewheel.event();
  30609. if (swiper.params.cssMode) {
  30610. swiper.wrapperEl.removeEventListener(event, swiper.mousewheel.handle);
  30611. return true;
  30612. }
  30613. if (!event) { return false; }
  30614. if (swiper.mousewheel.enabled) { return false; }
  30615. var target = swiper.$el;
  30616. if (swiper.params.mousewheel.eventsTarged !== 'container') {
  30617. target = $(swiper.params.mousewheel.eventsTarged);
  30618. }
  30619. target.on('mouseenter', swiper.mousewheel.handleMouseEnter);
  30620. target.on('mouseleave', swiper.mousewheel.handleMouseLeave);
  30621. target.on(event, swiper.mousewheel.handle);
  30622. swiper.mousewheel.enabled = true;
  30623. return true;
  30624. },
  30625. disable: function disable() {
  30626. var swiper = this;
  30627. var event = Mousewheel.event();
  30628. if (swiper.params.cssMode) {
  30629. swiper.wrapperEl.addEventListener(event, swiper.mousewheel.handle);
  30630. return true;
  30631. }
  30632. if (!event) { return false; }
  30633. if (!swiper.mousewheel.enabled) { return false; }
  30634. var target = swiper.$el;
  30635. if (swiper.params.mousewheel.eventsTarged !== 'container') {
  30636. target = $(swiper.params.mousewheel.eventsTarged);
  30637. }
  30638. target.off(event, swiper.mousewheel.handle);
  30639. swiper.mousewheel.enabled = false;
  30640. return true;
  30641. },
  30642. };
  30643. var Mousewheel$1 = {
  30644. name: 'mousewheel',
  30645. params: {
  30646. mousewheel: {
  30647. enabled: false,
  30648. releaseOnEdges: false,
  30649. invert: false,
  30650. forceToAxis: false,
  30651. sensitivity: 1,
  30652. eventsTarged: 'container',
  30653. },
  30654. },
  30655. create: function create() {
  30656. var swiper = this;
  30657. Utils.extend(swiper, {
  30658. mousewheel: {
  30659. enabled: false,
  30660. enable: Mousewheel.enable.bind(swiper),
  30661. disable: Mousewheel.disable.bind(swiper),
  30662. handle: Mousewheel.handle.bind(swiper),
  30663. handleMouseEnter: Mousewheel.handleMouseEnter.bind(swiper),
  30664. handleMouseLeave: Mousewheel.handleMouseLeave.bind(swiper),
  30665. animateSlider: Mousewheel.animateSlider.bind(swiper),
  30666. releaseScroll: Mousewheel.releaseScroll.bind(swiper),
  30667. lastScrollTime: Utils.now(),
  30668. lastEventBeforeSnap: undefined,
  30669. recentWheelEvents: [],
  30670. },
  30671. });
  30672. },
  30673. on: {
  30674. init: function init() {
  30675. var swiper = this;
  30676. if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
  30677. swiper.mousewheel.disable();
  30678. }
  30679. if (swiper.params.mousewheel.enabled) { swiper.mousewheel.enable(); }
  30680. },
  30681. destroy: function destroy() {
  30682. var swiper = this;
  30683. if (swiper.params.cssMode) {
  30684. swiper.mousewheel.enable();
  30685. }
  30686. if (swiper.mousewheel.enabled) { swiper.mousewheel.disable(); }
  30687. },
  30688. },
  30689. };
  30690. var Navigation = {
  30691. update: function update() {
  30692. // Update Navigation Buttons
  30693. var swiper = this;
  30694. var params = swiper.params.navigation;
  30695. if (swiper.params.loop) { return; }
  30696. var ref = swiper.navigation;
  30697. var $nextEl = ref.$nextEl;
  30698. var $prevEl = ref.$prevEl;
  30699. if ($prevEl && $prevEl.length > 0) {
  30700. if (swiper.isBeginning) {
  30701. $prevEl.addClass(params.disabledClass);
  30702. } else {
  30703. $prevEl.removeClass(params.disabledClass);
  30704. }
  30705. $prevEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
  30706. }
  30707. if ($nextEl && $nextEl.length > 0) {
  30708. if (swiper.isEnd) {
  30709. $nextEl.addClass(params.disabledClass);
  30710. } else {
  30711. $nextEl.removeClass(params.disabledClass);
  30712. }
  30713. $nextEl[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
  30714. }
  30715. },
  30716. onPrevClick: function onPrevClick(e) {
  30717. var swiper = this;
  30718. e.preventDefault();
  30719. if (swiper.isBeginning && !swiper.params.loop) { return; }
  30720. swiper.slidePrev();
  30721. },
  30722. onNextClick: function onNextClick(e) {
  30723. var swiper = this;
  30724. e.preventDefault();
  30725. if (swiper.isEnd && !swiper.params.loop) { return; }
  30726. swiper.slideNext();
  30727. },
  30728. init: function init() {
  30729. var swiper = this;
  30730. var params = swiper.params.navigation;
  30731. if (!(params.nextEl || params.prevEl)) { return; }
  30732. var $nextEl;
  30733. var $prevEl;
  30734. if (params.nextEl) {
  30735. $nextEl = $(params.nextEl);
  30736. if (
  30737. swiper.params.uniqueNavElements
  30738. && typeof params.nextEl === 'string'
  30739. && $nextEl.length > 1
  30740. && swiper.$el.find(params.nextEl).length === 1
  30741. ) {
  30742. $nextEl = swiper.$el.find(params.nextEl);
  30743. }
  30744. }
  30745. if (params.prevEl) {
  30746. $prevEl = $(params.prevEl);
  30747. if (
  30748. swiper.params.uniqueNavElements
  30749. && typeof params.prevEl === 'string'
  30750. && $prevEl.length > 1
  30751. && swiper.$el.find(params.prevEl).length === 1
  30752. ) {
  30753. $prevEl = swiper.$el.find(params.prevEl);
  30754. }
  30755. }
  30756. if ($nextEl && $nextEl.length > 0) {
  30757. $nextEl.on('click', swiper.navigation.onNextClick);
  30758. }
  30759. if ($prevEl && $prevEl.length > 0) {
  30760. $prevEl.on('click', swiper.navigation.onPrevClick);
  30761. }
  30762. Utils.extend(swiper.navigation, {
  30763. $nextEl: $nextEl,
  30764. nextEl: $nextEl && $nextEl[0],
  30765. $prevEl: $prevEl,
  30766. prevEl: $prevEl && $prevEl[0],
  30767. });
  30768. },
  30769. destroy: function destroy() {
  30770. var swiper = this;
  30771. var ref = swiper.navigation;
  30772. var $nextEl = ref.$nextEl;
  30773. var $prevEl = ref.$prevEl;
  30774. if ($nextEl && $nextEl.length) {
  30775. $nextEl.off('click', swiper.navigation.onNextClick);
  30776. $nextEl.removeClass(swiper.params.navigation.disabledClass);
  30777. }
  30778. if ($prevEl && $prevEl.length) {
  30779. $prevEl.off('click', swiper.navigation.onPrevClick);
  30780. $prevEl.removeClass(swiper.params.navigation.disabledClass);
  30781. }
  30782. },
  30783. };
  30784. var Navigation$1 = {
  30785. name: 'navigation',
  30786. params: {
  30787. navigation: {
  30788. nextEl: null,
  30789. prevEl: null,
  30790. hideOnClick: false,
  30791. disabledClass: 'swiper-button-disabled',
  30792. hiddenClass: 'swiper-button-hidden',
  30793. lockClass: 'swiper-button-lock',
  30794. },
  30795. },
  30796. create: function create() {
  30797. var swiper = this;
  30798. Utils.extend(swiper, {
  30799. navigation: {
  30800. init: Navigation.init.bind(swiper),
  30801. update: Navigation.update.bind(swiper),
  30802. destroy: Navigation.destroy.bind(swiper),
  30803. onNextClick: Navigation.onNextClick.bind(swiper),
  30804. onPrevClick: Navigation.onPrevClick.bind(swiper),
  30805. },
  30806. });
  30807. },
  30808. on: {
  30809. init: function init() {
  30810. var swiper = this;
  30811. swiper.navigation.init();
  30812. swiper.navigation.update();
  30813. },
  30814. toEdge: function toEdge() {
  30815. var swiper = this;
  30816. swiper.navigation.update();
  30817. },
  30818. fromEdge: function fromEdge() {
  30819. var swiper = this;
  30820. swiper.navigation.update();
  30821. },
  30822. destroy: function destroy() {
  30823. var swiper = this;
  30824. swiper.navigation.destroy();
  30825. },
  30826. click: function click(e) {
  30827. var swiper = this;
  30828. var ref = swiper.navigation;
  30829. var $nextEl = ref.$nextEl;
  30830. var $prevEl = ref.$prevEl;
  30831. if (
  30832. swiper.params.navigation.hideOnClick
  30833. && !$(e.target).is($prevEl)
  30834. && !$(e.target).is($nextEl)
  30835. ) {
  30836. var isHidden;
  30837. if ($nextEl) {
  30838. isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);
  30839. } else if ($prevEl) {
  30840. isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);
  30841. }
  30842. if (isHidden === true) {
  30843. swiper.emit('navigationShow', swiper);
  30844. } else {
  30845. swiper.emit('navigationHide', swiper);
  30846. }
  30847. if ($nextEl) {
  30848. $nextEl.toggleClass(swiper.params.navigation.hiddenClass);
  30849. }
  30850. if ($prevEl) {
  30851. $prevEl.toggleClass(swiper.params.navigation.hiddenClass);
  30852. }
  30853. }
  30854. },
  30855. },
  30856. };
  30857. var Pagination = {
  30858. update: function update() {
  30859. // Render || Update Pagination bullets/items
  30860. var swiper = this;
  30861. var rtl = swiper.rtl;
  30862. var params = swiper.params.pagination;
  30863. if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
  30864. var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
  30865. var $el = swiper.pagination.$el;
  30866. // Current/Total
  30867. var current;
  30868. var total = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
  30869. if (swiper.params.loop) {
  30870. current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);
  30871. if (current > slidesLength - 1 - (swiper.loopedSlides * 2)) {
  30872. current -= (slidesLength - (swiper.loopedSlides * 2));
  30873. }
  30874. if (current > total - 1) { current -= total; }
  30875. if (current < 0 && swiper.params.paginationType !== 'bullets') { current = total + current; }
  30876. } else if (typeof swiper.snapIndex !== 'undefined') {
  30877. current = swiper.snapIndex;
  30878. } else {
  30879. current = swiper.activeIndex || 0;
  30880. }
  30881. // Types
  30882. if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
  30883. var bullets = swiper.pagination.bullets;
  30884. var firstIndex;
  30885. var lastIndex;
  30886. var midIndex;
  30887. if (params.dynamicBullets) {
  30888. swiper.pagination.bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);
  30889. $el.css(swiper.isHorizontal() ? 'width' : 'height', ((swiper.pagination.bulletSize * (params.dynamicMainBullets + 4)) + "px"));
  30890. if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {
  30891. swiper.pagination.dynamicBulletIndex += (current - swiper.previousIndex);
  30892. if (swiper.pagination.dynamicBulletIndex > (params.dynamicMainBullets - 1)) {
  30893. swiper.pagination.dynamicBulletIndex = params.dynamicMainBullets - 1;
  30894. } else if (swiper.pagination.dynamicBulletIndex < 0) {
  30895. swiper.pagination.dynamicBulletIndex = 0;
  30896. }
  30897. }
  30898. firstIndex = current - swiper.pagination.dynamicBulletIndex;
  30899. lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
  30900. midIndex = (lastIndex + firstIndex) / 2;
  30901. }
  30902. bullets.removeClass(((params.bulletActiveClass) + " " + (params.bulletActiveClass) + "-next " + (params.bulletActiveClass) + "-next-next " + (params.bulletActiveClass) + "-prev " + (params.bulletActiveClass) + "-prev-prev " + (params.bulletActiveClass) + "-main"));
  30903. if ($el.length > 1) {
  30904. bullets.each(function (index, bullet) {
  30905. var $bullet = $(bullet);
  30906. var bulletIndex = $bullet.index();
  30907. if (bulletIndex === current) {
  30908. $bullet.addClass(params.bulletActiveClass);
  30909. }
  30910. if (params.dynamicBullets) {
  30911. if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
  30912. $bullet.addClass(((params.bulletActiveClass) + "-main"));
  30913. }
  30914. if (bulletIndex === firstIndex) {
  30915. $bullet
  30916. .prev()
  30917. .addClass(((params.bulletActiveClass) + "-prev"))
  30918. .prev()
  30919. .addClass(((params.bulletActiveClass) + "-prev-prev"));
  30920. }
  30921. if (bulletIndex === lastIndex) {
  30922. $bullet
  30923. .next()
  30924. .addClass(((params.bulletActiveClass) + "-next"))
  30925. .next()
  30926. .addClass(((params.bulletActiveClass) + "-next-next"));
  30927. }
  30928. }
  30929. });
  30930. } else {
  30931. var $bullet = bullets.eq(current);
  30932. var bulletIndex = $bullet.index();
  30933. $bullet.addClass(params.bulletActiveClass);
  30934. if (params.dynamicBullets) {
  30935. var $firstDisplayedBullet = bullets.eq(firstIndex);
  30936. var $lastDisplayedBullet = bullets.eq(lastIndex);
  30937. for (var i = firstIndex; i <= lastIndex; i += 1) {
  30938. bullets.eq(i).addClass(((params.bulletActiveClass) + "-main"));
  30939. }
  30940. if (swiper.params.loop) {
  30941. if (bulletIndex >= bullets.length - params.dynamicMainBullets) {
  30942. for (var i$1 = params.dynamicMainBullets; i$1 >= 0; i$1 -= 1) {
  30943. bullets.eq(bullets.length - i$1).addClass(((params.bulletActiveClass) + "-main"));
  30944. }
  30945. bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(((params.bulletActiveClass) + "-prev"));
  30946. } else {
  30947. $firstDisplayedBullet
  30948. .prev()
  30949. .addClass(((params.bulletActiveClass) + "-prev"))
  30950. .prev()
  30951. .addClass(((params.bulletActiveClass) + "-prev-prev"));
  30952. $lastDisplayedBullet
  30953. .next()
  30954. .addClass(((params.bulletActiveClass) + "-next"))
  30955. .next()
  30956. .addClass(((params.bulletActiveClass) + "-next-next"));
  30957. }
  30958. } else {
  30959. $firstDisplayedBullet
  30960. .prev()
  30961. .addClass(((params.bulletActiveClass) + "-prev"))
  30962. .prev()
  30963. .addClass(((params.bulletActiveClass) + "-prev-prev"));
  30964. $lastDisplayedBullet
  30965. .next()
  30966. .addClass(((params.bulletActiveClass) + "-next"))
  30967. .next()
  30968. .addClass(((params.bulletActiveClass) + "-next-next"));
  30969. }
  30970. }
  30971. }
  30972. if (params.dynamicBullets) {
  30973. var dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
  30974. var bulletsOffset = (((swiper.pagination.bulletSize * dynamicBulletsLength) - (swiper.pagination.bulletSize)) / 2) - (midIndex * swiper.pagination.bulletSize);
  30975. var offsetProp = rtl ? 'right' : 'left';
  30976. bullets.css(swiper.isHorizontal() ? offsetProp : 'top', (bulletsOffset + "px"));
  30977. }
  30978. }
  30979. if (params.type === 'fraction') {
  30980. $el.find(("." + (params.currentClass))).text(params.formatFractionCurrent(current + 1));
  30981. $el.find(("." + (params.totalClass))).text(params.formatFractionTotal(total));
  30982. }
  30983. if (params.type === 'progressbar') {
  30984. var progressbarDirection;
  30985. if (params.progressbarOpposite) {
  30986. progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
  30987. } else {
  30988. progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
  30989. }
  30990. var scale = (current + 1) / total;
  30991. var scaleX = 1;
  30992. var scaleY = 1;
  30993. if (progressbarDirection === 'horizontal') {
  30994. scaleX = scale;
  30995. } else {
  30996. scaleY = scale;
  30997. }
  30998. $el.find(("." + (params.progressbarFillClass))).transform(("translate3d(0,0,0) scaleX(" + scaleX + ") scaleY(" + scaleY + ")")).transition(swiper.params.speed);
  30999. }
  31000. if (params.type === 'custom' && params.renderCustom) {
  31001. $el.html(params.renderCustom(swiper, current + 1, total));
  31002. swiper.emit('paginationRender', swiper, $el[0]);
  31003. } else {
  31004. swiper.emit('paginationUpdate', swiper, $el[0]);
  31005. }
  31006. $el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);
  31007. },
  31008. render: function render() {
  31009. // Render Container
  31010. var swiper = this;
  31011. var params = swiper.params.pagination;
  31012. if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
  31013. var slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
  31014. var $el = swiper.pagination.$el;
  31015. var paginationHTML = '';
  31016. if (params.type === 'bullets') {
  31017. var numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - (swiper.loopedSlides * 2)) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
  31018. for (var i = 0; i < numberOfBullets; i += 1) {
  31019. if (params.renderBullet) {
  31020. paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
  31021. } else {
  31022. paginationHTML += "<" + (params.bulletElement) + " class=\"" + (params.bulletClass) + "\"></" + (params.bulletElement) + ">";
  31023. }
  31024. }
  31025. $el.html(paginationHTML);
  31026. swiper.pagination.bullets = $el.find(("." + (params.bulletClass)));
  31027. }
  31028. if (params.type === 'fraction') {
  31029. if (params.renderFraction) {
  31030. paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
  31031. } else {
  31032. paginationHTML = "<span class=\"" + (params.currentClass) + "\"></span>"
  31033. + ' / '
  31034. + "<span class=\"" + (params.totalClass) + "\"></span>";
  31035. }
  31036. $el.html(paginationHTML);
  31037. }
  31038. if (params.type === 'progressbar') {
  31039. if (params.renderProgressbar) {
  31040. paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
  31041. } else {
  31042. paginationHTML = "<span class=\"" + (params.progressbarFillClass) + "\"></span>";
  31043. }
  31044. $el.html(paginationHTML);
  31045. }
  31046. if (params.type !== 'custom') {
  31047. swiper.emit('paginationRender', swiper.pagination.$el[0]);
  31048. }
  31049. },
  31050. init: function init() {
  31051. var swiper = this;
  31052. var params = swiper.params.pagination;
  31053. if (!params.el) { return; }
  31054. var $el = $(params.el);
  31055. if ($el.length === 0) { return; }
  31056. if (
  31057. swiper.params.uniqueNavElements
  31058. && typeof params.el === 'string'
  31059. && $el.length > 1
  31060. && swiper.$el.find(params.el).length === 1
  31061. ) {
  31062. $el = swiper.$el.find(params.el);
  31063. }
  31064. if (params.type === 'bullets' && params.clickable) {
  31065. $el.addClass(params.clickableClass);
  31066. }
  31067. $el.addClass(params.modifierClass + params.type);
  31068. if (params.type === 'bullets' && params.dynamicBullets) {
  31069. $el.addClass(("" + (params.modifierClass) + (params.type) + "-dynamic"));
  31070. swiper.pagination.dynamicBulletIndex = 0;
  31071. if (params.dynamicMainBullets < 1) {
  31072. params.dynamicMainBullets = 1;
  31073. }
  31074. }
  31075. if (params.type === 'progressbar' && params.progressbarOpposite) {
  31076. $el.addClass(params.progressbarOppositeClass);
  31077. }
  31078. if (params.clickable) {
  31079. $el.on('click', ("." + (params.bulletClass)), function onClick(e) {
  31080. e.preventDefault();
  31081. var index = $(this).index() * swiper.params.slidesPerGroup;
  31082. if (swiper.params.loop) { index += swiper.loopedSlides; }
  31083. swiper.slideTo(index);
  31084. });
  31085. }
  31086. Utils.extend(swiper.pagination, {
  31087. $el: $el,
  31088. el: $el[0],
  31089. });
  31090. },
  31091. destroy: function destroy() {
  31092. var swiper = this;
  31093. var params = swiper.params.pagination;
  31094. if (!params.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0) { return; }
  31095. var $el = swiper.pagination.$el;
  31096. $el.removeClass(params.hiddenClass);
  31097. $el.removeClass(params.modifierClass + params.type);
  31098. if (swiper.pagination.bullets) { swiper.pagination.bullets.removeClass(params.bulletActiveClass); }
  31099. if (params.clickable) {
  31100. $el.off('click', ("." + (params.bulletClass)));
  31101. }
  31102. },
  31103. };
  31104. var Pagination$1 = {
  31105. name: 'pagination',
  31106. params: {
  31107. pagination: {
  31108. el: null,
  31109. bulletElement: 'span',
  31110. clickable: false,
  31111. hideOnClick: false,
  31112. renderBullet: null,
  31113. renderProgressbar: null,
  31114. renderFraction: null,
  31115. renderCustom: null,
  31116. progressbarOpposite: false,
  31117. type: 'bullets', // 'bullets' or 'progressbar' or 'fraction' or 'custom'
  31118. dynamicBullets: false,
  31119. dynamicMainBullets: 1,
  31120. formatFractionCurrent: function (number) { return number; },
  31121. formatFractionTotal: function (number) { return number; },
  31122. bulletClass: 'swiper-pagination-bullet',
  31123. bulletActiveClass: 'swiper-pagination-bullet-active',
  31124. modifierClass: 'swiper-pagination-', // NEW
  31125. currentClass: 'swiper-pagination-current',
  31126. totalClass: 'swiper-pagination-total',
  31127. hiddenClass: 'swiper-pagination-hidden',
  31128. progressbarFillClass: 'swiper-pagination-progressbar-fill',
  31129. progressbarOppositeClass: 'swiper-pagination-progressbar-opposite',
  31130. clickableClass: 'swiper-pagination-clickable', // NEW
  31131. lockClass: 'swiper-pagination-lock',
  31132. },
  31133. },
  31134. create: function create() {
  31135. var swiper = this;
  31136. Utils.extend(swiper, {
  31137. pagination: {
  31138. init: Pagination.init.bind(swiper),
  31139. render: Pagination.render.bind(swiper),
  31140. update: Pagination.update.bind(swiper),
  31141. destroy: Pagination.destroy.bind(swiper),
  31142. dynamicBulletIndex: 0,
  31143. },
  31144. });
  31145. },
  31146. on: {
  31147. init: function init() {
  31148. var swiper = this;
  31149. swiper.pagination.init();
  31150. swiper.pagination.render();
  31151. swiper.pagination.update();
  31152. },
  31153. activeIndexChange: function activeIndexChange() {
  31154. var swiper = this;
  31155. if (swiper.params.loop) {
  31156. swiper.pagination.update();
  31157. } else if (typeof swiper.snapIndex === 'undefined') {
  31158. swiper.pagination.update();
  31159. }
  31160. },
  31161. snapIndexChange: function snapIndexChange() {
  31162. var swiper = this;
  31163. if (!swiper.params.loop) {
  31164. swiper.pagination.update();
  31165. }
  31166. },
  31167. slidesLengthChange: function slidesLengthChange() {
  31168. var swiper = this;
  31169. if (swiper.params.loop) {
  31170. swiper.pagination.render();
  31171. swiper.pagination.update();
  31172. }
  31173. },
  31174. snapGridLengthChange: function snapGridLengthChange() {
  31175. var swiper = this;
  31176. if (!swiper.params.loop) {
  31177. swiper.pagination.render();
  31178. swiper.pagination.update();
  31179. }
  31180. },
  31181. destroy: function destroy() {
  31182. var swiper = this;
  31183. swiper.pagination.destroy();
  31184. },
  31185. click: function click(e) {
  31186. var swiper = this;
  31187. if (
  31188. swiper.params.pagination.el
  31189. && swiper.params.pagination.hideOnClick
  31190. && swiper.pagination.$el.length > 0
  31191. && !$(e.target).hasClass(swiper.params.pagination.bulletClass)
  31192. ) {
  31193. var isHidden = swiper.pagination.$el.hasClass(swiper.params.pagination.hiddenClass);
  31194. if (isHidden === true) {
  31195. swiper.emit('paginationShow', swiper);
  31196. } else {
  31197. swiper.emit('paginationHide', swiper);
  31198. }
  31199. swiper.pagination.$el.toggleClass(swiper.params.pagination.hiddenClass);
  31200. }
  31201. },
  31202. },
  31203. };
  31204. var Scrollbar = {
  31205. setTranslate: function setTranslate() {
  31206. var swiper = this;
  31207. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
  31208. var scrollbar = swiper.scrollbar;
  31209. var rtl = swiper.rtlTranslate;
  31210. var progress = swiper.progress;
  31211. var dragSize = scrollbar.dragSize;
  31212. var trackSize = scrollbar.trackSize;
  31213. var $dragEl = scrollbar.$dragEl;
  31214. var $el = scrollbar.$el;
  31215. var params = swiper.params.scrollbar;
  31216. var newSize = dragSize;
  31217. var newPos = (trackSize - dragSize) * progress;
  31218. if (rtl) {
  31219. newPos = -newPos;
  31220. if (newPos > 0) {
  31221. newSize = dragSize - newPos;
  31222. newPos = 0;
  31223. } else if (-newPos + dragSize > trackSize) {
  31224. newSize = trackSize + newPos;
  31225. }
  31226. } else if (newPos < 0) {
  31227. newSize = dragSize + newPos;
  31228. newPos = 0;
  31229. } else if (newPos + dragSize > trackSize) {
  31230. newSize = trackSize - newPos;
  31231. }
  31232. if (swiper.isHorizontal()) {
  31233. $dragEl.transform(("translate3d(" + newPos + "px, 0, 0)"));
  31234. $dragEl[0].style.width = newSize + "px";
  31235. } else {
  31236. $dragEl.transform(("translate3d(0px, " + newPos + "px, 0)"));
  31237. $dragEl[0].style.height = newSize + "px";
  31238. }
  31239. if (params.hide) {
  31240. clearTimeout(swiper.scrollbar.timeout);
  31241. $el[0].style.opacity = 1;
  31242. swiper.scrollbar.timeout = setTimeout(function () {
  31243. $el[0].style.opacity = 0;
  31244. $el.transition(400);
  31245. }, 1000);
  31246. }
  31247. },
  31248. setTransition: function setTransition(duration) {
  31249. var swiper = this;
  31250. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
  31251. swiper.scrollbar.$dragEl.transition(duration);
  31252. },
  31253. updateSize: function updateSize() {
  31254. var swiper = this;
  31255. if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) { return; }
  31256. var scrollbar = swiper.scrollbar;
  31257. var $dragEl = scrollbar.$dragEl;
  31258. var $el = scrollbar.$el;
  31259. $dragEl[0].style.width = '';
  31260. $dragEl[0].style.height = '';
  31261. var trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;
  31262. var divider = swiper.size / swiper.virtualSize;
  31263. var moveDivider = divider * (trackSize / swiper.size);
  31264. var dragSize;
  31265. if (swiper.params.scrollbar.dragSize === 'auto') {
  31266. dragSize = trackSize * divider;
  31267. } else {
  31268. dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
  31269. }
  31270. if (swiper.isHorizontal()) {
  31271. $dragEl[0].style.width = dragSize + "px";
  31272. } else {
  31273. $dragEl[0].style.height = dragSize + "px";
  31274. }
  31275. if (divider >= 1) {
  31276. $el[0].style.display = 'none';
  31277. } else {
  31278. $el[0].style.display = '';
  31279. }
  31280. if (swiper.params.scrollbar.hide) {
  31281. $el[0].style.opacity = 0;
  31282. }
  31283. Utils.extend(scrollbar, {
  31284. trackSize: trackSize,
  31285. divider: divider,
  31286. moveDivider: moveDivider,
  31287. dragSize: dragSize,
  31288. });
  31289. scrollbar.$el[swiper.params.watchOverflow && swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);
  31290. },
  31291. getPointerPosition: function getPointerPosition(e) {
  31292. var swiper = this;
  31293. if (swiper.isHorizontal()) {
  31294. return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientX : e.clientX);
  31295. }
  31296. return ((e.type === 'touchstart' || e.type === 'touchmove') ? e.targetTouches[0].clientY : e.clientY);
  31297. },
  31298. setDragPosition: function setDragPosition(e) {
  31299. var swiper = this;
  31300. var scrollbar = swiper.scrollbar;
  31301. var rtl = swiper.rtlTranslate;
  31302. var $el = scrollbar.$el;
  31303. var dragSize = scrollbar.dragSize;
  31304. var trackSize = scrollbar.trackSize;
  31305. var dragStartPos = scrollbar.dragStartPos;
  31306. var positionRatio;
  31307. positionRatio = ((scrollbar.getPointerPosition(e)) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top']
  31308. - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
  31309. positionRatio = Math.max(Math.min(positionRatio, 1), 0);
  31310. if (rtl) {
  31311. positionRatio = 1 - positionRatio;
  31312. }
  31313. var position = swiper.minTranslate() + ((swiper.maxTranslate() - swiper.minTranslate()) * positionRatio);
  31314. swiper.updateProgress(position);
  31315. swiper.setTranslate(position);
  31316. swiper.updateActiveIndex();
  31317. swiper.updateSlidesClasses();
  31318. },
  31319. onDragStart: function onDragStart(e) {
  31320. var swiper = this;
  31321. var params = swiper.params.scrollbar;
  31322. var scrollbar = swiper.scrollbar;
  31323. var $wrapperEl = swiper.$wrapperEl;
  31324. var $el = scrollbar.$el;
  31325. var $dragEl = scrollbar.$dragEl;
  31326. swiper.scrollbar.isTouched = true;
  31327. swiper.scrollbar.dragStartPos = (e.target === $dragEl[0] || e.target === $dragEl)
  31328. ? scrollbar.getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
  31329. e.preventDefault();
  31330. e.stopPropagation();
  31331. $wrapperEl.transition(100);
  31332. $dragEl.transition(100);
  31333. scrollbar.setDragPosition(e);
  31334. clearTimeout(swiper.scrollbar.dragTimeout);
  31335. $el.transition(0);
  31336. if (params.hide) {
  31337. $el.css('opacity', 1);
  31338. }
  31339. if (swiper.params.cssMode) {
  31340. swiper.$wrapperEl.css('scroll-snap-type', 'none');
  31341. }
  31342. swiper.emit('scrollbarDragStart', e);
  31343. },
  31344. onDragMove: function onDragMove(e) {
  31345. var swiper = this;
  31346. var scrollbar = swiper.scrollbar;
  31347. var $wrapperEl = swiper.$wrapperEl;
  31348. var $el = scrollbar.$el;
  31349. var $dragEl = scrollbar.$dragEl;
  31350. if (!swiper.scrollbar.isTouched) { return; }
  31351. if (e.preventDefault) { e.preventDefault(); }
  31352. else { e.returnValue = false; }
  31353. scrollbar.setDragPosition(e);
  31354. $wrapperEl.transition(0);
  31355. $el.transition(0);
  31356. $dragEl.transition(0);
  31357. swiper.emit('scrollbarDragMove', e);
  31358. },
  31359. onDragEnd: function onDragEnd(e) {
  31360. var swiper = this;
  31361. var params = swiper.params.scrollbar;
  31362. var scrollbar = swiper.scrollbar;
  31363. var $wrapperEl = swiper.$wrapperEl;
  31364. var $el = scrollbar.$el;
  31365. if (!swiper.scrollbar.isTouched) { return; }
  31366. swiper.scrollbar.isTouched = false;
  31367. if (swiper.params.cssMode) {
  31368. swiper.$wrapperEl.css('scroll-snap-type', '');
  31369. $wrapperEl.transition('');
  31370. }
  31371. if (params.hide) {
  31372. clearTimeout(swiper.scrollbar.dragTimeout);
  31373. swiper.scrollbar.dragTimeout = Utils.nextTick(function () {
  31374. $el.css('opacity', 0);
  31375. $el.transition(400);
  31376. }, 1000);
  31377. }
  31378. swiper.emit('scrollbarDragEnd', e);
  31379. if (params.snapOnRelease) {
  31380. swiper.slideToClosest();
  31381. }
  31382. },
  31383. enableDraggable: function enableDraggable() {
  31384. var swiper = this;
  31385. if (!swiper.params.scrollbar.el) { return; }
  31386. var scrollbar = swiper.scrollbar;
  31387. var touchEventsTouch = swiper.touchEventsTouch;
  31388. var touchEventsDesktop = swiper.touchEventsDesktop;
  31389. var params = swiper.params;
  31390. var $el = scrollbar.$el;
  31391. var target = $el[0];
  31392. var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
  31393. var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  31394. if (!Support.touch) {
  31395. target.addEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
  31396. doc.addEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
  31397. doc.addEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
  31398. } else {
  31399. target.addEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
  31400. target.addEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
  31401. target.addEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
  31402. }
  31403. },
  31404. disableDraggable: function disableDraggable() {
  31405. var swiper = this;
  31406. if (!swiper.params.scrollbar.el) { return; }
  31407. var scrollbar = swiper.scrollbar;
  31408. var touchEventsTouch = swiper.touchEventsTouch;
  31409. var touchEventsDesktop = swiper.touchEventsDesktop;
  31410. var params = swiper.params;
  31411. var $el = scrollbar.$el;
  31412. var target = $el[0];
  31413. var activeListener = Support.passiveListener && params.passiveListeners ? { passive: false, capture: false } : false;
  31414. var passiveListener = Support.passiveListener && params.passiveListeners ? { passive: true, capture: false } : false;
  31415. if (!Support.touch) {
  31416. target.removeEventListener(touchEventsDesktop.start, swiper.scrollbar.onDragStart, activeListener);
  31417. doc.removeEventListener(touchEventsDesktop.move, swiper.scrollbar.onDragMove, activeListener);
  31418. doc.removeEventListener(touchEventsDesktop.end, swiper.scrollbar.onDragEnd, passiveListener);
  31419. } else {
  31420. target.removeEventListener(touchEventsTouch.start, swiper.scrollbar.onDragStart, activeListener);
  31421. target.removeEventListener(touchEventsTouch.move, swiper.scrollbar.onDragMove, activeListener);
  31422. target.removeEventListener(touchEventsTouch.end, swiper.scrollbar.onDragEnd, passiveListener);
  31423. }
  31424. },
  31425. init: function init() {
  31426. var swiper = this;
  31427. if (!swiper.params.scrollbar.el) { return; }
  31428. var scrollbar = swiper.scrollbar;
  31429. var $swiperEl = swiper.$el;
  31430. var params = swiper.params.scrollbar;
  31431. var $el = $(params.el);
  31432. if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {
  31433. $el = $swiperEl.find(params.el);
  31434. }
  31435. var $dragEl = $el.find(("." + (swiper.params.scrollbar.dragClass)));
  31436. if ($dragEl.length === 0) {
  31437. $dragEl = $(("<div class=\"" + (swiper.params.scrollbar.dragClass) + "\"></div>"));
  31438. $el.append($dragEl);
  31439. }
  31440. Utils.extend(scrollbar, {
  31441. $el: $el,
  31442. el: $el[0],
  31443. $dragEl: $dragEl,
  31444. dragEl: $dragEl[0],
  31445. });
  31446. if (params.draggable) {
  31447. scrollbar.enableDraggable();
  31448. }
  31449. },
  31450. destroy: function destroy() {
  31451. var swiper = this;
  31452. swiper.scrollbar.disableDraggable();
  31453. },
  31454. };
  31455. var Scrollbar$1 = {
  31456. name: 'scrollbar',
  31457. params: {
  31458. scrollbar: {
  31459. el: null,
  31460. dragSize: 'auto',
  31461. hide: false,
  31462. draggable: false,
  31463. snapOnRelease: true,
  31464. lockClass: 'swiper-scrollbar-lock',
  31465. dragClass: 'swiper-scrollbar-drag',
  31466. },
  31467. },
  31468. create: function create() {
  31469. var swiper = this;
  31470. Utils.extend(swiper, {
  31471. scrollbar: {
  31472. init: Scrollbar.init.bind(swiper),
  31473. destroy: Scrollbar.destroy.bind(swiper),
  31474. updateSize: Scrollbar.updateSize.bind(swiper),
  31475. setTranslate: Scrollbar.setTranslate.bind(swiper),
  31476. setTransition: Scrollbar.setTransition.bind(swiper),
  31477. enableDraggable: Scrollbar.enableDraggable.bind(swiper),
  31478. disableDraggable: Scrollbar.disableDraggable.bind(swiper),
  31479. setDragPosition: Scrollbar.setDragPosition.bind(swiper),
  31480. getPointerPosition: Scrollbar.getPointerPosition.bind(swiper),
  31481. onDragStart: Scrollbar.onDragStart.bind(swiper),
  31482. onDragMove: Scrollbar.onDragMove.bind(swiper),
  31483. onDragEnd: Scrollbar.onDragEnd.bind(swiper),
  31484. isTouched: false,
  31485. timeout: null,
  31486. dragTimeout: null,
  31487. },
  31488. });
  31489. },
  31490. on: {
  31491. init: function init() {
  31492. var swiper = this;
  31493. swiper.scrollbar.init();
  31494. swiper.scrollbar.updateSize();
  31495. swiper.scrollbar.setTranslate();
  31496. },
  31497. update: function update() {
  31498. var swiper = this;
  31499. swiper.scrollbar.updateSize();
  31500. },
  31501. resize: function resize() {
  31502. var swiper = this;
  31503. swiper.scrollbar.updateSize();
  31504. },
  31505. observerUpdate: function observerUpdate() {
  31506. var swiper = this;
  31507. swiper.scrollbar.updateSize();
  31508. },
  31509. setTranslate: function setTranslate() {
  31510. var swiper = this;
  31511. swiper.scrollbar.setTranslate();
  31512. },
  31513. setTransition: function setTransition(duration) {
  31514. var swiper = this;
  31515. swiper.scrollbar.setTransition(duration);
  31516. },
  31517. destroy: function destroy() {
  31518. var swiper = this;
  31519. swiper.scrollbar.destroy();
  31520. },
  31521. },
  31522. };
  31523. var Parallax = {
  31524. setTransform: function setTransform(el, progress) {
  31525. var swiper = this;
  31526. var rtl = swiper.rtl;
  31527. var $el = $(el);
  31528. var rtlFactor = rtl ? -1 : 1;
  31529. var p = $el.attr('data-swiper-parallax') || '0';
  31530. var x = $el.attr('data-swiper-parallax-x');
  31531. var y = $el.attr('data-swiper-parallax-y');
  31532. var scale = $el.attr('data-swiper-parallax-scale');
  31533. var opacity = $el.attr('data-swiper-parallax-opacity');
  31534. if (x || y) {
  31535. x = x || '0';
  31536. y = y || '0';
  31537. } else if (swiper.isHorizontal()) {
  31538. x = p;
  31539. y = '0';
  31540. } else {
  31541. y = p;
  31542. x = '0';
  31543. }
  31544. if ((x).indexOf('%') >= 0) {
  31545. x = (parseInt(x, 10) * progress * rtlFactor) + "%";
  31546. } else {
  31547. x = (x * progress * rtlFactor) + "px";
  31548. }
  31549. if ((y).indexOf('%') >= 0) {
  31550. y = (parseInt(y, 10) * progress) + "%";
  31551. } else {
  31552. y = (y * progress) + "px";
  31553. }
  31554. if (typeof opacity !== 'undefined' && opacity !== null) {
  31555. var currentOpacity = opacity - ((opacity - 1) * (1 - Math.abs(progress)));
  31556. $el[0].style.opacity = currentOpacity;
  31557. }
  31558. if (typeof scale === 'undefined' || scale === null) {
  31559. $el.transform(("translate3d(" + x + ", " + y + ", 0px)"));
  31560. } else {
  31561. var currentScale = scale - ((scale - 1) * (1 - Math.abs(progress)));
  31562. $el.transform(("translate3d(" + x + ", " + y + ", 0px) scale(" + currentScale + ")"));
  31563. }
  31564. },
  31565. setTranslate: function setTranslate() {
  31566. var swiper = this;
  31567. var $el = swiper.$el;
  31568. var slides = swiper.slides;
  31569. var progress = swiper.progress;
  31570. var snapGrid = swiper.snapGrid;
  31571. $el.children('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
  31572. .each(function (index, el) {
  31573. swiper.parallax.setTransform(el, progress);
  31574. });
  31575. slides.each(function (slideIndex, slideEl) {
  31576. var slideProgress = slideEl.progress;
  31577. if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
  31578. slideProgress += Math.ceil(slideIndex / 2) - (progress * (snapGrid.length - 1));
  31579. }
  31580. slideProgress = Math.min(Math.max(slideProgress, -1), 1);
  31581. $(slideEl).find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
  31582. .each(function (index, el) {
  31583. swiper.parallax.setTransform(el, slideProgress);
  31584. });
  31585. });
  31586. },
  31587. setTransition: function setTransition(duration) {
  31588. if ( duration === void 0 ) duration = this.params.speed;
  31589. var swiper = this;
  31590. var $el = swiper.$el;
  31591. $el.find('[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]')
  31592. .each(function (index, parallaxEl) {
  31593. var $parallaxEl = $(parallaxEl);
  31594. var parallaxDuration = parseInt($parallaxEl.attr('data-swiper-parallax-duration'), 10) || duration;
  31595. if (duration === 0) { parallaxDuration = 0; }
  31596. $parallaxEl.transition(parallaxDuration);
  31597. });
  31598. },
  31599. };
  31600. var Parallax$1 = {
  31601. name: 'parallax',
  31602. params: {
  31603. parallax: {
  31604. enabled: false,
  31605. },
  31606. },
  31607. create: function create() {
  31608. var swiper = this;
  31609. Utils.extend(swiper, {
  31610. parallax: {
  31611. setTransform: Parallax.setTransform.bind(swiper),
  31612. setTranslate: Parallax.setTranslate.bind(swiper),
  31613. setTransition: Parallax.setTransition.bind(swiper),
  31614. },
  31615. });
  31616. },
  31617. on: {
  31618. beforeInit: function beforeInit() {
  31619. var swiper = this;
  31620. if (!swiper.params.parallax.enabled) { return; }
  31621. swiper.params.watchSlidesProgress = true;
  31622. swiper.originalParams.watchSlidesProgress = true;
  31623. },
  31624. init: function init() {
  31625. var swiper = this;
  31626. if (!swiper.params.parallax.enabled) { return; }
  31627. swiper.parallax.setTranslate();
  31628. },
  31629. setTranslate: function setTranslate() {
  31630. var swiper = this;
  31631. if (!swiper.params.parallax.enabled) { return; }
  31632. swiper.parallax.setTranslate();
  31633. },
  31634. setTransition: function setTransition(duration) {
  31635. var swiper = this;
  31636. if (!swiper.params.parallax.enabled) { return; }
  31637. swiper.parallax.setTransition(duration);
  31638. },
  31639. },
  31640. };
  31641. var Zoom = {
  31642. // Calc Scale From Multi-touches
  31643. getDistanceBetweenTouches: function getDistanceBetweenTouches(e) {
  31644. if (e.targetTouches.length < 2) { return 1; }
  31645. var x1 = e.targetTouches[0].pageX;
  31646. var y1 = e.targetTouches[0].pageY;
  31647. var x2 = e.targetTouches[1].pageX;
  31648. var y2 = e.targetTouches[1].pageY;
  31649. var distance = Math.sqrt((Math.pow( (x2 - x1), 2 )) + (Math.pow( (y2 - y1), 2 )));
  31650. return distance;
  31651. },
  31652. // Events
  31653. onGestureStart: function onGestureStart(e) {
  31654. var swiper = this;
  31655. var params = swiper.params.zoom;
  31656. var zoom = swiper.zoom;
  31657. var gesture = zoom.gesture;
  31658. zoom.fakeGestureTouched = false;
  31659. zoom.fakeGestureMoved = false;
  31660. if (!Support.gestures) {
  31661. if (e.type !== 'touchstart' || (e.type === 'touchstart' && e.targetTouches.length < 2)) {
  31662. return;
  31663. }
  31664. zoom.fakeGestureTouched = true;
  31665. gesture.scaleStart = Zoom.getDistanceBetweenTouches(e);
  31666. }
  31667. if (!gesture.$slideEl || !gesture.$slideEl.length) {
  31668. gesture.$slideEl = $(e.target).closest(("." + (swiper.params.slideClass)));
  31669. if (gesture.$slideEl.length === 0) { gesture.$slideEl = swiper.slides.eq(swiper.activeIndex); }
  31670. gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
  31671. gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
  31672. gesture.maxRatio = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
  31673. if (gesture.$imageWrapEl.length === 0) {
  31674. gesture.$imageEl = undefined;
  31675. return;
  31676. }
  31677. }
  31678. if (gesture.$imageEl) {
  31679. gesture.$imageEl.transition(0);
  31680. }
  31681. swiper.zoom.isScaling = true;
  31682. },
  31683. onGestureChange: function onGestureChange(e) {
  31684. var swiper = this;
  31685. var params = swiper.params.zoom;
  31686. var zoom = swiper.zoom;
  31687. var gesture = zoom.gesture;
  31688. if (!Support.gestures) {
  31689. if (e.type !== 'touchmove' || (e.type === 'touchmove' && e.targetTouches.length < 2)) {
  31690. return;
  31691. }
  31692. zoom.fakeGestureMoved = true;
  31693. gesture.scaleMove = Zoom.getDistanceBetweenTouches(e);
  31694. }
  31695. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  31696. if (Support.gestures) {
  31697. zoom.scale = e.scale * zoom.currentScale;
  31698. } else {
  31699. zoom.scale = (gesture.scaleMove / gesture.scaleStart) * zoom.currentScale;
  31700. }
  31701. if (zoom.scale > gesture.maxRatio) {
  31702. zoom.scale = (gesture.maxRatio - 1) + (Math.pow( ((zoom.scale - gesture.maxRatio) + 1), 0.5 ));
  31703. }
  31704. if (zoom.scale < params.minRatio) {
  31705. zoom.scale = (params.minRatio + 1) - (Math.pow( ((params.minRatio - zoom.scale) + 1), 0.5 ));
  31706. }
  31707. gesture.$imageEl.transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
  31708. },
  31709. onGestureEnd: function onGestureEnd(e) {
  31710. var swiper = this;
  31711. var params = swiper.params.zoom;
  31712. var zoom = swiper.zoom;
  31713. var gesture = zoom.gesture;
  31714. if (!Support.gestures) {
  31715. if (!zoom.fakeGestureTouched || !zoom.fakeGestureMoved) {
  31716. return;
  31717. }
  31718. if (e.type !== 'touchend' || (e.type === 'touchend' && e.changedTouches.length < 2 && !Device.android)) {
  31719. return;
  31720. }
  31721. zoom.fakeGestureTouched = false;
  31722. zoom.fakeGestureMoved = false;
  31723. }
  31724. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  31725. zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
  31726. gesture.$imageEl.transition(swiper.params.speed).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
  31727. zoom.currentScale = zoom.scale;
  31728. zoom.isScaling = false;
  31729. if (zoom.scale === 1) { gesture.$slideEl = undefined; }
  31730. },
  31731. onTouchStart: function onTouchStart(e) {
  31732. var swiper = this;
  31733. var zoom = swiper.zoom;
  31734. var gesture = zoom.gesture;
  31735. var image = zoom.image;
  31736. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  31737. if (image.isTouched) { return; }
  31738. if (Device.android && e.cancelable) { e.preventDefault(); }
  31739. image.isTouched = true;
  31740. image.touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  31741. image.touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  31742. },
  31743. onTouchMove: function onTouchMove(e) {
  31744. var swiper = this;
  31745. var zoom = swiper.zoom;
  31746. var gesture = zoom.gesture;
  31747. var image = zoom.image;
  31748. var velocity = zoom.velocity;
  31749. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  31750. swiper.allowClick = false;
  31751. if (!image.isTouched || !gesture.$slideEl) { return; }
  31752. if (!image.isMoved) {
  31753. image.width = gesture.$imageEl[0].offsetWidth;
  31754. image.height = gesture.$imageEl[0].offsetHeight;
  31755. image.startX = Utils.getTranslate(gesture.$imageWrapEl[0], 'x') || 0;
  31756. image.startY = Utils.getTranslate(gesture.$imageWrapEl[0], 'y') || 0;
  31757. gesture.slideWidth = gesture.$slideEl[0].offsetWidth;
  31758. gesture.slideHeight = gesture.$slideEl[0].offsetHeight;
  31759. gesture.$imageWrapEl.transition(0);
  31760. if (swiper.rtl) {
  31761. image.startX = -image.startX;
  31762. image.startY = -image.startY;
  31763. }
  31764. }
  31765. // Define if we need image drag
  31766. var scaledWidth = image.width * zoom.scale;
  31767. var scaledHeight = image.height * zoom.scale;
  31768. if (scaledWidth < gesture.slideWidth && scaledHeight < gesture.slideHeight) { return; }
  31769. image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
  31770. image.maxX = -image.minX;
  31771. image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
  31772. image.maxY = -image.minY;
  31773. image.touchesCurrent.x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  31774. image.touchesCurrent.y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  31775. if (!image.isMoved && !zoom.isScaling) {
  31776. if (
  31777. swiper.isHorizontal()
  31778. && (
  31779. (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x)
  31780. || (Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)
  31781. )
  31782. ) {
  31783. image.isTouched = false;
  31784. return;
  31785. } if (
  31786. !swiper.isHorizontal()
  31787. && (
  31788. (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y)
  31789. || (Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)
  31790. )
  31791. ) {
  31792. image.isTouched = false;
  31793. return;
  31794. }
  31795. }
  31796. if (e.cancelable) {
  31797. e.preventDefault();
  31798. }
  31799. e.stopPropagation();
  31800. image.isMoved = true;
  31801. image.currentX = (image.touchesCurrent.x - image.touchesStart.x) + image.startX;
  31802. image.currentY = (image.touchesCurrent.y - image.touchesStart.y) + image.startY;
  31803. if (image.currentX < image.minX) {
  31804. image.currentX = (image.minX + 1) - (Math.pow( ((image.minX - image.currentX) + 1), 0.8 ));
  31805. }
  31806. if (image.currentX > image.maxX) {
  31807. image.currentX = (image.maxX - 1) + (Math.pow( ((image.currentX - image.maxX) + 1), 0.8 ));
  31808. }
  31809. if (image.currentY < image.minY) {
  31810. image.currentY = (image.minY + 1) - (Math.pow( ((image.minY - image.currentY) + 1), 0.8 ));
  31811. }
  31812. if (image.currentY > image.maxY) {
  31813. image.currentY = (image.maxY - 1) + (Math.pow( ((image.currentY - image.maxY) + 1), 0.8 ));
  31814. }
  31815. // Velocity
  31816. if (!velocity.prevPositionX) { velocity.prevPositionX = image.touchesCurrent.x; }
  31817. if (!velocity.prevPositionY) { velocity.prevPositionY = image.touchesCurrent.y; }
  31818. if (!velocity.prevTime) { velocity.prevTime = Date.now(); }
  31819. velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
  31820. velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
  31821. if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) { velocity.x = 0; }
  31822. if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) { velocity.y = 0; }
  31823. velocity.prevPositionX = image.touchesCurrent.x;
  31824. velocity.prevPositionY = image.touchesCurrent.y;
  31825. velocity.prevTime = Date.now();
  31826. gesture.$imageWrapEl.transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
  31827. },
  31828. onTouchEnd: function onTouchEnd() {
  31829. var swiper = this;
  31830. var zoom = swiper.zoom;
  31831. var gesture = zoom.gesture;
  31832. var image = zoom.image;
  31833. var velocity = zoom.velocity;
  31834. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  31835. if (!image.isTouched || !image.isMoved) {
  31836. image.isTouched = false;
  31837. image.isMoved = false;
  31838. return;
  31839. }
  31840. image.isTouched = false;
  31841. image.isMoved = false;
  31842. var momentumDurationX = 300;
  31843. var momentumDurationY = 300;
  31844. var momentumDistanceX = velocity.x * momentumDurationX;
  31845. var newPositionX = image.currentX + momentumDistanceX;
  31846. var momentumDistanceY = velocity.y * momentumDurationY;
  31847. var newPositionY = image.currentY + momentumDistanceY;
  31848. // Fix duration
  31849. if (velocity.x !== 0) { momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x); }
  31850. if (velocity.y !== 0) { momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y); }
  31851. var momentumDuration = Math.max(momentumDurationX, momentumDurationY);
  31852. image.currentX = newPositionX;
  31853. image.currentY = newPositionY;
  31854. // Define if we need image drag
  31855. var scaledWidth = image.width * zoom.scale;
  31856. var scaledHeight = image.height * zoom.scale;
  31857. image.minX = Math.min(((gesture.slideWidth / 2) - (scaledWidth / 2)), 0);
  31858. image.maxX = -image.minX;
  31859. image.minY = Math.min(((gesture.slideHeight / 2) - (scaledHeight / 2)), 0);
  31860. image.maxY = -image.minY;
  31861. image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
  31862. image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
  31863. gesture.$imageWrapEl.transition(momentumDuration).transform(("translate3d(" + (image.currentX) + "px, " + (image.currentY) + "px,0)"));
  31864. },
  31865. onTransitionEnd: function onTransitionEnd() {
  31866. var swiper = this;
  31867. var zoom = swiper.zoom;
  31868. var gesture = zoom.gesture;
  31869. if (gesture.$slideEl && swiper.previousIndex !== swiper.activeIndex) {
  31870. if (gesture.$imageEl) {
  31871. gesture.$imageEl.transform('translate3d(0,0,0) scale(1)');
  31872. }
  31873. if (gesture.$imageWrapEl) {
  31874. gesture.$imageWrapEl.transform('translate3d(0,0,0)');
  31875. }
  31876. zoom.scale = 1;
  31877. zoom.currentScale = 1;
  31878. gesture.$slideEl = undefined;
  31879. gesture.$imageEl = undefined;
  31880. gesture.$imageWrapEl = undefined;
  31881. }
  31882. },
  31883. // Toggle Zoom
  31884. toggle: function toggle(e) {
  31885. var swiper = this;
  31886. var zoom = swiper.zoom;
  31887. if (zoom.scale && zoom.scale !== 1) {
  31888. // Zoom Out
  31889. zoom.out();
  31890. } else {
  31891. // Zoom In
  31892. zoom.in(e);
  31893. }
  31894. },
  31895. in: function in$1(e) {
  31896. var swiper = this;
  31897. var zoom = swiper.zoom;
  31898. var params = swiper.params.zoom;
  31899. var gesture = zoom.gesture;
  31900. var image = zoom.image;
  31901. if (!gesture.$slideEl) {
  31902. if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
  31903. gesture.$slideEl = swiper.$wrapperEl.children(("." + (swiper.params.slideActiveClass)));
  31904. } else {
  31905. gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
  31906. }
  31907. gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
  31908. gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
  31909. }
  31910. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  31911. gesture.$slideEl.addClass(("" + (params.zoomedSlideClass)));
  31912. var touchX;
  31913. var touchY;
  31914. var offsetX;
  31915. var offsetY;
  31916. var diffX;
  31917. var diffY;
  31918. var translateX;
  31919. var translateY;
  31920. var imageWidth;
  31921. var imageHeight;
  31922. var scaledWidth;
  31923. var scaledHeight;
  31924. var translateMinX;
  31925. var translateMinY;
  31926. var translateMaxX;
  31927. var translateMaxY;
  31928. var slideWidth;
  31929. var slideHeight;
  31930. if (typeof image.touchesStart.x === 'undefined' && e) {
  31931. touchX = e.type === 'touchend' ? e.changedTouches[0].pageX : e.pageX;
  31932. touchY = e.type === 'touchend' ? e.changedTouches[0].pageY : e.pageY;
  31933. } else {
  31934. touchX = image.touchesStart.x;
  31935. touchY = image.touchesStart.y;
  31936. }
  31937. zoom.scale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
  31938. zoom.currentScale = gesture.$imageWrapEl.attr('data-swiper-zoom') || params.maxRatio;
  31939. if (e) {
  31940. slideWidth = gesture.$slideEl[0].offsetWidth;
  31941. slideHeight = gesture.$slideEl[0].offsetHeight;
  31942. offsetX = gesture.$slideEl.offset().left;
  31943. offsetY = gesture.$slideEl.offset().top;
  31944. diffX = (offsetX + (slideWidth / 2)) - touchX;
  31945. diffY = (offsetY + (slideHeight / 2)) - touchY;
  31946. imageWidth = gesture.$imageEl[0].offsetWidth;
  31947. imageHeight = gesture.$imageEl[0].offsetHeight;
  31948. scaledWidth = imageWidth * zoom.scale;
  31949. scaledHeight = imageHeight * zoom.scale;
  31950. translateMinX = Math.min(((slideWidth / 2) - (scaledWidth / 2)), 0);
  31951. translateMinY = Math.min(((slideHeight / 2) - (scaledHeight / 2)), 0);
  31952. translateMaxX = -translateMinX;
  31953. translateMaxY = -translateMinY;
  31954. translateX = diffX * zoom.scale;
  31955. translateY = diffY * zoom.scale;
  31956. if (translateX < translateMinX) {
  31957. translateX = translateMinX;
  31958. }
  31959. if (translateX > translateMaxX) {
  31960. translateX = translateMaxX;
  31961. }
  31962. if (translateY < translateMinY) {
  31963. translateY = translateMinY;
  31964. }
  31965. if (translateY > translateMaxY) {
  31966. translateY = translateMaxY;
  31967. }
  31968. } else {
  31969. translateX = 0;
  31970. translateY = 0;
  31971. }
  31972. gesture.$imageWrapEl.transition(300).transform(("translate3d(" + translateX + "px, " + translateY + "px,0)"));
  31973. gesture.$imageEl.transition(300).transform(("translate3d(0,0,0) scale(" + (zoom.scale) + ")"));
  31974. },
  31975. out: function out() {
  31976. var swiper = this;
  31977. var zoom = swiper.zoom;
  31978. var params = swiper.params.zoom;
  31979. var gesture = zoom.gesture;
  31980. if (!gesture.$slideEl) {
  31981. if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
  31982. gesture.$slideEl = swiper.$wrapperEl.children(("." + (swiper.params.slideActiveClass)));
  31983. } else {
  31984. gesture.$slideEl = swiper.slides.eq(swiper.activeIndex);
  31985. }
  31986. gesture.$imageEl = gesture.$slideEl.find('img, svg, canvas, picture, .swiper-zoom-target');
  31987. gesture.$imageWrapEl = gesture.$imageEl.parent(("." + (params.containerClass)));
  31988. }
  31989. if (!gesture.$imageEl || gesture.$imageEl.length === 0) { return; }
  31990. zoom.scale = 1;
  31991. zoom.currentScale = 1;
  31992. gesture.$imageWrapEl.transition(300).transform('translate3d(0,0,0)');
  31993. gesture.$imageEl.transition(300).transform('translate3d(0,0,0) scale(1)');
  31994. gesture.$slideEl.removeClass(("" + (params.zoomedSlideClass)));
  31995. gesture.$slideEl = undefined;
  31996. },
  31997. // Attach/Detach Events
  31998. enable: function enable() {
  31999. var swiper = this;
  32000. var zoom = swiper.zoom;
  32001. if (zoom.enabled) { return; }
  32002. zoom.enabled = true;
  32003. var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
  32004. var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
  32005. var slideSelector = "." + (swiper.params.slideClass);
  32006. // Scale image
  32007. if (Support.gestures) {
  32008. swiper.$wrapperEl.on('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
  32009. swiper.$wrapperEl.on('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
  32010. swiper.$wrapperEl.on('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
  32011. } else if (swiper.touchEvents.start === 'touchstart') {
  32012. swiper.$wrapperEl.on(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
  32013. swiper.$wrapperEl.on(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
  32014. swiper.$wrapperEl.on(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
  32015. if (swiper.touchEvents.cancel) {
  32016. swiper.$wrapperEl.on(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
  32017. }
  32018. }
  32019. // Move image
  32020. swiper.$wrapperEl.on(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
  32021. },
  32022. disable: function disable() {
  32023. var swiper = this;
  32024. var zoom = swiper.zoom;
  32025. if (!zoom.enabled) { return; }
  32026. swiper.zoom.enabled = false;
  32027. var passiveListener = swiper.touchEvents.start === 'touchstart' && Support.passiveListener && swiper.params.passiveListeners ? { passive: true, capture: false } : false;
  32028. var activeListenerWithCapture = Support.passiveListener ? { passive: false, capture: true } : true;
  32029. var slideSelector = "." + (swiper.params.slideClass);
  32030. // Scale image
  32031. if (Support.gestures) {
  32032. swiper.$wrapperEl.off('gesturestart', slideSelector, zoom.onGestureStart, passiveListener);
  32033. swiper.$wrapperEl.off('gesturechange', slideSelector, zoom.onGestureChange, passiveListener);
  32034. swiper.$wrapperEl.off('gestureend', slideSelector, zoom.onGestureEnd, passiveListener);
  32035. } else if (swiper.touchEvents.start === 'touchstart') {
  32036. swiper.$wrapperEl.off(swiper.touchEvents.start, slideSelector, zoom.onGestureStart, passiveListener);
  32037. swiper.$wrapperEl.off(swiper.touchEvents.move, slideSelector, zoom.onGestureChange, activeListenerWithCapture);
  32038. swiper.$wrapperEl.off(swiper.touchEvents.end, slideSelector, zoom.onGestureEnd, passiveListener);
  32039. if (swiper.touchEvents.cancel) {
  32040. swiper.$wrapperEl.off(swiper.touchEvents.cancel, slideSelector, zoom.onGestureEnd, passiveListener);
  32041. }
  32042. }
  32043. // Move image
  32044. swiper.$wrapperEl.off(swiper.touchEvents.move, ("." + (swiper.params.zoom.containerClass)), zoom.onTouchMove, activeListenerWithCapture);
  32045. },
  32046. };
  32047. var Zoom$1 = {
  32048. name: 'zoom',
  32049. params: {
  32050. zoom: {
  32051. enabled: false,
  32052. maxRatio: 3,
  32053. minRatio: 1,
  32054. toggle: true,
  32055. containerClass: 'swiper-zoom-container',
  32056. zoomedSlideClass: 'swiper-slide-zoomed',
  32057. },
  32058. },
  32059. create: function create() {
  32060. var swiper = this;
  32061. var zoom = {
  32062. enabled: false,
  32063. scale: 1,
  32064. currentScale: 1,
  32065. isScaling: false,
  32066. gesture: {
  32067. $slideEl: undefined,
  32068. slideWidth: undefined,
  32069. slideHeight: undefined,
  32070. $imageEl: undefined,
  32071. $imageWrapEl: undefined,
  32072. maxRatio: 3,
  32073. },
  32074. image: {
  32075. isTouched: undefined,
  32076. isMoved: undefined,
  32077. currentX: undefined,
  32078. currentY: undefined,
  32079. minX: undefined,
  32080. minY: undefined,
  32081. maxX: undefined,
  32082. maxY: undefined,
  32083. width: undefined,
  32084. height: undefined,
  32085. startX: undefined,
  32086. startY: undefined,
  32087. touchesStart: {},
  32088. touchesCurrent: {},
  32089. },
  32090. velocity: {
  32091. x: undefined,
  32092. y: undefined,
  32093. prevPositionX: undefined,
  32094. prevPositionY: undefined,
  32095. prevTime: undefined,
  32096. },
  32097. };
  32098. ('onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out').split(' ').forEach(function (methodName) {
  32099. zoom[methodName] = Zoom[methodName].bind(swiper);
  32100. });
  32101. Utils.extend(swiper, {
  32102. zoom: zoom,
  32103. });
  32104. var scale = 1;
  32105. Object.defineProperty(swiper.zoom, 'scale', {
  32106. get: function get() {
  32107. return scale;
  32108. },
  32109. set: function set(value) {
  32110. if (scale !== value) {
  32111. var imageEl = swiper.zoom.gesture.$imageEl ? swiper.zoom.gesture.$imageEl[0] : undefined;
  32112. var slideEl = swiper.zoom.gesture.$slideEl ? swiper.zoom.gesture.$slideEl[0] : undefined;
  32113. swiper.emit('zoomChange', value, imageEl, slideEl);
  32114. }
  32115. scale = value;
  32116. },
  32117. });
  32118. },
  32119. on: {
  32120. init: function init() {
  32121. var swiper = this;
  32122. if (swiper.params.zoom.enabled) {
  32123. swiper.zoom.enable();
  32124. }
  32125. },
  32126. destroy: function destroy() {
  32127. var swiper = this;
  32128. swiper.zoom.disable();
  32129. },
  32130. touchStart: function touchStart(e) {
  32131. var swiper = this;
  32132. if (!swiper.zoom.enabled) { return; }
  32133. swiper.zoom.onTouchStart(e);
  32134. },
  32135. touchEnd: function touchEnd(e) {
  32136. var swiper = this;
  32137. if (!swiper.zoom.enabled) { return; }
  32138. swiper.zoom.onTouchEnd(e);
  32139. },
  32140. doubleTap: function doubleTap(e) {
  32141. var swiper = this;
  32142. if (swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
  32143. swiper.zoom.toggle(e);
  32144. }
  32145. },
  32146. transitionEnd: function transitionEnd() {
  32147. var swiper = this;
  32148. if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
  32149. swiper.zoom.onTransitionEnd();
  32150. }
  32151. },
  32152. slideChange: function slideChange() {
  32153. var swiper = this;
  32154. if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
  32155. swiper.zoom.onTransitionEnd();
  32156. }
  32157. },
  32158. },
  32159. };
  32160. var Lazy$2 = {
  32161. loadInSlide: function loadInSlide(index, loadInDuplicate) {
  32162. if ( loadInDuplicate === void 0 ) loadInDuplicate = true;
  32163. var swiper = this;
  32164. var params = swiper.params.lazy;
  32165. if (typeof index === 'undefined') { return; }
  32166. if (swiper.slides.length === 0) { return; }
  32167. var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  32168. var $slideEl = isVirtual
  32169. ? swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]"))
  32170. : swiper.slides.eq(index);
  32171. var $images = $slideEl.find(("." + (params.elementClass) + ":not(." + (params.loadedClass) + "):not(." + (params.loadingClass) + ")"));
  32172. if ($slideEl.hasClass(params.elementClass) && !$slideEl.hasClass(params.loadedClass) && !$slideEl.hasClass(params.loadingClass)) {
  32173. $images = $images.add($slideEl[0]);
  32174. }
  32175. if ($images.length === 0) { return; }
  32176. $images.each(function (imageIndex, imageEl) {
  32177. var $imageEl = $(imageEl);
  32178. $imageEl.addClass(params.loadingClass);
  32179. var background = $imageEl.attr('data-background');
  32180. var src = $imageEl.attr('data-src');
  32181. var srcset = $imageEl.attr('data-srcset');
  32182. var sizes = $imageEl.attr('data-sizes');
  32183. var $pictureEl = $imageEl.parent('picture');
  32184. swiper.loadImage($imageEl[0], (src || background), srcset, sizes, false, function () {
  32185. if (typeof swiper === 'undefined' || swiper === null || !swiper || (swiper && !swiper.params) || swiper.destroyed) { return; }
  32186. if (background) {
  32187. $imageEl.css('background-image', ("url(\"" + background + "\")"));
  32188. $imageEl.removeAttr('data-background');
  32189. } else {
  32190. if (srcset) {
  32191. $imageEl.attr('srcset', srcset);
  32192. $imageEl.removeAttr('data-srcset');
  32193. }
  32194. if (sizes) {
  32195. $imageEl.attr('sizes', sizes);
  32196. $imageEl.removeAttr('data-sizes');
  32197. }
  32198. if ($pictureEl.length) {
  32199. $pictureEl.children('source').each(function (sourceIndex, sourceEl) {
  32200. var $source = $(sourceEl);
  32201. if ($source.attr('data-srcset')) {
  32202. $source.attr('srcset', $source.attr('data-srcset'));
  32203. $source.removeAttr('data-srcset');
  32204. }
  32205. });
  32206. }
  32207. if (src) {
  32208. $imageEl.attr('src', src);
  32209. $imageEl.removeAttr('data-src');
  32210. }
  32211. }
  32212. $imageEl.addClass(params.loadedClass).removeClass(params.loadingClass);
  32213. $slideEl.find(("." + (params.preloaderClass))).remove();
  32214. if (swiper.params.loop && loadInDuplicate) {
  32215. var slideOriginalIndex = $slideEl.attr('data-swiper-slide-index');
  32216. if ($slideEl.hasClass(swiper.params.slideDuplicateClass)) {
  32217. var originalSlide = swiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]:not(." + (swiper.params.slideDuplicateClass) + ")"));
  32218. swiper.lazy.loadInSlide(originalSlide.index(), false);
  32219. } else {
  32220. var duplicatedSlide = swiper.$wrapperEl.children(("." + (swiper.params.slideDuplicateClass) + "[data-swiper-slide-index=\"" + slideOriginalIndex + "\"]"));
  32221. swiper.lazy.loadInSlide(duplicatedSlide.index(), false);
  32222. }
  32223. }
  32224. swiper.emit('lazyImageReady', $slideEl[0], $imageEl[0]);
  32225. if (swiper.params.autoHeight) {
  32226. swiper.updateAutoHeight();
  32227. }
  32228. });
  32229. swiper.emit('lazyImageLoad', $slideEl[0], $imageEl[0]);
  32230. });
  32231. },
  32232. load: function load() {
  32233. var swiper = this;
  32234. var $wrapperEl = swiper.$wrapperEl;
  32235. var swiperParams = swiper.params;
  32236. var slides = swiper.slides;
  32237. var activeIndex = swiper.activeIndex;
  32238. var isVirtual = swiper.virtual && swiperParams.virtual.enabled;
  32239. var params = swiperParams.lazy;
  32240. var slidesPerView = swiperParams.slidesPerView;
  32241. if (slidesPerView === 'auto') {
  32242. slidesPerView = 0;
  32243. }
  32244. function slideExist(index) {
  32245. if (isVirtual) {
  32246. if ($wrapperEl.children(("." + (swiperParams.slideClass) + "[data-swiper-slide-index=\"" + index + "\"]")).length) {
  32247. return true;
  32248. }
  32249. } else if (slides[index]) { return true; }
  32250. return false;
  32251. }
  32252. function slideIndex(slideEl) {
  32253. if (isVirtual) {
  32254. return $(slideEl).attr('data-swiper-slide-index');
  32255. }
  32256. return $(slideEl).index();
  32257. }
  32258. if (!swiper.lazy.initialImageLoaded) { swiper.lazy.initialImageLoaded = true; }
  32259. if (swiper.params.watchSlidesVisibility) {
  32260. $wrapperEl.children(("." + (swiperParams.slideVisibleClass))).each(function (elIndex, slideEl) {
  32261. var index = isVirtual ? $(slideEl).attr('data-swiper-slide-index') : $(slideEl).index();
  32262. swiper.lazy.loadInSlide(index);
  32263. });
  32264. } else if (slidesPerView > 1) {
  32265. for (var i = activeIndex; i < activeIndex + slidesPerView; i += 1) {
  32266. if (slideExist(i)) { swiper.lazy.loadInSlide(i); }
  32267. }
  32268. } else {
  32269. swiper.lazy.loadInSlide(activeIndex);
  32270. }
  32271. if (params.loadPrevNext) {
  32272. if (slidesPerView > 1 || (params.loadPrevNextAmount && params.loadPrevNextAmount > 1)) {
  32273. var amount = params.loadPrevNextAmount;
  32274. var spv = slidesPerView;
  32275. var maxIndex = Math.min(activeIndex + spv + Math.max(amount, spv), slides.length);
  32276. var minIndex = Math.max(activeIndex - Math.max(spv, amount), 0);
  32277. // Next Slides
  32278. for (var i$1 = activeIndex + slidesPerView; i$1 < maxIndex; i$1 += 1) {
  32279. if (slideExist(i$1)) { swiper.lazy.loadInSlide(i$1); }
  32280. }
  32281. // Prev Slides
  32282. for (var i$2 = minIndex; i$2 < activeIndex; i$2 += 1) {
  32283. if (slideExist(i$2)) { swiper.lazy.loadInSlide(i$2); }
  32284. }
  32285. } else {
  32286. var nextSlide = $wrapperEl.children(("." + (swiperParams.slideNextClass)));
  32287. if (nextSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(nextSlide)); }
  32288. var prevSlide = $wrapperEl.children(("." + (swiperParams.slidePrevClass)));
  32289. if (prevSlide.length > 0) { swiper.lazy.loadInSlide(slideIndex(prevSlide)); }
  32290. }
  32291. }
  32292. },
  32293. };
  32294. var Lazy$3 = {
  32295. name: 'lazy',
  32296. params: {
  32297. lazy: {
  32298. enabled: false,
  32299. loadPrevNext: false,
  32300. loadPrevNextAmount: 1,
  32301. loadOnTransitionStart: false,
  32302. elementClass: 'swiper-lazy',
  32303. loadingClass: 'swiper-lazy-loading',
  32304. loadedClass: 'swiper-lazy-loaded',
  32305. preloaderClass: 'swiper-lazy-preloader',
  32306. },
  32307. },
  32308. create: function create() {
  32309. var swiper = this;
  32310. Utils.extend(swiper, {
  32311. lazy: {
  32312. initialImageLoaded: false,
  32313. load: Lazy$2.load.bind(swiper),
  32314. loadInSlide: Lazy$2.loadInSlide.bind(swiper),
  32315. },
  32316. });
  32317. },
  32318. on: {
  32319. beforeInit: function beforeInit() {
  32320. var swiper = this;
  32321. if (swiper.params.lazy.enabled && swiper.params.preloadImages) {
  32322. swiper.params.preloadImages = false;
  32323. }
  32324. },
  32325. init: function init() {
  32326. var swiper = this;
  32327. if (swiper.params.lazy.enabled && !swiper.params.loop && swiper.params.initialSlide === 0) {
  32328. swiper.lazy.load();
  32329. }
  32330. },
  32331. scroll: function scroll() {
  32332. var swiper = this;
  32333. if (swiper.params.freeMode && !swiper.params.freeModeSticky) {
  32334. swiper.lazy.load();
  32335. }
  32336. },
  32337. resize: function resize() {
  32338. var swiper = this;
  32339. if (swiper.params.lazy.enabled) {
  32340. swiper.lazy.load();
  32341. }
  32342. },
  32343. scrollbarDragMove: function scrollbarDragMove() {
  32344. var swiper = this;
  32345. if (swiper.params.lazy.enabled) {
  32346. swiper.lazy.load();
  32347. }
  32348. },
  32349. transitionStart: function transitionStart() {
  32350. var swiper = this;
  32351. if (swiper.params.lazy.enabled) {
  32352. if (swiper.params.lazy.loadOnTransitionStart || (!swiper.params.lazy.loadOnTransitionStart && !swiper.lazy.initialImageLoaded)) {
  32353. swiper.lazy.load();
  32354. }
  32355. }
  32356. },
  32357. transitionEnd: function transitionEnd() {
  32358. var swiper = this;
  32359. if (swiper.params.lazy.enabled && !swiper.params.lazy.loadOnTransitionStart) {
  32360. swiper.lazy.load();
  32361. }
  32362. },
  32363. slideChange: function slideChange() {
  32364. var swiper = this;
  32365. if (swiper.params.lazy.enabled && swiper.params.cssMode) {
  32366. swiper.lazy.load();
  32367. }
  32368. },
  32369. },
  32370. };
  32371. /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
  32372. var Controller = {
  32373. LinearSpline: function LinearSpline(x, y) {
  32374. var binarySearch = (function search() {
  32375. var maxIndex;
  32376. var minIndex;
  32377. var guess;
  32378. return function (array, val) {
  32379. minIndex = -1;
  32380. maxIndex = array.length;
  32381. while (maxIndex - minIndex > 1) {
  32382. guess = maxIndex + minIndex >> 1;
  32383. if (array[guess] <= val) {
  32384. minIndex = guess;
  32385. } else {
  32386. maxIndex = guess;
  32387. }
  32388. }
  32389. return maxIndex;
  32390. };
  32391. }());
  32392. this.x = x;
  32393. this.y = y;
  32394. this.lastIndex = x.length - 1;
  32395. // Given an x value (x2), return the expected y2 value:
  32396. // (x1,y1) is the known point before given value,
  32397. // (x3,y3) is the known point after given value.
  32398. var i1;
  32399. var i3;
  32400. this.interpolate = function interpolate(x2) {
  32401. if (!x2) { return 0; }
  32402. // Get the indexes of x1 and x3 (the array indexes before and after given x2):
  32403. i3 = binarySearch(this.x, x2);
  32404. i1 = i3 - 1;
  32405. // We have our indexes i1 & i3, so we can calculate already:
  32406. // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
  32407. return (((x2 - this.x[i1]) * (this.y[i3] - this.y[i1])) / (this.x[i3] - this.x[i1])) + this.y[i1];
  32408. };
  32409. return this;
  32410. },
  32411. // xxx: for now i will just save one spline function to to
  32412. getInterpolateFunction: function getInterpolateFunction(c) {
  32413. var swiper = this;
  32414. if (!swiper.controller.spline) {
  32415. swiper.controller.spline = swiper.params.loop
  32416. ? new Controller.LinearSpline(swiper.slidesGrid, c.slidesGrid)
  32417. : new Controller.LinearSpline(swiper.snapGrid, c.snapGrid);
  32418. }
  32419. },
  32420. setTranslate: function setTranslate(setTranslate$1, byController) {
  32421. var swiper = this;
  32422. var controlled = swiper.controller.control;
  32423. var multiplier;
  32424. var controlledTranslate;
  32425. function setControlledTranslate(c) {
  32426. // this will create an Interpolate function based on the snapGrids
  32427. // x is the Grid of the scrolled scroller and y will be the controlled scroller
  32428. // it makes sense to create this only once and recall it for the interpolation
  32429. // the function does a lot of value caching for performance
  32430. var translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
  32431. if (swiper.params.controller.by === 'slide') {
  32432. swiper.controller.getInterpolateFunction(c);
  32433. // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
  32434. // but it did not work out
  32435. controlledTranslate = -swiper.controller.spline.interpolate(-translate);
  32436. }
  32437. if (!controlledTranslate || swiper.params.controller.by === 'container') {
  32438. multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
  32439. controlledTranslate = ((translate - swiper.minTranslate()) * multiplier) + c.minTranslate();
  32440. }
  32441. if (swiper.params.controller.inverse) {
  32442. controlledTranslate = c.maxTranslate() - controlledTranslate;
  32443. }
  32444. c.updateProgress(controlledTranslate);
  32445. c.setTranslate(controlledTranslate, swiper);
  32446. c.updateActiveIndex();
  32447. c.updateSlidesClasses();
  32448. }
  32449. if (Array.isArray(controlled)) {
  32450. for (var i = 0; i < controlled.length; i += 1) {
  32451. if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
  32452. setControlledTranslate(controlled[i]);
  32453. }
  32454. }
  32455. } else if (controlled instanceof Swiper && byController !== controlled) {
  32456. setControlledTranslate(controlled);
  32457. }
  32458. },
  32459. setTransition: function setTransition(duration, byController) {
  32460. var swiper = this;
  32461. var controlled = swiper.controller.control;
  32462. var i;
  32463. function setControlledTransition(c) {
  32464. c.setTransition(duration, swiper);
  32465. if (duration !== 0) {
  32466. c.transitionStart();
  32467. if (c.params.autoHeight) {
  32468. Utils.nextTick(function () {
  32469. c.updateAutoHeight();
  32470. });
  32471. }
  32472. c.$wrapperEl.transitionEnd(function () {
  32473. if (!controlled) { return; }
  32474. if (c.params.loop && swiper.params.controller.by === 'slide') {
  32475. c.loopFix();
  32476. }
  32477. c.transitionEnd();
  32478. });
  32479. }
  32480. }
  32481. if (Array.isArray(controlled)) {
  32482. for (i = 0; i < controlled.length; i += 1) {
  32483. if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
  32484. setControlledTransition(controlled[i]);
  32485. }
  32486. }
  32487. } else if (controlled instanceof Swiper && byController !== controlled) {
  32488. setControlledTransition(controlled);
  32489. }
  32490. },
  32491. };
  32492. var Controller$1 = {
  32493. name: 'controller',
  32494. params: {
  32495. controller: {
  32496. control: undefined,
  32497. inverse: false,
  32498. by: 'slide', // or 'container'
  32499. },
  32500. },
  32501. create: function create() {
  32502. var swiper = this;
  32503. Utils.extend(swiper, {
  32504. controller: {
  32505. control: swiper.params.controller.control,
  32506. getInterpolateFunction: Controller.getInterpolateFunction.bind(swiper),
  32507. setTranslate: Controller.setTranslate.bind(swiper),
  32508. setTransition: Controller.setTransition.bind(swiper),
  32509. },
  32510. });
  32511. },
  32512. on: {
  32513. update: function update() {
  32514. var swiper = this;
  32515. if (!swiper.controller.control) { return; }
  32516. if (swiper.controller.spline) {
  32517. swiper.controller.spline = undefined;
  32518. delete swiper.controller.spline;
  32519. }
  32520. },
  32521. resize: function resize() {
  32522. var swiper = this;
  32523. if (!swiper.controller.control) { return; }
  32524. if (swiper.controller.spline) {
  32525. swiper.controller.spline = undefined;
  32526. delete swiper.controller.spline;
  32527. }
  32528. },
  32529. observerUpdate: function observerUpdate() {
  32530. var swiper = this;
  32531. if (!swiper.controller.control) { return; }
  32532. if (swiper.controller.spline) {
  32533. swiper.controller.spline = undefined;
  32534. delete swiper.controller.spline;
  32535. }
  32536. },
  32537. setTranslate: function setTranslate(translate, byController) {
  32538. var swiper = this;
  32539. if (!swiper.controller.control) { return; }
  32540. swiper.controller.setTranslate(translate, byController);
  32541. },
  32542. setTransition: function setTransition(duration, byController) {
  32543. var swiper = this;
  32544. if (!swiper.controller.control) { return; }
  32545. swiper.controller.setTransition(duration, byController);
  32546. },
  32547. },
  32548. };
  32549. var History$1 = {
  32550. init: function init() {
  32551. var swiper = this;
  32552. if (!swiper.params.history) { return; }
  32553. if (!win.history || !win.history.pushState) {
  32554. swiper.params.history.enabled = false;
  32555. swiper.params.hashNavigation.enabled = true;
  32556. return;
  32557. }
  32558. var history = swiper.history;
  32559. history.initialized = true;
  32560. history.paths = History$1.getPathValues();
  32561. if (!history.paths.key && !history.paths.value) { return; }
  32562. history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
  32563. if (!swiper.params.history.replaceState) {
  32564. win.addEventListener('popstate', swiper.history.setHistoryPopState);
  32565. }
  32566. },
  32567. destroy: function destroy() {
  32568. var swiper = this;
  32569. if (!swiper.params.history.replaceState) {
  32570. win.removeEventListener('popstate', swiper.history.setHistoryPopState);
  32571. }
  32572. },
  32573. setHistoryPopState: function setHistoryPopState() {
  32574. var swiper = this;
  32575. swiper.history.paths = History$1.getPathValues();
  32576. swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
  32577. },
  32578. getPathValues: function getPathValues() {
  32579. var pathArray = win.location.pathname.slice(1).split('/').filter(function (part) { return part !== ''; });
  32580. var total = pathArray.length;
  32581. var key = pathArray[total - 2];
  32582. var value = pathArray[total - 1];
  32583. return { key: key, value: value };
  32584. },
  32585. setHistory: function setHistory(key, index) {
  32586. var swiper = this;
  32587. if (!swiper.history.initialized || !swiper.params.history.enabled) { return; }
  32588. var slide = swiper.slides.eq(index);
  32589. var value = History$1.slugify(slide.attr('data-history'));
  32590. if (!win.location.pathname.includes(key)) {
  32591. value = key + "/" + value;
  32592. }
  32593. var currentState = win.history.state;
  32594. if (currentState && currentState.value === value) {
  32595. return;
  32596. }
  32597. if (swiper.params.history.replaceState) {
  32598. win.history.replaceState({ value: value }, null, value);
  32599. } else {
  32600. win.history.pushState({ value: value }, null, value);
  32601. }
  32602. },
  32603. slugify: function slugify(text) {
  32604. return text.toString()
  32605. .replace(/\s+/g, '-')
  32606. .replace(/[^\w-]+/g, '')
  32607. .replace(/--+/g, '-')
  32608. .replace(/^-+/, '')
  32609. .replace(/-+$/, '');
  32610. },
  32611. scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
  32612. var swiper = this;
  32613. if (value) {
  32614. for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
  32615. var slide = swiper.slides.eq(i);
  32616. var slideHistory = History$1.slugify(slide.attr('data-history'));
  32617. if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
  32618. var index = slide.index();
  32619. swiper.slideTo(index, speed, runCallbacks);
  32620. }
  32621. }
  32622. } else {
  32623. swiper.slideTo(0, speed, runCallbacks);
  32624. }
  32625. },
  32626. };
  32627. var History$2 = {
  32628. name: 'history',
  32629. params: {
  32630. history: {
  32631. enabled: false,
  32632. replaceState: false,
  32633. key: 'slides',
  32634. },
  32635. },
  32636. create: function create() {
  32637. var swiper = this;
  32638. Utils.extend(swiper, {
  32639. history: {
  32640. init: History$1.init.bind(swiper),
  32641. setHistory: History$1.setHistory.bind(swiper),
  32642. setHistoryPopState: History$1.setHistoryPopState.bind(swiper),
  32643. scrollToSlide: History$1.scrollToSlide.bind(swiper),
  32644. destroy: History$1.destroy.bind(swiper),
  32645. },
  32646. });
  32647. },
  32648. on: {
  32649. init: function init() {
  32650. var swiper = this;
  32651. if (swiper.params.history.enabled) {
  32652. swiper.history.init();
  32653. }
  32654. },
  32655. destroy: function destroy() {
  32656. var swiper = this;
  32657. if (swiper.params.history.enabled) {
  32658. swiper.history.destroy();
  32659. }
  32660. },
  32661. transitionEnd: function transitionEnd() {
  32662. var swiper = this;
  32663. if (swiper.history.initialized) {
  32664. swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
  32665. }
  32666. },
  32667. slideChange: function slideChange() {
  32668. var swiper = this;
  32669. if (swiper.history.initialized && swiper.params.cssMode) {
  32670. swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
  32671. }
  32672. },
  32673. },
  32674. };
  32675. var HashNavigation = {
  32676. onHashCange: function onHashCange() {
  32677. var swiper = this;
  32678. swiper.emit('hashChange');
  32679. var newHash = doc.location.hash.replace('#', '');
  32680. var activeSlideHash = swiper.slides.eq(swiper.activeIndex).attr('data-hash');
  32681. if (newHash !== activeSlideHash) {
  32682. var newIndex = swiper.$wrapperEl.children(("." + (swiper.params.slideClass) + "[data-hash=\"" + newHash + "\"]")).index();
  32683. if (typeof newIndex === 'undefined') { return; }
  32684. swiper.slideTo(newIndex);
  32685. }
  32686. },
  32687. setHash: function setHash() {
  32688. var swiper = this;
  32689. if (!swiper.hashNavigation.initialized || !swiper.params.hashNavigation.enabled) { return; }
  32690. if (swiper.params.hashNavigation.replaceState && win.history && win.history.replaceState) {
  32691. win.history.replaceState(null, null, (("#" + (swiper.slides.eq(swiper.activeIndex).attr('data-hash'))) || ''));
  32692. swiper.emit('hashSet');
  32693. } else {
  32694. var slide = swiper.slides.eq(swiper.activeIndex);
  32695. var hash = slide.attr('data-hash') || slide.attr('data-history');
  32696. doc.location.hash = hash || '';
  32697. swiper.emit('hashSet');
  32698. }
  32699. },
  32700. init: function init() {
  32701. var swiper = this;
  32702. if (!swiper.params.hashNavigation.enabled || (swiper.params.history && swiper.params.history.enabled)) { return; }
  32703. swiper.hashNavigation.initialized = true;
  32704. var hash = doc.location.hash.replace('#', '');
  32705. if (hash) {
  32706. var speed = 0;
  32707. for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
  32708. var slide = swiper.slides.eq(i);
  32709. var slideHash = slide.attr('data-hash') || slide.attr('data-history');
  32710. if (slideHash === hash && !slide.hasClass(swiper.params.slideDuplicateClass)) {
  32711. var index = slide.index();
  32712. swiper.slideTo(index, speed, swiper.params.runCallbacksOnInit, true);
  32713. }
  32714. }
  32715. }
  32716. if (swiper.params.hashNavigation.watchState) {
  32717. $(win).on('hashchange', swiper.hashNavigation.onHashCange);
  32718. }
  32719. },
  32720. destroy: function destroy() {
  32721. var swiper = this;
  32722. if (swiper.params.hashNavigation.watchState) {
  32723. $(win).off('hashchange', swiper.hashNavigation.onHashCange);
  32724. }
  32725. },
  32726. };
  32727. var HashNavigation$1 = {
  32728. name: 'hash-navigation',
  32729. params: {
  32730. hashNavigation: {
  32731. enabled: false,
  32732. replaceState: false,
  32733. watchState: false,
  32734. },
  32735. },
  32736. create: function create() {
  32737. var swiper = this;
  32738. Utils.extend(swiper, {
  32739. hashNavigation: {
  32740. initialized: false,
  32741. init: HashNavigation.init.bind(swiper),
  32742. destroy: HashNavigation.destroy.bind(swiper),
  32743. setHash: HashNavigation.setHash.bind(swiper),
  32744. onHashCange: HashNavigation.onHashCange.bind(swiper),
  32745. },
  32746. });
  32747. },
  32748. on: {
  32749. init: function init() {
  32750. var swiper = this;
  32751. if (swiper.params.hashNavigation.enabled) {
  32752. swiper.hashNavigation.init();
  32753. }
  32754. },
  32755. destroy: function destroy() {
  32756. var swiper = this;
  32757. if (swiper.params.hashNavigation.enabled) {
  32758. swiper.hashNavigation.destroy();
  32759. }
  32760. },
  32761. transitionEnd: function transitionEnd() {
  32762. var swiper = this;
  32763. if (swiper.hashNavigation.initialized) {
  32764. swiper.hashNavigation.setHash();
  32765. }
  32766. },
  32767. slideChange: function slideChange() {
  32768. var swiper = this;
  32769. if (swiper.hashNavigation.initialized && swiper.params.cssMode) {
  32770. swiper.hashNavigation.setHash();
  32771. }
  32772. },
  32773. },
  32774. };
  32775. var a11y = {
  32776. makeElFocusable: function makeElFocusable($el) {
  32777. $el.attr('tabIndex', '0');
  32778. return $el;
  32779. },
  32780. makeElNotFocusable: function makeElNotFocusable($el) {
  32781. $el.attr('tabIndex', '-1');
  32782. return $el;
  32783. },
  32784. addElRole: function addElRole($el, role) {
  32785. $el.attr('role', role);
  32786. return $el;
  32787. },
  32788. addElLabel: function addElLabel($el, label) {
  32789. $el.attr('aria-label', label);
  32790. return $el;
  32791. },
  32792. disableEl: function disableEl($el) {
  32793. $el.attr('aria-disabled', true);
  32794. return $el;
  32795. },
  32796. enableEl: function enableEl($el) {
  32797. $el.attr('aria-disabled', false);
  32798. return $el;
  32799. },
  32800. onEnterKey: function onEnterKey(e) {
  32801. var swiper = this;
  32802. var params = swiper.params.a11y;
  32803. if (e.keyCode !== 13) { return; }
  32804. var $targetEl = $(e.target);
  32805. if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {
  32806. if (!(swiper.isEnd && !swiper.params.loop)) {
  32807. swiper.slideNext();
  32808. }
  32809. if (swiper.isEnd) {
  32810. swiper.a11y.notify(params.lastSlideMessage);
  32811. } else {
  32812. swiper.a11y.notify(params.nextSlideMessage);
  32813. }
  32814. }
  32815. if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {
  32816. if (!(swiper.isBeginning && !swiper.params.loop)) {
  32817. swiper.slidePrev();
  32818. }
  32819. if (swiper.isBeginning) {
  32820. swiper.a11y.notify(params.firstSlideMessage);
  32821. } else {
  32822. swiper.a11y.notify(params.prevSlideMessage);
  32823. }
  32824. }
  32825. if (swiper.pagination && $targetEl.is(("." + (swiper.params.pagination.bulletClass)))) {
  32826. $targetEl[0].click();
  32827. }
  32828. },
  32829. notify: function notify(message) {
  32830. var swiper = this;
  32831. var notification = swiper.a11y.liveRegion;
  32832. if (notification.length === 0) { return; }
  32833. notification.html('');
  32834. notification.html(message);
  32835. },
  32836. updateNavigation: function updateNavigation() {
  32837. var swiper = this;
  32838. if (swiper.params.loop || !swiper.navigation) { return; }
  32839. var ref = swiper.navigation;
  32840. var $nextEl = ref.$nextEl;
  32841. var $prevEl = ref.$prevEl;
  32842. if ($prevEl && $prevEl.length > 0) {
  32843. if (swiper.isBeginning) {
  32844. swiper.a11y.disableEl($prevEl);
  32845. swiper.a11y.makeElNotFocusable($prevEl);
  32846. } else {
  32847. swiper.a11y.enableEl($prevEl);
  32848. swiper.a11y.makeElFocusable($prevEl);
  32849. }
  32850. }
  32851. if ($nextEl && $nextEl.length > 0) {
  32852. if (swiper.isEnd) {
  32853. swiper.a11y.disableEl($nextEl);
  32854. swiper.a11y.makeElNotFocusable($nextEl);
  32855. } else {
  32856. swiper.a11y.enableEl($nextEl);
  32857. swiper.a11y.makeElFocusable($nextEl);
  32858. }
  32859. }
  32860. },
  32861. updatePagination: function updatePagination() {
  32862. var swiper = this;
  32863. var params = swiper.params.a11y;
  32864. if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
  32865. swiper.pagination.bullets.each(function (bulletIndex, bulletEl) {
  32866. var $bulletEl = $(bulletEl);
  32867. swiper.a11y.makeElFocusable($bulletEl);
  32868. swiper.a11y.addElRole($bulletEl, 'button');
  32869. swiper.a11y.addElLabel($bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, $bulletEl.index() + 1));
  32870. });
  32871. }
  32872. },
  32873. init: function init() {
  32874. var swiper = this;
  32875. swiper.$el.append(swiper.a11y.liveRegion);
  32876. // Navigation
  32877. var params = swiper.params.a11y;
  32878. var $nextEl;
  32879. var $prevEl;
  32880. if (swiper.navigation && swiper.navigation.$nextEl) {
  32881. $nextEl = swiper.navigation.$nextEl;
  32882. }
  32883. if (swiper.navigation && swiper.navigation.$prevEl) {
  32884. $prevEl = swiper.navigation.$prevEl;
  32885. }
  32886. if ($nextEl) {
  32887. swiper.a11y.makeElFocusable($nextEl);
  32888. swiper.a11y.addElRole($nextEl, 'button');
  32889. swiper.a11y.addElLabel($nextEl, params.nextSlideMessage);
  32890. $nextEl.on('keydown', swiper.a11y.onEnterKey);
  32891. }
  32892. if ($prevEl) {
  32893. swiper.a11y.makeElFocusable($prevEl);
  32894. swiper.a11y.addElRole($prevEl, 'button');
  32895. swiper.a11y.addElLabel($prevEl, params.prevSlideMessage);
  32896. $prevEl.on('keydown', swiper.a11y.onEnterKey);
  32897. }
  32898. // Pagination
  32899. if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
  32900. swiper.pagination.$el.on('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
  32901. }
  32902. },
  32903. destroy: function destroy() {
  32904. var swiper = this;
  32905. if (swiper.a11y.liveRegion && swiper.a11y.liveRegion.length > 0) { swiper.a11y.liveRegion.remove(); }
  32906. var $nextEl;
  32907. var $prevEl;
  32908. if (swiper.navigation && swiper.navigation.$nextEl) {
  32909. $nextEl = swiper.navigation.$nextEl;
  32910. }
  32911. if (swiper.navigation && swiper.navigation.$prevEl) {
  32912. $prevEl = swiper.navigation.$prevEl;
  32913. }
  32914. if ($nextEl) {
  32915. $nextEl.off('keydown', swiper.a11y.onEnterKey);
  32916. }
  32917. if ($prevEl) {
  32918. $prevEl.off('keydown', swiper.a11y.onEnterKey);
  32919. }
  32920. // Pagination
  32921. if (swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length) {
  32922. swiper.pagination.$el.off('keydown', ("." + (swiper.params.pagination.bulletClass)), swiper.a11y.onEnterKey);
  32923. }
  32924. },
  32925. };
  32926. var A11y = {
  32927. name: 'a11y',
  32928. params: {
  32929. a11y: {
  32930. enabled: true,
  32931. notificationClass: 'swiper-notification',
  32932. prevSlideMessage: 'Previous slide',
  32933. nextSlideMessage: 'Next slide',
  32934. firstSlideMessage: 'This is the first slide',
  32935. lastSlideMessage: 'This is the last slide',
  32936. paginationBulletMessage: 'Go to slide {{index}}',
  32937. },
  32938. },
  32939. create: function create() {
  32940. var swiper = this;
  32941. Utils.extend(swiper, {
  32942. a11y: {
  32943. liveRegion: $(("<span class=\"" + (swiper.params.a11y.notificationClass) + "\" aria-live=\"assertive\" aria-atomic=\"true\"></span>")),
  32944. },
  32945. });
  32946. Object.keys(a11y).forEach(function (methodName) {
  32947. swiper.a11y[methodName] = a11y[methodName].bind(swiper);
  32948. });
  32949. },
  32950. on: {
  32951. init: function init() {
  32952. var swiper = this;
  32953. if (!swiper.params.a11y.enabled) { return; }
  32954. swiper.a11y.init();
  32955. swiper.a11y.updateNavigation();
  32956. },
  32957. toEdge: function toEdge() {
  32958. var swiper = this;
  32959. if (!swiper.params.a11y.enabled) { return; }
  32960. swiper.a11y.updateNavigation();
  32961. },
  32962. fromEdge: function fromEdge() {
  32963. var swiper = this;
  32964. if (!swiper.params.a11y.enabled) { return; }
  32965. swiper.a11y.updateNavigation();
  32966. },
  32967. paginationUpdate: function paginationUpdate() {
  32968. var swiper = this;
  32969. if (!swiper.params.a11y.enabled) { return; }
  32970. swiper.a11y.updatePagination();
  32971. },
  32972. destroy: function destroy() {
  32973. var swiper = this;
  32974. if (!swiper.params.a11y.enabled) { return; }
  32975. swiper.a11y.destroy();
  32976. },
  32977. },
  32978. };
  32979. /* eslint no-underscore-dangle: "off" */
  32980. var Autoplay = {
  32981. run: function run() {
  32982. var swiper = this;
  32983. var $activeSlideEl = swiper.slides.eq(swiper.activeIndex);
  32984. var delay = swiper.params.autoplay.delay;
  32985. if ($activeSlideEl.attr('data-swiper-autoplay')) {
  32986. delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;
  32987. }
  32988. clearTimeout(swiper.autoplay.timeout);
  32989. swiper.autoplay.timeout = Utils.nextTick(function () {
  32990. if (swiper.params.autoplay.reverseDirection) {
  32991. if (swiper.params.loop) {
  32992. swiper.loopFix();
  32993. swiper.slidePrev(swiper.params.speed, true, true);
  32994. swiper.emit('autoplay');
  32995. } else if (!swiper.isBeginning) {
  32996. swiper.slidePrev(swiper.params.speed, true, true);
  32997. swiper.emit('autoplay');
  32998. } else if (!swiper.params.autoplay.stopOnLastSlide) {
  32999. swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);
  33000. swiper.emit('autoplay');
  33001. } else {
  33002. swiper.autoplay.stop();
  33003. }
  33004. } else if (swiper.params.loop) {
  33005. swiper.loopFix();
  33006. swiper.slideNext(swiper.params.speed, true, true);
  33007. swiper.emit('autoplay');
  33008. } else if (!swiper.isEnd) {
  33009. swiper.slideNext(swiper.params.speed, true, true);
  33010. swiper.emit('autoplay');
  33011. } else if (!swiper.params.autoplay.stopOnLastSlide) {
  33012. swiper.slideTo(0, swiper.params.speed, true, true);
  33013. swiper.emit('autoplay');
  33014. } else {
  33015. swiper.autoplay.stop();
  33016. }
  33017. if (swiper.params.cssMode && swiper.autoplay.running) { swiper.autoplay.run(); }
  33018. }, delay);
  33019. },
  33020. start: function start() {
  33021. var swiper = this;
  33022. if (typeof swiper.autoplay.timeout !== 'undefined') { return false; }
  33023. if (swiper.autoplay.running) { return false; }
  33024. swiper.autoplay.running = true;
  33025. swiper.emit('autoplayStart');
  33026. swiper.autoplay.run();
  33027. return true;
  33028. },
  33029. stop: function stop() {
  33030. var swiper = this;
  33031. if (!swiper.autoplay.running) { return false; }
  33032. if (typeof swiper.autoplay.timeout === 'undefined') { return false; }
  33033. if (swiper.autoplay.timeout) {
  33034. clearTimeout(swiper.autoplay.timeout);
  33035. swiper.autoplay.timeout = undefined;
  33036. }
  33037. swiper.autoplay.running = false;
  33038. swiper.emit('autoplayStop');
  33039. return true;
  33040. },
  33041. pause: function pause(speed) {
  33042. var swiper = this;
  33043. if (!swiper.autoplay.running) { return; }
  33044. if (swiper.autoplay.paused) { return; }
  33045. if (swiper.autoplay.timeout) { clearTimeout(swiper.autoplay.timeout); }
  33046. swiper.autoplay.paused = true;
  33047. if (speed === 0 || !swiper.params.autoplay.waitForTransition) {
  33048. swiper.autoplay.paused = false;
  33049. swiper.autoplay.run();
  33050. } else {
  33051. swiper.$wrapperEl[0].addEventListener('transitionend', swiper.autoplay.onTransitionEnd);
  33052. swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
  33053. }
  33054. },
  33055. };
  33056. var Autoplay$1 = {
  33057. name: 'autoplay',
  33058. params: {
  33059. autoplay: {
  33060. enabled: false,
  33061. delay: 3000,
  33062. waitForTransition: true,
  33063. disableOnInteraction: true,
  33064. stopOnLastSlide: false,
  33065. reverseDirection: false,
  33066. },
  33067. },
  33068. create: function create() {
  33069. var swiper = this;
  33070. Utils.extend(swiper, {
  33071. autoplay: {
  33072. running: false,
  33073. paused: false,
  33074. run: Autoplay.run.bind(swiper),
  33075. start: Autoplay.start.bind(swiper),
  33076. stop: Autoplay.stop.bind(swiper),
  33077. pause: Autoplay.pause.bind(swiper),
  33078. onVisibilityChange: function onVisibilityChange() {
  33079. if (document.visibilityState === 'hidden' && swiper.autoplay.running) {
  33080. swiper.autoplay.pause();
  33081. }
  33082. if (document.visibilityState === 'visible' && swiper.autoplay.paused) {
  33083. swiper.autoplay.run();
  33084. swiper.autoplay.paused = false;
  33085. }
  33086. },
  33087. onTransitionEnd: function onTransitionEnd(e) {
  33088. if (!swiper || swiper.destroyed || !swiper.$wrapperEl) { return; }
  33089. if (e.target !== this) { return; }
  33090. swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.autoplay.onTransitionEnd);
  33091. swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.autoplay.onTransitionEnd);
  33092. swiper.autoplay.paused = false;
  33093. if (!swiper.autoplay.running) {
  33094. swiper.autoplay.stop();
  33095. } else {
  33096. swiper.autoplay.run();
  33097. }
  33098. },
  33099. },
  33100. });
  33101. },
  33102. on: {
  33103. init: function init() {
  33104. var swiper = this;
  33105. if (swiper.params.autoplay.enabled) {
  33106. swiper.autoplay.start();
  33107. document.addEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
  33108. }
  33109. },
  33110. beforeTransitionStart: function beforeTransitionStart(speed, internal) {
  33111. var swiper = this;
  33112. if (swiper.autoplay.running) {
  33113. if (internal || !swiper.params.autoplay.disableOnInteraction) {
  33114. swiper.autoplay.pause(speed);
  33115. } else {
  33116. swiper.autoplay.stop();
  33117. }
  33118. }
  33119. },
  33120. sliderFirstMove: function sliderFirstMove() {
  33121. var swiper = this;
  33122. if (swiper.autoplay.running) {
  33123. if (swiper.params.autoplay.disableOnInteraction) {
  33124. swiper.autoplay.stop();
  33125. } else {
  33126. swiper.autoplay.pause();
  33127. }
  33128. }
  33129. },
  33130. touchEnd: function touchEnd() {
  33131. var swiper = this;
  33132. if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {
  33133. swiper.autoplay.run();
  33134. }
  33135. },
  33136. destroy: function destroy() {
  33137. var swiper = this;
  33138. if (swiper.autoplay.running) {
  33139. swiper.autoplay.stop();
  33140. }
  33141. document.removeEventListener('visibilitychange', swiper.autoplay.onVisibilityChange);
  33142. },
  33143. },
  33144. };
  33145. var Fade = {
  33146. setTranslate: function setTranslate() {
  33147. var swiper = this;
  33148. var slides = swiper.slides;
  33149. for (var i = 0; i < slides.length; i += 1) {
  33150. var $slideEl = swiper.slides.eq(i);
  33151. var offset = $slideEl[0].swiperSlideOffset;
  33152. var tx = -offset;
  33153. if (!swiper.params.virtualTranslate) { tx -= swiper.translate; }
  33154. var ty = 0;
  33155. if (!swiper.isHorizontal()) {
  33156. ty = tx;
  33157. tx = 0;
  33158. }
  33159. var slideOpacity = swiper.params.fadeEffect.crossFade
  33160. ? Math.max(1 - Math.abs($slideEl[0].progress), 0)
  33161. : 1 + Math.min(Math.max($slideEl[0].progress, -1), 0);
  33162. $slideEl
  33163. .css({
  33164. opacity: slideOpacity,
  33165. })
  33166. .transform(("translate3d(" + tx + "px, " + ty + "px, 0px)"));
  33167. }
  33168. },
  33169. setTransition: function setTransition(duration) {
  33170. var swiper = this;
  33171. var slides = swiper.slides;
  33172. var $wrapperEl = swiper.$wrapperEl;
  33173. slides.transition(duration);
  33174. if (swiper.params.virtualTranslate && duration !== 0) {
  33175. var eventTriggered = false;
  33176. slides.transitionEnd(function () {
  33177. if (eventTriggered) { return; }
  33178. if (!swiper || swiper.destroyed) { return; }
  33179. eventTriggered = true;
  33180. swiper.animating = false;
  33181. var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
  33182. for (var i = 0; i < triggerEvents.length; i += 1) {
  33183. $wrapperEl.trigger(triggerEvents[i]);
  33184. }
  33185. });
  33186. }
  33187. },
  33188. };
  33189. var EffectFade = {
  33190. name: 'effect-fade',
  33191. params: {
  33192. fadeEffect: {
  33193. crossFade: false,
  33194. },
  33195. },
  33196. create: function create() {
  33197. var swiper = this;
  33198. Utils.extend(swiper, {
  33199. fadeEffect: {
  33200. setTranslate: Fade.setTranslate.bind(swiper),
  33201. setTransition: Fade.setTransition.bind(swiper),
  33202. },
  33203. });
  33204. },
  33205. on: {
  33206. beforeInit: function beforeInit() {
  33207. var swiper = this;
  33208. if (swiper.params.effect !== 'fade') { return; }
  33209. swiper.classNames.push(((swiper.params.containerModifierClass) + "fade"));
  33210. var overwriteParams = {
  33211. slidesPerView: 1,
  33212. slidesPerColumn: 1,
  33213. slidesPerGroup: 1,
  33214. watchSlidesProgress: true,
  33215. spaceBetween: 0,
  33216. virtualTranslate: true,
  33217. };
  33218. Utils.extend(swiper.params, overwriteParams);
  33219. Utils.extend(swiper.originalParams, overwriteParams);
  33220. },
  33221. setTranslate: function setTranslate() {
  33222. var swiper = this;
  33223. if (swiper.params.effect !== 'fade') { return; }
  33224. swiper.fadeEffect.setTranslate();
  33225. },
  33226. setTransition: function setTransition(duration) {
  33227. var swiper = this;
  33228. if (swiper.params.effect !== 'fade') { return; }
  33229. swiper.fadeEffect.setTransition(duration);
  33230. },
  33231. },
  33232. };
  33233. var Cube = {
  33234. setTranslate: function setTranslate() {
  33235. var swiper = this;
  33236. var $el = swiper.$el;
  33237. var $wrapperEl = swiper.$wrapperEl;
  33238. var slides = swiper.slides;
  33239. var swiperWidth = swiper.width;
  33240. var swiperHeight = swiper.height;
  33241. var rtl = swiper.rtlTranslate;
  33242. var swiperSize = swiper.size;
  33243. var params = swiper.params.cubeEffect;
  33244. var isHorizontal = swiper.isHorizontal();
  33245. var isVirtual = swiper.virtual && swiper.params.virtual.enabled;
  33246. var wrapperRotate = 0;
  33247. var $cubeShadowEl;
  33248. if (params.shadow) {
  33249. if (isHorizontal) {
  33250. $cubeShadowEl = $wrapperEl.find('.swiper-cube-shadow');
  33251. if ($cubeShadowEl.length === 0) {
  33252. $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
  33253. $wrapperEl.append($cubeShadowEl);
  33254. }
  33255. $cubeShadowEl.css({ height: (swiperWidth + "px") });
  33256. } else {
  33257. $cubeShadowEl = $el.find('.swiper-cube-shadow');
  33258. if ($cubeShadowEl.length === 0) {
  33259. $cubeShadowEl = $('<div class="swiper-cube-shadow"></div>');
  33260. $el.append($cubeShadowEl);
  33261. }
  33262. }
  33263. }
  33264. for (var i = 0; i < slides.length; i += 1) {
  33265. var $slideEl = slides.eq(i);
  33266. var slideIndex = i;
  33267. if (isVirtual) {
  33268. slideIndex = parseInt($slideEl.attr('data-swiper-slide-index'), 10);
  33269. }
  33270. var slideAngle = slideIndex * 90;
  33271. var round = Math.floor(slideAngle / 360);
  33272. if (rtl) {
  33273. slideAngle = -slideAngle;
  33274. round = Math.floor(-slideAngle / 360);
  33275. }
  33276. var progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
  33277. var tx = 0;
  33278. var ty = 0;
  33279. var tz = 0;
  33280. if (slideIndex % 4 === 0) {
  33281. tx = -round * 4 * swiperSize;
  33282. tz = 0;
  33283. } else if ((slideIndex - 1) % 4 === 0) {
  33284. tx = 0;
  33285. tz = -round * 4 * swiperSize;
  33286. } else if ((slideIndex - 2) % 4 === 0) {
  33287. tx = swiperSize + (round * 4 * swiperSize);
  33288. tz = swiperSize;
  33289. } else if ((slideIndex - 3) % 4 === 0) {
  33290. tx = -swiperSize;
  33291. tz = (3 * swiperSize) + (swiperSize * 4 * round);
  33292. }
  33293. if (rtl) {
  33294. tx = -tx;
  33295. }
  33296. if (!isHorizontal) {
  33297. ty = tx;
  33298. tx = 0;
  33299. }
  33300. var transform = "rotateX(" + (isHorizontal ? 0 : -slideAngle) + "deg) rotateY(" + (isHorizontal ? slideAngle : 0) + "deg) translate3d(" + tx + "px, " + ty + "px, " + tz + "px)";
  33301. if (progress <= 1 && progress > -1) {
  33302. wrapperRotate = (slideIndex * 90) + (progress * 90);
  33303. if (rtl) { wrapperRotate = (-slideIndex * 90) - (progress * 90); }
  33304. }
  33305. $slideEl.transform(transform);
  33306. if (params.slideShadows) {
  33307. // Set shadows
  33308. var shadowBefore = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
  33309. var shadowAfter = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
  33310. if (shadowBefore.length === 0) {
  33311. shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
  33312. $slideEl.append(shadowBefore);
  33313. }
  33314. if (shadowAfter.length === 0) {
  33315. shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
  33316. $slideEl.append(shadowAfter);
  33317. }
  33318. if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
  33319. if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
  33320. }
  33321. }
  33322. $wrapperEl.css({
  33323. '-webkit-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  33324. '-moz-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  33325. '-ms-transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  33326. 'transform-origin': ("50% 50% -" + (swiperSize / 2) + "px"),
  33327. });
  33328. if (params.shadow) {
  33329. if (isHorizontal) {
  33330. $cubeShadowEl.transform(("translate3d(0px, " + ((swiperWidth / 2) + params.shadowOffset) + "px, " + (-swiperWidth / 2) + "px) rotateX(90deg) rotateZ(0deg) scale(" + (params.shadowScale) + ")"));
  33331. } else {
  33332. var shadowAngle = Math.abs(wrapperRotate) - (Math.floor(Math.abs(wrapperRotate) / 90) * 90);
  33333. var multiplier = 1.5 - (
  33334. (Math.sin((shadowAngle * 2 * Math.PI) / 360) / 2)
  33335. + (Math.cos((shadowAngle * 2 * Math.PI) / 360) / 2)
  33336. );
  33337. var scale1 = params.shadowScale;
  33338. var scale2 = params.shadowScale / multiplier;
  33339. var offset = params.shadowOffset;
  33340. $cubeShadowEl.transform(("scale3d(" + scale1 + ", 1, " + scale2 + ") translate3d(0px, " + ((swiperHeight / 2) + offset) + "px, " + (-swiperHeight / 2 / scale2) + "px) rotateX(-90deg)"));
  33341. }
  33342. }
  33343. var zFactor = (Browser.isSafari || Browser.isUiWebView) ? (-swiperSize / 2) : 0;
  33344. $wrapperEl
  33345. .transform(("translate3d(0px,0," + zFactor + "px) rotateX(" + (swiper.isHorizontal() ? 0 : wrapperRotate) + "deg) rotateY(" + (swiper.isHorizontal() ? -wrapperRotate : 0) + "deg)"));
  33346. },
  33347. setTransition: function setTransition(duration) {
  33348. var swiper = this;
  33349. var $el = swiper.$el;
  33350. var slides = swiper.slides;
  33351. slides
  33352. .transition(duration)
  33353. .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
  33354. .transition(duration);
  33355. if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
  33356. $el.find('.swiper-cube-shadow').transition(duration);
  33357. }
  33358. },
  33359. };
  33360. var EffectCube = {
  33361. name: 'effect-cube',
  33362. params: {
  33363. cubeEffect: {
  33364. slideShadows: true,
  33365. shadow: true,
  33366. shadowOffset: 20,
  33367. shadowScale: 0.94,
  33368. },
  33369. },
  33370. create: function create() {
  33371. var swiper = this;
  33372. Utils.extend(swiper, {
  33373. cubeEffect: {
  33374. setTranslate: Cube.setTranslate.bind(swiper),
  33375. setTransition: Cube.setTransition.bind(swiper),
  33376. },
  33377. });
  33378. },
  33379. on: {
  33380. beforeInit: function beforeInit() {
  33381. var swiper = this;
  33382. if (swiper.params.effect !== 'cube') { return; }
  33383. swiper.classNames.push(((swiper.params.containerModifierClass) + "cube"));
  33384. swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
  33385. var overwriteParams = {
  33386. slidesPerView: 1,
  33387. slidesPerColumn: 1,
  33388. slidesPerGroup: 1,
  33389. watchSlidesProgress: true,
  33390. resistanceRatio: 0,
  33391. spaceBetween: 0,
  33392. centeredSlides: false,
  33393. virtualTranslate: true,
  33394. };
  33395. Utils.extend(swiper.params, overwriteParams);
  33396. Utils.extend(swiper.originalParams, overwriteParams);
  33397. },
  33398. setTranslate: function setTranslate() {
  33399. var swiper = this;
  33400. if (swiper.params.effect !== 'cube') { return; }
  33401. swiper.cubeEffect.setTranslate();
  33402. },
  33403. setTransition: function setTransition(duration) {
  33404. var swiper = this;
  33405. if (swiper.params.effect !== 'cube') { return; }
  33406. swiper.cubeEffect.setTransition(duration);
  33407. },
  33408. },
  33409. };
  33410. var Flip = {
  33411. setTranslate: function setTranslate() {
  33412. var swiper = this;
  33413. var slides = swiper.slides;
  33414. var rtl = swiper.rtlTranslate;
  33415. for (var i = 0; i < slides.length; i += 1) {
  33416. var $slideEl = slides.eq(i);
  33417. var progress = $slideEl[0].progress;
  33418. if (swiper.params.flipEffect.limitRotation) {
  33419. progress = Math.max(Math.min($slideEl[0].progress, 1), -1);
  33420. }
  33421. var offset = $slideEl[0].swiperSlideOffset;
  33422. var rotate = -180 * progress;
  33423. var rotateY = rotate;
  33424. var rotateX = 0;
  33425. var tx = -offset;
  33426. var ty = 0;
  33427. if (!swiper.isHorizontal()) {
  33428. ty = tx;
  33429. tx = 0;
  33430. rotateX = -rotateY;
  33431. rotateY = 0;
  33432. } else if (rtl) {
  33433. rotateY = -rotateY;
  33434. }
  33435. $slideEl[0].style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
  33436. if (swiper.params.flipEffect.slideShadows) {
  33437. // Set shadows
  33438. var shadowBefore = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
  33439. var shadowAfter = swiper.isHorizontal() ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
  33440. if (shadowBefore.length === 0) {
  33441. shadowBefore = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'left' : 'top') + "\"></div>"));
  33442. $slideEl.append(shadowBefore);
  33443. }
  33444. if (shadowAfter.length === 0) {
  33445. shadowAfter = $(("<div class=\"swiper-slide-shadow-" + (swiper.isHorizontal() ? 'right' : 'bottom') + "\"></div>"));
  33446. $slideEl.append(shadowAfter);
  33447. }
  33448. if (shadowBefore.length) { shadowBefore[0].style.opacity = Math.max(-progress, 0); }
  33449. if (shadowAfter.length) { shadowAfter[0].style.opacity = Math.max(progress, 0); }
  33450. }
  33451. $slideEl
  33452. .transform(("translate3d(" + tx + "px, " + ty + "px, 0px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)"));
  33453. }
  33454. },
  33455. setTransition: function setTransition(duration) {
  33456. var swiper = this;
  33457. var slides = swiper.slides;
  33458. var activeIndex = swiper.activeIndex;
  33459. var $wrapperEl = swiper.$wrapperEl;
  33460. slides
  33461. .transition(duration)
  33462. .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
  33463. .transition(duration);
  33464. if (swiper.params.virtualTranslate && duration !== 0) {
  33465. var eventTriggered = false;
  33466. // eslint-disable-next-line
  33467. slides.eq(activeIndex).transitionEnd(function onTransitionEnd() {
  33468. if (eventTriggered) { return; }
  33469. if (!swiper || swiper.destroyed) { return; }
  33470. // if (!$(this).hasClass(swiper.params.slideActiveClass)) return;
  33471. eventTriggered = true;
  33472. swiper.animating = false;
  33473. var triggerEvents = ['webkitTransitionEnd', 'transitionend'];
  33474. for (var i = 0; i < triggerEvents.length; i += 1) {
  33475. $wrapperEl.trigger(triggerEvents[i]);
  33476. }
  33477. });
  33478. }
  33479. },
  33480. };
  33481. var EffectFlip = {
  33482. name: 'effect-flip',
  33483. params: {
  33484. flipEffect: {
  33485. slideShadows: true,
  33486. limitRotation: true,
  33487. },
  33488. },
  33489. create: function create() {
  33490. var swiper = this;
  33491. Utils.extend(swiper, {
  33492. flipEffect: {
  33493. setTranslate: Flip.setTranslate.bind(swiper),
  33494. setTransition: Flip.setTransition.bind(swiper),
  33495. },
  33496. });
  33497. },
  33498. on: {
  33499. beforeInit: function beforeInit() {
  33500. var swiper = this;
  33501. if (swiper.params.effect !== 'flip') { return; }
  33502. swiper.classNames.push(((swiper.params.containerModifierClass) + "flip"));
  33503. swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
  33504. var overwriteParams = {
  33505. slidesPerView: 1,
  33506. slidesPerColumn: 1,
  33507. slidesPerGroup: 1,
  33508. watchSlidesProgress: true,
  33509. spaceBetween: 0,
  33510. virtualTranslate: true,
  33511. };
  33512. Utils.extend(swiper.params, overwriteParams);
  33513. Utils.extend(swiper.originalParams, overwriteParams);
  33514. },
  33515. setTranslate: function setTranslate() {
  33516. var swiper = this;
  33517. if (swiper.params.effect !== 'flip') { return; }
  33518. swiper.flipEffect.setTranslate();
  33519. },
  33520. setTransition: function setTransition(duration) {
  33521. var swiper = this;
  33522. if (swiper.params.effect !== 'flip') { return; }
  33523. swiper.flipEffect.setTransition(duration);
  33524. },
  33525. },
  33526. };
  33527. var Coverflow = {
  33528. setTranslate: function setTranslate() {
  33529. var swiper = this;
  33530. var swiperWidth = swiper.width;
  33531. var swiperHeight = swiper.height;
  33532. var slides = swiper.slides;
  33533. var $wrapperEl = swiper.$wrapperEl;
  33534. var slidesSizesGrid = swiper.slidesSizesGrid;
  33535. var params = swiper.params.coverflowEffect;
  33536. var isHorizontal = swiper.isHorizontal();
  33537. var transform = swiper.translate;
  33538. var center = isHorizontal ? -transform + (swiperWidth / 2) : -transform + (swiperHeight / 2);
  33539. var rotate = isHorizontal ? params.rotate : -params.rotate;
  33540. var translate = params.depth;
  33541. // Each slide offset from center
  33542. for (var i = 0, length = slides.length; i < length; i += 1) {
  33543. var $slideEl = slides.eq(i);
  33544. var slideSize = slidesSizesGrid[i];
  33545. var slideOffset = $slideEl[0].swiperSlideOffset;
  33546. var offsetMultiplier = ((center - slideOffset - (slideSize / 2)) / slideSize) * params.modifier;
  33547. var rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
  33548. var rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
  33549. // var rotateZ = 0
  33550. var translateZ = -translate * Math.abs(offsetMultiplier);
  33551. var stretch = params.stretch;
  33552. // Allow percentage to make a relative stretch for responsive sliders
  33553. if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
  33554. stretch = ((parseFloat(params.stretch) / 100) * slideSize);
  33555. }
  33556. var translateY = isHorizontal ? 0 : stretch * (offsetMultiplier);
  33557. var translateX = isHorizontal ? stretch * (offsetMultiplier) : 0;
  33558. // Fix for ultra small values
  33559. if (Math.abs(translateX) < 0.001) { translateX = 0; }
  33560. if (Math.abs(translateY) < 0.001) { translateY = 0; }
  33561. if (Math.abs(translateZ) < 0.001) { translateZ = 0; }
  33562. if (Math.abs(rotateY) < 0.001) { rotateY = 0; }
  33563. if (Math.abs(rotateX) < 0.001) { rotateX = 0; }
  33564. var slideTransform = "translate3d(" + translateX + "px," + translateY + "px," + translateZ + "px) rotateX(" + rotateX + "deg) rotateY(" + rotateY + "deg)";
  33565. $slideEl.transform(slideTransform);
  33566. $slideEl[0].style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
  33567. if (params.slideShadows) {
  33568. // Set shadows
  33569. var $shadowBeforeEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-left') : $slideEl.find('.swiper-slide-shadow-top');
  33570. var $shadowAfterEl = isHorizontal ? $slideEl.find('.swiper-slide-shadow-right') : $slideEl.find('.swiper-slide-shadow-bottom');
  33571. if ($shadowBeforeEl.length === 0) {
  33572. $shadowBeforeEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'left' : 'top') + "\"></div>"));
  33573. $slideEl.append($shadowBeforeEl);
  33574. }
  33575. if ($shadowAfterEl.length === 0) {
  33576. $shadowAfterEl = $(("<div class=\"swiper-slide-shadow-" + (isHorizontal ? 'right' : 'bottom') + "\"></div>"));
  33577. $slideEl.append($shadowAfterEl);
  33578. }
  33579. if ($shadowBeforeEl.length) { $shadowBeforeEl[0].style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0; }
  33580. if ($shadowAfterEl.length) { $shadowAfterEl[0].style.opacity = (-offsetMultiplier) > 0 ? -offsetMultiplier : 0; }
  33581. }
  33582. }
  33583. // Set correct perspective for IE10
  33584. if (Support.pointerEvents || Support.prefixedPointerEvents) {
  33585. var ws = $wrapperEl[0].style;
  33586. ws.perspectiveOrigin = center + "px 50%";
  33587. }
  33588. },
  33589. setTransition: function setTransition(duration) {
  33590. var swiper = this;
  33591. swiper.slides
  33592. .transition(duration)
  33593. .find('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left')
  33594. .transition(duration);
  33595. },
  33596. };
  33597. var EffectCoverflow = {
  33598. name: 'effect-coverflow',
  33599. params: {
  33600. coverflowEffect: {
  33601. rotate: 50,
  33602. stretch: 0,
  33603. depth: 100,
  33604. modifier: 1,
  33605. slideShadows: true,
  33606. },
  33607. },
  33608. create: function create() {
  33609. var swiper = this;
  33610. Utils.extend(swiper, {
  33611. coverflowEffect: {
  33612. setTranslate: Coverflow.setTranslate.bind(swiper),
  33613. setTransition: Coverflow.setTransition.bind(swiper),
  33614. },
  33615. });
  33616. },
  33617. on: {
  33618. beforeInit: function beforeInit() {
  33619. var swiper = this;
  33620. if (swiper.params.effect !== 'coverflow') { return; }
  33621. swiper.classNames.push(((swiper.params.containerModifierClass) + "coverflow"));
  33622. swiper.classNames.push(((swiper.params.containerModifierClass) + "3d"));
  33623. swiper.params.watchSlidesProgress = true;
  33624. swiper.originalParams.watchSlidesProgress = true;
  33625. },
  33626. setTranslate: function setTranslate() {
  33627. var swiper = this;
  33628. if (swiper.params.effect !== 'coverflow') { return; }
  33629. swiper.coverflowEffect.setTranslate();
  33630. },
  33631. setTransition: function setTransition(duration) {
  33632. var swiper = this;
  33633. if (swiper.params.effect !== 'coverflow') { return; }
  33634. swiper.coverflowEffect.setTransition(duration);
  33635. },
  33636. },
  33637. };
  33638. var Thumbs = {
  33639. init: function init() {
  33640. var swiper = this;
  33641. var ref = swiper.params;
  33642. var thumbsParams = ref.thumbs;
  33643. var SwiperClass = swiper.constructor;
  33644. if (thumbsParams.swiper instanceof SwiperClass) {
  33645. swiper.thumbs.swiper = thumbsParams.swiper;
  33646. Utils.extend(swiper.thumbs.swiper.originalParams, {
  33647. watchSlidesProgress: true,
  33648. slideToClickedSlide: false,
  33649. });
  33650. Utils.extend(swiper.thumbs.swiper.params, {
  33651. watchSlidesProgress: true,
  33652. slideToClickedSlide: false,
  33653. });
  33654. } else if (Utils.isObject(thumbsParams.swiper)) {
  33655. swiper.thumbs.swiper = new SwiperClass(Utils.extend({}, thumbsParams.swiper, {
  33656. watchSlidesVisibility: true,
  33657. watchSlidesProgress: true,
  33658. slideToClickedSlide: false,
  33659. }));
  33660. swiper.thumbs.swiperCreated = true;
  33661. }
  33662. swiper.thumbs.swiper.$el.addClass(swiper.params.thumbs.thumbsContainerClass);
  33663. swiper.thumbs.swiper.on('tap', swiper.thumbs.onThumbClick);
  33664. },
  33665. onThumbClick: function onThumbClick() {
  33666. var swiper = this;
  33667. var thumbsSwiper = swiper.thumbs.swiper;
  33668. if (!thumbsSwiper) { return; }
  33669. var clickedIndex = thumbsSwiper.clickedIndex;
  33670. var clickedSlide = thumbsSwiper.clickedSlide;
  33671. if (clickedSlide && $(clickedSlide).hasClass(swiper.params.thumbs.slideThumbActiveClass)) { return; }
  33672. if (typeof clickedIndex === 'undefined' || clickedIndex === null) { return; }
  33673. var slideToIndex;
  33674. if (thumbsSwiper.params.loop) {
  33675. slideToIndex = parseInt($(thumbsSwiper.clickedSlide).attr('data-swiper-slide-index'), 10);
  33676. } else {
  33677. slideToIndex = clickedIndex;
  33678. }
  33679. if (swiper.params.loop) {
  33680. var currentIndex = swiper.activeIndex;
  33681. if (swiper.slides.eq(currentIndex).hasClass(swiper.params.slideDuplicateClass)) {
  33682. swiper.loopFix();
  33683. // eslint-disable-next-line
  33684. swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;
  33685. currentIndex = swiper.activeIndex;
  33686. }
  33687. var prevIndex = swiper.slides.eq(currentIndex).prevAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
  33688. var nextIndex = swiper.slides.eq(currentIndex).nextAll(("[data-swiper-slide-index=\"" + slideToIndex + "\"]")).eq(0).index();
  33689. if (typeof prevIndex === 'undefined') { slideToIndex = nextIndex; }
  33690. else if (typeof nextIndex === 'undefined') { slideToIndex = prevIndex; }
  33691. else if (nextIndex - currentIndex < currentIndex - prevIndex) { slideToIndex = nextIndex; }
  33692. else { slideToIndex = prevIndex; }
  33693. }
  33694. swiper.slideTo(slideToIndex);
  33695. },
  33696. update: function update(initial) {
  33697. var swiper = this;
  33698. var thumbsSwiper = swiper.thumbs.swiper;
  33699. if (!thumbsSwiper) { return; }
  33700. var slidesPerView = thumbsSwiper.params.slidesPerView === 'auto'
  33701. ? thumbsSwiper.slidesPerViewDynamic()
  33702. : thumbsSwiper.params.slidesPerView;
  33703. var autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
  33704. var useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
  33705. if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
  33706. var currentThumbsIndex = thumbsSwiper.activeIndex;
  33707. var newThumbsIndex;
  33708. var direction;
  33709. if (thumbsSwiper.params.loop) {
  33710. if (thumbsSwiper.slides.eq(currentThumbsIndex).hasClass(thumbsSwiper.params.slideDuplicateClass)) {
  33711. thumbsSwiper.loopFix();
  33712. // eslint-disable-next-line
  33713. thumbsSwiper._clientLeft = thumbsSwiper.$wrapperEl[0].clientLeft;
  33714. currentThumbsIndex = thumbsSwiper.activeIndex;
  33715. }
  33716. // Find actual thumbs index to slide to
  33717. var prevThumbsIndex = thumbsSwiper.slides
  33718. .eq(currentThumbsIndex)
  33719. .prevAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0)
  33720. .index();
  33721. var nextThumbsIndex = thumbsSwiper.slides
  33722. .eq(currentThumbsIndex)
  33723. .nextAll(("[data-swiper-slide-index=\"" + (swiper.realIndex) + "\"]")).eq(0)
  33724. .index();
  33725. if (typeof prevThumbsIndex === 'undefined') { newThumbsIndex = nextThumbsIndex; }
  33726. else if (typeof nextThumbsIndex === 'undefined') { newThumbsIndex = prevThumbsIndex; }
  33727. else if (nextThumbsIndex - currentThumbsIndex === currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = currentThumbsIndex; }
  33728. else if (nextThumbsIndex - currentThumbsIndex < currentThumbsIndex - prevThumbsIndex) { newThumbsIndex = nextThumbsIndex; }
  33729. else { newThumbsIndex = prevThumbsIndex; }
  33730. direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
  33731. } else {
  33732. newThumbsIndex = swiper.realIndex;
  33733. direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
  33734. }
  33735. if (useOffset) {
  33736. newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
  33737. }
  33738. if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
  33739. if (thumbsSwiper.params.centeredSlides) {
  33740. if (newThumbsIndex > currentThumbsIndex) {
  33741. newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
  33742. } else {
  33743. newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
  33744. }
  33745. } else if (newThumbsIndex > currentThumbsIndex) {
  33746. newThumbsIndex = newThumbsIndex - slidesPerView + 1;
  33747. }
  33748. thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
  33749. }
  33750. }
  33751. // Activate thumbs
  33752. var thumbsToActivate = 1;
  33753. var thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
  33754. if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
  33755. thumbsToActivate = swiper.params.slidesPerView;
  33756. }
  33757. if (!swiper.params.thumbs.multipleActiveThumbs) {
  33758. thumbsToActivate = 1;
  33759. }
  33760. thumbsToActivate = Math.floor(thumbsToActivate);
  33761. thumbsSwiper.slides.removeClass(thumbActiveClass);
  33762. if (thumbsSwiper.params.loop || (thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled)) {
  33763. for (var i = 0; i < thumbsToActivate; i += 1) {
  33764. thumbsSwiper.$wrapperEl.children(("[data-swiper-slide-index=\"" + (swiper.realIndex + i) + "\"]")).addClass(thumbActiveClass);
  33765. }
  33766. } else {
  33767. for (var i$1 = 0; i$1 < thumbsToActivate; i$1 += 1) {
  33768. thumbsSwiper.slides.eq(swiper.realIndex + i$1).addClass(thumbActiveClass);
  33769. }
  33770. }
  33771. },
  33772. };
  33773. var Thumbs$1 = {
  33774. name: 'thumbs',
  33775. params: {
  33776. thumbs: {
  33777. swiper: null,
  33778. multipleActiveThumbs: true,
  33779. autoScrollOffset: 0,
  33780. slideThumbActiveClass: 'swiper-slide-thumb-active',
  33781. thumbsContainerClass: 'swiper-container-thumbs',
  33782. },
  33783. },
  33784. create: function create() {
  33785. var swiper = this;
  33786. Utils.extend(swiper, {
  33787. thumbs: {
  33788. swiper: null,
  33789. init: Thumbs.init.bind(swiper),
  33790. update: Thumbs.update.bind(swiper),
  33791. onThumbClick: Thumbs.onThumbClick.bind(swiper),
  33792. },
  33793. });
  33794. },
  33795. on: {
  33796. beforeInit: function beforeInit() {
  33797. var swiper = this;
  33798. var ref = swiper.params;
  33799. var thumbs = ref.thumbs;
  33800. if (!thumbs || !thumbs.swiper) { return; }
  33801. swiper.thumbs.init();
  33802. swiper.thumbs.update(true);
  33803. },
  33804. slideChange: function slideChange() {
  33805. var swiper = this;
  33806. if (!swiper.thumbs.swiper) { return; }
  33807. swiper.thumbs.update();
  33808. },
  33809. update: function update() {
  33810. var swiper = this;
  33811. if (!swiper.thumbs.swiper) { return; }
  33812. swiper.thumbs.update();
  33813. },
  33814. resize: function resize() {
  33815. var swiper = this;
  33816. if (!swiper.thumbs.swiper) { return; }
  33817. swiper.thumbs.update();
  33818. },
  33819. observerUpdate: function observerUpdate() {
  33820. var swiper = this;
  33821. if (!swiper.thumbs.swiper) { return; }
  33822. swiper.thumbs.update();
  33823. },
  33824. setTransition: function setTransition(duration) {
  33825. var swiper = this;
  33826. var thumbsSwiper = swiper.thumbs.swiper;
  33827. if (!thumbsSwiper) { return; }
  33828. thumbsSwiper.setTransition(duration);
  33829. },
  33830. beforeDestroy: function beforeDestroy() {
  33831. var swiper = this;
  33832. var thumbsSwiper = swiper.thumbs.swiper;
  33833. if (!thumbsSwiper) { return; }
  33834. if (swiper.thumbs.swiperCreated && thumbsSwiper) {
  33835. thumbsSwiper.destroy();
  33836. }
  33837. },
  33838. },
  33839. };
  33840. // Swiper Class
  33841. Swiper.use([
  33842. Device$1,
  33843. Browser$1,
  33844. Support$1,
  33845. Resize,
  33846. Observer$1,
  33847. Virtual$1,
  33848. Keyboard$1,
  33849. Mousewheel$1,
  33850. Navigation$1,
  33851. Pagination$1,
  33852. Scrollbar$1,
  33853. Parallax$1,
  33854. Zoom$1,
  33855. Lazy$3,
  33856. Controller$1,
  33857. History$2,
  33858. HashNavigation$1,
  33859. A11y,
  33860. Autoplay$1,
  33861. EffectFade,
  33862. EffectCube,
  33863. EffectFlip,
  33864. EffectCoverflow,
  33865. Thumbs$1 ]);
  33866. {
  33867. if (!window.Swiper) {
  33868. window.Swiper = Swiper;
  33869. }
  33870. }
  33871. function initSwiper(swiperEl) {
  33872. var app = this;
  33873. var $swiperEl = $(swiperEl);
  33874. if ($swiperEl.length === 0) { return; }
  33875. if ($swiperEl[0].swiper) { return; }
  33876. var initialSlide;
  33877. var params = {};
  33878. var isTabs;
  33879. var isRoutableTabs;
  33880. if ($swiperEl.hasClass('tabs-swipeable-wrap')) {
  33881. $swiperEl
  33882. .addClass('swiper-container')
  33883. .children('.tabs')
  33884. .addClass('swiper-wrapper')
  33885. .children('.tab')
  33886. .addClass('swiper-slide');
  33887. initialSlide = $swiperEl.children('.tabs').children('.tab-active').index();
  33888. isTabs = true;
  33889. isRoutableTabs = $swiperEl.find('.tabs-routable').length > 0;
  33890. }
  33891. if ($swiperEl.attr('data-swiper')) {
  33892. params = JSON.parse($swiperEl.attr('data-swiper'));
  33893. } else if ($swiperEl[0].f7SwiperParams) {
  33894. params = $swiperEl[0].f7SwiperParams;
  33895. } else {
  33896. params = $swiperEl.dataset();
  33897. Object.keys(params).forEach(function (key) {
  33898. var value = params[key];
  33899. if (typeof value === 'string' && value.indexOf('{') === 0 && value.indexOf('}') > 0) {
  33900. try {
  33901. params[key] = JSON.parse(value);
  33902. } catch (e) {
  33903. // not JSON
  33904. }
  33905. }
  33906. });
  33907. }
  33908. if (typeof params.initialSlide === 'undefined' && typeof initialSlide !== 'undefined') {
  33909. params.initialSlide = initialSlide;
  33910. }
  33911. var swiper = app.swiper.create($swiperEl[0], params);
  33912. function updateSwiper() {
  33913. swiper.update();
  33914. }
  33915. var $tabEl = $swiperEl.parents('.tab').filter(function (tabElIndex, tabEl) {
  33916. return $(tabEl).parent('.tabs').parent('.tabs-animated-wrap, .tabs-swipeable-wrap').length === 0;
  33917. }).eq(0);
  33918. $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').on('modal:open', updateSwiper);
  33919. $swiperEl.parents('.panel').on('panel:open', updateSwiper);
  33920. if ($tabEl && $tabEl.length) {
  33921. $tabEl.on('tab:show', updateSwiper);
  33922. }
  33923. swiper.on('beforeDestroy', function () {
  33924. $swiperEl.parents('.popup, .login-screen, .sheet-modal, .popover').off('modal:open', updateSwiper);
  33925. $swiperEl.parents('.panel').off('panel:open', updateSwiper);
  33926. if ($tabEl && $tabEl.length) {
  33927. $tabEl.off('tab:show', updateSwiper);
  33928. }
  33929. });
  33930. if (isTabs) {
  33931. swiper.on('slideChange', function () {
  33932. if (isRoutableTabs) {
  33933. var view = app.views.get($swiperEl.parents('.view'));
  33934. if (!view) { view = app.views.main; }
  33935. var router = view.router;
  33936. var tabRoute = router.findTabRoute(swiper.slides.eq(swiper.activeIndex)[0]);
  33937. if (tabRoute) {
  33938. setTimeout(function () {
  33939. router.navigate(tabRoute.path);
  33940. }, 0);
  33941. }
  33942. } else {
  33943. app.tab.show({
  33944. tabEl: swiper.slides.eq(swiper.activeIndex),
  33945. });
  33946. }
  33947. });
  33948. }
  33949. }
  33950. var Swiper$1 = {
  33951. name: 'swiper',
  33952. static: {
  33953. Swiper: Swiper,
  33954. },
  33955. create: function create() {
  33956. var app = this;
  33957. app.swiper = ConstructorMethods({
  33958. defaultSelector: '.swiper-container',
  33959. constructor: Swiper,
  33960. domProp: 'swiper',
  33961. });
  33962. },
  33963. on: {
  33964. pageBeforeRemove: function pageBeforeRemove(page) {
  33965. var app = this;
  33966. page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  33967. app.swiper.destroy(swiperEl);
  33968. });
  33969. },
  33970. pageMounted: function pageMounted(page) {
  33971. var app = this;
  33972. page.$el.find('.tabs-swipeable-wrap').each(function (index, swiperEl) {
  33973. initSwiper.call(app, swiperEl);
  33974. });
  33975. },
  33976. pageInit: function pageInit(page) {
  33977. var app = this;
  33978. page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  33979. initSwiper.call(app, swiperEl);
  33980. });
  33981. },
  33982. pageReinit: function pageReinit(page) {
  33983. var app = this;
  33984. page.$el.find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  33985. var swiper = app.swiper.get(swiperEl);
  33986. if (swiper && swiper.update) { swiper.update(); }
  33987. });
  33988. },
  33989. tabMounted: function tabMounted(tabEl) {
  33990. var app = this;
  33991. $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  33992. initSwiper.call(app, swiperEl);
  33993. });
  33994. },
  33995. tabShow: function tabShow(tabEl) {
  33996. var app = this;
  33997. $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  33998. var swiper = app.swiper.get(swiperEl);
  33999. if (swiper && swiper.update) { swiper.update(); }
  34000. });
  34001. },
  34002. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  34003. var app = this;
  34004. $(tabEl).find('.swiper-init, .tabs-swipeable-wrap').each(function (index, swiperEl) {
  34005. app.swiper.destroy(swiperEl);
  34006. });
  34007. },
  34008. },
  34009. vnode: {
  34010. 'swiper-init': {
  34011. insert: function insert(vnode) {
  34012. var app = this;
  34013. var swiperEl = vnode.elm;
  34014. initSwiper.call(app, swiperEl);
  34015. },
  34016. destroy: function destroy(vnode) {
  34017. var app = this;
  34018. var swiperEl = vnode.elm;
  34019. app.swiper.destroy(swiperEl);
  34020. },
  34021. },
  34022. 'tabs-swipeable-wrap': {
  34023. insert: function insert(vnode) {
  34024. var app = this;
  34025. var swiperEl = vnode.elm;
  34026. initSwiper.call(app, swiperEl);
  34027. },
  34028. destroy: function destroy(vnode) {
  34029. var app = this;
  34030. var swiperEl = vnode.elm;
  34031. app.swiper.destroy(swiperEl);
  34032. },
  34033. },
  34034. },
  34035. };
  34036. /* eslint indent: ["off"] */
  34037. var PhotoBrowser = /*@__PURE__*/(function (Framework7Class) {
  34038. function PhotoBrowser(app, params) {
  34039. if ( params === void 0 ) params = {};
  34040. Framework7Class.call(this, params, [app]);
  34041. var pb = this;
  34042. pb.app = app;
  34043. var defaults = Utils.extend({
  34044. on: {},
  34045. }, app.params.photoBrowser);
  34046. // Extend defaults with modules params
  34047. pb.useModulesParams(defaults);
  34048. pb.params = Utils.extend(defaults, params);
  34049. Utils.extend(pb, {
  34050. exposed: false,
  34051. opened: false,
  34052. activeIndex: pb.params.swiper.initialSlide,
  34053. url: pb.params.url,
  34054. swipeToClose: {
  34055. allow: true,
  34056. isTouched: false,
  34057. diff: undefined,
  34058. start: undefined,
  34059. current: undefined,
  34060. started: false,
  34061. activeSlide: undefined,
  34062. timeStart: undefined,
  34063. },
  34064. });
  34065. // Install Modules
  34066. pb.useModules();
  34067. // Init
  34068. pb.init();
  34069. }
  34070. if ( Framework7Class ) PhotoBrowser.__proto__ = Framework7Class;
  34071. PhotoBrowser.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  34072. PhotoBrowser.prototype.constructor = PhotoBrowser;
  34073. var prototypeAccessors = { view: { configurable: true } };
  34074. prototypeAccessors.view.get = function () {
  34075. var ref = this;
  34076. var params = ref.params;
  34077. var app = ref.app;
  34078. return params.view || app.views.main;
  34079. };
  34080. PhotoBrowser.prototype.onSlideChange = function onSlideChange (swiper) {
  34081. var pb = this;
  34082. pb.activeIndex = swiper.activeIndex;
  34083. var current = swiper.activeIndex + 1;
  34084. var total = pb.params.virtualSlides ? pb.params.photos.length : swiper.slides.length;
  34085. if (swiper.params.loop) {
  34086. total -= 2;
  34087. current -= swiper.loopedSlides;
  34088. if (current < 1) { current = total + current; }
  34089. if (current > total) { current -= total; }
  34090. }
  34091. var $activeSlideEl = pb.params.virtualSlides
  34092. ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.activeIndex) + "\"]"))
  34093. : swiper.slides.eq(swiper.activeIndex);
  34094. var $previousSlideEl = pb.params.virtualSlides
  34095. ? swiper.$wrapperEl.find((".swiper-slide[data-swiper-slide-index=\"" + (swiper.previousIndex) + "\"]"))
  34096. : swiper.slides.eq(swiper.previousIndex);
  34097. var $currentEl = pb.$el.find('.photo-browser-current');
  34098. var $totalEl = pb.$el.find('.photo-browser-total');
  34099. var navbarEl;
  34100. if (pb.params.type === 'page' && pb.params.navbar && $currentEl.length === 0 && pb.app.theme === 'ios') {
  34101. navbarEl = pb.app.navbar.getElByPage(pb.$el);
  34102. if (navbarEl) {
  34103. $currentEl = $(navbarEl).find('.photo-browser-current');
  34104. $totalEl = $(navbarEl).find('.photo-browser-total');
  34105. }
  34106. }
  34107. if ($currentEl.length && $totalEl.length) {
  34108. $currentEl.text(current);
  34109. $totalEl.text(total);
  34110. if (!navbarEl) { navbarEl = $currentEl.parents('.navbar')[0]; }
  34111. if (navbarEl) {
  34112. pb.app.navbar.size(navbarEl);
  34113. }
  34114. }
  34115. // Update captions
  34116. if (pb.captions.length > 0) {
  34117. var captionIndex = swiper.params.loop ? $activeSlideEl.attr('data-swiper-slide-index') : pb.activeIndex;
  34118. pb.$captionsContainerEl.find('.photo-browser-caption-active').removeClass('photo-browser-caption-active');
  34119. pb.$captionsContainerEl.find(("[data-caption-index=\"" + captionIndex + "\"]")).addClass('photo-browser-caption-active');
  34120. }
  34121. // Stop Video
  34122. var previousSlideVideo = $previousSlideEl.find('video');
  34123. if (previousSlideVideo.length > 0) {
  34124. if ('pause' in previousSlideVideo[0]) { previousSlideVideo[0].pause(); }
  34125. }
  34126. };
  34127. PhotoBrowser.prototype.onTouchStart = function onTouchStart () {
  34128. var pb = this;
  34129. var swipeToClose = pb.swipeToClose;
  34130. if (!swipeToClose.allow) { return; }
  34131. swipeToClose.isTouched = true;
  34132. };
  34133. PhotoBrowser.prototype.onTouchMove = function onTouchMove (e) {
  34134. var pb = this;
  34135. var swipeToClose = pb.swipeToClose;
  34136. if (!swipeToClose.isTouched) { return; }
  34137. if (!swipeToClose.started) {
  34138. swipeToClose.started = true;
  34139. swipeToClose.start = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  34140. if (pb.params.virtualSlides) {
  34141. swipeToClose.activeSlide = pb.swiper.$wrapperEl.children('.swiper-slide-active');
  34142. } else {
  34143. swipeToClose.activeSlide = pb.swiper.slides.eq(pb.swiper.activeIndex);
  34144. }
  34145. swipeToClose.timeStart = Utils.now();
  34146. }
  34147. e.preventDefault();
  34148. swipeToClose.current = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  34149. swipeToClose.diff = swipeToClose.start - swipeToClose.current;
  34150. pb.$el.transition(0).transform(("translate3d(0," + (-swipeToClose.diff) + "px,0)"));
  34151. };
  34152. PhotoBrowser.prototype.onTouchEnd = function onTouchEnd () {
  34153. var pb = this;
  34154. var swipeToClose = pb.swipeToClose;
  34155. swipeToClose.isTouched = false;
  34156. if (!swipeToClose.started) {
  34157. swipeToClose.started = false;
  34158. return;
  34159. }
  34160. swipeToClose.started = false;
  34161. swipeToClose.allow = false;
  34162. var diff = Math.abs(swipeToClose.diff);
  34163. var timeDiff = (new Date()).getTime() - swipeToClose.timeStart;
  34164. if ((timeDiff < 300 && diff > 20) || (timeDiff >= 300 && diff > 100)) {
  34165. Utils.nextTick(function () {
  34166. if (pb.$el) {
  34167. if (swipeToClose.diff < 0) { pb.$el.addClass('swipe-close-to-bottom'); }
  34168. else { pb.$el.addClass('swipe-close-to-top'); }
  34169. }
  34170. pb.emit('local::swipeToClose', pb);
  34171. pb.$el.transform('').transition('');
  34172. pb.close();
  34173. swipeToClose.allow = true;
  34174. });
  34175. return;
  34176. }
  34177. if (diff !== 0) {
  34178. pb.$el.addClass('photo-browser-transitioning').transitionEnd(function () {
  34179. swipeToClose.allow = true;
  34180. pb.$el.removeClass('photo-browser-transitioning');
  34181. });
  34182. } else {
  34183. swipeToClose.allow = true;
  34184. }
  34185. Utils.nextTick(function () {
  34186. pb.$el.transform('').transition('');
  34187. });
  34188. };
  34189. // Render Functions
  34190. PhotoBrowser.prototype.renderNavbar = function renderNavbar () {
  34191. var pb = this;
  34192. if (pb.params.renderNavbar) { return pb.params.renderNavbar.call(pb); }
  34193. var iconsColor = pb.params.iconsColor;
  34194. if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
  34195. var pageBackLinkText = (pb.app.theme === 'ios' || pb.app.theme === 'aurora') && pb.params.pageBackLinkText ? pb.params.pageBackLinkText : '';
  34196. var renderNavbarCount = typeof pb.params.navbarShowCount === 'undefined' ? pb.params.photos.length > 1 : pb.params.navbarShowCount;
  34197. var isPopup = pb.params.type !== 'page';
  34198. var navbarHtml = ("\n <div class=\"navbar navbar-photo-browser " + (pb.params.theme === 'dark' ? 'navbar-photo-browser-dark' : '') + "\">\n <div class=\"navbar-bg\"></div>\n <div class=\"navbar-inner navbar-inner-centered-title sliding\">\n " + (!isPopup ? ("\n <div class=\"left\">\n <a class=\"link " + (!pageBackLinkText ? 'icon-only' : '') + " back\">\n <i class=\"icon icon-back " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n " + (pageBackLinkText ? ("<span>" + pageBackLinkText + "</span>") : '') + "\n </a>\n </div>\n ") : '') + "\n " + (renderNavbarCount ? ("\n <div class=\"title\">\n <span class=\"photo-browser-current\"></span>\n <span class=\"photo-browser-of\">" + (pb.params.navbarOfText) + "</span>\n <span class=\"photo-browser-total\"></span>\n </div>\n ") : '') + "\n " + (isPopup ? ("\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".photo-browser-popup\">\n <span>" + (pb.params.popupCloseLinkText) + "</span>\n </a>\n </div>\n ") : '') + "\n </div>\n </div>\n ").trim();
  34199. return navbarHtml;
  34200. };
  34201. PhotoBrowser.prototype.renderToolbar = function renderToolbar () {
  34202. var pb = this;
  34203. if (pb.params.renderToolbar) { return pb.params.renderToolbar.call(pb); }
  34204. var iconsColor = pb.params.iconsColor;
  34205. if (!pb.params.iconsColor && pb.params.theme === 'dark') { iconsColor = 'white'; }
  34206. var toolbarHtml = ("\n <div class=\"toolbar toolbar-bottom tabbar\">\n <div class=\"toolbar-inner\">\n <a class=\"link photo-browser-prev\">\n <i class=\"icon icon-back " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n </a>\n <a class=\"link photo-browser-next\">\n <i class=\"icon icon-forward " + (iconsColor ? ("color-" + iconsColor) : '') + "\"></i>\n </a>\n </div>\n </div>\n ").trim();
  34207. return toolbarHtml;
  34208. };
  34209. PhotoBrowser.prototype.renderCaption = function renderCaption (caption, index) {
  34210. var pb = this;
  34211. if (pb.params.renderCaption) { return pb.params.renderCaption.call(pb, caption, index); }
  34212. var captionHtml = ("\n <div class=\"photo-browser-caption\" data-caption-index=\"" + index + "\">\n " + caption + "\n </div>\n ").trim();
  34213. return captionHtml;
  34214. };
  34215. PhotoBrowser.prototype.renderObject = function renderObject (photo, index) {
  34216. var pb = this;
  34217. if (pb.params.renderObject) { return pb.params.renderObject.call(pb, photo, index); }
  34218. var objHtml = "\n <div class=\"photo-browser-slide photo-browser-object-slide swiper-slide\" data-swiper-slide-index=\"" + index + "\">" + (photo.html ? photo.html : photo) + "</div>\n ";
  34219. return objHtml;
  34220. };
  34221. PhotoBrowser.prototype.renderLazyPhoto = function renderLazyPhoto (photo, index) {
  34222. var pb = this;
  34223. if (pb.params.renderLazyPhoto) { return pb.params.renderLazyPhoto.call(pb, photo, index); }
  34224. var photoHtml = ("\n <div class=\"photo-browser-slide photo-browser-slide-lazy swiper-slide\" data-swiper-slide-index=\"" + index + "\">\n <div class=\"swiper-lazy-preloader\"></div>\n <span class=\"swiper-zoom-container\">\n <img data-src=\"" + (photo.url ? photo.url : photo) + "\" class=\"swiper-lazy\">\n </span>\n </div>\n ").trim();
  34225. return photoHtml;
  34226. };
  34227. PhotoBrowser.prototype.renderPhoto = function renderPhoto (photo, index) {
  34228. var pb = this;
  34229. if (pb.params.renderPhoto) { return pb.params.renderPhoto.call(pb, photo, index); }
  34230. var photoHtml = ("\n <div class=\"photo-browser-slide swiper-slide\" data-swiper-slide-index=\"" + index + "\">\n <span class=\"swiper-zoom-container\">\n <img src=\"" + (photo.url ? photo.url : photo) + "\">\n </span>\n </div>\n ").trim();
  34231. return photoHtml;
  34232. };
  34233. PhotoBrowser.prototype.render = function render () {
  34234. var pb = this;
  34235. if (pb.params.render) { return pb.params.render.call(pb, pb.params); }
  34236. var html = ("\n <div class=\"photo-browser photo-browser-" + (pb.params.theme) + "\">\n <div class=\"view\">\n <div class=\"page photo-browser-page photo-browser-page-" + (pb.params.theme) + " no-toolbar " + (!pb.params.navbar ? 'no-navbar' : '') + "\" data-name=\"photo-browser-page\">\n " + (pb.params.navbar ? pb.renderNavbar() : '') + "\n " + (pb.params.toolbar ? pb.renderToolbar() : '') + "\n <div class=\"photo-browser-captions photo-browser-captions-" + (pb.params.captionsTheme || pb.params.theme) + "\">\n " + (pb.params.photos.map(function (photo, index) {
  34237. if (photo.caption) { return pb.renderCaption(photo.caption, index); }
  34238. return '';
  34239. }).join(' ')) + "\n </div>\n <div class=\"photo-browser-swiper-container swiper-container\">\n <div class=\"photo-browser-swiper-wrapper swiper-wrapper\">\n " + (pb.params.virtualSlides ? '' : pb.params.photos.map(function (photo, index) {
  34240. if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
  34241. return pb.renderObject(photo, index);
  34242. }
  34243. if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
  34244. return pb.renderLazyPhoto(photo, index);
  34245. }
  34246. return pb.renderPhoto(photo, index);
  34247. }).join(' ')) + "\n </div>\n </div>\n </div>\n </div>\n </div>\n ").trim();
  34248. return html;
  34249. };
  34250. PhotoBrowser.prototype.renderStandalone = function renderStandalone () {
  34251. var pb = this;
  34252. if (pb.params.renderStandalone) { return pb.params.renderStandalone.call(pb); }
  34253. var standaloneHtml = "<div class=\"popup photo-browser-popup photo-browser-standalone popup-tablet-fullscreen\">" + (pb.render()) + "</div>";
  34254. return standaloneHtml;
  34255. };
  34256. PhotoBrowser.prototype.renderPage = function renderPage () {
  34257. var pb = this;
  34258. if (pb.params.renderPage) { return pb.params.renderPage.call(pb); }
  34259. var pageHtml = pb.render();
  34260. return pageHtml;
  34261. };
  34262. PhotoBrowser.prototype.renderPopup = function renderPopup () {
  34263. var pb = this;
  34264. if (pb.params.renderPopup) { return pb.params.renderPopup.call(pb); }
  34265. var popupHtml = "<div class=\"popup photo-browser-popup\">" + (pb.render()) + "</div>";
  34266. return popupHtml;
  34267. };
  34268. // Callbacks
  34269. PhotoBrowser.prototype.onOpen = function onOpen (type, el) {
  34270. var pb = this;
  34271. var app = pb.app;
  34272. var $el = $(el);
  34273. $el[0].f7PhotoBrowser = pb;
  34274. pb.$el = $el;
  34275. pb.el = $el[0];
  34276. pb.openedIn = type;
  34277. pb.opened = true;
  34278. pb.$swiperContainerEl = pb.$el.find('.photo-browser-swiper-container');
  34279. pb.$swiperWrapperEl = pb.$el.find('.photo-browser-swiper-wrapper');
  34280. pb.slides = pb.$el.find('.photo-browser-slide');
  34281. pb.$captionsContainerEl = pb.$el.find('.photo-browser-captions');
  34282. pb.captions = pb.$el.find('.photo-browser-caption');
  34283. // Init Swiper
  34284. var clickTimeout;
  34285. var swiperParams = Utils.extend({}, pb.params.swiper, {
  34286. initialSlide: pb.activeIndex,
  34287. on: {
  34288. click: function click(e) {
  34289. clearTimeout(clickTimeout);
  34290. if (pb.params.exposition) {
  34291. clickTimeout = setTimeout(function () {
  34292. pb.expositionToggle();
  34293. }, 350);
  34294. }
  34295. pb.emit('local::tap', e);
  34296. pb.emit('local::click', e);
  34297. },
  34298. doubleClick: function doubleClick(e) {
  34299. clearTimeout(clickTimeout);
  34300. pb.emit('local::doubleTap', e);
  34301. pb.emit('local::doubleClick', e);
  34302. },
  34303. slideChange: function slideChange() {
  34304. var args = [], len = arguments.length;
  34305. while ( len-- ) args[ len ] = arguments[ len ];
  34306. var swiper = this;
  34307. pb.onSlideChange(swiper);
  34308. pb.emit.apply(pb, [ 'local::slideChange' ].concat( args ));
  34309. },
  34310. transitionStart: function transitionStart() {
  34311. var args = [], len = arguments.length;
  34312. while ( len-- ) args[ len ] = arguments[ len ];
  34313. pb.emit.apply(pb, [ 'local::transitionStart' ].concat( args ));
  34314. },
  34315. transitionEnd: function transitionEnd() {
  34316. var args = [], len = arguments.length;
  34317. while ( len-- ) args[ len ] = arguments[ len ];
  34318. pb.emit.apply(pb, [ 'local::transitionEnd' ].concat( args ));
  34319. },
  34320. slideChangeTransitionStart: function slideChangeTransitionStart() {
  34321. var args = [], len = arguments.length;
  34322. while ( len-- ) args[ len ] = arguments[ len ];
  34323. var swiper = this;
  34324. pb.onSlideChange(swiper);
  34325. pb.emit.apply(pb, [ 'local::slideChangeTransitionStart' ].concat( args ));
  34326. },
  34327. slideChangeTransitionEnd: function slideChangeTransitionEnd() {
  34328. var args = [], len = arguments.length;
  34329. while ( len-- ) args[ len ] = arguments[ len ];
  34330. pb.emit.apply(pb, [ 'local::slideChangeTransitionEnd' ].concat( args ));
  34331. },
  34332. lazyImageLoad: function lazyImageLoad() {
  34333. var args = [], len = arguments.length;
  34334. while ( len-- ) args[ len ] = arguments[ len ];
  34335. pb.emit.apply(pb, [ 'local::lazyImageLoad' ].concat( args ));
  34336. },
  34337. lazyImageReady: function lazyImageReady() {
  34338. var args = [], len = arguments.length;
  34339. while ( len-- ) args[ len ] = arguments[ len ];
  34340. var slideEl = args[0];
  34341. $(slideEl).removeClass('photo-browser-slide-lazy');
  34342. pb.emit.apply(pb, [ 'local::lazyImageReady' ].concat( args ));
  34343. },
  34344. },
  34345. });
  34346. if (pb.params.swipeToClose && pb.params.type !== 'page') {
  34347. Utils.extend(swiperParams.on, {
  34348. touchStart: function touchStart(e) {
  34349. pb.onTouchStart(e);
  34350. pb.emit('local::touchStart', e);
  34351. },
  34352. touchMoveOpposite: function touchMoveOpposite(e) {
  34353. pb.onTouchMove(e);
  34354. pb.emit('local::touchMoveOpposite', e);
  34355. },
  34356. touchEnd: function touchEnd(e) {
  34357. pb.onTouchEnd(e);
  34358. pb.emit('local::touchEnd', e);
  34359. },
  34360. });
  34361. }
  34362. if (pb.params.virtualSlides) {
  34363. Utils.extend(swiperParams, {
  34364. virtual: {
  34365. slides: pb.params.photos,
  34366. renderSlide: function renderSlide(photo, index) {
  34367. if (photo.html || ((typeof photo === 'string' || photo instanceof String) && photo.indexOf('<') >= 0 && photo.indexOf('>') >= 0)) {
  34368. return pb.renderObject(photo, index);
  34369. }
  34370. if (pb.params.swiper.lazy === true || (pb.params.swiper.lazy && pb.params.swiper.lazy.enabled)) {
  34371. return pb.renderLazyPhoto(photo, index);
  34372. }
  34373. return pb.renderPhoto(photo, index);
  34374. },
  34375. },
  34376. });
  34377. }
  34378. pb.swiper = app.swiper.create(pb.$swiperContainerEl, swiperParams);
  34379. if (pb.activeIndex === 0) {
  34380. pb.onSlideChange(pb.swiper);
  34381. }
  34382. if (pb.$el) {
  34383. pb.$el.trigger('photobrowser:open');
  34384. }
  34385. pb.emit('local::open photoBrowserOpen', pb);
  34386. };
  34387. PhotoBrowser.prototype.onOpened = function onOpened () {
  34388. var pb = this;
  34389. if (pb.$el && pb.params.type === 'standalone') {
  34390. pb.$el.css('animation', 'none');
  34391. }
  34392. if (pb.$el) {
  34393. pb.$el.trigger('photobrowser:opened');
  34394. }
  34395. pb.emit('local::opened photoBrowserOpened', pb);
  34396. };
  34397. PhotoBrowser.prototype.onClose = function onClose () {
  34398. var pb = this;
  34399. if (pb.destroyed) { return; }
  34400. // Destroy Swiper
  34401. if (pb.swiper && pb.swiper.destroy) {
  34402. pb.swiper.destroy(true, false);
  34403. pb.swiper = null;
  34404. delete pb.swiper;
  34405. }
  34406. if (pb.$el) {
  34407. pb.$el.trigger('photobrowser:close');
  34408. }
  34409. pb.emit('local::close photoBrowserClose', pb);
  34410. };
  34411. PhotoBrowser.prototype.onClosed = function onClosed () {
  34412. var pb = this;
  34413. if (pb.destroyed) { return; }
  34414. pb.opened = false;
  34415. pb.$el = null;
  34416. pb.el = null;
  34417. delete pb.$el;
  34418. delete pb.el;
  34419. if (pb.$el) {
  34420. pb.$el.trigger('photobrowser:closed');
  34421. }
  34422. pb.emit('local::closed photoBrowserClosed', pb);
  34423. };
  34424. // Open
  34425. PhotoBrowser.prototype.openPage = function openPage () {
  34426. var pb = this;
  34427. if (pb.opened) { return pb; }
  34428. var pageHtml = pb.renderPage();
  34429. pb.view.router.navigate({
  34430. url: pb.url,
  34431. route: {
  34432. content: pageHtml,
  34433. path: pb.url,
  34434. on: {
  34435. pageBeforeIn: function pageBeforeIn(e, page) {
  34436. pb.view.$el.addClass(("with-photo-browser-page with-photo-browser-page-" + (pb.params.theme)));
  34437. pb.onOpen('page', page.el);
  34438. },
  34439. pageAfterIn: function pageAfterIn(e, page) {
  34440. pb.onOpened('page', page.el);
  34441. },
  34442. pageBeforeOut: function pageBeforeOut(e, page) {
  34443. pb.view.$el.removeClass(("with-photo-browser-page with-photo-browser-page-exposed with-photo-browser-page-" + (pb.params.theme)));
  34444. pb.onClose('page', page.el);
  34445. },
  34446. pageAfterOut: function pageAfterOut(e, page) {
  34447. pb.onClosed('page', page.el);
  34448. },
  34449. },
  34450. },
  34451. });
  34452. return pb;
  34453. };
  34454. PhotoBrowser.prototype.openStandalone = function openStandalone () {
  34455. var pb = this;
  34456. if (pb.opened) { return pb; }
  34457. var standaloneHtml = pb.renderStandalone();
  34458. var popupParams = {
  34459. backdrop: false,
  34460. content: standaloneHtml,
  34461. on: {
  34462. popupOpen: function popupOpen(popup) {
  34463. pb.onOpen('popup', popup.el);
  34464. },
  34465. popupOpened: function popupOpened(popup) {
  34466. pb.onOpened('popup', popup.el);
  34467. },
  34468. popupClose: function popupClose(popup) {
  34469. pb.onClose('popup', popup.el);
  34470. },
  34471. popupClosed: function popupClosed(popup) {
  34472. pb.onClosed('popup', popup.el);
  34473. },
  34474. },
  34475. };
  34476. if (pb.params.routableModals && pb.view) {
  34477. pb.view.router.navigate({
  34478. url: pb.url,
  34479. route: {
  34480. path: pb.url,
  34481. popup: popupParams,
  34482. },
  34483. });
  34484. } else {
  34485. pb.modal = pb.app.popup.create(popupParams).open();
  34486. }
  34487. return pb;
  34488. };
  34489. PhotoBrowser.prototype.openPopup = function openPopup () {
  34490. var pb = this;
  34491. if (pb.opened) { return pb; }
  34492. var popupHtml = pb.renderPopup();
  34493. var popupParams = {
  34494. content: popupHtml,
  34495. push: pb.params.popupPush,
  34496. on: {
  34497. popupOpen: function popupOpen(popup) {
  34498. pb.onOpen('popup', popup.el);
  34499. },
  34500. popupOpened: function popupOpened(popup) {
  34501. pb.onOpened('popup', popup.el);
  34502. },
  34503. popupClose: function popupClose(popup) {
  34504. pb.onClose('popup', popup.el);
  34505. },
  34506. popupClosed: function popupClosed(popup) {
  34507. pb.onClosed('popup', popup.el);
  34508. },
  34509. },
  34510. };
  34511. if (pb.params.routableModals && pb.view) {
  34512. pb.view.router.navigate({
  34513. url: pb.url,
  34514. route: {
  34515. path: pb.url,
  34516. popup: popupParams,
  34517. },
  34518. });
  34519. } else {
  34520. pb.modal = pb.app.popup.create(popupParams).open();
  34521. }
  34522. return pb;
  34523. };
  34524. // Exposition
  34525. PhotoBrowser.prototype.expositionEnable = function expositionEnable () {
  34526. var pb = this;
  34527. if (pb.params.type === 'page') {
  34528. pb.view.$el.addClass('with-photo-browser-page-exposed');
  34529. }
  34530. if (pb.$el) { pb.$el.addClass('photo-browser-exposed'); }
  34531. if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.addClass('photo-browser-captions-exposed'); }
  34532. pb.exposed = true;
  34533. return pb;
  34534. };
  34535. PhotoBrowser.prototype.expositionDisable = function expositionDisable () {
  34536. var pb = this;
  34537. if (pb.params.type === 'page') {
  34538. pb.view.$el.removeClass('with-photo-browser-page-exposed');
  34539. }
  34540. if (pb.$el) { pb.$el.removeClass('photo-browser-exposed'); }
  34541. if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.removeClass('photo-browser-captions-exposed'); }
  34542. pb.exposed = false;
  34543. return pb;
  34544. };
  34545. PhotoBrowser.prototype.expositionToggle = function expositionToggle () {
  34546. var pb = this;
  34547. if (pb.params.type === 'page') {
  34548. pb.view.$el.toggleClass('with-photo-browser-page-exposed');
  34549. }
  34550. if (pb.$el) { pb.$el.toggleClass('photo-browser-exposed'); }
  34551. if (pb.params.expositionHideCaptions) { pb.$captionsContainerEl.toggleClass('photo-browser-captions-exposed'); }
  34552. pb.exposed = !pb.exposed;
  34553. return pb;
  34554. };
  34555. PhotoBrowser.prototype.open = function open (index) {
  34556. var pb = this;
  34557. var type = pb.params.type;
  34558. if (pb.opened) {
  34559. if (pb.swiper && typeof index !== 'undefined') {
  34560. pb.swiper.slideTo(parseInt(index, 10));
  34561. }
  34562. return pb;
  34563. }
  34564. if (typeof index !== 'undefined') {
  34565. pb.activeIndex = index;
  34566. }
  34567. if (type === 'standalone') {
  34568. pb.openStandalone();
  34569. }
  34570. if (type === 'page') {
  34571. pb.openPage();
  34572. }
  34573. if (type === 'popup') {
  34574. pb.openPopup();
  34575. }
  34576. return pb;
  34577. };
  34578. PhotoBrowser.prototype.close = function close () {
  34579. var pb = this;
  34580. if (!pb.opened) { return pb; }
  34581. if ((pb.params.routableModals && pb.view) || pb.openedIn === 'page') {
  34582. pb.view.router.back();
  34583. } else {
  34584. pb.modal.once('modalClosed', function () {
  34585. Utils.nextTick(function () {
  34586. if (pb.destroyed) { return; }
  34587. pb.modal.destroy();
  34588. delete pb.modal;
  34589. });
  34590. });
  34591. pb.modal.close();
  34592. }
  34593. return pb;
  34594. };
  34595. // eslint-disable-next-line
  34596. PhotoBrowser.prototype.init = function init () {};
  34597. PhotoBrowser.prototype.destroy = function destroy () {
  34598. var pb = this;
  34599. pb.emit('local::beforeDestroy photoBrowserBeforeDestroy', pb);
  34600. if (pb.$el) {
  34601. pb.$el.trigger('photobrowser:beforedestroy');
  34602. pb.$el[0].f7PhotoBrowser = null;
  34603. delete pb.$el[0].f7PhotoBrowser;
  34604. }
  34605. Utils.deleteProps(pb);
  34606. pb.destroyed = true;
  34607. pb = null;
  34608. };
  34609. Object.defineProperties( PhotoBrowser.prototype, prototypeAccessors );
  34610. return PhotoBrowser;
  34611. }(Framework7Class));
  34612. var PhotoBrowser$1 = {
  34613. name: 'photoBrowser',
  34614. params: {
  34615. photoBrowser: {
  34616. photos: [],
  34617. exposition: true,
  34618. expositionHideCaptions: false,
  34619. type: 'standalone',
  34620. navbar: true,
  34621. toolbar: true,
  34622. theme: 'light',
  34623. captionsTheme: undefined,
  34624. iconsColor: undefined,
  34625. popupPush: false,
  34626. swipeToClose: true,
  34627. pageBackLinkText: 'Back',
  34628. popupCloseLinkText: 'Close',
  34629. navbarOfText: 'of',
  34630. navbarShowCount: undefined,
  34631. view: undefined,
  34632. url: 'photos/',
  34633. routableModals: true,
  34634. virtualSlides: true,
  34635. renderNavbar: undefined,
  34636. renderToolbar: undefined,
  34637. renderCaption: undefined,
  34638. renderObject: undefined,
  34639. renderLazyPhoto: undefined,
  34640. renderPhoto: undefined,
  34641. renderPage: undefined,
  34642. renderPopup: undefined,
  34643. renderStandalone: undefined,
  34644. swiper: {
  34645. initialSlide: 0,
  34646. spaceBetween: 20,
  34647. speed: 300,
  34648. loop: false,
  34649. preloadImages: true,
  34650. navigation: {
  34651. nextEl: '.photo-browser-next',
  34652. prevEl: '.photo-browser-prev',
  34653. },
  34654. zoom: {
  34655. enabled: true,
  34656. maxRatio: 3,
  34657. minRatio: 1,
  34658. },
  34659. lazy: {
  34660. enabled: true,
  34661. },
  34662. },
  34663. },
  34664. },
  34665. create: function create() {
  34666. var app = this;
  34667. app.photoBrowser = ConstructorMethods({
  34668. defaultSelector: '.photo-browser-popup, .photo-browser-page',
  34669. constructor: PhotoBrowser,
  34670. app: app,
  34671. domProp: 'f7PhotoBrowser',
  34672. });
  34673. },
  34674. static: {
  34675. PhotoBrowser: PhotoBrowser,
  34676. },
  34677. };
  34678. var Notification = /*@__PURE__*/(function (Modal) {
  34679. function Notification(app, params) {
  34680. var extendedParams = Utils.extend({
  34681. on: {},
  34682. }, app.params.notification, params);
  34683. // Extends with open/close Modal methods;
  34684. Modal.call(this, app, extendedParams);
  34685. var notification = this;
  34686. notification.app = app;
  34687. notification.params = extendedParams;
  34688. var ref = notification.params;
  34689. var icon = ref.icon;
  34690. var title = ref.title;
  34691. var titleRightText = ref.titleRightText;
  34692. var subtitle = ref.subtitle;
  34693. var text = ref.text;
  34694. var closeButton = ref.closeButton;
  34695. var closeTimeout = ref.closeTimeout;
  34696. var cssClass = ref.cssClass;
  34697. var closeOnClick = ref.closeOnClick;
  34698. var $el;
  34699. if (!notification.params.el) {
  34700. // Find Element
  34701. var notificationHtml = notification.render({
  34702. icon: icon,
  34703. title: title,
  34704. titleRightText: titleRightText,
  34705. subtitle: subtitle,
  34706. text: text,
  34707. closeButton: closeButton,
  34708. cssClass: cssClass,
  34709. });
  34710. $el = $(notificationHtml);
  34711. } else {
  34712. $el = $(notification.params.el);
  34713. }
  34714. if ($el && $el.length > 0 && $el[0].f7Modal) {
  34715. return $el[0].f7Modal;
  34716. }
  34717. if ($el.length === 0) {
  34718. return notification.destroy();
  34719. }
  34720. Utils.extend(notification, {
  34721. $el: $el,
  34722. el: $el[0],
  34723. type: 'notification',
  34724. });
  34725. $el[0].f7Modal = notification;
  34726. if (closeButton) {
  34727. $el.find('.notification-close-button').on('click', function () {
  34728. notification.close();
  34729. });
  34730. }
  34731. $el.on('click', function (e) {
  34732. if (closeButton && $(e.target).closest('.notification-close-button').length) {
  34733. return;
  34734. }
  34735. notification.emit('local::click notificationClick', notification);
  34736. if (closeOnClick) { notification.close(); }
  34737. });
  34738. notification.on('beforeDestroy', function () {
  34739. $el.off('click');
  34740. });
  34741. /* Touch Events */
  34742. var isTouched;
  34743. var isMoved;
  34744. var isScrolling;
  34745. var touchesDiff;
  34746. var touchStartTime;
  34747. var notificationHeight;
  34748. var touchesStart = {};
  34749. function handleTouchStart(e) {
  34750. if (isTouched) { return; }
  34751. isTouched = true;
  34752. isMoved = false;
  34753. isScrolling = undefined;
  34754. touchStartTime = Utils.now();
  34755. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  34756. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  34757. }
  34758. function handleTouchMove(e) {
  34759. if (!isTouched) { return; }
  34760. var pageX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  34761. var pageY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  34762. if (typeof isScrolling === 'undefined') {
  34763. isScrolling = !!(isScrolling || Math.abs(pageY - touchesStart.y) < Math.abs(pageX - touchesStart.x));
  34764. }
  34765. if (isScrolling) {
  34766. isTouched = false;
  34767. return;
  34768. }
  34769. e.preventDefault();
  34770. if (!isMoved) {
  34771. notification.$el.removeClass('notification-transitioning');
  34772. notification.$el.transition(0);
  34773. notificationHeight = notification.$el[0].offsetHeight / 2;
  34774. }
  34775. isMoved = true;
  34776. touchesDiff = (pageY - touchesStart.y);
  34777. var newTranslate = touchesDiff;
  34778. if (touchesDiff > 0) {
  34779. newTranslate = Math.pow( touchesDiff, 0.8 );
  34780. }
  34781. notification.$el.transform(("translate3d(0, " + newTranslate + "px, 0)"));
  34782. }
  34783. function handleTouchEnd() {
  34784. if (!isTouched || !isMoved) {
  34785. isTouched = false;
  34786. isMoved = false;
  34787. return;
  34788. }
  34789. isTouched = false;
  34790. isMoved = false;
  34791. if (touchesDiff === 0) {
  34792. return;
  34793. }
  34794. var timeDiff = Utils.now() - touchStartTime;
  34795. notification.$el.transition('');
  34796. notification.$el.addClass('notification-transitioning');
  34797. notification.$el.transform('');
  34798. if (
  34799. (touchesDiff < -10 && timeDiff < 300)
  34800. || (-touchesDiff >= notificationHeight / 1)
  34801. ) {
  34802. notification.close();
  34803. }
  34804. }
  34805. function attachTouchEvents() {
  34806. notification.$el.on(app.touchEvents.start, handleTouchStart, { passive: true });
  34807. app.on('touchmove:active', handleTouchMove);
  34808. app.on('touchend:passive', handleTouchEnd);
  34809. }
  34810. function detachTouchEvents() {
  34811. notification.$el.off(app.touchEvents.start, handleTouchStart, { passive: true });
  34812. app.off('touchmove:active', handleTouchMove);
  34813. app.off('touchend:passive', handleTouchEnd);
  34814. }
  34815. var timeoutId;
  34816. function closeOnTimeout() {
  34817. timeoutId = Utils.nextTick(function () {
  34818. if (isTouched && isMoved) {
  34819. closeOnTimeout();
  34820. return;
  34821. }
  34822. notification.close();
  34823. }, closeTimeout);
  34824. }
  34825. notification.on('open', function () {
  34826. if (notification.params.swipeToClose) {
  34827. attachTouchEvents();
  34828. }
  34829. $('.notification.modal-in').each(function (index, openedEl) {
  34830. var notificationInstance = app.notification.get(openedEl);
  34831. if (openedEl !== notification.el && notificationInstance) {
  34832. notificationInstance.close();
  34833. }
  34834. });
  34835. if (closeTimeout) {
  34836. closeOnTimeout();
  34837. }
  34838. });
  34839. notification.on('close beforeDestroy', function () {
  34840. if (notification.params.swipeToClose) {
  34841. detachTouchEvents();
  34842. }
  34843. win.clearTimeout(timeoutId);
  34844. });
  34845. return notification;
  34846. }
  34847. if ( Modal ) Notification.__proto__ = Modal;
  34848. Notification.prototype = Object.create( Modal && Modal.prototype );
  34849. Notification.prototype.constructor = Notification;
  34850. Notification.prototype.render = function render () {
  34851. var notification = this;
  34852. if (notification.params.render) { return notification.params.render.call(notification, notification); }
  34853. var ref = notification.params;
  34854. var icon = ref.icon;
  34855. var title = ref.title;
  34856. var titleRightText = ref.titleRightText;
  34857. var subtitle = ref.subtitle;
  34858. var text = ref.text;
  34859. var closeButton = ref.closeButton;
  34860. var cssClass = ref.cssClass;
  34861. return ("\n <div class=\"notification " + (cssClass || '') + "\">\n <div class=\"notification-header\">\n " + (icon ? ("<div class=\"notification-icon\">" + icon + "</div>") : '') + "\n " + (title ? ("<div class=\"notification-title\">" + title + "</div>") : '') + "\n " + (titleRightText ? ("<div class=\"notification-title-right-text\">" + titleRightText + "</div>") : '') + "\n " + (closeButton ? '<span class="notification-close-button"></span>' : '') + "\n </div>\n <div class=\"notification-content\">\n " + (subtitle ? ("<div class=\"notification-subtitle\">" + subtitle + "</div>") : '') + "\n " + (text ? ("<div class=\"notification-text\">" + text + "</div>") : '') + "\n </div>\n </div>\n ").trim();
  34862. };
  34863. return Notification;
  34864. }(Modal));
  34865. var Notification$1 = {
  34866. name: 'notification',
  34867. static: {
  34868. Notification: Notification,
  34869. },
  34870. create: function create() {
  34871. var app = this;
  34872. app.notification = Utils.extend(
  34873. {},
  34874. ModalMethods({
  34875. app: app,
  34876. constructor: Notification,
  34877. defaultSelector: '.notification.modal-in',
  34878. })
  34879. );
  34880. },
  34881. params: {
  34882. notification: {
  34883. icon: null,
  34884. title: null,
  34885. titleRightText: null,
  34886. subtitle: null,
  34887. text: null,
  34888. closeButton: false,
  34889. closeTimeout: null,
  34890. closeOnClick: false,
  34891. swipeToClose: true,
  34892. cssClass: null,
  34893. render: null,
  34894. },
  34895. },
  34896. };
  34897. /* eslint "no-useless-escape": "off" */
  34898. var Autocomplete = /*@__PURE__*/(function (Framework7Class) {
  34899. function Autocomplete(app, params) {
  34900. if ( params === void 0 ) params = {};
  34901. Framework7Class.call(this, params, [app]);
  34902. var ac = this;
  34903. ac.app = app;
  34904. var defaults = Utils.extend({
  34905. on: {},
  34906. }, app.params.autocomplete);
  34907. if (typeof defaults.searchbarDisableButton === 'undefined') {
  34908. defaults.searchbarDisableButton = app.theme !== 'aurora';
  34909. }
  34910. // Extend defaults with modules params
  34911. ac.useModulesParams(defaults);
  34912. ac.params = Utils.extend(defaults, params);
  34913. var $openerEl;
  34914. if (ac.params.openerEl) {
  34915. $openerEl = $(ac.params.openerEl);
  34916. if ($openerEl.length) { $openerEl[0].f7Autocomplete = ac; }
  34917. }
  34918. var $inputEl;
  34919. if (ac.params.inputEl) {
  34920. $inputEl = $(ac.params.inputEl);
  34921. if ($inputEl.length) { $inputEl[0].f7Autocomplete = ac; }
  34922. }
  34923. var id = Utils.id();
  34924. var url = params.url;
  34925. if (!url && $openerEl && $openerEl.length) {
  34926. if ($openerEl.attr('href')) { url = $openerEl.attr('href'); }
  34927. else if ($openerEl.find('a').length > 0) {
  34928. url = $openerEl.find('a').attr('href');
  34929. }
  34930. }
  34931. if (!url || url === '#' || url === '') { url = ac.params.url; }
  34932. var inputType = ac.params.multiple ? 'checkbox' : 'radio';
  34933. Utils.extend(ac, {
  34934. $openerEl: $openerEl,
  34935. openerEl: $openerEl && $openerEl[0],
  34936. $inputEl: $inputEl,
  34937. inputEl: $inputEl && $inputEl[0],
  34938. id: id,
  34939. url: url,
  34940. value: ac.params.value || [],
  34941. inputType: inputType,
  34942. inputName: (inputType + "-" + id),
  34943. $modalEl: undefined,
  34944. $dropdownEl: undefined,
  34945. });
  34946. var previousQuery = '';
  34947. function onInputChange() {
  34948. var query = ac.$inputEl.val().trim();
  34949. if (!ac.params.source) { return; }
  34950. ac.params.source.call(ac, query, function (items) {
  34951. var itemsHTML = '';
  34952. var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
  34953. ac.items = items;
  34954. var regExp;
  34955. if (ac.params.highlightMatches) {
  34956. query = query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
  34957. regExp = new RegExp(("(" + query + ")"), 'i');
  34958. }
  34959. var firstValue;
  34960. var firstItem;
  34961. for (var i = 0; i < limit; i += 1) {
  34962. var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
  34963. var itemText = typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i];
  34964. if (i === 0) {
  34965. firstValue = itemValue;
  34966. firstItem = ac.items[i];
  34967. }
  34968. itemsHTML += ac.renderItem({
  34969. value: itemValue,
  34970. text: ac.params.highlightMatches ? itemText.replace(regExp, '<b>$1</b>') : itemText,
  34971. }, i);
  34972. }
  34973. if (itemsHTML === '' && query === '' && ac.params.dropdownPlaceholderText) {
  34974. itemsHTML += ac.renderItem({
  34975. placeholder: true,
  34976. text: ac.params.dropdownPlaceholderText,
  34977. });
  34978. }
  34979. ac.$dropdownEl.find('ul').html(itemsHTML);
  34980. if (ac.params.typeahead) {
  34981. if (!firstValue || !firstItem) {
  34982. return;
  34983. }
  34984. if (firstValue.toLowerCase().indexOf(query.toLowerCase()) !== 0) {
  34985. return;
  34986. }
  34987. if (previousQuery.toLowerCase() === query.toLowerCase()) {
  34988. ac.value = [];
  34989. return;
  34990. }
  34991. if (previousQuery.toLowerCase().indexOf(query.toLowerCase()) === 0) {
  34992. previousQuery = query;
  34993. ac.value = [];
  34994. return;
  34995. }
  34996. $inputEl.val(firstValue);
  34997. $inputEl[0].setSelectionRange(query.length, firstValue.length);
  34998. var previousValue = typeof ac.value[0] === 'object' ? ac.value[0][ac.params.valueProperty] : ac.value[0];
  34999. if (!previousValue || firstValue.toLowerCase() !== previousValue.toLowerCase()) {
  35000. ac.value = [firstItem];
  35001. ac.emit('local::change autocompleteChange', [firstItem]);
  35002. }
  35003. }
  35004. previousQuery = query;
  35005. });
  35006. }
  35007. function onPageInputChange() {
  35008. var input = this;
  35009. var value = input.value;
  35010. var isValues = $(input).parents('.autocomplete-values').length > 0;
  35011. var item;
  35012. var itemValue;
  35013. var aValue;
  35014. if (isValues) {
  35015. if (ac.inputType === 'checkbox' && !input.checked) {
  35016. for (var i = 0; i < ac.value.length; i += 1) {
  35017. aValue = typeof ac.value[i] === 'string' ? ac.value[i] : ac.value[i][ac.params.valueProperty];
  35018. if (aValue === value || aValue * 1 === value * 1) {
  35019. ac.value.splice(i, 1);
  35020. }
  35021. }
  35022. ac.updateValues();
  35023. ac.emit('local::change autocompleteChange', ac.value);
  35024. }
  35025. return;
  35026. }
  35027. // Find Related Item
  35028. for (var i$1 = 0; i$1 < ac.items.length; i$1 += 1) {
  35029. itemValue = typeof ac.items[i$1] === 'object' ? ac.items[i$1][ac.params.valueProperty] : ac.items[i$1];
  35030. if (itemValue === value || itemValue * 1 === value * 1) { item = ac.items[i$1]; }
  35031. }
  35032. if (ac.inputType === 'radio') {
  35033. ac.value = [item];
  35034. } else if (input.checked) {
  35035. ac.value.push(item);
  35036. } else {
  35037. for (var i$2 = 0; i$2 < ac.value.length; i$2 += 1) {
  35038. aValue = typeof ac.value[i$2] === 'object' ? ac.value[i$2][ac.params.valueProperty] : ac.value[i$2];
  35039. if (aValue === value || aValue * 1 === value * 1) {
  35040. ac.value.splice(i$2, 1);
  35041. }
  35042. }
  35043. }
  35044. // Update Values Block
  35045. ac.updateValues();
  35046. // On Select Callback
  35047. if (((ac.inputType === 'radio' && input.checked) || ac.inputType === 'checkbox')) {
  35048. ac.emit('local::change autocompleteChange', ac.value);
  35049. }
  35050. }
  35051. function onHtmlClick(e) {
  35052. var $targetEl = $(e.target);
  35053. if ($targetEl.is(ac.$inputEl[0]) || (ac.$dropdownEl && $targetEl.closest(ac.$dropdownEl[0]).length)) { return; }
  35054. ac.close();
  35055. }
  35056. function onOpenerClick() {
  35057. ac.open();
  35058. }
  35059. function onInputFocus() {
  35060. ac.open();
  35061. }
  35062. function onInputBlur() {
  35063. if (ac.$dropdownEl.find('label.active-state').length > 0) { return; }
  35064. setTimeout(function () {
  35065. ac.close();
  35066. }, 0);
  35067. }
  35068. function onResize() {
  35069. ac.positionDropdown();
  35070. }
  35071. function onKeyDown(e) {
  35072. if (!ac.opened) { return; }
  35073. if (e.keyCode === 27) {
  35074. // ESC
  35075. e.preventDefault();
  35076. ac.$inputEl.blur();
  35077. return;
  35078. }
  35079. if (e.keyCode === 13) {
  35080. // Enter
  35081. var $selectedItemLabel = ac.$dropdownEl.find('.autocomplete-dropdown-selected label');
  35082. if ($selectedItemLabel.length) {
  35083. e.preventDefault();
  35084. $selectedItemLabel.trigger('click');
  35085. ac.$inputEl.blur();
  35086. return;
  35087. }
  35088. if (ac.params.typeahead) {
  35089. e.preventDefault();
  35090. ac.$inputEl.blur();
  35091. }
  35092. return;
  35093. }
  35094. if (e.keyCode !== 40 && e.keyCode !== 38) { return; }
  35095. e.preventDefault();
  35096. var $selectedItem = ac.$dropdownEl.find('.autocomplete-dropdown-selected');
  35097. var $newItem;
  35098. if ($selectedItem.length) {
  35099. $newItem = $selectedItem[e.keyCode === 40 ? 'next' : 'prev']('li');
  35100. if (!$newItem.length) {
  35101. $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
  35102. }
  35103. } else {
  35104. $newItem = ac.$dropdownEl.find('li').eq(e.keyCode === 40 ? 0 : ac.$dropdownEl.find('li').length - 1);
  35105. }
  35106. if ($newItem.hasClass('autocomplete-dropdown-placeholder')) { return; }
  35107. $selectedItem.removeClass('autocomplete-dropdown-selected');
  35108. $newItem.addClass('autocomplete-dropdown-selected');
  35109. }
  35110. function onDropdownClick() {
  35111. var $clickedEl = $(this);
  35112. var clickedItem;
  35113. for (var i = 0; i < ac.items.length; i += 1) {
  35114. var itemValue = typeof ac.items[i] === 'object' ? ac.items[i][ac.params.valueProperty] : ac.items[i];
  35115. var value = $clickedEl.attr('data-value');
  35116. if (itemValue === value || itemValue * 1 === value * 1) {
  35117. clickedItem = ac.items[i];
  35118. }
  35119. }
  35120. if (ac.params.updateInputValueOnSelect) {
  35121. ac.$inputEl.val(typeof clickedItem === 'object' ? clickedItem[ac.params.valueProperty] : clickedItem);
  35122. ac.$inputEl.trigger('input change');
  35123. }
  35124. ac.value = [clickedItem];
  35125. ac.emit('local::change autocompleteChange', [clickedItem]);
  35126. ac.close();
  35127. }
  35128. ac.attachEvents = function attachEvents() {
  35129. if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
  35130. ac.$openerEl.on('click', onOpenerClick);
  35131. }
  35132. if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
  35133. ac.$inputEl.on('focus', onInputFocus);
  35134. ac.$inputEl.on(ac.params.inputEvents, onInputChange);
  35135. if (app.device.android) {
  35136. $('html').on('click', onHtmlClick);
  35137. } else {
  35138. ac.$inputEl.on('blur', onInputBlur);
  35139. }
  35140. ac.$inputEl.on('keydown', onKeyDown);
  35141. }
  35142. };
  35143. ac.detachEvents = function attachEvents() {
  35144. if (ac.params.openIn !== 'dropdown' && ac.$openerEl) {
  35145. ac.$openerEl.off('click', onOpenerClick);
  35146. }
  35147. if (ac.params.openIn === 'dropdown' && ac.$inputEl) {
  35148. ac.$inputEl.off('focus', onInputFocus);
  35149. ac.$inputEl.off(ac.params.inputEvents, onInputChange);
  35150. if (app.device.android) {
  35151. $('html').off('click', onHtmlClick);
  35152. } else {
  35153. ac.$inputEl.off('blur', onInputBlur);
  35154. }
  35155. ac.$inputEl.off('keydown', onKeyDown);
  35156. }
  35157. };
  35158. ac.attachDropdownEvents = function attachDropdownEvents() {
  35159. ac.$dropdownEl.on('click', 'label', onDropdownClick);
  35160. app.on('resize', onResize);
  35161. };
  35162. ac.detachDropdownEvents = function detachDropdownEvents() {
  35163. ac.$dropdownEl.off('click', 'label', onDropdownClick);
  35164. app.off('resize', onResize);
  35165. };
  35166. ac.attachPageEvents = function attachPageEvents() {
  35167. ac.$el.on('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
  35168. if (ac.params.closeOnSelect && !ac.params.multiple) {
  35169. ac.$el.once('click', '.list label', function () {
  35170. Utils.nextTick(function () {
  35171. ac.close();
  35172. });
  35173. });
  35174. }
  35175. };
  35176. ac.detachPageEvents = function detachPageEvents() {
  35177. ac.$el.off('change', 'input[type="radio"], input[type="checkbox"]', onPageInputChange);
  35178. };
  35179. // Install Modules
  35180. ac.useModules();
  35181. // Init
  35182. ac.init();
  35183. return ac;
  35184. }
  35185. if ( Framework7Class ) Autocomplete.__proto__ = Framework7Class;
  35186. Autocomplete.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  35187. Autocomplete.prototype.constructor = Autocomplete;
  35188. var prototypeAccessors = { view: { configurable: true } };
  35189. prototypeAccessors.view.get = function () {
  35190. var ac = this;
  35191. var $openerEl = ac.$openerEl;
  35192. var $inputEl = ac.$inputEl;
  35193. var app = ac.app;
  35194. var view;
  35195. if (ac.params.view) {
  35196. view = ac.params.view;
  35197. } else if ($openerEl || $inputEl) {
  35198. var $el = $openerEl || $inputEl;
  35199. view = $el.closest('.view').length && $el.closest('.view')[0].f7View;
  35200. }
  35201. if (!view) { view = app.views.main; }
  35202. return view;
  35203. };
  35204. Autocomplete.prototype.positionDropdown = function positionDropdown () {
  35205. var obj;
  35206. var ac = this;
  35207. var $inputEl = ac.$inputEl;
  35208. var app = ac.app;
  35209. var $dropdownEl = ac.$dropdownEl;
  35210. var $pageContentEl = $inputEl.parents('.page-content');
  35211. if ($pageContentEl.length === 0) { return; }
  35212. var inputOffset = $inputEl.offset();
  35213. var inputOffsetWidth = $inputEl[0].offsetWidth;
  35214. var inputOffsetHeight = $inputEl[0].offsetHeight;
  35215. var $listEl = $inputEl.parents('.list');
  35216. var $listParent;
  35217. $listEl.parents().each(function (index, parentEl) {
  35218. if ($listParent) { return; }
  35219. var $parentEl = $(parentEl);
  35220. if ($parentEl.parent($pageContentEl).length) { $listParent = $parentEl; }
  35221. });
  35222. var listOffset = $listEl.offset();
  35223. var paddingBottom = parseInt($pageContentEl.css('padding-bottom'), 10);
  35224. var listOffsetLeft = $listEl.length > 0 ? listOffset.left - $pageContentEl.offset().left : 0;
  35225. var inputOffsetLeft = inputOffset.left - ($listEl.length > 0 ? listOffset.left : 0) - (app.rtl ? 0 : 0);
  35226. var inputOffsetTop = inputOffset.top - ($pageContentEl.offset().top - $pageContentEl[0].scrollTop);
  35227. var maxHeight = $pageContentEl[0].scrollHeight - paddingBottom - (inputOffsetTop + $pageContentEl[0].scrollTop) - $inputEl[0].offsetHeight;
  35228. var paddingProp = app.rtl ? 'padding-right' : 'padding-left';
  35229. var paddingValue;
  35230. if ($listEl.length && !ac.params.expandInput) {
  35231. paddingValue = (app.rtl ? $listEl[0].offsetWidth - inputOffsetLeft - inputOffsetWidth : inputOffsetLeft) - (app.theme === 'md' ? 16 : 15);
  35232. }
  35233. $dropdownEl.css({
  35234. left: (($listEl.length > 0 ? listOffsetLeft : inputOffsetLeft) + "px"),
  35235. top: ((inputOffsetTop + $pageContentEl[0].scrollTop + inputOffsetHeight) + "px"),
  35236. width: (($listEl.length > 0 ? $listEl[0].offsetWidth : inputOffsetWidth) + "px"),
  35237. });
  35238. $dropdownEl.children('.autocomplete-dropdown-inner').css(( obj = {
  35239. maxHeight: (maxHeight + "px")
  35240. }, obj[paddingProp] = $listEl.length > 0 && !ac.params.expandInput ? (paddingValue + "px") : '', obj ));
  35241. };
  35242. Autocomplete.prototype.focus = function focus () {
  35243. var ac = this;
  35244. ac.$el.find('input[type=search]').focus();
  35245. };
  35246. Autocomplete.prototype.source = function source (query) {
  35247. var ac = this;
  35248. if (!ac.params.source) { return; }
  35249. var $el = ac.$el;
  35250. ac.params.source.call(ac, query, function (items) {
  35251. var itemsHTML = '';
  35252. var limit = ac.params.limit ? Math.min(ac.params.limit, items.length) : items.length;
  35253. ac.items = items;
  35254. for (var i = 0; i < limit; i += 1) {
  35255. var selected = false;
  35256. var itemValue = typeof items[i] === 'object' ? items[i][ac.params.valueProperty] : items[i];
  35257. for (var j = 0; j < ac.value.length; j += 1) {
  35258. var aValue = typeof ac.value[j] === 'object' ? ac.value[j][ac.params.valueProperty] : ac.value[j];
  35259. if (aValue === itemValue || aValue * 1 === itemValue * 1) { selected = true; }
  35260. }
  35261. itemsHTML += ac.renderItem({
  35262. value: itemValue,
  35263. text: typeof items[i] === 'object' ? items[i][ac.params.textProperty] : items[i],
  35264. inputType: ac.inputType,
  35265. id: ac.id,
  35266. inputName: ac.inputName,
  35267. selected: selected,
  35268. }, i);
  35269. }
  35270. $el.find('.autocomplete-found ul').html(itemsHTML);
  35271. if (items.length === 0) {
  35272. if (query.length !== 0) {
  35273. $el.find('.autocomplete-not-found').show();
  35274. $el.find('.autocomplete-found, .autocomplete-values').hide();
  35275. } else {
  35276. $el.find('.autocomplete-values').show();
  35277. $el.find('.autocomplete-found, .autocomplete-not-found').hide();
  35278. }
  35279. } else {
  35280. $el.find('.autocomplete-found').show();
  35281. $el.find('.autocomplete-not-found, .autocomplete-values').hide();
  35282. }
  35283. });
  35284. };
  35285. Autocomplete.prototype.updateValues = function updateValues () {
  35286. var ac = this;
  35287. var valuesHTML = '';
  35288. for (var i = 0; i < ac.value.length; i += 1) {
  35289. valuesHTML += ac.renderItem({
  35290. value: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.valueProperty] : ac.value[i],
  35291. text: typeof ac.value[i] === 'object' ? ac.value[i][ac.params.textProperty] : ac.value[i],
  35292. inputType: ac.inputType,
  35293. id: ac.id,
  35294. inputName: ((ac.inputName) + "-checked}"),
  35295. selected: true,
  35296. }, i);
  35297. }
  35298. ac.$el.find('.autocomplete-values ul').html(valuesHTML);
  35299. };
  35300. Autocomplete.prototype.preloaderHide = function preloaderHide () {
  35301. var ac = this;
  35302. if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
  35303. ac.$dropdownEl.find('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
  35304. } else {
  35305. $('.autocomplete-preloader').removeClass('autocomplete-preloader-visible');
  35306. }
  35307. };
  35308. Autocomplete.prototype.preloaderShow = function preloaderShow () {
  35309. var ac = this;
  35310. if (ac.params.openIn === 'dropdown' && ac.$dropdownEl) {
  35311. ac.$dropdownEl.find('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
  35312. } else {
  35313. $('.autocomplete-preloader').addClass('autocomplete-preloader-visible');
  35314. }
  35315. };
  35316. Autocomplete.prototype.renderPreloader = function renderPreloader () {
  35317. var ac = this;
  35318. return ("\n <div class=\"autocomplete-preloader preloader " + (ac.params.preloaderColor ? ("color-" + (ac.params.preloaderColor)) : '') + "\">" + (Utils[((ac.app.theme) + "PreloaderContent")] || '') + "</div>\n ").trim();
  35319. };
  35320. Autocomplete.prototype.renderSearchbar = function renderSearchbar () {
  35321. var ac = this;
  35322. if (ac.params.renderSearchbar) { return ac.params.renderSearchbar.call(ac); }
  35323. var searchbarHTML = ("\n <form class=\"searchbar\">\n <div class=\"searchbar-inner\">\n <div class=\"searchbar-input-wrap\">\n <input type=\"search\" spellcheck=\"" + (ac.params.searchbarSpellcheck || 'false') + "\" placeholder=\"" + (ac.params.searchbarPlaceholder) + "\"/>\n <i class=\"searchbar-icon\"></i>\n <span class=\"input-clear-button\"></span>\n </div>\n " + (ac.params.searchbarDisableButton ? ("\n <span class=\"searchbar-disable-button\">" + (ac.params.searchbarDisableText) + "</span>\n ") : '') + "\n </div>\n </form>\n ").trim();
  35324. return searchbarHTML;
  35325. };
  35326. Autocomplete.prototype.renderItem = function renderItem (item, index) {
  35327. var ac = this;
  35328. if (ac.params.renderItem) { return ac.params.renderItem.call(ac, item, index); }
  35329. var itemHtml;
  35330. var itemValue = item.value && typeof item.value === 'string' ? item.value.replace(/"/g, '&quot;') : item.value;
  35331. if (ac.params.openIn !== 'dropdown') {
  35332. itemHtml = "\n <li>\n <label class=\"item-" + (item.inputType) + " item-content\">\n <input type=\"" + (item.inputType) + "\" name=\"" + (item.inputName) + "\" value=\"" + itemValue + "\" " + (item.selected ? 'checked' : '') + ">\n <i class=\"icon icon-" + (item.inputType) + "\"></i>\n <div class=\"item-inner\">\n <div class=\"item-title\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
  35333. } else if (!item.placeholder) {
  35334. // Dropdown
  35335. itemHtml = "\n <li>\n <label class=\"item-radio item-content\" data-value=\"" + itemValue + "\">\n <div class=\"item-inner\">\n <div class=\"item-title\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
  35336. } else {
  35337. // Dropwdown placeholder
  35338. itemHtml = "\n <li class=\"autocomplete-dropdown-placeholder\">\n <label class=\"item-content\">\n <div class=\"item-inner\">\n <div class=\"item-title\">" + (item.text) + "</div>\n </div>\n </label>\n </li>\n ";
  35339. }
  35340. return itemHtml.trim();
  35341. };
  35342. Autocomplete.prototype.renderNavbar = function renderNavbar () {
  35343. var ac = this;
  35344. if (ac.params.renderNavbar) { return ac.params.renderNavbar.call(ac); }
  35345. var pageTitle = ac.params.pageTitle;
  35346. if (typeof pageTitle === 'undefined' && ac.$openerEl && ac.$openerEl.length) {
  35347. pageTitle = ac.$openerEl.find('.item-title').text().trim();
  35348. }
  35349. var inPopup = ac.params.openIn === 'popup';
  35350. var navbarLeft = inPopup
  35351. ? ("\n " + (ac.params.preloader ? ("\n <div class=\"left\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n ")
  35352. : ("\n <div class=\"left sliding\">\n <a class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"if-not-md\">" + (ac.params.pageBackLinkText) + "</span>\n </a>\n </div>\n ");
  35353. var navbarRight = inPopup
  35354. ? ("\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".autocomplete-popup\">\n " + (ac.params.popupCloseLinkText) + "\n </a>\n </div>\n ")
  35355. : ("\n " + (ac.params.preloader ? ("\n <div class=\"right\">\n " + (ac.renderPreloader()) + "\n </div>\n ") : '') + "\n ");
  35356. var navbarHtml = ("\n <div class=\"navbar " + (ac.params.navbarColorTheme ? ("color-" + (ac.params.navbarColorTheme)) : '') + "\">\n <div class=\"navbar-bg\"></div>\n <div class=\"navbar-inner " + (ac.params.navbarColorTheme ? ("color-" + (ac.params.navbarColorTheme)) : '') + "\">\n " + navbarLeft + "\n " + (pageTitle ? ("<div class=\"title sliding\">" + pageTitle + "</div>") : '') + "\n " + navbarRight + "\n <div class=\"subnavbar sliding\">" + (ac.renderSearchbar()) + "</div>\n </div>\n </div>\n ").trim();
  35357. return navbarHtml;
  35358. };
  35359. Autocomplete.prototype.renderDropdown = function renderDropdown () {
  35360. var ac = this;
  35361. if (ac.params.renderDropdown) { return ac.params.renderDropdown.call(ac, ac.items); }
  35362. var dropdownHtml = ("\n <div class=\"autocomplete-dropdown\">\n <div class=\"autocomplete-dropdown-inner\">\n <div class=\"list " + (!ac.params.expandInput ? 'no-safe-areas' : '') + "\">\n <ul></ul>\n </div>\n </div>\n " + (ac.params.preloader ? ac.renderPreloader() : '') + "\n </div>\n ").trim();
  35363. return dropdownHtml;
  35364. };
  35365. Autocomplete.prototype.renderPage = function renderPage (inPopup) {
  35366. var ac = this;
  35367. if (ac.params.renderPage) { return ac.params.renderPage.call(ac, ac.items); }
  35368. var pageHtml = ("\n <div class=\"page page-with-subnavbar autocomplete-page\" data-name=\"autocomplete-page\">\n " + (ac.renderNavbar(inPopup)) + "\n <div class=\"searchbar-backdrop\"></div>\n <div class=\"page-content\">\n <div class=\"list autocomplete-list autocomplete-found autocomplete-list-" + (ac.id) + " " + (ac.params.formColorTheme ? ("color-" + (ac.params.formColorTheme)) : '') + "\">\n <ul></ul>\n </div>\n <div class=\"list autocomplete-not-found\">\n <ul>\n <li class=\"item-content\"><div class=\"item-inner\"><div class=\"item-title\">" + (ac.params.notFoundText) + "</div></div></li>\n </ul>\n </div>\n <div class=\"list autocomplete-values\">\n <ul></ul>\n </div>\n </div>\n </div>\n ").trim();
  35369. return pageHtml;
  35370. };
  35371. Autocomplete.prototype.renderPopup = function renderPopup () {
  35372. var ac = this;
  35373. if (ac.params.renderPopup) { return ac.params.renderPopup.call(ac, ac.items); }
  35374. var popupHtml = ("\n <div class=\"popup autocomplete-popup\">\n <div class=\"view\">\n " + (ac.renderPage(true)) + ";\n </div>\n </div>\n ").trim();
  35375. return popupHtml;
  35376. };
  35377. Autocomplete.prototype.onOpen = function onOpen (type, el) {
  35378. var ac = this;
  35379. var app = ac.app;
  35380. var $el = $(el);
  35381. ac.$el = $el;
  35382. ac.el = $el[0];
  35383. ac.openedIn = type;
  35384. ac.opened = true;
  35385. if (ac.params.openIn === 'dropdown') {
  35386. ac.attachDropdownEvents();
  35387. ac.$dropdownEl.addClass('autocomplete-dropdown-in');
  35388. ac.$inputEl.trigger('input');
  35389. } else {
  35390. // Init SB
  35391. var $searchbarEl = $el.find('.searchbar');
  35392. if (ac.params.openIn === 'page' && app.theme === 'ios' && $searchbarEl.length === 0) {
  35393. $searchbarEl = $(app.navbar.getElByPage($el)).find('.searchbar');
  35394. }
  35395. ac.searchbar = app.searchbar.create({
  35396. el: $searchbarEl,
  35397. backdropEl: $el.find('.searchbar-backdrop'),
  35398. customSearch: true,
  35399. on: {
  35400. search: function search(sb, query) {
  35401. if (query.length === 0 && ac.searchbar.enabled) {
  35402. ac.searchbar.backdropShow();
  35403. } else {
  35404. ac.searchbar.backdropHide();
  35405. }
  35406. ac.source(query);
  35407. },
  35408. },
  35409. });
  35410. // Attach page events
  35411. ac.attachPageEvents();
  35412. // Update Values On Page Init
  35413. ac.updateValues();
  35414. // Source on load
  35415. if (ac.params.requestSourceOnOpen) { ac.source(''); }
  35416. }
  35417. ac.emit('local::open autocompleteOpen', ac);
  35418. };
  35419. Autocomplete.prototype.autoFocus = function autoFocus () {
  35420. var ac = this;
  35421. if (ac.searchbar && ac.searchbar.$inputEl) {
  35422. ac.searchbar.$inputEl.focus();
  35423. }
  35424. return ac;
  35425. };
  35426. Autocomplete.prototype.onOpened = function onOpened () {
  35427. var ac = this;
  35428. if (ac.params.openIn !== 'dropdown' && ac.params.autoFocus) {
  35429. ac.autoFocus();
  35430. }
  35431. ac.emit('local::opened autocompleteOpened', ac);
  35432. };
  35433. Autocomplete.prototype.onClose = function onClose () {
  35434. var ac = this;
  35435. if (ac.destroyed) { return; }
  35436. // Destroy SB
  35437. if (ac.searchbar && ac.searchbar.destroy) {
  35438. ac.searchbar.destroy();
  35439. ac.searchbar = null;
  35440. delete ac.searchbar;
  35441. }
  35442. if (ac.params.openIn === 'dropdown') {
  35443. ac.detachDropdownEvents();
  35444. ac.$dropdownEl.removeClass('autocomplete-dropdown-in').remove();
  35445. ac.$inputEl.parents('.item-content-dropdown-expanded').removeClass('item-content-dropdown-expanded');
  35446. } else {
  35447. ac.detachPageEvents();
  35448. }
  35449. ac.emit('local::close autocompleteClose', ac);
  35450. };
  35451. Autocomplete.prototype.onClosed = function onClosed () {
  35452. var ac = this;
  35453. if (ac.destroyed) { return; }
  35454. ac.opened = false;
  35455. ac.$el = null;
  35456. ac.el = null;
  35457. delete ac.$el;
  35458. delete ac.el;
  35459. ac.emit('local::closed autocompleteClosed', ac);
  35460. };
  35461. Autocomplete.prototype.openPage = function openPage () {
  35462. var ac = this;
  35463. if (ac.opened) { return ac; }
  35464. var pageHtml = ac.renderPage();
  35465. ac.view.router.navigate({
  35466. url: ac.url,
  35467. route: {
  35468. content: pageHtml,
  35469. path: ac.url,
  35470. on: {
  35471. pageBeforeIn: function pageBeforeIn(e, page) {
  35472. ac.onOpen('page', page.el);
  35473. },
  35474. pageAfterIn: function pageAfterIn(e, page) {
  35475. ac.onOpened('page', page.el);
  35476. },
  35477. pageBeforeOut: function pageBeforeOut(e, page) {
  35478. ac.onClose('page', page.el);
  35479. },
  35480. pageAfterOut: function pageAfterOut(e, page) {
  35481. ac.onClosed('page', page.el);
  35482. },
  35483. },
  35484. options: {
  35485. animate: ac.params.animate,
  35486. },
  35487. },
  35488. });
  35489. return ac;
  35490. };
  35491. Autocomplete.prototype.openPopup = function openPopup () {
  35492. var ac = this;
  35493. if (ac.opened) { return ac; }
  35494. var popupHtml = ac.renderPopup();
  35495. var popupParams = {
  35496. content: popupHtml,
  35497. animate: ac.params.animate,
  35498. push: ac.params.popupPush,
  35499. swipeToClose: ac.params.popupSwipeToClose,
  35500. on: {
  35501. popupOpen: function popupOpen(popup) {
  35502. ac.onOpen('popup', popup.el);
  35503. },
  35504. popupOpened: function popupOpened(popup) {
  35505. ac.onOpened('popup', popup.el);
  35506. },
  35507. popupClose: function popupClose(popup) {
  35508. ac.onClose('popup', popup.el);
  35509. },
  35510. popupClosed: function popupClosed(popup) {
  35511. ac.onClosed('popup', popup.el);
  35512. },
  35513. },
  35514. };
  35515. if (ac.params.routableModals && ac.view) {
  35516. ac.view.router.navigate({
  35517. url: ac.url,
  35518. route: {
  35519. path: ac.url,
  35520. popup: popupParams,
  35521. },
  35522. });
  35523. } else {
  35524. ac.modal = ac.app.popup.create(popupParams).open(ac.params.animate);
  35525. }
  35526. return ac;
  35527. };
  35528. Autocomplete.prototype.openDropdown = function openDropdown () {
  35529. var ac = this;
  35530. if (!ac.$dropdownEl) {
  35531. ac.$dropdownEl = $(ac.renderDropdown());
  35532. }
  35533. var $listEl = ac.$inputEl.parents('.list');
  35534. if ($listEl.length && ac.$inputEl.parents('.item-content').length > 0 && ac.params.expandInput) {
  35535. ac.$inputEl.parents('.item-content').addClass('item-content-dropdown-expanded');
  35536. }
  35537. var $pageContentEl = ac.$inputEl.parents('.page-content');
  35538. if (ac.params.dropdownContainerEl) {
  35539. $(ac.params.dropdownContainerEl).append(ac.$dropdownEl);
  35540. } else if ($pageContentEl.length === 0) {
  35541. ac.$dropdownEl.insertAfter(ac.$inputEl);
  35542. } else {
  35543. ac.positionDropdown();
  35544. $pageContentEl.append(ac.$dropdownEl);
  35545. }
  35546. ac.onOpen('dropdown', ac.$dropdownEl);
  35547. ac.onOpened('dropdown', ac.$dropdownEl);
  35548. };
  35549. Autocomplete.prototype.open = function open () {
  35550. var ac = this;
  35551. if (ac.opened) { return ac; }
  35552. var openIn = ac.params.openIn;
  35553. ac[("open" + (openIn.split('').map(function (el, index) {
  35554. if (index === 0) { return el.toUpperCase(); }
  35555. return el;
  35556. }).join('')))]();
  35557. return ac;
  35558. };
  35559. Autocomplete.prototype.close = function close () {
  35560. var ac = this;
  35561. if (!ac.opened) { return ac; }
  35562. if (ac.params.openIn === 'dropdown') {
  35563. ac.onClose();
  35564. ac.onClosed();
  35565. } else if ((ac.params.routableModals && ac.view) || ac.openedIn === 'page') {
  35566. ac.view.router.back({ animate: ac.params.animate });
  35567. } else {
  35568. ac.modal.once('modalClosed', function () {
  35569. Utils.nextTick(function () {
  35570. if (ac.destroyed) { return; }
  35571. ac.modal.destroy();
  35572. delete ac.modal;
  35573. });
  35574. });
  35575. ac.modal.close();
  35576. }
  35577. return ac;
  35578. };
  35579. Autocomplete.prototype.init = function init () {
  35580. var ac = this;
  35581. ac.attachEvents();
  35582. };
  35583. Autocomplete.prototype.destroy = function destroy () {
  35584. var ac = this;
  35585. ac.emit('local::beforeDestroy autocompleteBeforeDestroy', ac);
  35586. ac.detachEvents();
  35587. if (ac.$inputEl && ac.$inputEl[0]) {
  35588. delete ac.$inputEl[0].f7Autocomplete;
  35589. }
  35590. if (ac.$openerEl && ac.$openerEl[0]) {
  35591. delete ac.$openerEl[0].f7Autocomplete;
  35592. }
  35593. Utils.deleteProps(ac);
  35594. ac.destroyed = true;
  35595. };
  35596. Object.defineProperties( Autocomplete.prototype, prototypeAccessors );
  35597. return Autocomplete;
  35598. }(Framework7Class));
  35599. var Autocomplete$1 = {
  35600. name: 'autocomplete',
  35601. params: {
  35602. autocomplete: {
  35603. openerEl: undefined,
  35604. inputEl: undefined,
  35605. view: undefined,
  35606. // DropDown
  35607. dropdownContainerEl: undefined,
  35608. dropdownPlaceholderText: undefined,
  35609. typeahead: false,
  35610. highlightMatches: true,
  35611. expandInput: false,
  35612. updateInputValueOnSelect: true,
  35613. inputEvents: 'input',
  35614. value: undefined,
  35615. multiple: false,
  35616. source: undefined,
  35617. limit: undefined,
  35618. valueProperty: 'id',
  35619. textProperty: 'text',
  35620. openIn: 'page', // or 'popup' or 'dropdown'
  35621. pageBackLinkText: 'Back',
  35622. popupCloseLinkText: 'Close',
  35623. pageTitle: undefined,
  35624. searchbarPlaceholder: 'Search...',
  35625. searchbarDisableText: 'Cancel',
  35626. searchbarDisableButton: undefined,
  35627. searchbarSpellcheck: false,
  35628. popupPush: false,
  35629. popupSwipeToClose: undefined,
  35630. animate: true,
  35631. autoFocus: false,
  35632. closeOnSelect: false,
  35633. notFoundText: 'Nothing found',
  35634. requestSourceOnOpen: false,
  35635. // Preloader
  35636. preloaderColor: undefined,
  35637. preloader: false,
  35638. // Colors
  35639. formColorTheme: undefined,
  35640. navbarColorTheme: undefined,
  35641. // Routing
  35642. routableModals: true,
  35643. url: 'select/',
  35644. // Custom render functions
  35645. renderDropdown: undefined,
  35646. renderPage: undefined,
  35647. renderPopup: undefined,
  35648. renderItem: undefined,
  35649. renderSearchbar: undefined,
  35650. renderNavbar: undefined,
  35651. },
  35652. },
  35653. static: {
  35654. Autocomplete: Autocomplete,
  35655. },
  35656. create: function create() {
  35657. var app = this;
  35658. app.autocomplete = Utils.extend(
  35659. ConstructorMethods({
  35660. defaultSelector: undefined,
  35661. constructor: Autocomplete,
  35662. app: app,
  35663. domProp: 'f7Autocomplete',
  35664. }),
  35665. {
  35666. open: function open(autocompleteEl) {
  35667. var ac = app.autocomplete.get(autocompleteEl);
  35668. if (ac && ac.open) { return ac.open(); }
  35669. return undefined;
  35670. },
  35671. close: function close(autocompleteEl) {
  35672. var ac = app.autocomplete.get(autocompleteEl);
  35673. if (ac && ac.close) { return ac.close(); }
  35674. return undefined;
  35675. },
  35676. }
  35677. );
  35678. },
  35679. };
  35680. var Tooltip = /*@__PURE__*/(function (Framework7Class) {
  35681. function Tooltip(app, params) {
  35682. if ( params === void 0 ) params = {};
  35683. Framework7Class.call(this, params, [app]);
  35684. var tooltip = this;
  35685. var defaults = Utils.extend({}, app.params.tooltip);
  35686. // Extend defaults with modules params
  35687. tooltip.useModulesParams(defaults);
  35688. tooltip.params = Utils.extend(defaults, params);
  35689. if (typeof params.offset === 'undefined' && Support.touch && tooltip.params.trigger === 'hover') {
  35690. tooltip.params.offset = 10;
  35691. }
  35692. var ref = tooltip.params;
  35693. var targetEl = ref.targetEl;
  35694. if (!targetEl) { return tooltip; }
  35695. var $targetEl = $(targetEl);
  35696. if ($targetEl.length === 0) { return tooltip; }
  35697. if ($targetEl[0].f7Tooltip) { return $targetEl[0].f7Tooltip; }
  35698. var $el = $(tooltip.render()).eq(0);
  35699. Utils.extend(tooltip, {
  35700. app: app,
  35701. $targetEl: $targetEl,
  35702. targetEl: $targetEl && $targetEl[0],
  35703. $el: $el,
  35704. el: $el && $el[0],
  35705. text: tooltip.params.text || '',
  35706. visible: false,
  35707. opened: false,
  35708. });
  35709. $targetEl[0].f7Tooltip = tooltip;
  35710. var touchesStart = {};
  35711. var isTouched;
  35712. function handleClick() {
  35713. if (tooltip.opened) { tooltip.hide(); }
  35714. else { tooltip.show(this); }
  35715. }
  35716. function handleClickOut(e) {
  35717. if (tooltip.opened && (
  35718. $(e.target).closest($targetEl).length
  35719. || $(e.target).closest(tooltip.$el).length
  35720. )) { return; }
  35721. tooltip.hide();
  35722. }
  35723. function handleTouchStart(e) {
  35724. if (isTouched) { return; }
  35725. isTouched = true;
  35726. touchesStart.x = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  35727. touchesStart.y = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  35728. tooltip.show(this);
  35729. }
  35730. function handleTouchMove(e) {
  35731. if (!isTouched) { return; }
  35732. var x = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  35733. var y = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  35734. var distance = Math.pow( (
  35735. (Math.pow( (x - touchesStart.x), 2 ))
  35736. + (Math.pow( (y - touchesStart.y), 2 ))
  35737. ), 0.5 );
  35738. if (distance > 50) {
  35739. isTouched = false;
  35740. tooltip.hide();
  35741. }
  35742. }
  35743. function handleTouchEnd() {
  35744. if (!isTouched) { return; }
  35745. isTouched = false;
  35746. tooltip.hide();
  35747. }
  35748. function handleMouseEnter() {
  35749. tooltip.show(this);
  35750. }
  35751. function handleMouseLeave() {
  35752. tooltip.hide();
  35753. }
  35754. function handleTransitionEnd() {
  35755. if (!$el.hasClass('tooltip-in')) {
  35756. $el.removeClass('tooltip-out').remove();
  35757. }
  35758. }
  35759. tooltip.attachEvents = function attachEvents() {
  35760. $el.on('transitionend', handleTransitionEnd);
  35761. if (tooltip.params.trigger === 'click') {
  35762. $targetEl.on('click', handleClick);
  35763. $('html').on('click', handleClickOut);
  35764. return;
  35765. }
  35766. if (Support.touch) {
  35767. var passive = Support.passiveListener ? { passive: true } : false;
  35768. $targetEl.on(app.touchEvents.start, handleTouchStart, passive);
  35769. app.on('touchmove', handleTouchMove);
  35770. app.on('touchend:passive', handleTouchEnd);
  35771. } else {
  35772. $targetEl.on((Support.pointerEvents ? 'pointerenter' : 'mouseenter'), handleMouseEnter);
  35773. $targetEl.on((Support.pointerEvents ? 'pointerleave' : 'mouseleave'), handleMouseLeave);
  35774. }
  35775. };
  35776. tooltip.detachEvents = function detachEvents() {
  35777. $el.off('transitionend', handleTransitionEnd);
  35778. if (tooltip.params.trigger === 'click') {
  35779. $targetEl.off('click', handleClick);
  35780. $('html').off('click', handleClickOut);
  35781. return;
  35782. }
  35783. if (Support.touch) {
  35784. var passive = Support.passiveListener ? { passive: true } : false;
  35785. $targetEl.off(app.touchEvents.start, handleTouchStart, passive);
  35786. app.off('touchmove', handleTouchMove);
  35787. app.off('touchend:passive', handleTouchEnd);
  35788. } else {
  35789. $targetEl.off((Support.pointerEvents ? 'pointerenter' : 'mouseenter'), handleMouseEnter);
  35790. $targetEl.off((Support.pointerEvents ? 'pointerleave' : 'mouseleave'), handleMouseLeave);
  35791. }
  35792. };
  35793. // Install Modules
  35794. tooltip.useModules();
  35795. tooltip.init();
  35796. return tooltip;
  35797. }
  35798. if ( Framework7Class ) Tooltip.__proto__ = Framework7Class;
  35799. Tooltip.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  35800. Tooltip.prototype.constructor = Tooltip;
  35801. Tooltip.prototype.position = function position (targetEl) {
  35802. var tooltip = this;
  35803. var $el = tooltip.$el;
  35804. var app = tooltip.app;
  35805. var tooltipOffset = tooltip.params.offset || 0;
  35806. $el.css({ left: '', top: '' });
  35807. var $targetEl = $(targetEl || tooltip.targetEl);
  35808. var ref = [$el.width(), $el.height()];
  35809. var width = ref[0];
  35810. var height = ref[1];
  35811. $el.css({ left: '', top: '' });
  35812. var targetWidth;
  35813. var targetHeight;
  35814. var targetOffsetLeft;
  35815. var targetOffsetTop;
  35816. if ($targetEl && $targetEl.length > 0) {
  35817. targetWidth = $targetEl.outerWidth();
  35818. targetHeight = $targetEl.outerHeight();
  35819. if (typeof targetWidth === 'undefined' && typeof targetHeight === 'undefined') {
  35820. var clientRect = $targetEl[0].getBoundingClientRect();
  35821. targetWidth = clientRect.width;
  35822. targetHeight = clientRect.height;
  35823. }
  35824. var targetOffset = $targetEl.offset();
  35825. targetOffsetLeft = targetOffset.left - app.left;
  35826. targetOffsetTop = targetOffset.top - app.top;
  35827. var targetParentPage = $targetEl.parents('.page');
  35828. if (targetParentPage.length > 0) {
  35829. targetOffsetTop -= targetParentPage[0].scrollTop;
  35830. }
  35831. }
  35832. var ref$1 = [0, 0, 0];
  35833. var left = ref$1[0];
  35834. var top = ref$1[1];
  35835. // Top Position
  35836. var position = 'top';
  35837. if (height + tooltipOffset < targetOffsetTop) {
  35838. // On top
  35839. top = targetOffsetTop - height - tooltipOffset;
  35840. } else if (height < app.height - targetOffsetTop - targetHeight) {
  35841. // On bottom
  35842. position = 'bottom';
  35843. top = targetOffsetTop + targetHeight + tooltipOffset;
  35844. } else {
  35845. // On middle
  35846. position = 'middle';
  35847. top = ((targetHeight / 2) + targetOffsetTop) - (height / 2);
  35848. if (top <= 0) {
  35849. top = 8;
  35850. } else if (top + height >= app.height) {
  35851. top = app.height - height - 8;
  35852. }
  35853. }
  35854. // Horizontal Position
  35855. if (position === 'top' || position === 'bottom') {
  35856. left = ((targetWidth / 2) + targetOffsetLeft) - (width / 2);
  35857. if (left < 8) { left = 8; }
  35858. if (left + width > app.width) { left = app.width - width - 8; }
  35859. if (left < 0) { left = 0; }
  35860. } else if (position === 'middle') {
  35861. left = targetOffsetLeft - width;
  35862. if (left < 8 || (left + width > app.width)) {
  35863. if (left < 8) { left = targetOffsetLeft + targetWidth; }
  35864. if (left + width > app.width) { left = app.width - width - 8; }
  35865. }
  35866. }
  35867. // Apply Styles
  35868. $el.css({ top: (top + "px"), left: (left + "px") });
  35869. };
  35870. Tooltip.prototype.show = function show (aroundEl) {
  35871. var tooltip = this;
  35872. var app = tooltip.app;
  35873. var $el = tooltip.$el;
  35874. var $targetEl = tooltip.$targetEl;
  35875. app.root.append($el);
  35876. tooltip.position(aroundEl);
  35877. var $aroundEl = $(aroundEl);
  35878. tooltip.visible = true;
  35879. tooltip.opened = true;
  35880. $targetEl.trigger('tooltip:show');
  35881. $el.trigger('tooltip:show');
  35882. if ($aroundEl.length && $aroundEl[0] !== $targetEl[0]) {
  35883. $aroundEl.trigger('tooltip:show');
  35884. }
  35885. tooltip.emit('local::show tooltipShow', tooltip);
  35886. $el.removeClass('tooltip-out').addClass('tooltip-in');
  35887. return tooltip;
  35888. };
  35889. Tooltip.prototype.hide = function hide () {
  35890. var tooltip = this;
  35891. var $el = tooltip.$el;
  35892. var $targetEl = tooltip.$targetEl;
  35893. tooltip.visible = false;
  35894. tooltip.opened = false;
  35895. $targetEl.trigger('tooltip:hide');
  35896. $el.trigger('tooltip:hide');
  35897. tooltip.emit('local::hide tooltipHide', tooltip);
  35898. $el.addClass('tooltip-out').removeClass('tooltip-in');
  35899. return tooltip;
  35900. };
  35901. Tooltip.prototype.render = function render () {
  35902. var tooltip = this;
  35903. if (tooltip.params.render) { return tooltip.params.render.call(tooltip, tooltip); }
  35904. var ref = tooltip.params;
  35905. var cssClass = ref.cssClass;
  35906. var text = ref.text;
  35907. return ("\n <div class=\"tooltip " + (cssClass || '') + "\">\n <div class=\"tooltip-content\">" + (text || '') + "</div>\n </div>\n ").trim();
  35908. };
  35909. Tooltip.prototype.setText = function setText (newText) {
  35910. var tooltip = this;
  35911. if (typeof newText === 'undefined') {
  35912. return tooltip;
  35913. }
  35914. tooltip.params.text = newText;
  35915. tooltip.text = newText;
  35916. if (tooltip.$el) {
  35917. tooltip.$el.children('.tooltip-content').html(newText);
  35918. }
  35919. if (tooltip.opened) {
  35920. tooltip.position();
  35921. }
  35922. return tooltip;
  35923. };
  35924. Tooltip.prototype.init = function init () {
  35925. var tooltip = this;
  35926. tooltip.attachEvents();
  35927. };
  35928. Tooltip.prototype.destroy = function destroy () {
  35929. var tooltip = this;
  35930. if (!tooltip.$targetEl || tooltip.destroyed) { return; }
  35931. tooltip.$targetEl.trigger('tooltip:beforedestroy');
  35932. tooltip.emit('local::beforeDestroy tooltipBeforeDestroy', tooltip);
  35933. tooltip.$el.remove();
  35934. delete tooltip.$targetEl[0].f7Tooltip;
  35935. tooltip.detachEvents();
  35936. Utils.deleteProps(tooltip);
  35937. tooltip.destroyed = true;
  35938. };
  35939. return Tooltip;
  35940. }(Framework7Class));
  35941. var Tooltip$1 = {
  35942. name: 'tooltip',
  35943. static: {
  35944. Tooltip: Tooltip,
  35945. },
  35946. create: function create() {
  35947. var app = this;
  35948. app.tooltip = ConstructorMethods({
  35949. defaultSelector: '.tooltip',
  35950. constructor: Tooltip,
  35951. app: app,
  35952. domProp: 'f7Tooltip',
  35953. });
  35954. app.tooltip.show = function show(el) {
  35955. var $el = $(el);
  35956. if ($el.length === 0) { return undefined; }
  35957. var tooltip = $el[0].f7Tooltip;
  35958. if (!tooltip) { return undefined; }
  35959. tooltip.show($el[0]);
  35960. return tooltip;
  35961. };
  35962. app.tooltip.hide = function hide(el) {
  35963. var $el = $(el);
  35964. if ($el.length === 0) { return undefined; }
  35965. var tooltip = $el[0].f7Tooltip;
  35966. if (!tooltip) { return undefined; }
  35967. tooltip.hide();
  35968. return tooltip;
  35969. };
  35970. app.tooltip.setText = function text(el, newText) {
  35971. var $el = $(el);
  35972. if ($el.length === 0) { return undefined; }
  35973. var tooltip = $el[0].f7Tooltip;
  35974. if (!tooltip) { return undefined; }
  35975. tooltip.setText(newText);
  35976. return tooltip;
  35977. };
  35978. },
  35979. params: {
  35980. tooltip: {
  35981. targetEl: null,
  35982. text: null,
  35983. cssClass: null,
  35984. render: null,
  35985. offset: 0,
  35986. trigger: 'hover',
  35987. },
  35988. },
  35989. on: {
  35990. tabMounted: function tabMounted(tabEl) {
  35991. var app = this;
  35992. $(tabEl).find('.tooltip-init').each(function (index, el) {
  35993. var text = $(el).attr('data-tooltip');
  35994. if (!text) { return; }
  35995. app.tooltip.create({ targetEl: el, text: text });
  35996. });
  35997. },
  35998. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  35999. $(tabEl).find('.tooltip-init').each(function (index, el) {
  36000. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  36001. });
  36002. },
  36003. pageInit: function pageInit(page) {
  36004. var app = this;
  36005. page.$el.find('.tooltip-init').each(function (index, el) {
  36006. var text = $(el).attr('data-tooltip');
  36007. if (!text) { return; }
  36008. app.tooltip.create({ targetEl: el, text: text });
  36009. });
  36010. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  36011. page.$navbarEl.find('.tooltip-init').each(function (index, el) {
  36012. var text = $(el).attr('data-tooltip');
  36013. if (!text) { return; }
  36014. app.tooltip.create({ targetEl: el, text: text });
  36015. });
  36016. }
  36017. },
  36018. pageBeforeRemove: function pageBeforeRemove(page) {
  36019. var app = this;
  36020. page.$el.find('.tooltip-init').each(function (index, el) {
  36021. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  36022. });
  36023. if (app.theme === 'ios' && page.view && page.view.router.dynamicNavbar && page.$navbarEl && page.$navbarEl.length > 0) {
  36024. page.$navbarEl.find('.tooltip-init').each(function (index, el) {
  36025. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  36026. });
  36027. }
  36028. },
  36029. },
  36030. vnode: {
  36031. 'tooltip-init': {
  36032. insert: function insert(vnode) {
  36033. var app = this;
  36034. var el = vnode.elm;
  36035. var text = $(el).attr('data-tooltip');
  36036. if (!text) { return; }
  36037. app.tooltip.create({ targetEl: el, text: text });
  36038. },
  36039. update: function update(vnode) {
  36040. var el = vnode.elm;
  36041. if (!el.f7Tooltip) { return; }
  36042. if (vnode && vnode.data && vnode.data.attrs && vnode.data.attrs['data-tooltip']) {
  36043. el.f7Tooltip.setText(vnode.data.attrs['data-tooltip']);
  36044. }
  36045. },
  36046. destroy: function destroy(vnode) {
  36047. var el = vnode.elm;
  36048. if (el.f7Tooltip) { el.f7Tooltip.destroy(); }
  36049. },
  36050. },
  36051. },
  36052. };
  36053. /* eslint no-nested-ternary: off */
  36054. var Gauge = /*@__PURE__*/(function (Framework7Class) {
  36055. function Gauge(app, params) {
  36056. if ( params === void 0 ) params = {};
  36057. // Extends with open/close Modal methods;
  36058. Framework7Class.call(this, params, [app]);
  36059. var gauge = this;
  36060. var defaults = Utils.extend({}, app.params.gauge);
  36061. // Extend defaults with modules params
  36062. gauge.useModulesParams(defaults);
  36063. gauge.params = Utils.extend(defaults, params);
  36064. var ref = gauge.params;
  36065. var el = ref.el;
  36066. if (!el) { return gauge; }
  36067. var $el = $(el);
  36068. if ($el.length === 0) { return gauge; }
  36069. if ($el[0].f7Gauge) { return $el[0].f7Gauge; }
  36070. Utils.extend(gauge, {
  36071. app: app,
  36072. $el: $el,
  36073. el: $el && $el[0],
  36074. });
  36075. $el[0].f7Gauge = gauge;
  36076. // Install Modules
  36077. gauge.useModules();
  36078. gauge.init();
  36079. return gauge;
  36080. }
  36081. if ( Framework7Class ) Gauge.__proto__ = Framework7Class;
  36082. Gauge.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  36083. Gauge.prototype.constructor = Gauge;
  36084. Gauge.prototype.calcRadius = function calcRadius () {
  36085. var gauge = this;
  36086. var ref = gauge.params;
  36087. var size = ref.size;
  36088. var borderWidth = ref.borderWidth;
  36089. return (size / 2) - (borderWidth / 2);
  36090. };
  36091. Gauge.prototype.calcBorderLength = function calcBorderLength () {
  36092. var gauge = this;
  36093. var radius = gauge.calcRadius();
  36094. return 2 * Math.PI * radius;
  36095. };
  36096. Gauge.prototype.render = function render () {
  36097. var gauge = this;
  36098. if (gauge.params.render) { return gauge.params.render.call(gauge, gauge); }
  36099. var ref = gauge.params;
  36100. var type = ref.type;
  36101. var value = ref.value;
  36102. var size = ref.size;
  36103. var bgColor = ref.bgColor;
  36104. var borderBgColor = ref.borderBgColor;
  36105. var borderColor = ref.borderColor;
  36106. var borderWidth = ref.borderWidth;
  36107. var valueText = ref.valueText;
  36108. var valueTextColor = ref.valueTextColor;
  36109. var valueFontSize = ref.valueFontSize;
  36110. var valueFontWeight = ref.valueFontWeight;
  36111. var labelText = ref.labelText;
  36112. var labelTextColor = ref.labelTextColor;
  36113. var labelFontSize = ref.labelFontSize;
  36114. var labelFontWeight = ref.labelFontWeight;
  36115. var semiCircle = type === 'semicircle';
  36116. var radius = gauge.calcRadius();
  36117. var length = gauge.calcBorderLength();
  36118. var progress = Math.max(Math.min(value, 1), 0);
  36119. return ("\n <svg class=\"gauge-svg\" width=\"" + size + "px\" height=\"" + (semiCircle ? size / 2 : size) + "px\" viewBox=\"0 0 " + size + " " + (semiCircle ? size / 2 : size) + "\">\n " + (semiCircle ? ("\n <path\n class=\"gauge-back-semi\"\n d=\"M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0\"\n stroke=\"" + borderBgColor + "\"\n stroke-width=\"" + borderWidth + "\"\n fill=\"" + (bgColor || 'none') + "\"\n />\n <path\n class=\"gauge-front-semi\"\n d=\"M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0\"\n stroke=\"" + borderColor + "\"\n stroke-width=\"" + borderWidth + "\"\n stroke-dasharray=\"" + (length / 2) + "\"\n stroke-dashoffset=\"" + ((length / 2) * (1 + progress)) + "\"\n fill=\"" + (borderBgColor ? 'none' : (bgColor || 'none')) + "\"\n />\n ") : ("\n " + (borderBgColor ? ("\n <circle\n class=\"gauge-back-circle\"\n stroke=\"" + borderBgColor + "\"\n stroke-width=\"" + borderWidth + "\"\n fill=\"" + (bgColor || 'none') + "\"\n cx=\"" + (size / 2) + "\"\n cy=\"" + (size / 2) + "\"\n r=\"" + radius + "\"\n ></circle>\n ") : '') + "\n <circle\n class=\"gauge-front-circle\"\n transform=\"" + ("rotate(-90 " + (size / 2) + " " + (size / 2) + ")") + "\"\n stroke=\"" + borderColor + "\"\n stroke-width=\"" + borderWidth + "\"\n stroke-dasharray=\"" + length + "\"\n stroke-dashoffset=\"" + (length * (1 - progress)) + "\"\n fill=\"" + (borderBgColor ? 'none' : bgColor || 'none') + "\"\n cx=\"" + (size / 2) + "\"\n cy=\"" + (size / 2) + "\"\n r=\"" + radius + "\"\n ></circle>\n ")) + "\n " + (valueText ? ("\n <text\n class=\"gauge-value-text\"\n x=\"50%\"\n y=\"" + (semiCircle ? '100%' : '50%') + "\"\n font-weight=\"" + valueFontWeight + "\"\n font-size=\"" + valueFontSize + "\"\n fill=\"" + valueTextColor + "\"\n dy=\"" + (semiCircle ? (labelText ? -labelFontSize - 15 : -5) : 0) + "\"\n text-anchor=\"middle\"\n dominant-baseline=\"" + (!semiCircle && 'middle') + "\"\n >" + valueText + "</text>\n ") : '') + "\n " + (labelText ? ("\n <text\n class=\"gauge-label-text\"\n x=\"50%\"\n y=\"" + (semiCircle ? '100%' : '50%') + "\"\n font-weight=\"" + labelFontWeight + "\"\n font-size=\"" + labelFontSize + "\"\n fill=\"" + labelTextColor + "\"\n dy=\"" + (semiCircle ? -5 : (valueText ? ((valueFontSize / 2) + 10) : 0)) + "\"\n text-anchor=\"middle\"\n dominant-baseline=\"" + (!semiCircle && 'middle') + "\"\n >" + labelText + "</text>\n ") : '') + "\n </svg>\n ").trim();
  36120. };
  36121. Gauge.prototype.update = function update (newParams) {
  36122. if ( newParams === void 0 ) newParams = {};
  36123. var gauge = this;
  36124. var params = gauge.params;
  36125. var $gaugeSvgEl = gauge.$gaugeSvgEl;
  36126. Object.keys(newParams).forEach(function (param) {
  36127. if (typeof newParams[param] !== 'undefined') {
  36128. params[param] = newParams[param];
  36129. }
  36130. });
  36131. if ($gaugeSvgEl.length === 0) { return gauge; }
  36132. var value = params.value;
  36133. var size = params.size;
  36134. var bgColor = params.bgColor;
  36135. var borderBgColor = params.borderBgColor;
  36136. var borderColor = params.borderColor;
  36137. var borderWidth = params.borderWidth;
  36138. var valueText = params.valueText;
  36139. var valueTextColor = params.valueTextColor;
  36140. var valueFontSize = params.valueFontSize;
  36141. var valueFontWeight = params.valueFontWeight;
  36142. var labelText = params.labelText;
  36143. var labelTextColor = params.labelTextColor;
  36144. var labelFontSize = params.labelFontSize;
  36145. var labelFontWeight = params.labelFontWeight;
  36146. var length = gauge.calcBorderLength();
  36147. var progress = Math.max(Math.min(value, 1), 0);
  36148. var radius = gauge.calcRadius();
  36149. var semiCircle = params.type === 'semicircle';
  36150. var svgAttrs = {
  36151. width: (size + "px"),
  36152. height: ((semiCircle ? size / 2 : size) + "px"),
  36153. viewBox: ("0 0 " + size + " " + (semiCircle ? size / 2 : size)),
  36154. };
  36155. Object.keys(svgAttrs).forEach(function (attr) {
  36156. $gaugeSvgEl.attr(attr, svgAttrs[attr]);
  36157. });
  36158. if (semiCircle) {
  36159. var backAttrs = {
  36160. d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
  36161. stroke: borderBgColor,
  36162. 'stroke-width': borderWidth,
  36163. fill: bgColor || 'none',
  36164. };
  36165. var frontAttrs = {
  36166. d: ("M" + (size - (borderWidth / 2)) + "," + (size / 2) + " a1,1 0 0,0 -" + (size - borderWidth) + ",0"),
  36167. stroke: borderColor,
  36168. 'stroke-width': borderWidth,
  36169. 'stroke-dasharray': length / 2,
  36170. 'stroke-dashoffset': (length / 2) * (1 + progress),
  36171. fill: borderBgColor ? 'none' : (bgColor || 'none'),
  36172. };
  36173. Object.keys(backAttrs).forEach(function (attr) {
  36174. $gaugeSvgEl.find('.gauge-back-semi').attr(attr, backAttrs[attr]);
  36175. });
  36176. Object.keys(frontAttrs).forEach(function (attr) {
  36177. $gaugeSvgEl.find('.gauge-front-semi').attr(attr, frontAttrs[attr]);
  36178. });
  36179. } else {
  36180. var backAttrs$1 = {
  36181. stroke: borderBgColor,
  36182. 'stroke-width': borderWidth,
  36183. fill: bgColor || 'none',
  36184. cx: size / 2,
  36185. cy: size / 2,
  36186. r: radius,
  36187. };
  36188. var frontAttrs$1 = {
  36189. transform: ("rotate(-90 " + (size / 2) + " " + (size / 2) + ")"),
  36190. stroke: borderColor,
  36191. 'stroke-width': borderWidth,
  36192. 'stroke-dasharray': length,
  36193. 'stroke-dashoffset': length * (1 - progress),
  36194. fill: borderBgColor ? 'none' : bgColor || 'none',
  36195. cx: size / 2,
  36196. cy: size / 2,
  36197. r: radius,
  36198. };
  36199. Object.keys(backAttrs$1).forEach(function (attr) {
  36200. $gaugeSvgEl.find('.gauge-back-circle').attr(attr, backAttrs$1[attr]);
  36201. });
  36202. Object.keys(frontAttrs$1).forEach(function (attr) {
  36203. $gaugeSvgEl.find('.gauge-front-circle').attr(attr, frontAttrs$1[attr]);
  36204. });
  36205. }
  36206. if (valueText) {
  36207. if (!$gaugeSvgEl.find('.gauge-value-text').length) {
  36208. var textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text');
  36209. textEl.classList.add('gauge-value-text');
  36210. $gaugeSvgEl.append(textEl);
  36211. }
  36212. var textAttrs = {
  36213. x: '50%',
  36214. y: semiCircle ? '100%' : '50%',
  36215. 'font-weight': valueFontWeight,
  36216. 'font-size': valueFontSize,
  36217. fill: valueTextColor,
  36218. dy: semiCircle ? (labelText ? -labelFontSize - 15 : -5) : 0,
  36219. 'text-anchor': 'middle',
  36220. 'dominant-baseline': !semiCircle && 'middle',
  36221. };
  36222. Object.keys(textAttrs).forEach(function (attr) {
  36223. $gaugeSvgEl.find('.gauge-value-text').attr(attr, textAttrs[attr]);
  36224. });
  36225. $gaugeSvgEl.find('.gauge-value-text').text(valueText);
  36226. } else {
  36227. $gaugeSvgEl.find('.gauge-value-text').remove();
  36228. }
  36229. if (labelText) {
  36230. if (!$gaugeSvgEl.find('.gauge-label-text').length) {
  36231. var textEl$1 = document.createElementNS('http://www.w3.org/2000/svg', 'text');
  36232. textEl$1.classList.add('gauge-label-text');
  36233. $gaugeSvgEl.append(textEl$1);
  36234. }
  36235. var labelAttrs = {
  36236. x: '50%',
  36237. y: semiCircle ? '100%' : '50%',
  36238. 'font-weight': labelFontWeight,
  36239. 'font-size': labelFontSize,
  36240. fill: labelTextColor,
  36241. dy: semiCircle ? -5 : (valueText ? ((valueFontSize / 2) + 10) : 0),
  36242. 'text-anchor': 'middle',
  36243. 'dominant-baseline': !semiCircle && 'middle',
  36244. };
  36245. Object.keys(labelAttrs).forEach(function (attr) {
  36246. $gaugeSvgEl.find('.gauge-label-text').attr(attr, labelAttrs[attr]);
  36247. });
  36248. $gaugeSvgEl.find('.gauge-label-text').text(labelText);
  36249. } else {
  36250. $gaugeSvgEl.find('.gauge-label-text').remove();
  36251. }
  36252. return gauge;
  36253. };
  36254. Gauge.prototype.init = function init () {
  36255. var gauge = this;
  36256. var $gaugeSvgEl = $(gauge.render()).eq(0);
  36257. $gaugeSvgEl.f7Gauge = gauge;
  36258. Utils.extend(gauge, {
  36259. $gaugeSvgEl: $gaugeSvgEl,
  36260. gaugeSvgEl: $gaugeSvgEl && $gaugeSvgEl[0],
  36261. });
  36262. gauge.$el.append($gaugeSvgEl);
  36263. return gauge;
  36264. };
  36265. Gauge.prototype.destroy = function destroy () {
  36266. var gauge = this;
  36267. if (!gauge.$el || gauge.destroyed) { return; }
  36268. gauge.$el.trigger('gauge:beforedestroy');
  36269. gauge.emit('local::beforeDestroy gaugeBeforeDestroy', gauge);
  36270. gauge.$gaugeSvgEl.remove();
  36271. delete gauge.$el[0].f7Gauge;
  36272. Utils.deleteProps(gauge);
  36273. gauge.destroyed = true;
  36274. };
  36275. return Gauge;
  36276. }(Framework7Class));
  36277. var Gauge$1 = {
  36278. name: 'gauge',
  36279. static: {
  36280. Gauge: Gauge,
  36281. },
  36282. create: function create() {
  36283. var app = this;
  36284. app.gauge = ConstructorMethods({
  36285. defaultSelector: '.gauge',
  36286. constructor: Gauge,
  36287. app: app,
  36288. domProp: 'f7Gauge',
  36289. });
  36290. app.gauge.update = function update(el, newParams) {
  36291. var $el = $(el);
  36292. if ($el.length === 0) { return undefined; }
  36293. var gauge = app.gauge.get(el);
  36294. if (!gauge) { return undefined; }
  36295. gauge.update(newParams);
  36296. return gauge;
  36297. };
  36298. },
  36299. params: {
  36300. gauge: {
  36301. el: null,
  36302. type: 'circle',
  36303. value: 0,
  36304. size: 200,
  36305. bgColor: 'transparent',
  36306. borderBgColor: '#eeeeee',
  36307. borderColor: '#000000',
  36308. borderWidth: 10,
  36309. valueText: null,
  36310. valueTextColor: '#000000',
  36311. valueFontSize: 31,
  36312. valueFontWeight: 500,
  36313. labelText: null,
  36314. labelTextColor: '#888888',
  36315. labelFontSize: 14,
  36316. labelFontWeight: 400,
  36317. },
  36318. },
  36319. on: {
  36320. tabMounted: function tabMounted(tabEl) {
  36321. var app = this;
  36322. $(tabEl).find('.gauge-init').each(function (index, el) {
  36323. app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
  36324. });
  36325. },
  36326. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  36327. $(tabEl).find('.gauge-init').each(function (index, el) {
  36328. if (el.f7Gauge) { el.f7Gauge.destroy(); }
  36329. });
  36330. },
  36331. pageInit: function pageInit(page) {
  36332. var app = this;
  36333. page.$el.find('.gauge-init').each(function (index, el) {
  36334. app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
  36335. });
  36336. },
  36337. pageBeforeRemove: function pageBeforeRemove(page) {
  36338. page.$el.find('.gauge-init').each(function (index, el) {
  36339. if (el.f7Gauge) { el.f7Gauge.destroy(); }
  36340. });
  36341. },
  36342. },
  36343. vnode: {
  36344. 'gauge-init': {
  36345. insert: function insert(vnode) {
  36346. var app = this;
  36347. var el = vnode.elm;
  36348. app.gauge.create(Utils.extend({ el: el }, $(el).dataset() || {}));
  36349. },
  36350. destroy: function destroy(vnode) {
  36351. var el = vnode.elm;
  36352. if (el.f7Gauge) { el.f7Gauge.destroy(); }
  36353. },
  36354. },
  36355. },
  36356. };
  36357. var Skeleton = {
  36358. name: 'skeleton',
  36359. };
  36360. var Menu = {
  36361. open: function open(el) {
  36362. if ( el === void 0 ) el = '.menu-item-dropdown';
  36363. var app = this;
  36364. if (!el) { return; }
  36365. var $el = $(el).closest('.menu-item-dropdown');
  36366. if (!$el.length) { return; }
  36367. var $menuEl = $el.closest('.menu').eq(0);
  36368. if ($menuEl.length) {
  36369. var zIndex = $menuEl.css('z-index');
  36370. var originalZIndex = $menuEl[0].style.zIndex;
  36371. $menuEl.css('z-index', parseInt(zIndex || 0, 0) + 1);
  36372. $menuEl[0].f7MenuZIndex = originalZIndex;
  36373. }
  36374. $el.eq(0).addClass('menu-item-dropdown-opened').trigger('menu:opened');
  36375. app.emit('menuOpened', $el.eq(0)[0]);
  36376. },
  36377. close: function close(el) {
  36378. if ( el === void 0 ) el = '.menu-item-dropdown-opened';
  36379. var app = this;
  36380. if (!el) { return; }
  36381. var $el = $(el).closest('.menu-item-dropdown-opened');
  36382. if (!$el.length) { return; }
  36383. var $menuEl = $el.closest('.menu').eq(0);
  36384. if ($menuEl.length) {
  36385. var zIndex = $menuEl[0].f7MenuZIndex;
  36386. $menuEl.css('z-index', zIndex);
  36387. delete $menuEl[0].f7MenuZIndex;
  36388. }
  36389. $el.eq(0).removeClass('menu-item-dropdown-opened').trigger('menu:closed');
  36390. app.emit('menuClosed', $el.eq(0)[0]);
  36391. },
  36392. };
  36393. var Menu$1 = {
  36394. name: 'menu',
  36395. create: function create() {
  36396. var app = this;
  36397. app.menu = {
  36398. open: Menu.open.bind(app),
  36399. close: Menu.close.bind(app),
  36400. };
  36401. },
  36402. on: {
  36403. click: function click(e) {
  36404. var app = this;
  36405. var openedMenus = $('.menu-item-dropdown-opened');
  36406. if (!openedMenus.length) { return; }
  36407. openedMenus.each(function (index, el) {
  36408. if (!$(e.target).closest('.menu-item-dropdown-opened').length) {
  36409. app.menu.close(el);
  36410. }
  36411. });
  36412. },
  36413. },
  36414. clicks: {
  36415. '.menu-item-dropdown': function onClick($clickedEl, dataset, e) {
  36416. var app = this;
  36417. if ($clickedEl.hasClass('menu-item-dropdown-opened')) {
  36418. if ($(e.target).closest('.menu-dropdown').length) { return; }
  36419. app.menu.close($clickedEl);
  36420. } else {
  36421. app.menu.open($clickedEl);
  36422. }
  36423. },
  36424. '.menu-close': function onClick() {
  36425. var app = this;
  36426. app.menu.close();
  36427. },
  36428. },
  36429. };
  36430. var moduleAlphaSlider = {
  36431. render: function render(self) {
  36432. var ref = self.params;
  36433. var sliderLabel = ref.sliderLabel;
  36434. var sliderValue = ref.sliderValue;
  36435. var sliderValueEditable = ref.sliderValueEditable;
  36436. var alphaLabelText = ref.alphaLabelText;
  36437. return ("\n <div class=\"color-picker-module color-picker-module-alpha-slider\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + alphaLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-alpha\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.01\" min=\"0\" max=\"1\" class=\"color-picker-value-alpha\">\n " : "\n <span class=\"color-picker-value-alpha\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
  36438. },
  36439. init: function init(self) {
  36440. self.alphaRangeSlider = self.app.range.create({
  36441. el: self.$el.find('.color-picker-slider-alpha'),
  36442. min: 0,
  36443. max: 1,
  36444. step: 0.01,
  36445. value: 1,
  36446. on: {
  36447. change: function change(range, value) {
  36448. var alpha = Math.floor(value * 100) / 100;
  36449. self.setValue({ alpha: alpha });
  36450. },
  36451. },
  36452. });
  36453. function handleInputChange(e) {
  36454. var alpha = self.value.alpha;
  36455. var value = parseFloat(e.target.value);
  36456. if (Number.isNaN(value)) {
  36457. e.target.value = alpha;
  36458. return;
  36459. }
  36460. value = Math.max(0, Math.min(1, value));
  36461. self.setValue({ alpha: value });
  36462. }
  36463. self.$el.on('change', '.color-picker-module-alpha-slider input', handleInputChange);
  36464. self.destroyAlphaSliderEvents = function destroyAlphaSliderEvents() {
  36465. self.$el.off('change', '.color-picker-module-alpha-slider input', handleInputChange);
  36466. };
  36467. },
  36468. update: function update(self) {
  36469. var value = self.value;
  36470. var ref = self.params;
  36471. var sliderValue = ref.sliderValue;
  36472. var sliderValueEditable = ref.sliderValueEditable;
  36473. var alpha = value.alpha;
  36474. self.alphaRangeSlider.value = alpha;
  36475. self.alphaRangeSlider.layout();
  36476. if (sliderValue && sliderValueEditable) {
  36477. self.$el.find('input.color-picker-value-alpha').val(alpha);
  36478. } else {
  36479. self.$el.find('span.color-picker-value-alpha').text(alpha);
  36480. }
  36481. },
  36482. destroy: function destroy(self) {
  36483. if (self.alphaRangeSlider && self.alphaRangeSlider.destroy) {
  36484. self.alphaRangeSlider.destroy();
  36485. }
  36486. delete self.alphaRangeSlider;
  36487. if (self.destroyAlphaSliderEvents) { self.destroyAlphaSliderEvents(); }
  36488. delete self.destroyAlphaSliderEvents;
  36489. },
  36490. };
  36491. var moduleCurrentColor = {
  36492. render: function render() {
  36493. return "\n <div class=\"color-picker-module color-picker-module-current-color\">\n <div class=\"color-picker-current-color\"></div>\n </div>\n ";
  36494. },
  36495. update: function update(self) {
  36496. self.$el.find('.color-picker-module-current-color .color-picker-current-color').css(
  36497. 'background-color',
  36498. self.value.hex
  36499. );
  36500. },
  36501. };
  36502. var moduleHex = {
  36503. render: function render(self) {
  36504. var ref = self.params;
  36505. var hexLabel = ref.hexLabel;
  36506. var hexLabelText = ref.hexLabelText;
  36507. var hexValueEditable = ref.hexValueEditable;
  36508. return ("\n <div class=\"color-picker-module color-picker-module-hex\">\n <div class=\"color-picker-hex-wrap\">\n " + (hexLabel ? ("\n <div class=\"color-picker-hex-label\">" + hexLabelText + "</div>\n ") : '') + "\n <div class=\"color-picker-hex-value\">\n " + (hexValueEditable ? "\n <input type=\"text\" class=\"color-picker-value-hex\">\n " : "\n <span class=\"color-picker-value-hex\"></span>\n ") + "\n </div>\n </div>\n </div>\n ");
  36509. },
  36510. init: function init(self) {
  36511. function handleInputChange(e) {
  36512. var hex = self.value.hex;
  36513. var value = e.target.value.replace(/#/g, '');
  36514. if (Number.isNaN(value) || !value || (value.length !== 3 && value.length !== 6)) {
  36515. e.target.value = hex;
  36516. return;
  36517. }
  36518. var min = 0;
  36519. var current = parseInt(value, 16);
  36520. var max = parseInt('ffffff', 16); // eslint-disable-line
  36521. if (current > max) {
  36522. value = 'fff';
  36523. }
  36524. if (current < min) {
  36525. value = '000';
  36526. }
  36527. self.setValue({ hex: value });
  36528. }
  36529. self.$el.on('change', '.color-picker-module-hex input', handleInputChange);
  36530. self.destroyHexEvents = function destroyHexEvents() {
  36531. self.$el.off('change', '.color-picker-module-hex input', handleInputChange);
  36532. };
  36533. },
  36534. update: function update(self) {
  36535. var value = self.value;
  36536. var ref = self.params;
  36537. var hexValueEditable = ref.hexValueEditable;
  36538. var hex = value.hex;
  36539. if (hexValueEditable) {
  36540. self.$el.find('input.color-picker-value-hex').val(hex);
  36541. } else {
  36542. self.$el.find('span.color-picker-value-hex').text(hex);
  36543. }
  36544. },
  36545. destroy: function destroy(self) {
  36546. if (self.destroyHexEvents) { self.destroyHexEvents(); }
  36547. delete self.destroyHexEvents;
  36548. },
  36549. };
  36550. var moduleHsbSliders = {
  36551. render: function render(self) {
  36552. var ref = self.params;
  36553. var sliderLabel = ref.sliderLabel;
  36554. var sliderValue = ref.sliderValue;
  36555. var sliderValueEditable = ref.sliderValueEditable;
  36556. var hueLabelText = ref.hueLabelText;
  36557. var saturationLabelText = ref.saturationLabelText;
  36558. var brightnessLabelText = ref.brightnessLabelText;
  36559. return ("\n <div class=\"color-picker-module color-picker-module-hsb-sliders\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + hueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-hue\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"360\" class=\"color-picker-value-hue\" data-color-index=\"0\">\n " : "\n <span class=\"color-picker-value-hue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + saturationLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-saturation\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"100\" class=\"color-picker-value-saturation\" data-color-index=\"1\">\n " : "\n <span class=\"color-picker-value-saturation\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + brightnessLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-brightness\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"100\" class=\"color-picker-value-brightness\" data-color-index=\"2\">\n " : "\n <span class=\"color-picker-value-brightness\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
  36560. },
  36561. init: function init(self) {
  36562. self.hueRangeSlider = self.app.range.create({
  36563. el: self.$el.find('.color-picker-slider-hue'),
  36564. min: 0,
  36565. max: 360,
  36566. step: 0.1,
  36567. value: 0,
  36568. on: {
  36569. change: function change(range, value) {
  36570. self.setValue({ hue: value });
  36571. },
  36572. },
  36573. });
  36574. self.saturationRangeSlider = self.app.range.create({
  36575. el: self.$el.find('.color-picker-slider-saturation'),
  36576. min: 0,
  36577. max: 1,
  36578. step: 0.001,
  36579. value: 0,
  36580. on: {
  36581. change: function change(range, value) {
  36582. var s = Math.floor(value * 1000) / 1000;
  36583. self.setValue({ hsb: [self.value.hsb[0], s, self.value.hsb[2]] });
  36584. },
  36585. },
  36586. });
  36587. self.brightnessRangeSlider = self.app.range.create({
  36588. el: self.$el.find('.color-picker-slider-brightness'),
  36589. min: 0,
  36590. max: 1,
  36591. step: 0.001,
  36592. value: 0,
  36593. on: {
  36594. change: function change(range, value) {
  36595. var b = Math.floor(value * 1000) / 1000;
  36596. self.setValue({ hsb: [self.value.hsb[0], self.value.hsb[1], b] });
  36597. },
  36598. },
  36599. });
  36600. function handleInputChange(e) {
  36601. var hsb = [].concat( self.value.hsb );
  36602. var index = parseInt($(e.target).attr('data-color-index'), 10);
  36603. var value = parseFloat(e.target.value);
  36604. if (Number.isNaN(value)) {
  36605. e.target.value = hsb[index];
  36606. return;
  36607. }
  36608. if (index === 0) {
  36609. value = Math.max(0, Math.min(360, value));
  36610. } else {
  36611. value = Math.max(0, Math.min(100, value)) / 100;
  36612. }
  36613. hsb[index] = value;
  36614. self.setValue({ hsb: hsb });
  36615. }
  36616. self.$el.on('change', '.color-picker-module-hsb-sliders input', handleInputChange);
  36617. self.destroyHsbSlidersEvents = function destroyHsbSlidersEvents() {
  36618. self.$el.off('change', '.color-picker-module-hsb-sliders input', handleInputChange);
  36619. };
  36620. },
  36621. update: function update(self) {
  36622. var app = self.app;
  36623. var value = self.value;
  36624. var ref = self.params;
  36625. var sliderValue = ref.sliderValue;
  36626. var sliderValueEditable = ref.sliderValueEditable;
  36627. var hsb = value.hsb;
  36628. var hue = value.hue;
  36629. self.hueRangeSlider.value = hue;
  36630. self.saturationRangeSlider.value = hsb[1];
  36631. self.brightnessRangeSlider.value = hsb[2];
  36632. self.hueRangeSlider.layout();
  36633. self.saturationRangeSlider.layout();
  36634. self.brightnessRangeSlider.layout();
  36635. var hslCurrent = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
  36636. var hslLeft = Utils.colorHsbToHsl(hsb[0], 0, 1);
  36637. var hslRight = Utils.colorHsbToHsl(hsb[0], 1, 1);
  36638. var brightness = hsb[2];
  36639. self.hueRangeSlider.$el[0].style.setProperty(
  36640. '--f7-range-knob-color',
  36641. ("hsl(" + hue + ", 100%, 50%)")
  36642. );
  36643. self.saturationRangeSlider.$el[0].style.setProperty(
  36644. '--f7-range-knob-color',
  36645. ("hsl(" + (hslCurrent[0]) + ", " + (hslCurrent[1] * 100) + "%, " + (hslCurrent[2] * 100) + "%)")
  36646. );
  36647. self.brightnessRangeSlider.$el[0].style.setProperty(
  36648. '--f7-range-knob-color',
  36649. ("rgb(" + (brightness * 255) + ", " + (brightness * 255) + ", " + (brightness * 255) + ")")
  36650. );
  36651. self.saturationRangeSlider.$el.find('.range-bar').css(
  36652. 'background-image',
  36653. ("linear-gradient(" + (app.rtl ? 'to left' : 'to right') + ", hsl(" + (hslLeft[0]) + ", " + (hslLeft[1] * 100) + "%, " + (hslLeft[2] * 100) + "%), hsl(" + (hslRight[0]) + ", " + (hslRight[1] * 100) + "%, " + (hslRight[2] * 100) + "%))")
  36654. );
  36655. if (sliderValue && sliderValueEditable) {
  36656. self.$el.find('input.color-picker-value-hue').val(("" + hue));
  36657. self.$el.find('input.color-picker-value-saturation').val(("" + (hsb[1] * 1000 / 10)));
  36658. self.$el.find('input.color-picker-value-brightness').val(("" + (hsb[2] * 1000 / 10)));
  36659. } else if (sliderValue) {
  36660. self.$el.find('span.color-picker-value-hue').text(("" + hue));
  36661. self.$el.find('span.color-picker-value-saturation').text(("" + (hsb[1] * 1000 / 10)));
  36662. self.$el.find('span.color-picker-value-brightness').text(("" + (hsb[2] * 1000 / 10)));
  36663. }
  36664. },
  36665. destroy: function destroy(self) {
  36666. if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
  36667. self.hueRangeSlider.destroy();
  36668. }
  36669. if (self.saturationRangeSlider && self.saturationRangeSlider.destroy) {
  36670. self.saturationRangeSlider.destroy();
  36671. }
  36672. if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
  36673. self.brightnessRangeSlider.destroy();
  36674. }
  36675. delete self.hueRangeSlider;
  36676. delete self.saturationRangeSlider;
  36677. delete self.brightnessRangeSlider;
  36678. if (self.destroyHsbSlidersEvents) { self.destroyHsbSlidersEvents(); }
  36679. delete self.destroyHsbSlidersEvents;
  36680. },
  36681. };
  36682. var moduleHueSlider = {
  36683. render: function render(self) {
  36684. var ref = self.params;
  36685. var sliderLabel = ref.sliderLabel;
  36686. var sliderValue = ref.sliderValue;
  36687. var sliderValueEditable = ref.sliderValueEditable;
  36688. var hueLabelText = ref.hueLabelText;
  36689. return ("\n <div class=\"color-picker-module color-picker-module-hue-slider\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + hueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-hue\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"360\" class=\"color-picker-value-hue\">\n " : "\n <span class=\"color-picker-value-hue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
  36690. },
  36691. init: function init(self) {
  36692. self.hueRangeSlider = self.app.range.create({
  36693. el: self.$el.find('.color-picker-slider-hue'),
  36694. min: 0,
  36695. max: 360,
  36696. step: 0.1,
  36697. value: 0,
  36698. on: {
  36699. change: function change(range, value) {
  36700. self.setValue({ hue: value });
  36701. },
  36702. },
  36703. });
  36704. },
  36705. update: function update(self) {
  36706. var value = self.value;
  36707. var ref = self.params;
  36708. var sliderValue = ref.sliderValue;
  36709. var sliderValueEditable = ref.sliderValueEditable;
  36710. var hue = value.hue;
  36711. self.hueRangeSlider.value = hue;
  36712. self.hueRangeSlider.layout();
  36713. self.hueRangeSlider.$el[0].style.setProperty(
  36714. '--f7-range-knob-color',
  36715. ("hsl(" + hue + ", 100%, 50%)")
  36716. );
  36717. if (sliderValue && sliderValueEditable) {
  36718. self.$el.find('input.color-picker-value-hue').val(("" + hue));
  36719. } else if (sliderValue) {
  36720. self.$el.find('span.color-picker-value-hue').text(("" + hue));
  36721. }
  36722. },
  36723. destroy: function destroy(self) {
  36724. if (self.hueRangeSlider && self.hueRangeSlider.destroy) {
  36725. self.hueRangeSlider.destroy();
  36726. }
  36727. delete self.hueRangeSlider;
  36728. },
  36729. };
  36730. var moduleBrightnessSlider = {
  36731. render: function render(self) {
  36732. var ref = self.params;
  36733. var sliderLabel = ref.sliderLabel;
  36734. var sliderValue = ref.sliderValue;
  36735. var sliderValueEditable = ref.sliderValueEditable;
  36736. var brightnessLabelText = ref.brightnessLabelText;
  36737. return ("\n <div class=\"color-picker-module color-picker-module-brightness-slider\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + brightnessLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-brightness\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"0.1\" min=\"0\" max=\"100\" class=\"color-picker-value-brightness\">\n " : "\n <span class=\"color-picker-value-brightness\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
  36738. },
  36739. init: function init(self) {
  36740. self.brightnessRangeSlider = self.app.range.create({
  36741. el: self.$el.find('.color-picker-slider-brightness'),
  36742. min: 0,
  36743. max: 1,
  36744. step: 0.001,
  36745. value: 0,
  36746. on: {
  36747. change: function change(range, value) {
  36748. var b = Math.floor(value * 1000) / 1000;
  36749. self.setValue({ hsb: [self.value.hsb[0], self.value.hsb[1], b] });
  36750. },
  36751. },
  36752. });
  36753. },
  36754. update: function update(self) {
  36755. var value = self.value;
  36756. var app = self.app;
  36757. var ref = self.params;
  36758. var sliderValue = ref.sliderValue;
  36759. var sliderValueEditable = ref.sliderValueEditable;
  36760. var hsb = value.hsb;
  36761. self.brightnessRangeSlider.value = hsb[2];
  36762. self.brightnessRangeSlider.layout();
  36763. var hslCurrent = Utils.colorHsbToHsl(hsb[0], hsb[1], hsb[2]);
  36764. var hslLeft = Utils.colorHsbToHsl(hsb[0], hsb[1], 0);
  36765. var hslRight = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
  36766. self.brightnessRangeSlider.$el[0].style.setProperty(
  36767. '--f7-range-knob-color',
  36768. ("hsl(" + (hslCurrent[0]) + ", " + (hslCurrent[1] * 100) + "%, " + (hslCurrent[2] * 100) + "%)")
  36769. );
  36770. self.brightnessRangeSlider.$el.find('.range-bar').css(
  36771. 'background-image',
  36772. ("linear-gradient(" + (app.rtl ? 'to left' : 'to right') + ", hsl(" + (hslLeft[0]) + ", " + (hslLeft[1] * 100) + "%, " + (hslLeft[2] * 100) + "%), hsl(" + (hslRight[0]) + ", " + (hslRight[1] * 100) + "%, " + (hslRight[2] * 100) + "%))")
  36773. );
  36774. if (sliderValue && sliderValueEditable) {
  36775. self.$el.find('input.color-picker-value-brightness').val(("" + (hsb[2] * 1000 / 10)));
  36776. } else if (sliderValue) {
  36777. self.$el.find('span.color-picker-value-brightness').text(("" + (hsb[2] * 1000 / 10)));
  36778. }
  36779. },
  36780. destroy: function destroy(self) {
  36781. if (self.brightnessRangeSlider && self.brightnessRangeSlider.destroy) {
  36782. self.brightnessRangeSlider.destroy();
  36783. }
  36784. delete self.brightnessRangeSlider;
  36785. },
  36786. };
  36787. /* eslint indent: ["off"] */
  36788. var modulePalette = {
  36789. render: function render(self) {
  36790. return ("\n <div class=\"color-picker-module color-picker-module-palette\">\n <div class=\"color-picker-palette\">\n " + (self.params.palette.map(function (p) {
  36791. if (Array.isArray(p)) {
  36792. var row = '<div class="color-picker-palette-row">';
  36793. row += p.map(function (c) { return ("\n <div class=\"color-picker-palette-value\" data-palette-color=\"" + c + "\" style=\"background-color: " + c + "\"></div>\n "); }).join('');
  36794. row += '</div>';
  36795. return row;
  36796. }
  36797. return ("\n <div class=\"color-picker-palette-value\" data-palette-color=\"" + p + "\" style=\"background-color: " + p + "\"></div>\n ");
  36798. }).join('')) + "\n </div>\n </div>\n ");
  36799. },
  36800. init: function init(self) {
  36801. function handlePaletteClick(e) {
  36802. var hex = $(e.target).attr('data-palette-color');
  36803. self.setValue({
  36804. hex: hex,
  36805. });
  36806. }
  36807. self.$el.on('click', '.color-picker-module-palette .color-picker-palette-value', handlePaletteClick);
  36808. self.destroyPaletteEvents = function destroyPaletteEvents() {
  36809. self.$el.off('click', '.color-picker-module-hex input', handlePaletteClick);
  36810. };
  36811. },
  36812. destroy: function destroy(self) {
  36813. if (self.destroyPaletteEvents) {
  36814. self.destroyPaletteEvents();
  36815. }
  36816. delete self.destroyPaletteEvents;
  36817. },
  36818. };
  36819. var moduleInitialCurrentColors = {
  36820. render: function render() {
  36821. return "\n <div class=\"color-picker-module color-picker-module-initial-current-colors\">\n <div class=\"color-picker-initial-current-colors\">\n <div class=\"color-picker-initial-color\"></div>\n <div class=\"color-picker-current-color\"></div>\n </div>\n </div>\n ";
  36822. },
  36823. init: function init(self) {
  36824. function handleInitialColorClick() {
  36825. if (self.initialValue) {
  36826. var ref = self.initialValue;
  36827. var hex = ref.hex;
  36828. var alpha = ref.alpha;
  36829. self.setValue({
  36830. hex: hex,
  36831. alpha: alpha,
  36832. });
  36833. }
  36834. }
  36835. self.$el.on('click', '.color-picker-initial-color', handleInitialColorClick);
  36836. self.destroyInitialCurrentEvents = function destroyInitialCurrentEvents() {
  36837. self.$el.off('click', '.color-picker-initial-color', handleInitialColorClick);
  36838. };
  36839. },
  36840. update: function update(self) {
  36841. self.$el.find('.color-picker-module-initial-current-colors .color-picker-initial-color').css(
  36842. 'background-color',
  36843. self.initialValue.hex
  36844. );
  36845. self.$el.find('.color-picker-module-initial-current-colors .color-picker-current-color').css(
  36846. 'background-color',
  36847. self.value.hex
  36848. );
  36849. },
  36850. destroy: function destroy(self) {
  36851. if (self.destroyInitialCurrentEvents) {
  36852. self.destroyInitialCurrentEvents();
  36853. }
  36854. delete self.destroyInitialCurrentEvents;
  36855. },
  36856. };
  36857. var moduleRgbBars = {
  36858. render: function render(self) {
  36859. var ref = self.params;
  36860. var barLabel = ref.barLabel;
  36861. var barValue = ref.barValue;
  36862. var barValueEditable = ref.barValueEditable;
  36863. var redLabelText = ref.redLabelText;
  36864. var greenLabelText = ref.greenLabelText;
  36865. var blueLabelText = ref.blueLabelText;
  36866. return ("\n <div class=\"color-picker-module color-picker-module-rgb-bars\">\n <div class=\"color-picker-bar-wrap\">\n " + (barLabel ? ("\n <div class=\"color-picker-bar-label\">" + redLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-bar color-picker-bar-red\"></div>\n " + (barValue ? ("\n <div class=\"color-picker-bar-value\">\n " + (barValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-bar-red\" data-color-index=\"0\">\n " : "\n <span class=\"color-picker-value-bar-red\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-bar-wrap\">\n " + (barLabel ? ("\n <div class=\"color-picker-bar-label\">" + greenLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-bar color-picker-bar-green\"></div>\n " + (barValue ? ("\n <div class=\"color-picker-bar-value\">\n " + (barValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-bar-green\" data-color-index=\"1\">\n " : "\n <span class=\"color-picker-value-bar-green\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-bar-wrap\">\n " + (barLabel ? ("\n <div class=\"color-picker-bar-label\">" + blueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-bar color-picker-bar-blue\"></div>\n " + (barValue ? ("\n <div class=\"color-picker-bar-value\">\n " + (barValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-bar-blue\" data-color-index=\"2\">\n " : "\n <span class=\"color-picker-value-bar-blue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
  36867. },
  36868. init: function init(self) {
  36869. self.redBar = self.app.range.create({
  36870. el: self.$el.find('.color-picker-bar-red'),
  36871. min: 0,
  36872. max: 255,
  36873. step: 1,
  36874. value: 0,
  36875. vertical: true,
  36876. on: {
  36877. change: function change(range, value) {
  36878. self.setValue({ rgb: [value, self.value.rgb[1], self.value.rgb[2]] });
  36879. },
  36880. },
  36881. });
  36882. self.greenBar = self.app.range.create({
  36883. el: self.$el.find('.color-picker-bar-green'),
  36884. min: 0,
  36885. max: 255,
  36886. step: 1,
  36887. value: 0,
  36888. vertical: true,
  36889. on: {
  36890. change: function change(range, value) {
  36891. self.setValue({ rgb: [self.value.rgb[0], value, self.value.rgb[2]] });
  36892. },
  36893. },
  36894. });
  36895. self.blueBar = self.app.range.create({
  36896. el: self.$el.find('.color-picker-bar-blue'),
  36897. min: 0,
  36898. max: 255,
  36899. step: 1,
  36900. value: 0,
  36901. vertical: true,
  36902. on: {
  36903. change: function change(range, value) {
  36904. self.setValue({ rgb: [self.value.rgb[0], self.value.rgb[1], value] });
  36905. },
  36906. },
  36907. });
  36908. function handleInputChange(e) {
  36909. var rgb = [].concat( self.value.rgb );
  36910. var index = parseInt($(e.target).attr('data-color-index'), 10);
  36911. var value = parseInt(e.target.value, 10);
  36912. if (Number.isNaN(value)) {
  36913. e.target.value = rgb[index];
  36914. return;
  36915. }
  36916. value = Math.max(0, Math.min(255, value));
  36917. rgb[index] = value;
  36918. self.setValue({ rgb: rgb });
  36919. }
  36920. self.$el.on('change', '.color-picker-module-rgb-bars input', handleInputChange);
  36921. self.destroyRgbBarsEvents = function destroyRgbBarsEvents() {
  36922. self.$el.off('change', '.color-picker-module-rgb-bars input', handleInputChange);
  36923. };
  36924. },
  36925. update: function update(self) {
  36926. var value = self.value;
  36927. var redBar = self.redBar;
  36928. var greenBar = self.greenBar;
  36929. var blueBar = self.blueBar;
  36930. var ref = self.params;
  36931. var barValue = ref.barValue;
  36932. var barValueEditable = ref.barValueEditable;
  36933. var rgb = value.rgb;
  36934. redBar.value = rgb[0];
  36935. greenBar.value = rgb[1];
  36936. blueBar.value = rgb[2];
  36937. redBar.layout();
  36938. greenBar.layout();
  36939. blueBar.layout();
  36940. redBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(0, " + (rgb[1]) + ", " + (rgb[2]) + "), rgb(255, " + (rgb[1]) + ", " + (rgb[2]) + "))"));
  36941. greenBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(" + (rgb[0]) + ", 0, " + (rgb[2]) + "), rgb(" + (rgb[0]) + ", 255, " + (rgb[2]) + "))"));
  36942. blueBar.$el.find('.range-bar').css('background-image', ("linear-gradient(to top, rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 0), rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 255))"));
  36943. if (barValue && barValueEditable) {
  36944. self.$el.find('input.color-picker-value-bar-red').val(rgb[0]);
  36945. self.$el.find('input.color-picker-value-bar-green').val(rgb[1]);
  36946. self.$el.find('input.color-picker-value-bar-blue').val(rgb[2]);
  36947. } else if (barValue) {
  36948. self.$el.find('span.color-picker-value-bar-red').text(rgb[0]);
  36949. self.$el.find('span.color-picker-value-bar-green').text(rgb[1]);
  36950. self.$el.find('span.color-picker-value-bar-blue').text(rgb[2]);
  36951. }
  36952. },
  36953. destroy: function destroy(self) {
  36954. if (self.redBar && self.redBar.destroy) {
  36955. self.redBar.destroy();
  36956. }
  36957. if (self.greenBar && self.greenBar.destroy) {
  36958. self.greenBar.destroy();
  36959. }
  36960. if (self.blueBar && self.blueBar.destroy) {
  36961. self.blueBar.destroy();
  36962. }
  36963. delete self.redBar;
  36964. delete self.greenBar;
  36965. delete self.blueBar;
  36966. if (self.destroyRgbBarsEvents) { self.destroyRgbBarsEvents(); }
  36967. delete self.destroyRgbBarsEvents;
  36968. },
  36969. };
  36970. var moduleRgbSliders = {
  36971. render: function render(self) {
  36972. var ref = self.params;
  36973. var sliderLabel = ref.sliderLabel;
  36974. var sliderValue = ref.sliderValue;
  36975. var sliderValueEditable = ref.sliderValueEditable;
  36976. var redLabelText = ref.redLabelText;
  36977. var greenLabelText = ref.greenLabelText;
  36978. var blueLabelText = ref.blueLabelText;
  36979. return ("\n <div class=\"color-picker-module color-picker-module-rgb-sliders\">\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + redLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-red\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-red\" data-color-index=\"0\">\n " : "\n <span class=\"color-picker-value-red\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + greenLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-green\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-green\" data-color-index=\"1\">\n " : "\n <span class=\"color-picker-value-green\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n <div class=\"color-picker-slider-wrap\">\n " + (sliderLabel ? ("\n <div class=\"color-picker-slider-label\">" + blueLabelText + "</div>\n ") : '') + "\n <div class=\"range-slider color-picker-slider color-picker-slider-blue\"></div>\n " + (sliderValue ? ("\n <div class=\"color-picker-slider-value\">\n " + (sliderValueEditable ? "\n <input type=\"number\" step=\"1\" min=\"0\" max=\"255\" class=\"color-picker-value-blue\" data-color-index=\"2\">\n " : "\n <span class=\"color-picker-value-blue\"></span>\n ") + "\n </div>\n ") : '') + "\n </div>\n </div>\n ");
  36980. },
  36981. init: function init(self) {
  36982. self.redRangeSlider = self.app.range.create({
  36983. el: self.$el.find('.color-picker-slider-red'),
  36984. min: 0,
  36985. max: 255,
  36986. step: 1,
  36987. value: 0,
  36988. on: {
  36989. change: function change(range, value) {
  36990. self.setValue({ rgb: [value, self.value.rgb[1], self.value.rgb[2]] });
  36991. },
  36992. },
  36993. });
  36994. self.greenRangeSlider = self.app.range.create({
  36995. el: self.$el.find('.color-picker-slider-green'),
  36996. min: 0,
  36997. max: 255,
  36998. step: 1,
  36999. value: 0,
  37000. on: {
  37001. change: function change(range, value) {
  37002. self.setValue({ rgb: [self.value.rgb[0], value, self.value.rgb[2]] });
  37003. },
  37004. },
  37005. });
  37006. self.blueRangeSlider = self.app.range.create({
  37007. el: self.$el.find('.color-picker-slider-blue'),
  37008. min: 0,
  37009. max: 255,
  37010. step: 1,
  37011. value: 0,
  37012. on: {
  37013. change: function change(range, value) {
  37014. self.setValue({ rgb: [self.value.rgb[0], self.value.rgb[1], value] });
  37015. },
  37016. },
  37017. });
  37018. function handleInputChange(e) {
  37019. var rgb = [].concat( self.value.rgb );
  37020. var index = parseInt($(e.target).attr('data-color-index'), 10);
  37021. var value = parseInt(e.target.value, 10);
  37022. if (Number.isNaN(value)) {
  37023. e.target.value = rgb[index];
  37024. return;
  37025. }
  37026. value = Math.max(0, Math.min(255, value));
  37027. rgb[index] = value;
  37028. self.setValue({ rgb: rgb });
  37029. }
  37030. self.$el.on('change', '.color-picker-module-rgb-sliders input', handleInputChange);
  37031. self.destroyRgbSlidersEvents = function destroyRgbSlidersEvents() {
  37032. self.$el.off('change', '.color-picker-module-rgb-sliders input', handleInputChange);
  37033. };
  37034. },
  37035. update: function update(self) {
  37036. var app = self.app;
  37037. var value = self.value;
  37038. var redRangeSlider = self.redRangeSlider;
  37039. var greenRangeSlider = self.greenRangeSlider;
  37040. var blueRangeSlider = self.blueRangeSlider;
  37041. var ref = self.params;
  37042. var sliderValue = ref.sliderValue;
  37043. var sliderValueEditable = ref.sliderValueEditable;
  37044. var rgb = value.rgb;
  37045. redRangeSlider.value = rgb[0];
  37046. greenRangeSlider.value = rgb[1];
  37047. blueRangeSlider.value = rgb[2];
  37048. redRangeSlider.layout();
  37049. greenRangeSlider.layout();
  37050. blueRangeSlider.layout();
  37051. redRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
  37052. greenRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
  37053. blueRangeSlider.$el[0].style.setProperty('--f7-range-knob-color', ("rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", " + (rgb[2]) + ")"));
  37054. var direction = app.rtl ? 'to left' : 'to right';
  37055. redRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(0, " + (rgb[1]) + ", " + (rgb[2]) + "), rgb(255, " + (rgb[1]) + ", " + (rgb[2]) + "))"));
  37056. greenRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(" + (rgb[0]) + ", 0, " + (rgb[2]) + "), rgb(" + (rgb[0]) + ", 255, " + (rgb[2]) + "))"));
  37057. blueRangeSlider.$el.find('.range-bar').css('background-image', ("linear-gradient(" + direction + ", rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 0), rgb(" + (rgb[0]) + ", " + (rgb[1]) + ", 255))"));
  37058. if (sliderValue && sliderValueEditable) {
  37059. self.$el.find('input.color-picker-value-red').val(rgb[0]);
  37060. self.$el.find('input.color-picker-value-green').val(rgb[1]);
  37061. self.$el.find('input.color-picker-value-blue').val(rgb[2]);
  37062. } else if (sliderValue) {
  37063. self.$el.find('span.color-picker-value-red').text(rgb[0]);
  37064. self.$el.find('span.color-picker-value-green').text(rgb[1]);
  37065. self.$el.find('span.color-picker-value-blue').text(rgb[2]);
  37066. }
  37067. },
  37068. destroy: function destroy(self) {
  37069. if (self.redRangeSlider && self.redRangeSlider.destroy) {
  37070. self.redRangeSlider.destroy();
  37071. }
  37072. if (self.greenRangeSlider && self.greenRangeSlider.destroy) {
  37073. self.greenRangeSlider.destroy();
  37074. }
  37075. if (self.blueRangeSlider && self.blueRangeSlider.destroy) {
  37076. self.blueRangeSlider.destroy();
  37077. }
  37078. delete self.redRangeSlider;
  37079. delete self.greenRangeSlider;
  37080. delete self.blueRangeSlider;
  37081. if (self.destroyRgbSlidersEvents) { self.destroyRgbSlidersEvents(); }
  37082. delete self.destroyRgbSlidersEvents;
  37083. },
  37084. };
  37085. var moduleSbSpectrum = {
  37086. render: function render() {
  37087. return "\n <div class=\"color-picker-module color-picker-module-sb-spectrum\">\n <div class=\"color-picker-sb-spectrum\" style=\"background-color: hsl(0, 100%, 50%)\">\n <div class=\"color-picker-sb-spectrum-handle\"></div>\n </div>\n </div>\n ";
  37088. },
  37089. init: function init(self) {
  37090. var app = self.app;
  37091. var isTouched;
  37092. var isMoved;
  37093. var touchStartX;
  37094. var touchStartY;
  37095. var touchCurrentX;
  37096. var touchCurrentY;
  37097. var specterRect;
  37098. var specterIsTouched;
  37099. var specterHandleIsTouched;
  37100. var $el = self.$el;
  37101. function setSBFromSpecterCoords(x, y) {
  37102. var s = (x - specterRect.left) / specterRect.width;
  37103. var b = (y - specterRect.top) / specterRect.height;
  37104. s = Math.max(0, Math.min(1, s));
  37105. b = 1 - Math.max(0, Math.min(1, b));
  37106. self.setValue({ hsb: [self.value.hue, s, b] });
  37107. }
  37108. function handleTouchStart(e) {
  37109. if (isMoved || isTouched) { return; }
  37110. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  37111. touchCurrentX = touchStartX;
  37112. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  37113. touchCurrentY = touchStartY;
  37114. var $targetEl = $(e.target);
  37115. specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
  37116. if (!specterHandleIsTouched) {
  37117. specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
  37118. }
  37119. if (specterIsTouched) {
  37120. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  37121. setSBFromSpecterCoords(touchStartX, touchStartY);
  37122. }
  37123. if (specterHandleIsTouched || specterIsTouched) {
  37124. $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
  37125. }
  37126. }
  37127. function handleTouchMove(e) {
  37128. if (!(specterIsTouched || specterHandleIsTouched)) { return; }
  37129. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  37130. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  37131. e.preventDefault();
  37132. if (!isMoved) {
  37133. // First move
  37134. isMoved = true;
  37135. if (specterHandleIsTouched) {
  37136. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  37137. }
  37138. }
  37139. if (specterIsTouched || specterHandleIsTouched) {
  37140. setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
  37141. }
  37142. }
  37143. function handleTouchEnd() {
  37144. isMoved = false;
  37145. if (specterIsTouched || specterHandleIsTouched) {
  37146. $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
  37147. }
  37148. specterIsTouched = false;
  37149. specterHandleIsTouched = false;
  37150. }
  37151. function handleResize() {
  37152. self.modules['sb-spectrum'].update(self);
  37153. }
  37154. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  37155. self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  37156. app.on('touchmove:active', handleTouchMove);
  37157. app.on('touchend:passive', handleTouchEnd);
  37158. app.on('resize', handleResize);
  37159. self.destroySpectrumEvents = function destroySpectrumEvents() {
  37160. self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  37161. app.off('touchmove:active', handleTouchMove);
  37162. app.off('touchend:passive', handleTouchEnd);
  37163. app.off('resize', handleResize);
  37164. };
  37165. },
  37166. update: function update(self) {
  37167. var value = self.value;
  37168. var hsl = value.hsl;
  37169. var hsb = value.hsb;
  37170. var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
  37171. var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
  37172. self.$el.find('.color-picker-sb-spectrum')
  37173. .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"));
  37174. self.$el.find('.color-picker-sb-spectrum-handle')
  37175. .css('background-color', ("hsl(" + (hsl[0]) + ", " + (hsl[1] * 100) + "%, " + (hsl[2] * 100) + "%)"))
  37176. .transform(("translate(" + (specterWidth * hsb[1]) + "px, " + (specterHeight * (1 - hsb[2])) + "px)"));
  37177. },
  37178. destroy: function destroy(self) {
  37179. if (self.destroySpectrumEvents) { self.destroySpectrumEvents(); }
  37180. delete self.destroySpectrumEvents;
  37181. },
  37182. };
  37183. var moduleHsSpectrum = {
  37184. render: function render() {
  37185. return "\n <div class=\"color-picker-module color-picker-module-hs-spectrum\">\n <div class=\"color-picker-hs-spectrum\">\n <div class=\"color-picker-hs-spectrum-handle\"></div>\n </div>\n </div>\n ";
  37186. },
  37187. init: function init(self) {
  37188. var app = self.app;
  37189. var isTouched;
  37190. var isMoved;
  37191. var touchStartX;
  37192. var touchStartY;
  37193. var touchCurrentX;
  37194. var touchCurrentY;
  37195. var specterRect;
  37196. var specterIsTouched;
  37197. var specterHandleIsTouched;
  37198. var $el = self.$el;
  37199. function setHSFromSpecterCoords(x, y) {
  37200. var h = (x - specterRect.left) / specterRect.width * 360;
  37201. var s = (y - specterRect.top) / specterRect.height;
  37202. h = Math.max(0, Math.min(360, h));
  37203. s = 1 - Math.max(0, Math.min(1, s));
  37204. self.setValue({ hsb: [h, s, self.value.hsb[2]] });
  37205. }
  37206. function handleTouchStart(e) {
  37207. if (isMoved || isTouched) { return; }
  37208. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  37209. touchCurrentX = touchStartX;
  37210. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  37211. touchCurrentY = touchStartY;
  37212. var $targetEl = $(e.target);
  37213. specterHandleIsTouched = $targetEl.closest('.color-picker-hs-spectrum-handle').length > 0;
  37214. if (!specterHandleIsTouched) {
  37215. specterIsTouched = $targetEl.closest('.color-picker-hs-spectrum').length > 0;
  37216. }
  37217. if (specterIsTouched) {
  37218. specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
  37219. setHSFromSpecterCoords(touchStartX, touchStartY);
  37220. }
  37221. if (specterHandleIsTouched || specterIsTouched) {
  37222. $el.find('.color-picker-hs-spectrum-handle').addClass('color-picker-hs-spectrum-handle-pressed');
  37223. }
  37224. }
  37225. function handleTouchMove(e) {
  37226. if (!(specterIsTouched || specterHandleIsTouched)) { return; }
  37227. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  37228. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  37229. e.preventDefault();
  37230. if (!isMoved) {
  37231. // First move
  37232. isMoved = true;
  37233. if (specterHandleIsTouched) {
  37234. specterRect = $el.find('.color-picker-hs-spectrum')[0].getBoundingClientRect();
  37235. }
  37236. }
  37237. if (specterIsTouched || specterHandleIsTouched) {
  37238. setHSFromSpecterCoords(touchCurrentX, touchCurrentY);
  37239. }
  37240. }
  37241. function handleTouchEnd() {
  37242. isMoved = false;
  37243. if (specterIsTouched || specterHandleIsTouched) {
  37244. $el.find('.color-picker-hs-spectrum-handle').removeClass('color-picker-hs-spectrum-handle-pressed');
  37245. }
  37246. specterIsTouched = false;
  37247. specterHandleIsTouched = false;
  37248. }
  37249. function handleResize() {
  37250. self.modules['hs-spectrum'].update(self);
  37251. }
  37252. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  37253. self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  37254. app.on('touchmove:active', handleTouchMove);
  37255. app.on('touchend:passive', handleTouchEnd);
  37256. app.on('resize', handleResize);
  37257. self.destroySpectrumEvents = function destroySpectrumEvents() {
  37258. self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  37259. app.off('touchmove:active', handleTouchMove);
  37260. app.off('touchend:passive', handleTouchEnd);
  37261. app.off('resize', handleResize);
  37262. };
  37263. },
  37264. update: function update(self) {
  37265. var value = self.value;
  37266. var hsb = value.hsb;
  37267. var specterWidth = self.$el.find('.color-picker-hs-spectrum')[0].offsetWidth;
  37268. var specterHeight = self.$el.find('.color-picker-hs-spectrum')[0].offsetHeight;
  37269. var hslBright = Utils.colorHsbToHsl(hsb[0], hsb[1], 1);
  37270. self.$el.find('.color-picker-hs-spectrum-handle')
  37271. .css('background-color', ("hsl(" + (hslBright[0]) + ", " + (hslBright[1] * 100) + "%, " + (hslBright[2] * 100) + "%)"))
  37272. .transform(("translate(" + (specterWidth * (hsb[0] / 360)) + "px, " + (specterHeight * (1 - hsb[1])) + "px)"));
  37273. },
  37274. destroy: function destroy(self) {
  37275. if (self.destroySpectrumEvents) { self.destroySpectrumEvents(); }
  37276. delete self.destroySpectrumEvents;
  37277. },
  37278. };
  37279. function svgWheelCircles() {
  37280. var total = 256;
  37281. var circles = '';
  37282. for (var i = total; i > 0; i -= 1) {
  37283. var angle = i * Math.PI / (total / 2);
  37284. var hue = 360 / total * i;
  37285. circles += "<circle cx=\"" + (150 - Math.sin(angle) * 125) + "\" cy=\"" + (150 - Math.cos(angle) * 125) + "\" r=\"25\" fill=\"hsl(" + hue + ", 100%, 50%)\"></circle>";
  37286. }
  37287. return circles;
  37288. }
  37289. var moduleWheel = {
  37290. render: function render() {
  37291. return ("\n <div class=\"color-picker-module color-picker-module-wheel\">\n <div class=\"color-picker-wheel\">\n <svg viewBox=\"0 0 300 300\" width=\"300\" height=\"300\">" + (svgWheelCircles()) + "</svg>\n <div class=\"color-picker-wheel-handle\"></div>\n <div class=\"color-picker-sb-spectrum\" style=\"background-color: hsl(0, 100%, 50%)\">\n <div class=\"color-picker-sb-spectrum-handle\"></div>\n </div>\n </div>\n </div>\n ");
  37292. },
  37293. init: function init(self) {
  37294. var app = self.app;
  37295. var isTouched;
  37296. var isMoved;
  37297. var touchStartX;
  37298. var touchStartY;
  37299. var touchCurrentX;
  37300. var touchCurrentY;
  37301. var wheelRect;
  37302. var wheelIsTouched;
  37303. var wheelHandleIsTouched;
  37304. var specterRect;
  37305. var specterIsTouched;
  37306. var specterHandleIsTouched;
  37307. var $el = self.$el;
  37308. function setHueFromWheelCoords(x, y) {
  37309. var wheelCenterX = wheelRect.left + wheelRect.width / 2;
  37310. var wheelCenterY = wheelRect.top + wheelRect.height / 2;
  37311. var angleRad = Math.atan2(y - wheelCenterY, x - wheelCenterX);
  37312. var angleDeg = angleRad * 180 / Math.PI + 90;
  37313. if (angleDeg < 0) { angleDeg += 360; }
  37314. angleDeg = 360 - angleDeg;
  37315. self.setValue({ hue: angleDeg });
  37316. }
  37317. function setSBFromSpecterCoords(x, y) {
  37318. var s = (x - specterRect.left) / specterRect.width;
  37319. var b = (y - specterRect.top) / specterRect.height;
  37320. s = Math.max(0, Math.min(1, s));
  37321. b = 1 - Math.max(0, Math.min(1, b));
  37322. self.setValue({ hsb: [self.value.hue, s, b] });
  37323. }
  37324. function handleTouchStart(e) {
  37325. if (isMoved || isTouched) { return; }
  37326. touchStartX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;
  37327. touchCurrentX = touchStartX;
  37328. touchStartY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;
  37329. touchCurrentY = touchStartY;
  37330. var $targetEl = $(e.target);
  37331. wheelHandleIsTouched = $targetEl.closest('.color-picker-wheel-handle').length > 0;
  37332. wheelIsTouched = $targetEl.closest('circle').length > 0;
  37333. specterHandleIsTouched = $targetEl.closest('.color-picker-sb-spectrum-handle').length > 0;
  37334. if (!specterHandleIsTouched) {
  37335. specterIsTouched = $targetEl.closest('.color-picker-sb-spectrum').length > 0;
  37336. }
  37337. if (wheelIsTouched) {
  37338. wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
  37339. setHueFromWheelCoords(touchStartX, touchStartY);
  37340. }
  37341. if (specterIsTouched) {
  37342. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  37343. setSBFromSpecterCoords(touchStartX, touchStartY);
  37344. }
  37345. if (specterHandleIsTouched || specterIsTouched) {
  37346. $el.find('.color-picker-sb-spectrum-handle').addClass('color-picker-sb-spectrum-handle-pressed');
  37347. }
  37348. }
  37349. function handleTouchMove(e) {
  37350. if (!(wheelIsTouched || wheelHandleIsTouched) && !(specterIsTouched || specterHandleIsTouched)) { return; }
  37351. touchCurrentX = e.type === 'touchmove' ? e.targetTouches[0].pageX : e.pageX;
  37352. touchCurrentY = e.type === 'touchmove' ? e.targetTouches[0].pageY : e.pageY;
  37353. e.preventDefault();
  37354. if (!isMoved) {
  37355. // First move
  37356. isMoved = true;
  37357. if (wheelHandleIsTouched) {
  37358. wheelRect = $el.find('.color-picker-wheel')[0].getBoundingClientRect();
  37359. }
  37360. if (specterHandleIsTouched) {
  37361. specterRect = $el.find('.color-picker-sb-spectrum')[0].getBoundingClientRect();
  37362. }
  37363. }
  37364. if (wheelIsTouched || wheelHandleIsTouched) {
  37365. setHueFromWheelCoords(touchCurrentX, touchCurrentY);
  37366. }
  37367. if (specterIsTouched || specterHandleIsTouched) {
  37368. setSBFromSpecterCoords(touchCurrentX, touchCurrentY);
  37369. }
  37370. }
  37371. function handleTouchEnd() {
  37372. isMoved = false;
  37373. if (specterIsTouched || specterHandleIsTouched) {
  37374. $el.find('.color-picker-sb-spectrum-handle').removeClass('color-picker-sb-spectrum-handle-pressed');
  37375. }
  37376. wheelIsTouched = false;
  37377. wheelHandleIsTouched = false;
  37378. specterIsTouched = false;
  37379. specterHandleIsTouched = false;
  37380. }
  37381. function handleResize() {
  37382. self.modules.wheel.update(self);
  37383. }
  37384. var passiveListener = app.touchEvents.start === 'touchstart' && app.support.passiveListener ? { passive: true, capture: false } : false;
  37385. self.$el.on(app.touchEvents.start, handleTouchStart, passiveListener);
  37386. app.on('touchmove:active', handleTouchMove);
  37387. app.on('touchend:passive', handleTouchEnd);
  37388. app.on('resize', handleResize);
  37389. self.destroyWheelEvents = function destroyWheelEvents() {
  37390. self.$el.off(app.touchEvents.start, handleTouchStart, passiveListener);
  37391. app.off('touchmove:active', handleTouchMove);
  37392. app.off('touchend:passive', handleTouchEnd);
  37393. app.off('resize', handleResize);
  37394. };
  37395. },
  37396. update: function update(self) {
  37397. var value = self.value;
  37398. var hsl = value.hsl;
  37399. var hsb = value.hsb;
  37400. var specterWidth = self.$el.find('.color-picker-sb-spectrum')[0].offsetWidth;
  37401. var specterHeight = self.$el.find('.color-picker-sb-spectrum')[0].offsetHeight;
  37402. var wheelSize = self.$el.find('.color-picker-wheel')[0].offsetWidth;
  37403. var wheelHalfSize = wheelSize / 2;
  37404. var angleRad = value.hue * Math.PI / 180;
  37405. var handleSize = wheelSize / 6;
  37406. var handleHalfSize = handleSize / 2;
  37407. var tX = wheelHalfSize - Math.sin(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
  37408. var tY = wheelHalfSize - Math.cos(angleRad) * (wheelHalfSize - handleHalfSize) - handleHalfSize;
  37409. self.$el.find('.color-picker-wheel-handle')
  37410. .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"))
  37411. .transform(("translate(" + tX + "px, " + tY + "px)"));
  37412. self.$el.find('.color-picker-sb-spectrum')
  37413. .css('background-color', ("hsl(" + (hsl[0]) + ", 100%, 50%)"));
  37414. self.$el.find('.color-picker-sb-spectrum-handle')
  37415. .css('background-color', ("hsl(" + (hsl[0]) + ", " + (hsl[1] * 100) + "%, " + (hsl[2] * 100) + "%)"))
  37416. .transform(("translate(" + (specterWidth * hsb[1]) + "px, " + (specterHeight * (1 - hsb[2])) + "px)"));
  37417. },
  37418. destroy: function destroy(self) {
  37419. if (self.destroyWheelEvents) { self.destroyWheelEvents(); }
  37420. delete self.destroyWheelEvents;
  37421. },
  37422. };
  37423. var ColorPicker = /*@__PURE__*/(function (Framework7Class) {
  37424. function ColorPicker(app, params) {
  37425. if ( params === void 0 ) params = {};
  37426. Framework7Class.call(this, params, [app]);
  37427. var self = this;
  37428. self.params = Utils.extend({}, app.params.colorPicker, params);
  37429. var $containerEl;
  37430. if (self.params.containerEl) {
  37431. $containerEl = $(self.params.containerEl);
  37432. if ($containerEl.length === 0) { return self; }
  37433. }
  37434. var $inputEl;
  37435. if (self.params.inputEl) {
  37436. $inputEl = $(self.params.inputEl);
  37437. }
  37438. var $targetEl;
  37439. if (self.params.targetEl) {
  37440. $targetEl = $(self.params.targetEl);
  37441. }
  37442. Utils.extend(self, {
  37443. app: app,
  37444. $containerEl: $containerEl,
  37445. containerEl: $containerEl && $containerEl[0],
  37446. inline: $containerEl && $containerEl.length > 0,
  37447. $inputEl: $inputEl,
  37448. inputEl: $inputEl && $inputEl[0],
  37449. $targetEl: $targetEl,
  37450. targetEl: $targetEl && $targetEl[0],
  37451. initialized: false,
  37452. opened: false,
  37453. url: self.params.url,
  37454. modules: {
  37455. 'alpha-slider': moduleAlphaSlider,
  37456. 'current-color': moduleCurrentColor,
  37457. 'hex': moduleHex, // eslint-disable-line
  37458. 'hsb-sliders': moduleHsbSliders,
  37459. 'hue-slider': moduleHueSlider,
  37460. 'brightness-slider': moduleBrightnessSlider,
  37461. 'palette': modulePalette, // eslint-disable-line
  37462. 'initial-current-colors': moduleInitialCurrentColors,
  37463. 'rgb-bars': moduleRgbBars,
  37464. 'rgb-sliders': moduleRgbSliders,
  37465. 'sb-spectrum': moduleSbSpectrum,
  37466. 'hs-spectrum': moduleHsSpectrum,
  37467. 'wheel': moduleWheel, // eslint-disable-line
  37468. },
  37469. });
  37470. function onInputClick() {
  37471. self.open();
  37472. }
  37473. function onInputFocus(e) {
  37474. e.preventDefault();
  37475. }
  37476. function onTargetClick() {
  37477. self.open();
  37478. }
  37479. function onHtmlClick(e) {
  37480. if (self.destroyed || !self.params) { return; }
  37481. if (self.params.openIn === 'page') { return; }
  37482. var $clickTargetEl = $(e.target);
  37483. if (!self.opened || self.closing) { return; }
  37484. if ($clickTargetEl.closest('[class*="backdrop"]').length) { return; }
  37485. if ($clickTargetEl.closest('.color-picker-popup, .color-picker-popover').length) { return; }
  37486. if ($inputEl && $inputEl.length > 0) {
  37487. if ($clickTargetEl[0] !== $inputEl[0] && $clickTargetEl.closest('.sheet-modal').length === 0) {
  37488. self.close();
  37489. }
  37490. } else if ($(e.target).closest('.sheet-modal').length === 0) {
  37491. self.close();
  37492. }
  37493. }
  37494. // Events
  37495. Utils.extend(self, {
  37496. attachInputEvents: function attachInputEvents() {
  37497. self.$inputEl.on('click', onInputClick);
  37498. if (self.params.inputReadOnly) {
  37499. self.$inputEl.on('focus mousedown', onInputFocus);
  37500. if (self.$inputEl[0]) {
  37501. self.$inputEl[0].f7ValidateReadonly = true;
  37502. }
  37503. }
  37504. },
  37505. detachInputEvents: function detachInputEvents() {
  37506. self.$inputEl.off('click', onInputClick);
  37507. if (self.params.inputReadOnly) {
  37508. self.$inputEl.off('focus mousedown', onInputFocus);
  37509. if (self.$inputEl[0]) {
  37510. delete self.$inputEl[0].f7ValidateReadonly;
  37511. }
  37512. }
  37513. },
  37514. attachTargetEvents: function attachTargetEvents() {
  37515. self.$targetEl.on('click', onTargetClick);
  37516. },
  37517. detachTargetEvents: function detachTargetEvents() {
  37518. self.$targetEl.off('click', onTargetClick);
  37519. },
  37520. attachHtmlEvents: function attachHtmlEvents() {
  37521. app.on('click', onHtmlClick);
  37522. },
  37523. detachHtmlEvents: function detachHtmlEvents() {
  37524. app.off('click', onHtmlClick);
  37525. },
  37526. });
  37527. self.init();
  37528. return self;
  37529. }
  37530. if ( Framework7Class ) ColorPicker.__proto__ = Framework7Class;
  37531. ColorPicker.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  37532. ColorPicker.prototype.constructor = ColorPicker;
  37533. var prototypeAccessors = { view: { configurable: true } };
  37534. prototypeAccessors.view.get = function () {
  37535. var ref = this;
  37536. var $inputEl = ref.$inputEl;
  37537. var $targetEl = ref.$targetEl;
  37538. var app = ref.app;
  37539. var params = ref.params;
  37540. var view;
  37541. if (params.view) {
  37542. view = params.view;
  37543. } else {
  37544. if ($inputEl) {
  37545. view = $inputEl.parents('.view').length && $inputEl.parents('.view')[0].f7View;
  37546. }
  37547. if (!view && $targetEl) {
  37548. view = $targetEl.parents('.view').length && $targetEl.parents('.view')[0].f7View;
  37549. }
  37550. }
  37551. if (!view) { view = app.views.main; }
  37552. return view;
  37553. };
  37554. ColorPicker.prototype.attachEvents = function attachEvents () {
  37555. var self = this;
  37556. self.centerModules = self.centerModules.bind(self);
  37557. if (self.params.centerModules) {
  37558. self.app.on('resize', self.centerModules);
  37559. }
  37560. };
  37561. ColorPicker.prototype.detachEvents = function detachEvents () {
  37562. var self = this;
  37563. if (self.params.centerModules) {
  37564. self.app.off('resize', self.centerModules);
  37565. }
  37566. };
  37567. ColorPicker.prototype.centerModules = function centerModules () {
  37568. var self = this;
  37569. if (!self.opened || !self.$el || self.inline) { return; }
  37570. var $pageContentEl = self.$el.find('.page-content');
  37571. if (!$pageContentEl.length) { return; }
  37572. var ref = $pageContentEl[0];
  37573. var scrollHeight = ref.scrollHeight;
  37574. var offsetHeight = ref.offsetHeight;
  37575. if (scrollHeight <= offsetHeight) {
  37576. $pageContentEl.addClass('justify-content-center');
  37577. } else {
  37578. $pageContentEl.removeClass('justify-content-center');
  37579. }
  37580. };
  37581. ColorPicker.prototype.initInput = function initInput () {
  37582. var self = this;
  37583. if (!self.$inputEl) { return; }
  37584. if (self.params.inputReadOnly) { self.$inputEl.prop('readOnly', true); }
  37585. };
  37586. ColorPicker.prototype.getModalType = function getModalType () {
  37587. var self = this;
  37588. var app = self.app;
  37589. var modal = self.modal;
  37590. var params = self.params;
  37591. var openIn = params.openIn;
  37592. var openInPhone = params.openInPhone;
  37593. if (modal && modal.type) { return modal.type; }
  37594. if (openIn !== 'auto') { return openIn; }
  37595. if (self.inline) { return null; }
  37596. if (app.device.ios) {
  37597. return app.device.ipad ? 'popover' : openInPhone;
  37598. }
  37599. if (app.width >= 768 || (app.device.desktop && app.theme === 'aurora')) {
  37600. return 'popover';
  37601. }
  37602. return openInPhone;
  37603. };
  37604. ColorPicker.prototype.formatValue = function formatValue () {
  37605. var self = this;
  37606. var value = self.value;
  37607. if (self.params.formatValue) {
  37608. return self.params.formatValue.call(self, value);
  37609. }
  37610. return value.hex;
  37611. };
  37612. // eslint-disable-next-line
  37613. ColorPicker.prototype.normalizeHsValues = function normalizeHsValues (arr) {
  37614. return [
  37615. Math.floor(arr[0] * 10) / 10,
  37616. Math.floor(arr[1] * 1000) / 1000,
  37617. Math.floor(arr[2] * 1000) / 1000 ];
  37618. };
  37619. ColorPicker.prototype.setValue = function setValue (value, updateModules) {
  37620. if ( value === void 0 ) value = {};
  37621. if ( updateModules === void 0 ) updateModules = true;
  37622. var self = this;
  37623. if (typeof value === 'undefined') { return; }
  37624. var ref = (self.value || {});
  37625. var hex = ref.hex;
  37626. var rgb = ref.rgb;
  37627. var hsl = ref.hsl;
  37628. var hsb = ref.hsb;
  37629. var alpha = ref.alpha; if ( alpha === void 0 ) alpha = 1;
  37630. var hue = ref.hue;
  37631. var rgba = ref.rgba;
  37632. var hsla = ref.hsla;
  37633. var needChangeEvent = self.value || (!self.value && !self.params.value);
  37634. var valueChanged;
  37635. Object.keys(value).forEach(function (k) {
  37636. if (!self.value || typeof self.value[k] === 'undefined') {
  37637. valueChanged = true;
  37638. return;
  37639. }
  37640. var v = value[k];
  37641. if (Array.isArray(v)) {
  37642. v.forEach(function (subV, subIndex) {
  37643. if (subV !== self.value[k][subIndex]) {
  37644. valueChanged = true;
  37645. }
  37646. });
  37647. } else if (v !== self.value[k]) {
  37648. valueChanged = true;
  37649. }
  37650. });
  37651. if (!valueChanged) { return; }
  37652. if (value.rgb || value.rgba) {
  37653. var ref$1 = (value.rgb || value.rgba);
  37654. var r = ref$1[0];
  37655. var g = ref$1[1];
  37656. var b = ref$1[2];
  37657. var a = ref$1[3]; if ( a === void 0 ) a = alpha;
  37658. rgb = [r, g, b];
  37659. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  37660. hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
  37661. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  37662. hsl = self.normalizeHsValues(hsl);
  37663. hsb = self.normalizeHsValues(hsb);
  37664. hue = hsb[0];
  37665. alpha = a;
  37666. rgba = [rgb[0], rgb[1], rgb[2], a];
  37667. hsla = [hsl[0], hsl[1], hsl[2], a];
  37668. }
  37669. if (value.hsl || value.hsla) {
  37670. var ref$2 = (value.hsl || value.hsla);
  37671. var h = ref$2[0];
  37672. var s = ref$2[1];
  37673. var l = ref$2[2];
  37674. var a$1 = ref$2[3]; if ( a$1 === void 0 ) a$1 = alpha;
  37675. hsl = [h, s, l];
  37676. rgb = Utils.colorHslToRgb.apply(Utils, hsl);
  37677. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  37678. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  37679. hsl = self.normalizeHsValues(hsl);
  37680. hsb = self.normalizeHsValues(hsb);
  37681. hue = hsb[0];
  37682. alpha = a$1;
  37683. rgba = [rgb[0], rgb[1], rgb[2], a$1];
  37684. hsla = [hsl[0], hsl[1], hsl[2], a$1];
  37685. }
  37686. if (value.hsb) {
  37687. var ref$3 = value.hsb;
  37688. var h$1 = ref$3[0];
  37689. var s$1 = ref$3[1];
  37690. var b$1 = ref$3[2];
  37691. var a$2 = ref$3[3]; if ( a$2 === void 0 ) a$2 = alpha;
  37692. hsb = [h$1, s$1, b$1];
  37693. hsl = Utils.colorHsbToHsl.apply(Utils, hsb);
  37694. rgb = Utils.colorHslToRgb.apply(Utils, hsl);
  37695. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  37696. hsl = self.normalizeHsValues(hsl);
  37697. hsb = self.normalizeHsValues(hsb);
  37698. hue = hsb[0];
  37699. alpha = a$2;
  37700. rgba = [rgb[0], rgb[1], rgb[2], a$2];
  37701. hsla = [hsl[0], hsl[1], hsl[2], a$2];
  37702. }
  37703. if (value.hex) {
  37704. rgb = Utils.colorHexToRgb(value.hex);
  37705. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  37706. hsl = Utils.colorRgbToHsl.apply(Utils, rgb);
  37707. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  37708. hsl = self.normalizeHsValues(hsl);
  37709. hsb = self.normalizeHsValues(hsb);
  37710. hue = hsb[0];
  37711. rgba = [rgb[0], rgb[1], rgb[2], alpha];
  37712. hsla = [hsl[0], hsl[1], hsl[2], alpha];
  37713. }
  37714. if (typeof value.alpha !== 'undefined') {
  37715. alpha = value.alpha;
  37716. if (typeof rgb !== 'undefined') {
  37717. rgba = [rgb[0], rgb[1], rgb[2], alpha];
  37718. }
  37719. if (typeof hsl !== 'undefined') {
  37720. hsla = [hsl[0], hsl[1], hsl[2], alpha];
  37721. }
  37722. }
  37723. if (typeof value.hue !== 'undefined') {
  37724. var h$2 = hsl[0];
  37725. var s$2 = hsl[1];
  37726. var l$1 = hsl[2]; // eslint-disable-line
  37727. hsl = [value.hue, s$2, l$1];
  37728. hsb = Utils.colorHslToHsb.apply(Utils, hsl);
  37729. rgb = Utils.colorHslToRgb.apply(Utils, hsl);
  37730. hex = Utils.colorRgbToHex.apply(Utils, rgb);
  37731. hsl = self.normalizeHsValues(hsl);
  37732. hsb = self.normalizeHsValues(hsb);
  37733. hue = hsb[0];
  37734. rgba = [rgb[0], rgb[1], rgb[2], alpha];
  37735. hsla = [hsl[0], hsl[1], hsl[2], alpha];
  37736. }
  37737. self.value = {
  37738. hex: hex,
  37739. alpha: alpha,
  37740. hue: hue,
  37741. rgb: rgb,
  37742. hsl: hsl,
  37743. hsb: hsb,
  37744. rgba: rgba,
  37745. hsla: hsla,
  37746. };
  37747. if (!self.initialValue) { self.initialValue = Utils.extend({}, self.value); }
  37748. self.updateValue(needChangeEvent);
  37749. if (self.opened && updateModules) {
  37750. self.updateModules();
  37751. }
  37752. };
  37753. ColorPicker.prototype.getValue = function getValue () {
  37754. var self = this;
  37755. return self.value;
  37756. };
  37757. ColorPicker.prototype.updateValue = function updateValue (fireEvents) {
  37758. if ( fireEvents === void 0 ) fireEvents = true;
  37759. var self = this;
  37760. var $inputEl = self.$inputEl;
  37761. var value = self.value;
  37762. var $targetEl = self.$targetEl;
  37763. if ($targetEl && self.params.targetElSetBackgroundColor) {
  37764. var rgba = value.rgba;
  37765. $targetEl.css('background-color', ("rgba(" + (rgba.join(', ')) + ")"));
  37766. }
  37767. if (fireEvents) {
  37768. self.emit('local::change colorPickerChange', self, value);
  37769. }
  37770. if ($inputEl && $inputEl.length) {
  37771. var inputValue = self.formatValue(value);
  37772. if ($inputEl && $inputEl.length) {
  37773. $inputEl.val(inputValue);
  37774. if (fireEvents) {
  37775. $inputEl.trigger('change');
  37776. }
  37777. }
  37778. }
  37779. };
  37780. ColorPicker.prototype.updateModules = function updateModules () {
  37781. var self = this;
  37782. var modules = self.modules;
  37783. self.params.modules.forEach(function (m) {
  37784. if (typeof m === 'string' && modules[m] && modules[m].update) {
  37785. modules[m].update(self);
  37786. } else if (m && m.update) {
  37787. m.update(self);
  37788. }
  37789. });
  37790. };
  37791. ColorPicker.prototype.update = function update () {
  37792. var self = this;
  37793. self.updateModules();
  37794. };
  37795. ColorPicker.prototype.renderPicker = function renderPicker () {
  37796. var self = this;
  37797. var params = self.params;
  37798. var modules = self.modules;
  37799. var html = '';
  37800. params.modules.forEach(function (m) {
  37801. if (typeof m === 'string' && modules[m] && modules[m].render) {
  37802. html += modules[m].render(self);
  37803. } else if (m && m.render) {
  37804. html += m.render(self);
  37805. }
  37806. });
  37807. return html;
  37808. };
  37809. ColorPicker.prototype.renderNavbar = function renderNavbar () {
  37810. var self = this;
  37811. if (self.params.renderNavbar) {
  37812. return self.params.renderNavbar.call(self, self);
  37813. }
  37814. var ref = self.params;
  37815. var openIn = ref.openIn;
  37816. var navbarTitleText = ref.navbarTitleText;
  37817. var navbarBackLinkText = ref.navbarBackLinkText;
  37818. var navbarCloseText = ref.navbarCloseText;
  37819. return ("\n <div class=\"navbar\">\n <div class=\"navbar-bg\"></div>\n <div class=\"navbar-inner sliding\">\n " + (openIn === 'page' ? ("\n <div class=\"left\">\n <a class=\"link back\">\n <i class=\"icon icon-back\"></i>\n <span class=\"if-not-md\">" + navbarBackLinkText + "</span>\n </a>\n </div>\n ") : '') + "\n <div class=\"title\">" + navbarTitleText + "</div>\n " + (openIn !== 'page' ? ("\n <div class=\"right\">\n <a class=\"link popup-close\" data-popup=\".color-picker-popup\">" + navbarCloseText + "</a>\n </div>\n ") : '') + "\n </div>\n </div>\n ").trim();
  37820. };
  37821. ColorPicker.prototype.renderToolbar = function renderToolbar () {
  37822. var self = this;
  37823. if (self.params.renderToolbar) {
  37824. return self.params.renderToolbar.call(self, self);
  37825. }
  37826. return ("\n <div class=\"toolbar toolbar-top no-shadow\">\n <div class=\"toolbar-inner\">\n <div class=\"left\"></div>\n <div class=\"right\">\n <a class=\"link sheet-close popover-close\" data-sheet=\".color-picker-sheet-modal\" data-popover=\".color-picker-popover\">" + (self.params.toolbarCloseText) + "</a>\n </div>\n </div>\n </div>\n ").trim();
  37827. };
  37828. ColorPicker.prototype.renderInline = function renderInline () {
  37829. var self = this;
  37830. var ref = self.params;
  37831. var cssClass = ref.cssClass;
  37832. var groupedModules = ref.groupedModules;
  37833. var inlineHtml = ("\n <div class=\"color-picker color-picker-inline " + (groupedModules ? 'color-picker-grouped-modules' : '') + " " + (cssClass || '') + "\">\n " + (self.renderPicker()) + "\n </div>\n ").trim();
  37834. return inlineHtml;
  37835. };
  37836. ColorPicker.prototype.renderSheet = function renderSheet () {
  37837. var self = this;
  37838. var ref = self.params;
  37839. var cssClass = ref.cssClass;
  37840. var toolbarSheet = ref.toolbarSheet;
  37841. var groupedModules = ref.groupedModules;
  37842. var sheetHtml = ("\n <div class=\"sheet-modal color-picker color-picker-sheet-modal " + (groupedModules ? 'color-picker-grouped-modules' : '') + " " + (cssClass || '') + "\">\n " + (toolbarSheet ? self.renderToolbar() : '') + "\n <div class=\"sheet-modal-inner\">\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n ").trim();
  37843. return sheetHtml;
  37844. };
  37845. ColorPicker.prototype.renderPopover = function renderPopover () {
  37846. var self = this;
  37847. var ref = self.params;
  37848. var cssClass = ref.cssClass;
  37849. var toolbarPopover = ref.toolbarPopover;
  37850. var groupedModules = ref.groupedModules;
  37851. var popoverHtml = ("\n <div class=\"popover color-picker-popover " + (cssClass || '') + "\">\n <div class=\"popover-inner\">\n <div class=\"color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '') + "\">\n " + (toolbarPopover ? self.renderToolbar() : '') + "\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n </div>\n ").trim();
  37852. return popoverHtml;
  37853. };
  37854. ColorPicker.prototype.renderPopup = function renderPopup () {
  37855. var self = this;
  37856. var ref = self.params;
  37857. var cssClass = ref.cssClass;
  37858. var navbarPopup = ref.navbarPopup;
  37859. var groupedModules = ref.groupedModules;
  37860. var popupHtml = ("\n <div class=\"popup color-picker-popup " + (cssClass || '') + "\">\n <div class=\"page\">\n " + (navbarPopup ? self.renderNavbar() : '') + "\n <div class=\"color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '') + "\">\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n </div>\n ").trim();
  37861. return popupHtml;
  37862. };
  37863. ColorPicker.prototype.renderPage = function renderPage () {
  37864. var self = this;
  37865. var ref = self.params;
  37866. var cssClass = ref.cssClass;
  37867. var groupedModules = ref.groupedModules;
  37868. var pageHtml = ("\n <div class=\"page color-picker-page " + (cssClass || '') + "\" data-name=\"color-picker-page\">\n " + (self.renderNavbar()) + "\n <div class=\"color-picker " + (groupedModules ? 'color-picker-grouped-modules' : '') + "\">\n <div class=\"page-content\">\n " + (self.renderPicker()) + "\n </div>\n </div>\n </div>\n ").trim();
  37869. return pageHtml;
  37870. };
  37871. // eslint-disable-next-line
  37872. ColorPicker.prototype.render = function render () {
  37873. var self = this;
  37874. var params = self.params;
  37875. if (params.render) { return params.render.call(self); }
  37876. if (self.inline) { return self.renderInline(); }
  37877. if (params.openIn === 'page') {
  37878. return self.renderPage();
  37879. }
  37880. var modalType = self.getModalType();
  37881. if (modalType === 'popover') { return self.renderPopover(); }
  37882. if (modalType === 'sheet') { return self.renderSheet(); }
  37883. if (modalType === 'popup') { return self.renderPopup(); }
  37884. };
  37885. ColorPicker.prototype.onOpen = function onOpen () {
  37886. var self = this;
  37887. var initialized = self.initialized;
  37888. var $el = self.$el;
  37889. var app = self.app;
  37890. var $inputEl = self.$inputEl;
  37891. var inline = self.inline;
  37892. var value = self.value;
  37893. var params = self.params;
  37894. var modules = self.modules;
  37895. self.closing = false;
  37896. self.opened = true;
  37897. self.opening = true;
  37898. // Init main events
  37899. self.attachEvents();
  37900. params.modules.forEach(function (m) {
  37901. if (typeof m === 'string' && modules[m] && modules[m].init) {
  37902. modules[m].init(self);
  37903. } else if (m && m.init) {
  37904. m.init(self);
  37905. }
  37906. });
  37907. var updateValue = !value && params.value;
  37908. // Set value
  37909. if (!initialized) {
  37910. if (value) { self.setValue(value); }
  37911. else if (params.value) {
  37912. self.setValue(params.value, false);
  37913. } else if (!params.value) {
  37914. self.setValue({ hex: '#ff0000' }, false);
  37915. }
  37916. } else if (value) {
  37917. self.initialValue = Utils.extend({}, value);
  37918. self.setValue(value, false);
  37919. }
  37920. // Update input value
  37921. if (updateValue) { self.updateValue(); }
  37922. self.updateModules();
  37923. // Center modules
  37924. if (params.centerModules) {
  37925. self.centerModules();
  37926. }
  37927. // Extra focus
  37928. if (!inline && $inputEl && $inputEl.length && app.theme === 'md') {
  37929. $inputEl.trigger('focus');
  37930. }
  37931. self.initialized = true;
  37932. // Trigger events
  37933. if ($el) {
  37934. $el.trigger('colorpicker:open');
  37935. }
  37936. if ($inputEl) {
  37937. $inputEl.trigger('colorpicker:open');
  37938. }
  37939. self.emit('local::open colorPickerOpen', self);
  37940. };
  37941. ColorPicker.prototype.onOpened = function onOpened () {
  37942. var self = this;
  37943. self.opening = false;
  37944. if (self.$el) {
  37945. self.$el.trigger('colorpicker:opened');
  37946. }
  37947. if (self.$inputEl) {
  37948. self.$inputEl.trigger('colorpicker:opened');
  37949. }
  37950. self.emit('local::opened colorPickerOpened', self);
  37951. };
  37952. ColorPicker.prototype.onClose = function onClose () {
  37953. var self = this;
  37954. var app = self.app;
  37955. var params = self.params;
  37956. var modules = self.modules;
  37957. self.opening = false;
  37958. self.closing = true;
  37959. // Detach events
  37960. self.detachEvents();
  37961. if (self.$inputEl) {
  37962. if (app.theme === 'md') {
  37963. self.$inputEl.trigger('blur');
  37964. } else {
  37965. var validate = self.$inputEl.attr('validate');
  37966. var required = self.$inputEl.attr('required');
  37967. if (validate && required) {
  37968. app.input.validate(self.$inputEl);
  37969. }
  37970. }
  37971. }
  37972. params.modules.forEach(function (m) {
  37973. if (typeof m === 'string' && modules[m] && modules[m].destroy) {
  37974. modules[m].destroy(self);
  37975. } else if (m && m.destroy) {
  37976. m.destroy(self);
  37977. }
  37978. });
  37979. if (self.$el) {
  37980. self.$el.trigger('colorpicker:close');
  37981. }
  37982. if (self.$inputEl) {
  37983. self.$inputEl.trigger('colorpicker:close');
  37984. }
  37985. self.emit('local::close colorPickerClose', self);
  37986. };
  37987. ColorPicker.prototype.onClosed = function onClosed () {
  37988. var self = this;
  37989. self.opened = false;
  37990. self.closing = false;
  37991. if (!self.inline) {
  37992. Utils.nextTick(function () {
  37993. if (self.modal && self.modal.el && self.modal.destroy) {
  37994. if (!self.params.routableModals) {
  37995. self.modal.destroy();
  37996. }
  37997. }
  37998. delete self.modal;
  37999. });
  38000. }
  38001. if (self.$el) {
  38002. self.$el.trigger('colorpicker:closed');
  38003. }
  38004. if (self.$inputEl) {
  38005. self.$inputEl.trigger('colorpicker:closed');
  38006. }
  38007. self.emit('local::closed colorPickerClosed', self);
  38008. };
  38009. ColorPicker.prototype.open = function open () {
  38010. var obj;
  38011. var self = this;
  38012. var app = self.app;
  38013. var opened = self.opened;
  38014. var inline = self.inline;
  38015. var $inputEl = self.$inputEl;
  38016. var $targetEl = self.$targetEl;
  38017. var params = self.params;
  38018. if (opened) { return; }
  38019. if (inline) {
  38020. self.$el = $(self.render());
  38021. self.$el[0].f7ColorPicker = self;
  38022. self.$containerEl.append(self.$el);
  38023. self.onOpen();
  38024. self.onOpened();
  38025. return;
  38026. }
  38027. var colorPickerContent = self.render();
  38028. if (params.openIn === 'page') {
  38029. self.view.router.navigate({
  38030. url: self.url,
  38031. route: {
  38032. content: colorPickerContent,
  38033. path: self.url,
  38034. on: {
  38035. pageBeforeIn: function pageBeforeIn(e, page) {
  38036. self.$el = page.$el.find('.color-picker');
  38037. self.$el[0].f7ColorPicker = self;
  38038. self.onOpen();
  38039. },
  38040. pageAfterIn: function pageAfterIn() {
  38041. self.onOpened();
  38042. },
  38043. pageBeforeOut: function pageBeforeOut() {
  38044. self.onClose();
  38045. },
  38046. pageAfterOut: function pageAfterOut() {
  38047. self.onClosed();
  38048. if (self.$el && self.$el[0]) {
  38049. self.$el[0].f7ColorPicker = null;
  38050. delete self.$el[0].f7ColorPicker;
  38051. }
  38052. },
  38053. },
  38054. },
  38055. });
  38056. } else {
  38057. var modalType = self.getModalType();
  38058. var backdrop = params.backdrop;
  38059. if (backdrop === null || typeof backdrop === 'undefined') {
  38060. if (modalType === 'popover' && app.params.popover.backdrop !== false) { backdrop = true; }
  38061. if (modalType === 'popup') { backdrop = true; }
  38062. }
  38063. var modalParams = {
  38064. targetEl: ($targetEl || $inputEl),
  38065. scrollToEl: params.scrollToInput ? ($targetEl || $inputEl) : undefined,
  38066. content: colorPickerContent,
  38067. backdrop: backdrop,
  38068. closeByBackdropClick: params.closeByBackdropClick,
  38069. on: {
  38070. open: function open() {
  38071. var modal = this;
  38072. self.modal = modal;
  38073. self.$el = modalType === 'popover' || modalType === 'popup' ? modal.$el.find('.color-picker') : modal.$el;
  38074. self.$el[0].f7ColorPicker = self;
  38075. self.onOpen();
  38076. },
  38077. opened: function opened() { self.onOpened(); },
  38078. close: function close() { self.onClose(); },
  38079. closed: function closed() {
  38080. self.onClosed();
  38081. if (self.$el && self.$el[0]) {
  38082. self.$el[0].f7ColorPicker = null;
  38083. delete self.$el[0].f7ColorPicker;
  38084. }
  38085. },
  38086. },
  38087. };
  38088. if (modalType === 'popup') {
  38089. modalParams.push = params.popupPush;
  38090. modalParams.swipeToClose = params.popupSwipeToClose;
  38091. }
  38092. if (modalType === 'sheet') {
  38093. modalParams.push = params.sheetPush;
  38094. modalParams.swipeToClose = params.sheetSwipeToClose;
  38095. }
  38096. if (params.routableModals && self.view) {
  38097. self.view.router.navigate({
  38098. url: self.url,
  38099. route: ( obj = {
  38100. path: self.url
  38101. }, obj[modalType] = modalParams, obj ),
  38102. });
  38103. } else {
  38104. self.modal = app[modalType].create(modalParams);
  38105. self.modal.open();
  38106. }
  38107. }
  38108. };
  38109. ColorPicker.prototype.close = function close () {
  38110. var self = this;
  38111. var opened = self.opened;
  38112. var inline = self.inline;
  38113. if (!opened) { return; }
  38114. if (inline) {
  38115. self.onClose();
  38116. self.onClosed();
  38117. return;
  38118. }
  38119. if ((self.params.routableModals && self.view) || self.params.openIn === 'page') {
  38120. self.view.router.back();
  38121. } else {
  38122. self.modal.close();
  38123. }
  38124. };
  38125. ColorPicker.prototype.init = function init () {
  38126. var self = this;
  38127. self.initInput();
  38128. if (self.inline) {
  38129. self.open();
  38130. self.emit('local::init colorPickerInit', self);
  38131. return;
  38132. }
  38133. if (!self.initialized && self.params.value) {
  38134. self.setValue(self.params.value);
  38135. }
  38136. // Attach input Events
  38137. if (self.$inputEl) {
  38138. self.attachInputEvents();
  38139. }
  38140. if (self.$targetEl) {
  38141. self.attachTargetEvents();
  38142. }
  38143. if (self.params.closeByOutsideClick) {
  38144. self.attachHtmlEvents();
  38145. }
  38146. self.emit('local::init colorPickerInit', self);
  38147. };
  38148. ColorPicker.prototype.destroy = function destroy () {
  38149. var self = this;
  38150. if (self.destroyed) { return; }
  38151. var $el = self.$el;
  38152. self.emit('local::beforeDestroy colorPickerBeforeDestroy', self);
  38153. if ($el) { $el.trigger('colorpicker:beforedestroy'); }
  38154. self.close();
  38155. // Detach Events
  38156. self.detachEvents();
  38157. if (self.$inputEl) {
  38158. self.detachInputEvents();
  38159. }
  38160. if (self.$targetEl) {
  38161. self.detachTargetEvents();
  38162. }
  38163. if (self.params.closeByOutsideClick) {
  38164. self.detachHtmlEvents();
  38165. }
  38166. if ($el && $el.length) { delete self.$el[0].f7ColorPicker; }
  38167. Utils.deleteProps(self);
  38168. self.destroyed = true;
  38169. };
  38170. Object.defineProperties( ColorPicker.prototype, prototypeAccessors );
  38171. return ColorPicker;
  38172. }(Framework7Class));
  38173. var ColorPicker$1 = {
  38174. name: 'colorPicker',
  38175. static: {
  38176. ColorPicker: ColorPicker,
  38177. },
  38178. create: function create() {
  38179. var app = this;
  38180. app.colorPicker = ConstructorMethods({
  38181. defaultSelector: '.color-picker',
  38182. constructor: ColorPicker,
  38183. app: app,
  38184. domProp: 'f7ColorPicker',
  38185. });
  38186. app.colorPicker.close = function close(el) {
  38187. if ( el === void 0 ) el = '.color-picker';
  38188. var $el = $(el);
  38189. if ($el.length === 0) { return; }
  38190. var colorPicker = $el[0].f7ColorPicker;
  38191. if (!colorPicker || (colorPicker && !colorPicker.opened)) { return; }
  38192. colorPicker.close();
  38193. };
  38194. },
  38195. params: {
  38196. colorPicker: {
  38197. // Color picker settings
  38198. value: null,
  38199. modules: [
  38200. 'wheel' ],
  38201. palette: [
  38202. ['#FFEBEE', '#FFCDD2', '#EF9A9A', '#E57373', '#EF5350', '#F44336', '#E53935', '#D32F2F', '#C62828', '#B71C1C'],
  38203. ['#F3E5F5', '#E1BEE7', '#CE93D8', '#BA68C8', '#AB47BC', '#9C27B0', '#8E24AA', '#7B1FA2', '#6A1B9A', '#4A148C'],
  38204. ['#E8EAF6', '#C5CAE9', '#9FA8DA', '#7986CB', '#5C6BC0', '#3F51B5', '#3949AB', '#303F9F', '#283593', '#1A237E'],
  38205. ['#E1F5FE', '#B3E5FC', '#81D4FA', '#4FC3F7', '#29B6F6', '#03A9F4', '#039BE5', '#0288D1', '#0277BD', '#01579B'],
  38206. ['#E0F2F1', '#B2DFDB', '#80CBC4', '#4DB6AC', '#26A69A', '#009688', '#00897B', '#00796B', '#00695C', '#004D40'],
  38207. ['#F1F8E9', '#DCEDC8', '#C5E1A5', '#AED581', '#9CCC65', '#8BC34A', '#7CB342', '#689F38', '#558B2F', '#33691E'],
  38208. ['#FFFDE7', '#FFF9C4', '#FFF59D', '#FFF176', '#FFEE58', '#FFEB3B', '#FDD835', '#FBC02D', '#F9A825', '#F57F17'],
  38209. ['#FFF3E0', '#FFE0B2', '#FFCC80', '#FFB74D', '#FFA726', '#FF9800', '#FB8C00', '#F57C00', '#EF6C00', '#E65100'] ],
  38210. groupedModules: false,
  38211. centerModules: true,
  38212. sliderLabel: false,
  38213. sliderValue: false,
  38214. sliderValueEdiable: false,
  38215. barLabel: false,
  38216. barValue: false,
  38217. barValueEdiable: false,
  38218. hexLabel: false,
  38219. hexValueEditable: false,
  38220. redLabelText: 'R',
  38221. greenLabelText: 'G',
  38222. blueLabelText: 'B',
  38223. hueLabelText: 'H',
  38224. saturationLabelText: 'S',
  38225. brightnessLabelText: 'B',
  38226. hexLabelText: 'HEX',
  38227. alphaLabelText: 'A',
  38228. // Common opener settings
  38229. containerEl: null,
  38230. openIn: 'popover', // or 'popover' or 'sheet' or 'popup' or 'page' or 'auto'
  38231. openInPhone: 'popup', // or 'popover' or 'sheet' or 'popup' or 'page'
  38232. popupPush: false,
  38233. popupSwipeToClose: undefined,
  38234. sheetPush: false,
  38235. sheetSwipeToClose: undefined,
  38236. formatValue: null,
  38237. targetEl: null,
  38238. targetElSetBackgroundColor: false,
  38239. inputEl: null,
  38240. inputReadOnly: true,
  38241. closeByOutsideClick: true,
  38242. scrollToInput: true,
  38243. toolbarSheet: true,
  38244. toolbarPopover: false,
  38245. toolbarCloseText: 'Done',
  38246. navbarPopup: true,
  38247. navbarCloseText: 'Done',
  38248. navbarTitleText: 'Color',
  38249. navbarBackLinkText: 'Back',
  38250. cssClass: null,
  38251. routableModals: true,
  38252. view: null,
  38253. url: 'color/',
  38254. backdrop: null,
  38255. closeByBackdropClick: true,
  38256. // Render functions
  38257. renderToolbar: null,
  38258. renderNavbar: null,
  38259. renderInline: null,
  38260. renderPopover: null,
  38261. renderSheet: null,
  38262. renderPopup: null,
  38263. render: null,
  38264. },
  38265. },
  38266. };
  38267. var Treeview = {
  38268. open: function open(itemEl) {
  38269. var app = this;
  38270. var $itemEl = $(itemEl).eq(0);
  38271. if (!$itemEl.length) { return; }
  38272. $itemEl.addClass('treeview-item-opened');
  38273. $itemEl.trigger('treeview:open');
  38274. app.emit('treeviewOpen', $itemEl[0]);
  38275. function done(cancel) {
  38276. if (cancel) {
  38277. $itemEl.removeClass('treeview-item-opened');
  38278. $itemEl.trigger('treeview:close');
  38279. app.emit('treeviewClose', $itemEl[0]);
  38280. } else {
  38281. $itemEl[0].f7TreeviewChildrenLoaded = true;
  38282. }
  38283. $itemEl.find('.treeview-toggle').removeClass('treeview-toggle-hidden');
  38284. $itemEl.find('.treeview-preloader').remove();
  38285. }
  38286. if ($itemEl.hasClass('treeview-load-children') && !$itemEl[0].f7TreeviewChildrenLoaded) {
  38287. $itemEl.trigger('treeview:loadchildren', done);
  38288. app.emit('treeviewLoadChildren', $itemEl[0], done);
  38289. $itemEl.find('.treeview-toggle').addClass('treeview-toggle-hidden');
  38290. $itemEl.find('.treeview-item-root').prepend(("<div class=\"preloader treeview-preloader\">" + (Utils[((app.theme) + "PreloaderContent")]) + "</div>"));
  38291. }
  38292. },
  38293. close: function close(itemEl) {
  38294. var app = this;
  38295. var $itemEl = $(itemEl).eq(0);
  38296. if (!$itemEl.length) { return; }
  38297. $itemEl.removeClass('treeview-item-opened');
  38298. $itemEl.trigger('treeview:close');
  38299. app.emit('treeviewClose', $itemEl[0]);
  38300. },
  38301. toggle: function toggle(itemEl) {
  38302. var app = this;
  38303. var $itemEl = $(itemEl).eq(0);
  38304. if (!$itemEl.length) { return; }
  38305. var wasOpened = $itemEl.hasClass('treeview-item-opened');
  38306. app.treeview[wasOpened ? 'close' : 'open']($itemEl);
  38307. },
  38308. };
  38309. var Treeview$1 = {
  38310. name: 'treeview',
  38311. create: function create() {
  38312. var app = this;
  38313. Utils.extend(app, {
  38314. treeview: {
  38315. open: Treeview.open.bind(app),
  38316. close: Treeview.close.bind(app),
  38317. toggle: Treeview.toggle.bind(app),
  38318. },
  38319. });
  38320. },
  38321. clicks: {
  38322. '.treeview-toggle': function toggle($clickedEl, clickedData, e) {
  38323. var app = this;
  38324. if ($clickedEl.parents('.treeview-item-toggle').length) { return; }
  38325. var $treeviewItemEl = $clickedEl.parents('.treeview-item').eq(0);
  38326. if (!$treeviewItemEl.length) { return; }
  38327. e.preventF7Router = true;
  38328. app.treeview.toggle($treeviewItemEl[0]);
  38329. },
  38330. '.treeview-item-toggle': function toggle($clickedEl, clickedData, e) {
  38331. var app = this;
  38332. var $treeviewItemEl = $clickedEl.closest('.treeview-item').eq(0);
  38333. if (!$treeviewItemEl.length) { return; }
  38334. e.preventF7Router = true;
  38335. app.treeview.toggle($treeviewItemEl[0]);
  38336. },
  38337. },
  38338. };
  38339. var textEditorButtonsMap = {
  38340. // f7-icon, material-icon, command
  38341. bold: ['bold', 'format_bold', 'bold'],
  38342. italic: ['italic', 'format_italic', 'italic'],
  38343. underline: ['underline', 'format_underlined', 'underline'],
  38344. strikeThrough: ['strikethrough', 'strikethrough_s', 'strikeThrough'],
  38345. orderedList: ['list_number', 'format_list_numbered', 'insertOrderedList'],
  38346. unorderedList: ['list_bullet', 'format_list_bulleted', 'insertUnorderedList'],
  38347. link: ['link', 'link', 'createLink'],
  38348. image: ['photo', 'image', 'insertImage'],
  38349. paragraph: ['paragraph', '<i class="icon">¶</i>', 'formatBlock.P'],
  38350. h1: ['<i class="icon">H<sub>1</sub></i>', '<i class="icon">H<sub>1</sub></i>', 'formatBlock.H1'],
  38351. h2: ['<i class="icon">H<sub>2</sub></i>', '<i class="icon">H<sub>2</sub></i>', 'formatBlock.H2'],
  38352. h3: ['<i class="icon">H<sub>3</sub></i>', '<i class="icon">H<sub>3</sub></i>', 'formatBlock.H3'],
  38353. alignLeft: ['text_alignleft', 'format_align_left', 'justifyLeft'],
  38354. alignCenter: ['text_aligncenter', 'format_align_center', 'justifyCenter'],
  38355. alignRight: ['text_alignright', 'format_align_right', 'justifyRight'],
  38356. alignJustify: ['text_justify', 'format_align_justify', 'justifyFull'],
  38357. subscript: ['textformat_subscript', '<i class="icon">A<sub>1</sub></i>', 'subscript'],
  38358. superscript: ['textformat_superscript', '<i class="icon">A<sup>1</sup></i>', 'superscript'],
  38359. indent: ['increase_indent', 'format_indent_increase', 'indent'],
  38360. outdent: ['decrease_indent', 'format_indent_decrease', 'outdent'],
  38361. };
  38362. var TextEditor = /*@__PURE__*/(function (Framework7Class) {
  38363. function TextEditor(app, params) {
  38364. Framework7Class.call(this, params, [app]);
  38365. var self = this;
  38366. var defaults = Utils.extend({}, app.params.textEditor);
  38367. // Extend defaults with modules params
  38368. self.useModulesParams(defaults);
  38369. self.params = Utils.extend(defaults, params);
  38370. var el = self.params.el;
  38371. if (!el) { return self; }
  38372. var $el = $(el);
  38373. if ($el.length === 0) { return self; }
  38374. if ($el[0].f7TextEditor) { return $el[0].f7TextEditor; }
  38375. var $contentEl = $el.children('.text-editor-content');
  38376. if (!$contentEl.length) {
  38377. $el.append('<div class="text-editor-content" contenteditable></div>');
  38378. $contentEl = $el.children('.text-editor-content');
  38379. }
  38380. Utils.extend(self, {
  38381. app: app,
  38382. $el: $el,
  38383. el: $el[0],
  38384. $contentEl: $contentEl,
  38385. contentEl: $contentEl[0],
  38386. });
  38387. if ('value' in params) {
  38388. self.value = self.params.value;
  38389. }
  38390. if (self.params.mode === 'keyboard-toolbar') {
  38391. if (!app.device.cordova && !app.device.android) {
  38392. self.params.mode = 'popover';
  38393. }
  38394. }
  38395. if (typeof self.params.buttons === 'string') {
  38396. try {
  38397. self.params.buttons = JSON.parse(self.params.buttons);
  38398. } catch (err) {
  38399. throw new Error('Framework7: TextEditor: wrong "buttons" parameter format');
  38400. }
  38401. }
  38402. $el[0].f7TextEditor = self;
  38403. // Bind
  38404. self.onButtonClick = self.onButtonClick.bind(self);
  38405. self.onFocus = self.onFocus.bind(self);
  38406. self.onBlur = self.onBlur.bind(self);
  38407. self.onInput = self.onInput.bind(self);
  38408. self.onPaste = self.onPaste.bind(self);
  38409. self.onSelectionChange = self.onSelectionChange.bind(self);
  38410. self.closeKeyboardToolbar = self.closeKeyboardToolbar.bind(self);
  38411. // Handle Events
  38412. self.attachEvents = function attachEvents() {
  38413. if (self.params.mode === 'toolbar') {
  38414. self.$el.find('.text-editor-toolbar').on('click', 'button', self.onButtonClick);
  38415. }
  38416. if (self.params.mode === 'keyboard-toolbar') {
  38417. self.$keyboardToolbarEl.on('click', 'button', self.onButtonClick);
  38418. self.$el.parents('.page').on('page:beforeout', self.closeKeyboardToolbar);
  38419. }
  38420. if (self.params.mode === 'popover' && self.popover) {
  38421. self.popover.$el.on('click', 'button', self.onButtonClick);
  38422. }
  38423. self.$contentEl.on('paste', self.onPaste);
  38424. self.$contentEl.on('focus', self.onFocus);
  38425. self.$contentEl.on('blur', self.onBlur);
  38426. self.$contentEl.on('input', self.onInput, true);
  38427. $(doc).on('selectionchange', self.onSelectionChange);
  38428. };
  38429. self.detachEvents = function detachEvents() {
  38430. if (self.params.mode === 'toolbar') {
  38431. self.$el.find('.text-editor-toolbar').off('click', 'button', self.onButtonClick);
  38432. }
  38433. if (self.params.mode === 'keyboard-toolbar') {
  38434. self.$keyboardToolbarEl.off('click', 'button', self.onButtonClick);
  38435. self.$el.parents('.page').off('page:beforeout', self.closeKeyboardToolbar);
  38436. }
  38437. if (self.params.mode === 'popover' && self.popover) {
  38438. self.popover.$el.off('click', 'button', self.onButtonClick);
  38439. }
  38440. self.$contentEl.off('paste', self.onPaste);
  38441. self.$contentEl.off('focus', self.onFocus);
  38442. self.$contentEl.off('blur', self.onBlur);
  38443. self.$contentEl.off('input', self.onInput, true);
  38444. $(doc).off('selectionchange', self.onSelectionChange);
  38445. };
  38446. // Install Modules
  38447. self.useModules();
  38448. // Init
  38449. self.init();
  38450. return self;
  38451. }
  38452. if ( Framework7Class ) TextEditor.__proto__ = Framework7Class;
  38453. TextEditor.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  38454. TextEditor.prototype.constructor = TextEditor;
  38455. TextEditor.prototype.setValue = function setValue (newValue) {
  38456. var self = this;
  38457. var currentValue = self.value;
  38458. if (currentValue === newValue) { return self; }
  38459. self.value = newValue;
  38460. self.$contentEl.html(newValue);
  38461. self.$el.trigger('texteditor:change', self.value);
  38462. self.emit('local::change textEditorChange', self, self.value);
  38463. return self;
  38464. };
  38465. TextEditor.prototype.getValue = function getValue () {
  38466. var self = this;
  38467. return self.value;
  38468. };
  38469. TextEditor.prototype.createLink = function createLink () {
  38470. var self = this;
  38471. var currentSelection = win.getSelection();
  38472. var selectedNodes = [];
  38473. var $selectedLinks;
  38474. if (currentSelection && currentSelection.anchorNode && $(currentSelection.anchorNode).parents(self.$el).length) {
  38475. var anchorNode = currentSelection.anchorNode;
  38476. while (anchorNode) {
  38477. selectedNodes.push(anchorNode);
  38478. if (!anchorNode.nextSibling || anchorNode === currentSelection.focusNode) {
  38479. anchorNode = null;
  38480. }
  38481. if (anchorNode) {
  38482. anchorNode = anchorNode.nextSibling;
  38483. }
  38484. }
  38485. $selectedLinks = $(selectedNodes).closest('a').add($(selectedNodes).children('a'));
  38486. }
  38487. if ($selectedLinks && $selectedLinks.length) {
  38488. $selectedLinks.each(function (linkIndex, linkNode) {
  38489. var selection = win.getSelection();
  38490. var range = doc.createRange();
  38491. range.selectNodeContents(linkNode);
  38492. selection.removeAllRanges();
  38493. selection.addRange(range);
  38494. doc.execCommand('unlink', false);
  38495. selection.removeAllRanges();
  38496. });
  38497. return self;
  38498. }
  38499. var currentRange = self.getSelectionRange();
  38500. if (!currentRange) { return self; }
  38501. var dialog = self.app.dialog.prompt(self.params.linkUrlText, '', function (link) {
  38502. if (link && link.trim().length) {
  38503. self.setSelectionRange(currentRange);
  38504. doc.execCommand('createLink', false, link.trim());
  38505. }
  38506. });
  38507. dialog.$el.find('input').focus();
  38508. return self;
  38509. };
  38510. TextEditor.prototype.insertImage = function insertImage () {
  38511. var self = this;
  38512. var currentRange = self.getSelectionRange();
  38513. if (!currentRange) { return self; }
  38514. var dialog = self.app.dialog.prompt(self.params.imageUrlText, '', function (imageUrl) {
  38515. if (imageUrl && imageUrl.trim().length) {
  38516. self.setSelectionRange(currentRange);
  38517. doc.execCommand('insertImage', false, imageUrl.trim());
  38518. }
  38519. });
  38520. dialog.$el.find('input').focus();
  38521. return self;
  38522. };
  38523. TextEditor.prototype.removePlaceholder = function removePlaceholder () {
  38524. var self = this;
  38525. self.$contentEl.find('.text-editor-placeholder').remove();
  38526. };
  38527. TextEditor.prototype.insertPlaceholder = function insertPlaceholder () {
  38528. var self = this;
  38529. self.$contentEl.append(("<div class=\"text-editor-placeholder\">" + (self.params.placeholder) + "</div>"));
  38530. };
  38531. TextEditor.prototype.onSelectionChange = function onSelectionChange () {
  38532. var self = this;
  38533. if (self.params.mode === 'toolbar') { return; }
  38534. var selection = win.getSelection();
  38535. var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
  38536. if (self.params.mode === 'keyboard-toolbar') {
  38537. if (!selectionIsInContent) {
  38538. self.closeKeyboardToolbar();
  38539. } else {
  38540. self.openKeyboardToolbar();
  38541. }
  38542. return;
  38543. }
  38544. if (self.params.mode === 'popover') {
  38545. var selectionIsInPopover = $(selection.anchorNode).parents(self.popover.el).length || selection.anchorNode === self.popover.el;
  38546. if (!selectionIsInContent && !selectionIsInPopover) {
  38547. self.closePopover();
  38548. return;
  38549. }
  38550. if (!selection.isCollapsed && selection.rangeCount) {
  38551. var range = selection.getRangeAt(0);
  38552. var rect = range.getBoundingClientRect();
  38553. var rootEl = self.app.root[0] || doc.body;
  38554. self.openPopover(rect.x + (win.scrollX || 0) - rootEl.offsetLeft, rect.y + (win.scrollY || 0) - rootEl.offsetTop, rect.width, rect.height);
  38555. } else if (selection.isCollapsed) {
  38556. self.closePopover();
  38557. }
  38558. }
  38559. };
  38560. TextEditor.prototype.onPaste = function onPaste (e) {
  38561. var self = this;
  38562. if (self.params.clearFormattingOnPaste && e.clipboardData && e.clipboardData.getData) {
  38563. var text = e.clipboardData.getData('text/plain');
  38564. e.preventDefault();
  38565. doc.execCommand('insertText', false, text);
  38566. }
  38567. };
  38568. TextEditor.prototype.onInput = function onInput () {
  38569. var self = this;
  38570. var value = self.$contentEl.html();
  38571. self.$el.trigger('texteditor:input');
  38572. self.emit('local:input textEditorInput', self);
  38573. self.value = value;
  38574. self.$el.trigger('texteditor:change', self.value);
  38575. self.emit('local::change textEditorChange', self, self.value);
  38576. };
  38577. TextEditor.prototype.onFocus = function onFocus () {
  38578. var self = this;
  38579. self.removePlaceholder();
  38580. self.$contentEl.focus();
  38581. self.$el.trigger('texteditor:focus');
  38582. self.emit('local::focus textEditorFocus', self);
  38583. };
  38584. TextEditor.prototype.onBlur = function onBlur () {
  38585. var self = this;
  38586. if (self.params.placeholder && self.$contentEl.html() === '') {
  38587. self.insertPlaceholder();
  38588. }
  38589. if (self.params.mode === 'popover') {
  38590. var selection = win.getSelection();
  38591. var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
  38592. var inPopover = doc.activeElement && self.popover && $(doc.activeElement).closest(self.popover.$el).length;
  38593. if (!inPopover && !selectionIsInContent) {
  38594. self.closePopover();
  38595. }
  38596. }
  38597. if (self.params.mode === 'keyboard-toolbar') {
  38598. var selection$1 = win.getSelection();
  38599. var selectionIsInContent$1 = $(selection$1.anchorNode).parents(self.contentEl).length || selection$1.anchorNode === self.contentEl;
  38600. if (!selectionIsInContent$1) {
  38601. self.closeKeyboardToolbar();
  38602. }
  38603. }
  38604. self.$el.trigger('texteditor:blur');
  38605. self.emit('local::blur textEditorBlur', self);
  38606. };
  38607. TextEditor.prototype.onButtonClick = function onButtonClick (e) {
  38608. var self = this;
  38609. var selection = win.getSelection();
  38610. var selectionIsInContent = $(selection.anchorNode).parents(self.contentEl).length || selection.anchorNode === self.contentEl;
  38611. if (!selectionIsInContent) { return; }
  38612. var $buttonEl = $(e.target).closest('button');
  38613. if ($buttonEl.parents('form').length) {
  38614. e.preventDefault();
  38615. }
  38616. var button = $buttonEl.attr('data-button');
  38617. var buttonData = self.params.customButtons && self.params.customButtons[button];
  38618. if (!button || !(textEditorButtonsMap[button] || buttonData)) { return; }
  38619. $buttonEl.trigger('texteditor:buttonclick', button);
  38620. self.emit('local::buttonClick textEditorButtonClick', self, button);
  38621. if (buttonData) {
  38622. if (buttonData.onClick) { buttonData.onClick(self, $buttonEl[0]); }
  38623. return;
  38624. }
  38625. var command = textEditorButtonsMap[button][2];
  38626. if (command === 'createLink') {
  38627. self.createLink();
  38628. return;
  38629. }
  38630. if (command === 'insertImage') {
  38631. self.insertImage();
  38632. return;
  38633. }
  38634. if (command.indexOf('formatBlock') === 0) {
  38635. var tagName = command.split('.')[1];
  38636. var $anchorNode = $(selection.anchorNode);
  38637. if ($anchorNode.parents(tagName.toLowerCase()).length || $anchorNode.is(tagName)) {
  38638. doc.execCommand('formatBlock', false, 'div');
  38639. } else {
  38640. doc.execCommand('formatBlock', false, tagName);
  38641. }
  38642. return;
  38643. }
  38644. doc.execCommand(command, false);
  38645. };
  38646. // eslint-disable-next-line
  38647. TextEditor.prototype.getSelectionRange = function getSelectionRange () {
  38648. if (win.getSelection) {
  38649. var sel = win.getSelection();
  38650. if (sel.getRangeAt && sel.rangeCount) {
  38651. return sel.getRangeAt(0);
  38652. }
  38653. } else if (doc.selection && doc.selection.createRange) {
  38654. return doc.selection.createRange();
  38655. }
  38656. return null;
  38657. };
  38658. // eslint-disable-next-line
  38659. TextEditor.prototype.setSelectionRange = function setSelectionRange (range) {
  38660. if (range) {
  38661. if (win.getSelection) {
  38662. var sel = win.getSelection();
  38663. sel.removeAllRanges();
  38664. sel.addRange(range);
  38665. } else if (doc.selection && range.select) {
  38666. range.select();
  38667. }
  38668. }
  38669. };
  38670. TextEditor.prototype.renderButtons = function renderButtons () {
  38671. var self = this;
  38672. var html = '';
  38673. function renderButton(button) {
  38674. var iconClass = self.app.theme === 'md' ? 'material-icons' : 'f7-icons';
  38675. if (self.params.customButtons && self.params.customButtons[button]) {
  38676. var buttonData = self.params.customButtons[button];
  38677. return ("<button type=\"button\" class=\"text-editor-button\" data-button=\"" + button + "\">" + (buttonData.content || '') + "</button>");
  38678. }
  38679. if (!textEditorButtonsMap[button]) { return ''; }
  38680. var iconContent = textEditorButtonsMap[button][self.app.theme === 'md' ? 1 : 0];
  38681. return ("<button type=\"button\" class=\"text-editor-button\" data-button=\"" + button + "\">" + (iconContent.indexOf('<') >= 0 ? iconContent : ("<i class=\"" + iconClass + "\">" + iconContent + "</i>")) + "</button>").trim();
  38682. }
  38683. self.params.buttons.forEach(function (button, buttonIndex) {
  38684. if (Array.isArray(button)) {
  38685. button.forEach(function (b) {
  38686. html += renderButton(b);
  38687. });
  38688. if (buttonIndex < self.params.buttons.length - 1 && self.params.dividers) {
  38689. html += '<div class="text-editor-button-divider"></div>';
  38690. }
  38691. } else {
  38692. html += renderButton(button);
  38693. }
  38694. });
  38695. return html;
  38696. };
  38697. TextEditor.prototype.createToolbar = function createToolbar () {
  38698. var self = this;
  38699. self.$el.prepend(("<div class=\"text-editor-toolbar\">" + (self.renderButtons()) + "</div>"));
  38700. };
  38701. TextEditor.prototype.createKeyboardToolbar = function createKeyboardToolbar () {
  38702. var self = this;
  38703. var isDark = self.$el.closest('.theme-dark').length > 0 || self.app.device.prefersColorScheme() === 'dark';
  38704. self.$keyboardToolbarEl = $(("<div class=\"toolbar toolbar-bottom text-editor-keyboard-toolbar " + (isDark ? 'theme-dark' : '') + "\"><div class=\"toolbar-inner\">" + (self.renderButtons()) + "</div></div>"));
  38705. };
  38706. TextEditor.prototype.createPopover = function createPopover () {
  38707. var self = this;
  38708. var isDark = self.$el.closest('.theme-dark').length > 0;
  38709. self.popover = self.app.popover.create({
  38710. content: ("\n <div class=\"popover " + (isDark ? 'theme-light' : 'theme-dark') + " text-editor-popover\">\n <div class=\"popover-inner\">" + (self.renderButtons()) + "</div>\n </div>\n "),
  38711. closeByOutsideClick: false,
  38712. backdrop: false,
  38713. });
  38714. };
  38715. TextEditor.prototype.openKeyboardToolbar = function openKeyboardToolbar () {
  38716. var self = this;
  38717. if (self.$keyboardToolbarEl.parent(self.app.root).length) { return; }
  38718. self.$el.trigger('texteditor:keyboardopen');
  38719. self.emit('local::keyboardOpen textEditorKeyboardOpen', self);
  38720. self.app.root.append(self.$keyboardToolbarEl);
  38721. };
  38722. TextEditor.prototype.closeKeyboardToolbar = function closeKeyboardToolbar () {
  38723. var self = this;
  38724. self.$keyboardToolbarEl.remove();
  38725. self.$el.trigger('texteditor:keyboardclose');
  38726. self.emit('local::keyboardClose textEditorKeyboardClose', self);
  38727. };
  38728. TextEditor.prototype.openPopover = function openPopover (targetX, targetY, targetWidth, targetHeight) {
  38729. var self = this;
  38730. if (!self.popover) { return; }
  38731. Object.assign(self.popover.params, {
  38732. targetX: targetX,
  38733. targetY: targetY,
  38734. targetWidth: targetWidth,
  38735. targetHeight: targetHeight,
  38736. });
  38737. clearTimeout(self.popoverTimeout);
  38738. self.popoverTimeout = setTimeout(function () {
  38739. if (!self.popover) { return; }
  38740. if (self.popover.opened) {
  38741. self.popover.resize();
  38742. } else {
  38743. self.$el.trigger('texteditor:popoveropen');
  38744. self.emit('local::popoverOpen textEditorPopoverOpen', self);
  38745. self.popover.open();
  38746. }
  38747. }, 400);
  38748. };
  38749. TextEditor.prototype.closePopover = function closePopover () {
  38750. var self = this;
  38751. clearTimeout(self.popoverTimeout);
  38752. if (!self.popover || !self.popover.opened) { return; }
  38753. self.popoverTimeout = setTimeout(function () {
  38754. if (!self.popover) { return; }
  38755. self.$el.trigger('texteditor:popoverclose');
  38756. self.emit('local::popoverClose textEditorPopoverClose', self);
  38757. self.popover.close();
  38758. }, 400);
  38759. };
  38760. TextEditor.prototype.init = function init () {
  38761. var self = this;
  38762. if (self.value) {
  38763. self.$contentEl.html(self.value);
  38764. } else {
  38765. self.value = self.$contentEl.html();
  38766. }
  38767. if (self.params.placeholder && self.value === '') {
  38768. self.insertPlaceholder();
  38769. }
  38770. if (self.params.mode === 'toolbar') {
  38771. self.createToolbar();
  38772. } else if (self.params.mode === 'popover') {
  38773. self.createPopover();
  38774. } else if (self.params.mode === 'keyboard-toolbar') {
  38775. self.createKeyboardToolbar();
  38776. }
  38777. self.attachEvents();
  38778. self.$el.trigger('texteditor:init');
  38779. self.emit('local::init textEditorInit', self);
  38780. return self;
  38781. };
  38782. TextEditor.prototype.destroy = function destroy () {
  38783. var self = this;
  38784. self.$el.trigger('texteditor:beforedestroy');
  38785. self.emit('local::beforeDestroy textEditorBeforeDestroy', self);
  38786. self.detachEvents();
  38787. if (self.params.mode === 'keyboard-toolbar' && self.$keyboardToolbarEl) {
  38788. self.$keyboardToolbarEl.remove();
  38789. }
  38790. if (self.popover) {
  38791. self.popover.close(false);
  38792. self.popover.destroy();
  38793. }
  38794. delete self.$el[0].f7TextEditor;
  38795. Utils.deleteProps(self);
  38796. self = null;
  38797. };
  38798. return TextEditor;
  38799. }(Framework7Class));
  38800. var TextEditor$1 = {
  38801. name: 'textEditor',
  38802. params: {
  38803. textEditor: {
  38804. el: null,
  38805. mode: 'toolbar', // or 'popover'
  38806. value: undefined, // will use html content
  38807. customButtons: null,
  38808. buttons: [
  38809. ['bold', 'italic', 'underline', 'strikeThrough'],
  38810. ['orderedList', 'unorderedList'],
  38811. ['link', 'image'],
  38812. ['paragraph', 'h1', 'h2', 'h3'],
  38813. ['alignLeft', 'alignCenter', 'alignRight', 'alignJustify'],
  38814. ['subscript', 'superscript'],
  38815. ['indent', 'outdent'] ],
  38816. dividers: true,
  38817. imageUrlText: 'Insert image URL',
  38818. linkUrlText: 'Insert link URL',
  38819. placeholder: null,
  38820. clearFormattingOnPaste: true,
  38821. },
  38822. },
  38823. create: function create() {
  38824. var app = this;
  38825. app.textEditor = Utils.extend(
  38826. ConstructorMethods({
  38827. defaultSelector: '.text-editor',
  38828. constructor: TextEditor,
  38829. app: app,
  38830. domProp: 'f7TextEditor',
  38831. })
  38832. );
  38833. },
  38834. static: {
  38835. TextEditor: TextEditor,
  38836. },
  38837. on: {
  38838. tabMounted: function tabMounted(tabEl) {
  38839. var app = this;
  38840. $(tabEl).find('.text-editor-init').each(function (index, editorEl) {
  38841. var dataset = $(editorEl).dataset();
  38842. app.textEditor.create(Utils.extend({ el: editorEl }, dataset || {}));
  38843. });
  38844. },
  38845. tabBeforeRemove: function tabBeforeRemove(tabEl) {
  38846. $(tabEl).find('.text-editor-init').each(function (index, editorEl) {
  38847. if (editorEl.f7TextEditor) { editorEl.f7TextEditor.destroy(); }
  38848. });
  38849. },
  38850. pageInit: function pageInit(page) {
  38851. var app = this;
  38852. page.$el.find('.text-editor-init').each(function (index, editorEl) {
  38853. var dataset = $(editorEl).dataset();
  38854. app.textEditor.create(Utils.extend({ el: editorEl }, dataset || {}));
  38855. });
  38856. },
  38857. pageBeforeRemove: function pageBeforeRemove(page) {
  38858. page.$el.find('.text-editor-init').each(function (index, editorEl) {
  38859. if (editorEl.f7TextEditor) { editorEl.f7TextEditor.destroy(); }
  38860. });
  38861. },
  38862. },
  38863. vnode: {
  38864. 'text-editor-init': {
  38865. insert: function insert(vnode) {
  38866. var app = this;
  38867. var editorEl = vnode.elm;
  38868. var dataset = $(editorEl).dataset();
  38869. app.textEditor.create(Utils.extend({ el: editorEl }, dataset || {}));
  38870. },
  38871. destroy: function destroy(vnode) {
  38872. var editorEl = vnode.elm;
  38873. if (editorEl.f7TextEditor) { editorEl.f7TextEditor.destroy(); }
  38874. },
  38875. },
  38876. },
  38877. };
  38878. var Elevation = {
  38879. name: 'elevation',
  38880. };
  38881. var Typography = {
  38882. name: 'typography',
  38883. };
  38884. var ViAd = /*@__PURE__*/(function (Framework7Class) {
  38885. function ViAd(app, params) {
  38886. if ( params === void 0 ) params = {};
  38887. Framework7Class.call(this, params, [app]);
  38888. var vi = this;
  38889. if (!win.vi) {
  38890. throw new Error('Framework7: vi SDK not found.');
  38891. }
  38892. var orientation;
  38893. if (typeof win.orientation !== 'undefined') {
  38894. orientation = win.orientation === -90 || win.orientation === 90 ? 'horizontal' : 'vertical';
  38895. }
  38896. var defaults = Utils.extend(
  38897. {},
  38898. app.params.vi,
  38899. {
  38900. appId: app.id,
  38901. appVer: app.version,
  38902. language: app.language,
  38903. width: app.width,
  38904. height: app.height,
  38905. os: Device.os,
  38906. osVersion: Device.osVersion,
  38907. orientation: orientation,
  38908. }
  38909. );
  38910. // Extend defaults with modules params
  38911. vi.useModulesParams(defaults);
  38912. vi.params = Utils.extend(defaults, params);
  38913. var adParams = {};
  38914. var skipParams = ('on autoplay fallbackOverlay fallbackOverlayText enabled').split(' ');
  38915. Object.keys(vi.params).forEach(function (paramName) {
  38916. if (skipParams.indexOf(paramName) >= 0) { return; }
  38917. var paramValue = vi.params[paramName];
  38918. if ([null, undefined].indexOf(paramValue) >= 0) { return; }
  38919. adParams[paramName] = paramValue;
  38920. });
  38921. if (!vi.params.appId) {
  38922. throw new Error('Framework7: "app.id" is required to display an ad. Make sure you have specified it on app initialization.');
  38923. }
  38924. if (!vi.params.placementId) {
  38925. throw new Error('Framework7: "placementId" is required to display an ad.');
  38926. }
  38927. function onResize() {
  38928. var $viFrame = $('iframe#viAd');
  38929. if ($viFrame.length === 0) { return; }
  38930. $viFrame
  38931. .css({
  38932. width: ((app.width) + "px"),
  38933. height: ((app.height) + "px"),
  38934. });
  38935. }
  38936. function removeOverlay() {
  38937. if (!vi.$overlayEl) { return; }
  38938. vi.$overlayEl.off('click touchstart');
  38939. vi.$overlayEl.remove();
  38940. }
  38941. function createOverlay(videoEl) {
  38942. if (!videoEl) { return; }
  38943. vi.$overlayEl = $(("\n <div class=\"vi-overlay\">\n " + (vi.params.fallbackOverlayText ? ("<div class=\"vi-overlay-text\">" + (vi.params.fallbackOverlayText) + "</div>") : '') + "\n <div class=\"vi-overlay-play-button\"></div>\n </div>\n ").trim());
  38944. var touchStartTime;
  38945. vi.$overlayEl.on('touchstart', function () {
  38946. touchStartTime = Utils.now();
  38947. });
  38948. vi.$overlayEl.on('click', function () {
  38949. var timeDiff = Utils.now() - touchStartTime;
  38950. if (timeDiff > 300) { return; }
  38951. if (videoEl) {
  38952. videoEl.play();
  38953. removeOverlay();
  38954. return;
  38955. }
  38956. vi.start();
  38957. removeOverlay();
  38958. });
  38959. app.root.append(vi.$overlayEl);
  38960. }
  38961. // Create ad
  38962. vi.ad = new win.vi.Ad(adParams);
  38963. Utils.extend(vi.ad, {
  38964. onAdReady: function onAdReady() {
  38965. app.on('resize', onResize);
  38966. vi.emit('local::ready');
  38967. if (vi.params.autoplay) {
  38968. vi.start();
  38969. }
  38970. },
  38971. onAdStarted: function onAdStarted() {
  38972. vi.emit('local::started');
  38973. },
  38974. onAdClick: function onAdClick(targetUrl) {
  38975. vi.emit('local::click', targetUrl);
  38976. },
  38977. onAdImpression: function onAdImpression() {
  38978. vi.emit('local::impression');
  38979. },
  38980. onAdStopped: function onAdStopped(reason) {
  38981. app.off('resize', onResize);
  38982. removeOverlay();
  38983. vi.emit('local::stopped', reason);
  38984. if (reason === 'complete') {
  38985. vi.emit('local::complete');
  38986. vi.emit('local::completed');
  38987. }
  38988. if (reason === 'userexit') {
  38989. vi.emit('local::userexit');
  38990. }
  38991. vi.destroyed = true;
  38992. },
  38993. onAutoPlayFailed: function onAutoPlayFailed(reason, videoEl) {
  38994. vi.emit('local::autoplayFailed', reason, videoEl);
  38995. if (reason && reason.name && reason.name.indexOf('NotAllowedError') !== -1 && vi.params.fallbackOverlay) {
  38996. createOverlay(videoEl);
  38997. }
  38998. },
  38999. onAdError: function onAdError(msg) {
  39000. removeOverlay();
  39001. app.off('resize', onResize);
  39002. vi.emit('local::error', msg);
  39003. vi.destroyed = true;
  39004. },
  39005. });
  39006. vi.init();
  39007. Utils.extend(vi, {
  39008. app: app,
  39009. });
  39010. }
  39011. if ( Framework7Class ) ViAd.__proto__ = Framework7Class;
  39012. ViAd.prototype = Object.create( Framework7Class && Framework7Class.prototype );
  39013. ViAd.prototype.constructor = ViAd;
  39014. ViAd.prototype.start = function start () {
  39015. var vi = this;
  39016. if (vi.destroyed) { return; }
  39017. if (vi.ad) { vi.ad.startAd(); }
  39018. };
  39019. ViAd.prototype.pause = function pause () {
  39020. var vi = this;
  39021. if (vi.destroyed) { return; }
  39022. if (vi.ad) { vi.ad.pauseAd(); }
  39023. };
  39024. ViAd.prototype.resume = function resume () {
  39025. var vi = this;
  39026. if (vi.destroyed) { return; }
  39027. if (vi.ad) { vi.ad.resumeAd(); }
  39028. };
  39029. ViAd.prototype.stop = function stop () {
  39030. var vi = this;
  39031. if (vi.destroyed) { return; }
  39032. if (vi.ad) { vi.ad.stopAd(); }
  39033. };
  39034. ViAd.prototype.init = function init () {
  39035. var vi = this;
  39036. if (vi.destroyed) { return; }
  39037. if (vi.ad) { vi.ad.initAd(); }
  39038. };
  39039. ViAd.prototype.destroy = function destroy () {
  39040. var vi = this;
  39041. vi.destroyed = true;
  39042. vi.emit('local::beforeDestroy');
  39043. Utils.deleteProps(vi);
  39044. };
  39045. return ViAd;
  39046. }(Framework7Class));
  39047. var Vi = {
  39048. name: 'vi',
  39049. params: {
  39050. vi: {
  39051. enabled: false,
  39052. autoplay: true,
  39053. fallbackOverlay: true,
  39054. fallbackOverlayText: 'Please watch this ad',
  39055. showMute: true,
  39056. startMuted: (Device.ios || Device.android) && !Device.cordova,
  39057. appId: null,
  39058. appVer: null,
  39059. language: null,
  39060. width: null,
  39061. height: null,
  39062. placementId: 'pltd4o7ibb9rc653x14',
  39063. placementType: 'interstitial',
  39064. videoSlot: null,
  39065. showProgress: true,
  39066. showBranding: true,
  39067. os: null,
  39068. osVersion: null,
  39069. orientation: null,
  39070. age: null,
  39071. gender: null,
  39072. advertiserId: null,
  39073. latitude: null,
  39074. longitude: null,
  39075. accuracy: null,
  39076. storeId: null,
  39077. ip: null,
  39078. manufacturer: null,
  39079. model: null,
  39080. connectionType: null,
  39081. connectionProvider: null,
  39082. },
  39083. },
  39084. create: function create() {
  39085. var app = this;
  39086. app.vi = {
  39087. sdkReady: false,
  39088. createAd: function createAd(adParams) {
  39089. return new ViAd(app, adParams);
  39090. },
  39091. loadSdk: function loadSdk() {
  39092. if (app.vi.sdkReady) { return; }
  39093. var script = doc.createElement('script');
  39094. script.onload = function onload() {
  39095. app.emit('viSdkReady');
  39096. app.vi.sdkReady = true;
  39097. };
  39098. script.src = 'https://c.vi-serve.com/viadshtml/vi.min.js';
  39099. $('head').append(script);
  39100. },
  39101. };
  39102. },
  39103. on: {
  39104. init: function init() {
  39105. var app = this;
  39106. if (app.params.vi.enabled || (app.passedParams.vi && app.passedParams.vi.enabled !== false)) { app.vi.loadSdk(); }
  39107. },
  39108. },
  39109. };
  39110. {
  39111. if (typeof window !== 'undefined') {
  39112. // Template7
  39113. if (!window.Template7) { window.Template7 = Template7; }
  39114. // Dom7
  39115. if (!window.Dom7) { window.Dom7 = $; }
  39116. }
  39117. }
  39118. // Install Core Modules & Components
  39119. Router.use([ //NO_LITE
  39120. RouterTemplateLoaderModule, //NO_LITE
  39121. RouterComponentLoaderModule ]); //NO_LITE
  39122. Framework7.use([
  39123. DeviceModule,
  39124. SupportModule,
  39125. UtilsModule,
  39126. ResizeModule,
  39127. RequestModule,
  39128. TouchModule,
  39129. ClicksModule,
  39130. RouterModule,
  39131. HistoryModule,
  39132. ComponentModule, //NO_LITE
  39133. ServiceWorkerModule,
  39134. Statusbar$1,
  39135. View$1,
  39136. Navbar$1,
  39137. Toolbar$1,
  39138. Subnavbar,
  39139. TouchRipple$1,
  39140. Modal$1,
  39141. Appbar,
  39142. Dialog$1,
  39143. Popup$1,
  39144. LoginScreen$1,
  39145. Popover$1,
  39146. Actions$1,
  39147. Sheet$1,
  39148. Toast$1,
  39149. Preloader$1,
  39150. Progressbar$1,
  39151. Sortable$1,
  39152. Swipeout$1,
  39153. Accordion$1,
  39154. ContactsList,
  39155. VirtualList$1,
  39156. ListIndex$1,
  39157. Timeline,
  39158. Tabs,
  39159. Panel$1,
  39160. Card,
  39161. Chip,
  39162. Form,
  39163. Input$1,
  39164. Checkbox,
  39165. Radio,
  39166. Toggle$1,
  39167. Range$1,
  39168. Stepper$1,
  39169. SmartSelect$1,
  39170. Grid$1,
  39171. Calendar$1,
  39172. Picker$1,
  39173. InfiniteScroll$1,
  39174. PullToRefresh$1,
  39175. Lazy$1,
  39176. DataTable$1,
  39177. Fab$1,
  39178. Searchbar$1,
  39179. Messages$1,
  39180. Messagebar$1,
  39181. Swiper$1,
  39182. PhotoBrowser$1,
  39183. Notification$1,
  39184. Autocomplete$1,
  39185. Tooltip$1,
  39186. Gauge$1,
  39187. Skeleton,
  39188. Menu$1,
  39189. ColorPicker$1,
  39190. Treeview$1,
  39191. TextEditor$1,
  39192. Elevation,
  39193. Typography,
  39194. Vi
  39195. ]);
  39196. return Framework7;
  39197. })));